2010-08-03 4 views
6

Ich arbeite mit einer älteren Version von OpenSSL und stoße auf ein Verhalten, das mich seit Tagen stört, wenn ich versuche, mit plattformübergreifender Arbeit zu arbeiten Code.Derselbe C-Code erzeugt unter Mac OS X andere Ergebnisse als Windows und Linux

Ich habe Code, der OpenSSL anruft, um etwas zu signieren. Mein Code ist nach dem Code in ASN1_sign modelliert, der in a_sign.c in OpenSSL gefunden wird, der die gleichen Probleme aufweist, wenn ich ihn verwende. Hier ist die relevante Code-Zeile (die gefunden wird, und genau die gleiche Art und Weise in a_sign.c verwendet):

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

CTX ist eine Struktur, die OpenSSL verwendet, nicht relevant für diese Diskussion
buf_in ein char * die Daten, die
inl unterzeichnet werden soll ist die Länge des buf_in

EVP_SignUpdate wiederholt, um in Daten zu lesen, unterzeichnet werden, bevor EVP_SignFinal genannt, es zu unterzeichnen aufgerufen werden kann.

Alles funktioniert gut, wenn dieser Code auf Ubuntu und Windows 7 verwendet wird, beide erzeugen die gleichen Signaturen bei den gleichen Eingaben.

Unter OS X, wenn die Größe von inl weniger als 64 ist (das sind 64 Bytes oder weniger in buf_in), erzeugt es auch die gleichen Signaturen wie Ubuntu und Windows. Wenn jedoch die Größe von inl größer als 64 wird, erzeugt es seine eigenen intern konsistenten Signaturen, die sich von den anderen Plattformen unterscheiden. Mit intern konsistent, ich meine, dass der Mac die Signaturen lesen und sie als richtig überprüfen wird, während es die Signaturen von Ubuntu und Windows zurückweist und umgekehrt.

ich es geschafft, dieses Problem zu beheben, und führen die gleichen Signaturen oben auf die folgenden, indem diese Zeile erstellt werden, in dem er den Puffer ein Byte zu einem Zeitpunkt liest:

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

Dies bewirkt, dass OS X um seine eigenen Signaturen von Daten> 64 Bytes als ungültig abzulehnen, und ich habe eine ähnliche Zeile woanders nachverfolgt, um Signaturen zu überprüfen, die in identischer Weise aufgeteilt werden mussten.

Das behebt die Signaturerstellung und Überprüfung, aber etwas läuft immer noch falsch, da ich auf andere Probleme stoße, und ich möchte wirklich nicht tiefer in OpenSSL gehen (und modifizieren!).

Sicher mache ich etwas falsch, da ich genau die gleichen Probleme sehe, wenn ich Lager ASN1_sign verwende. Ist das ein Problem mit der Art, wie ich OpenSSL kompiliert habe? Für das Leben von mir kann ich es nicht herausfinden. Kann mir jemand beibringen, was für ein knochenköpfiger Fehler ich machen muss?

Antwort

-1

beschrieben. Das am häufigsten auftretende Problem bei der Portierung von Windows- und Linux-Code ist die Standardwerte des Speichers. Ich denke Windows setzt es auf 0xDEADBEEF und Linux setzt es auf 0s.

0

Es gibt bekannte Probleme mit OpenSSL auf dem Mac (Sie müssen durch ein paar Schleifen springen, um sicherzustellen, dass es mit der richtigen Bibliothek anstelle der Systembibliothek verknüpft ist). Hast du es selbst kompiliert? Die PROBLEMS-Datei in der Distribution erläutert die Details des Problems und schlägt einige Problemumgehungen vor. (Oder wenn Sie mit freigegebenen Bibliotheken arbeiten, überprüfen Sie, ob Ihr DYLD_LIBRARY_PATH korrekt eingestellt ist). Keine Garantie, aber dies scheint ein wahrscheinlicher Ort zu sein ...