2010-08-03 25 views
6

Estoy trabajando con una versión anterior de OpenSSL, y me estoy encontrando con un comportamiento que me ha dejado perplejo durante días al intentar trabajar con plataforma cruzada código.Mismo código C que produce resultados diferentes en Mac OS X que Windows y Linux

Tengo un código que llama a OpenSSL para firmar algo. Mi código está modelado después del código en ASN1_sign, que se encuentra en a_sign.c en OpenSSL, que presenta los mismos problemas cuando lo uso. Aquí está la línea correspondiente de código (que se encuentra y se utiliza exactamente de la misma manera en a_sign.c):

EVP_SignUpdate(&ctx,(unsigned char *)buf_in,inl); 

CTX es una estructura que utiliza OpenSSL, no es relevante para esta discusión
buf_in es un char * de los datos que se va a firmar
INL es la longitud de buf_in

EVP_SignUpdate puede ser llamado en varias ocasiones con el fin de leer los datos a ser firmados antes EVP_SignFinal se llama a firmarlo.

Todo funciona bien cuando se usa este código en Ubuntu y Windows 7, ambos producen las mismas firmas con las mismas entradas.

En OS X, si el tamaño de inl es menor que 64 (es decir, hay 64 bytes o menos en buf_in), también produce las mismas firmas que Ubuntu y Windows. Sin embargo, si el tamaño de inl es mayor que 64, produce sus propias firmas internamente consistentes que difieren de las otras plataformas. Por coherencia interna, quiero decir que la Mac leerá las firmas y las verificará como corresponde, mientras que rechazará las firmas de Ubuntu y Windows, y viceversa.

me las arreglé para solucionar este problema y hacer que las mismas firmas que se creen cambiando esa línea anterior a la siguiente, donde se lee el buffer de un byte a la vez:

int input_it; 
for(input_it = (int)buf_in; input_it < inl + (int)buf_in; intput_it++){ 
    EVP_SIGNUpdate(&ctx, (unsigned char*) input_it, 1); 
} 

Esto hace que OS X rechazar sus propias firmas de datos> 64 bytes como no válidos, y rastreé una línea similar en otro lugar para verificar las firmas que debían dividirse de manera idéntica.

Esto corrige la creación y verificación de firmas, pero algo sigue funcionando mal, ya que estoy teniendo otros problemas, y realmente no quiero irme (¡y modificar!) Mucho más profundo en OpenSSL.

Seguramente estoy haciendo algo mal, ya que estoy viendo exactamente los mismos problemas cuando uso stock ASN1_sign. ¿Es esto un problema con la forma en que compilé OpenSSL? Por mi vida no puedo resolverlo. ¿Alguien puede educarme sobre qué error de cabeza debo estar cometiendo?

Respuesta

-1

El problema más común que transmite el código de Windows y Linux son los valores predeterminados de la memoria. Creo que Windows lo establece en 0xDEADBEEF y Linux lo establece en 0s.

0

Existen problemas conocidos con OpenSSL en mac (debe pasar por algunos aros para asegurarse de que enlaza con la biblioteca correcta en lugar de la biblioteca del sistema). ¿Compiló usted mismo? El archivo PROBLEMS en la distribución explica los detalles del problema y sugiere algunas soluciones. (O si está ejecutando bibliotecas compartidas, verifique que su DYLD_LIBRARY_PATH esté correctamente configurada). No hay garantía, pero este parece un buen lugar para comenzar ...

Cuestiones relacionadas