Подписание DSA с помощью OpenSSL

Я пытаюсь подписать с помощью DSA из OpenSSL. У меня есть файлы, содержащие открытые и закрытые ключи.

Прежде всего, я делаю одноадресное соединение, и все в порядке. После этого мне нужно многоадресное UDP-соединение, и я хочу подписывать пакеты. Я пытаюсь использовать функцию PEM_read_DSA_PUBKEY() для загрузки моего открытого ключа из моего сертификата, но это не работает. Он всегда возвращает NULL вместо структуры DSA.

Здесь у вас есть упрощенная версия кода. Я компилирую так:

gcc -Wall -g -lm prueba.c -o prueba -lcrypto

Есть идеи? Благодарю вас!

#include <stdio.h>
#include <openssl/dsa.h>
#include <openssl/pem.h>

int main()
{
    FILE *DSA_cert_file = fopen("./certs/cert.pem", "r");
    if (DSA_cert_file == NULL)
        return 1;

    printf("Certificate read\n");

    DSA *dsa = DSA_new();
    if((dsa = PEM_read_DSA_PUBKEY(DSA_cert_file, 0, 0, 0)) == NULL)
        return 1;

    printf("DSA public key read\n");

    return 0;
}

person calamares    schedule 03.05.2011    source источник


Ответы (2)


Вы используете открытый ключ, защищенный паролем?

Если да, вам необходимо передать функцию обратного вызова в качестве третьего аргумента PEM_read_DSA_PUBKEY, поэтому, если предоставленный пароль совпадает, он сможет правильно загрузить ваш ключ.

Обновление:

В качестве альтернативы, как указано в Hasturkun, вы можете передать строку с завершающим нулем в качестве четвертого аргумента. Цитируя официальную документацию:

Если для параметров cb установлено значение NULL, а параметр u не равен NULL, то параметр u интерпретируется как строка с завершающим нулем для использования в качестве парольной фразы. Если и cb, и u равны NULL, то используется процедура обратного вызова по умолчанию, которая обычно запрашивает парольную фразу на текущем терминале с отключенным эхом.

person jweyrich    schedule 03.05.2011
comment
Также можно передать указатель на строку с завершающим нулем в качестве четвертого аргумента. - person Hasturkun; 03.05.2011
comment
@Hasturkun: правда, спасибо! Обновлено, чтобы упомянуть. Дело в том, что я не вижу никаких проблем с его кодом (за исключением ненужной утечки памяти), поэтому я предполагаю, что его ключ защищен паролем, и он не предоставляет пароль должным образом. - person jweyrich; 03.05.2011
comment
Нет. Я избегал использования пароля, чтобы сделать его проще. - person calamares; 03.05.2011

Содержит ли ваш cert.pem сертификат X.509? Похоже, что PEM_read_DSA_PUBKEY ожидает открытый ключ DSA с кодировкой PEM без контейнера X.509.

Вместо этого попробуйте что-то подобное:

X509 *cert;
EVP_PKEY *pk;
DSA *dsa; 

cert = PEM_read_X509(DSA_cert_file,NULL,NULL,NULL);
if (!cert) { /* error */ }
pk = X509_get_pubkey(cert);
if (!pk) { /* error */ }
if (pk->type != 116) { /* not a dsa key */ }
dsa = pk->pkey.dsa
person b0fh    schedule 18.01.2012