2011-05-03 20 views
6

Estoy intentando firmar usando DSA desde OpenSSL. Tengo los archivos que contienen claves públicas y privadas.Firma DSA con OpenSSL

Antes que nada, hago una conexión de unidifusión y todo está bien. Después de eso necesito una conexión UDP de multidifusión y quiero firmar los paquetes. Estoy tratando de usar la función PEM_read_DSA_PUBKEY() para cargar mi clave pública de mi certificado pero no funciona. Devuelve siempre NULL en lugar de una estructura DSA.

Aquí tiene una versión simplista del código. Compilo de esta manera:

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

¿Alguna idea? ¡Gracias!

#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; 
} 

Respuesta

1

¿Está utilizando una clave pública protegida con contraseña?

Si es así, usted está obligado a pasar una función de devolución de llamada como el tercer argumento a PEM_read_DSA_PUBKEY, por lo que si la contraseña proporcionada coincide, será capaz de cargar correctamente su clave.

Actualización:

Por otra parte, como se ha señalado por Hasturkun, puede pasar una cadena terminada en cero como el cuarto argumento. Citando la official documentation:

Si los parámetros cb se establece en NULL y el parámetro u no es NULL entonces el parámetro u se interpreta como un nulo cadena terminada utilizar como frase de contraseña. Si tanto cb como u son NULL , la rutina de devolución de llamada predeterminada es utilizada, que normalmente solicitará la frase de contraseña en el terminal actual con eco desactivado.

+0

También es posible pasar un puntero a una cadena terminada en nulo como el cuarto argumento – Hasturkun

+0

@Hasturkun: verdad, gracias! Actualizado para mencionar. El hecho es que no veo ningún problema con su código (excepto una fuga de memoria innecesaria), así que supongo que su clave está protegida con contraseña y que no proporciona la contraseña correctamente. – jweyrich

+0

No. He evitado usar una contraseña para simplificarla. – calamares

1

¿Su cert.pem contiene un certificado X.509? Parece que PEM_read_DSA_PUBKEY espera una clave pública DSA codificada con PEM sin el contenedor X.509.

intentar algo así como que en lugar:

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 
Cuestiones relacionadas