Openssl DSA знак - PullRequest
       41

Openssl DSA знак

2 голосов
/ 04 декабря 2011

Я пытаюсь подписать некоторые данные, используя сертификат DSA. Я сохраняю сертификат в памяти (он был сгенерирован командой openssl gendsa).

Моя функция выглядит следующим образом, и моя проблема с res = EVP_SignFinal. Здесь функция возвращает 0 и устанавливает signature_len на 0.

bool my_dsa_sign(const Certificate& certificate, const char* messageData, size_t messageLength, Signature &outSignature) {
    bool resultOk = false;
    BIO* bio = BIO_new_mem_buf((void*) certificate.getPEMData(), certificate.getSize());
    if(NULL != bio) {
        EVP_PKEY *pkey = NULL;
        if(NULL != (pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL))) {
            unsigned int signature_len;
            EVP_MD_CTX ctx;
            int res = EVP_SignInit(&ctx, EVP_sha512());
            if(1 == res) {
                res = EVP_SignUpdate(&ctx, messageData, messageLength);
                if(1 == res) {
                    unsigned char* s = (unsigned char*)malloc(EVP_PKEY_size(pkey));

                    // problem here
                    res = EVP_SignFinal(&ctx, s, &signature_len, pkey);
                    if(1 == res) {
                        resultOk = true;
                        signature.setData(s, signature_len);
                    }
                }
            }
            EVP_PKEY_free(pkey);
            EVP_MD_CTX_cleanup(&ctx);
        }
        BIO_free(bio);
    }
    return resultOk;
}

есть идеи, в чем может быть проблема? Я проверил с помощью отладчика, значение сертификата правильное, в виде:

-----BEGIN DSA PRIVATE KEY-----
MIID....
.......
-----END DSA PRIVATE KEY-----

Также длина правильная, совпадает с длиной файла.

1 Ответ

2 голосов
/ 05 декабря 2011

Не зная многого об OpenSSL, я нигде не вижу, чтобы вы использовали DSA в своем коде.

int res = EVP_SignInit(&ctx, EVP_sha512());

Страница руководства для EVP_SignInit гласит:

EVP_SignInit() инициализирует контекст подписи ctx для использования реализации дайджеста по умолчанию type .

Руководство на странице EVP_sha512 говорится:

[...], EVP_sha512(), [...] возвращать EVP_MD структур для [...], SHA512, [...] алгоритмы дайджеста соответственно. В каждом случае связанный алгоритм подписи - это RSA.

Выделите мной.Похоже, что вы пытаетесь сделать подпись RSA с помощью ключа DSA, который не будет работать (или выплевывать бессмыслицу).

После некоторого просмотра документации я не совсем нашел способиспользуйте SHA512 вместе с DSA, хотя, несмотря на то, что документация сейчас гласит:

Связь между дайджестами и алгоритмами подписи была исправлена ​​в OpenSSL 1.0 и более поздних версиях, поэтому теперь EVP_sha1() можно использовать с RSA иDSA, больше нет необходимости использовать EVP_dss1().

...