2016-06-12 23 views
2

Wenn ich den Code SHA_CTX shash zu SHA1_Final (hash, & shash), schreiben habe ich einen Fehler von Segmentation Fault, oder in einem anderen Fall, ich habe Rückgabewert von 255. Ich nicht tun versteh warum das passiert. Dies ist ein einfaches Beispiel.SHA1 OpenSSL Segmentation Fault

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <malloc.h> 
#include <openssl/sha.h> 
#include <openssl/bn.h> 
#include <openssl/ec.h> 
#include <openssl/obj_mac.h> 

int main() { 

    BIGNUM *x=BN_new(); 
    BIGNUM *y=BN_new(); 
    BIGNUM *n=BN_new(); 
    BIGNUM *e=BN_new(); 

    EC_POINT *P; 

    BN_CTX *ctx;//Buffer 

    const EC_POINT *G; //Generator Point 

    unsigned char hash[SHA_DIGEST_LENGTH]; 

    SHA_CTX shash; 
    SHA1_Init(&shash); 
    SHA1_Update(&shash, "abc", 3); 
    SHA1_Final(hash, &shash); 

    const EC_GROUP *curve = EC_GROUP_new_by_curve_name(NID_secp224r1); 

    P=EC_POINT_new(curve); 

    G=EC_GROUP_get0_generator(curve); 

    EC_GROUP_get_order(curve,n,ctx); 

    BN_rand_range(e,n); 

    EC_POINT_mul(curve,P,e,NULL,NULL,ctx); 

    if (!EC_POINT_is_on_curve(curve,P,ctx)) return -1; 
    if (!EC_POINT_get_affine_coordinates_GFp(curve, P, x, y, ctx)) return -1; 


    for(int i=0;i<SHA_DIGEST_LENGTH;i++) 
    { 
     printf("%02x",hash[i]); 
    } 


    return 0; 
} 
+0

Wenn ich den Code von SHA_CTX zu SHA1_Final kommentieren, dann funktioniert dieser Code. – JLo

+0

Die empfohlene Möglichkeit, dies mit späteren Versionen von OpenSSL, wie 1.0.2 und 1.1.0, zu tun, ist die EVP-Schnittstelle. Siehe auch [EVP Message Digests] (http://wiki.openssl.org/index.php/EVP_Message_Digests) im OpenSSL-Wiki. – jww

Antwort

3

Die Flagge -Wall können alle Warnungen als das Programm kompiliert wird, damit hinzugefügt werden. Eine der Warnungen schlägt vor, den Ursprung des Problems:

main4.c:36:23: warning: ‘ctx’ is used uninitialized in this function [-Wuninitialized]

Tatsächlich ist der Wert des Zeigers ctx ist nicht initialisiert. Daher kann ctx irgendwo zeigen und dies führt zu undefiniertem Verhalten, z. B. Segmentierungsfehler.

Können Sie die folgende Zeile hinzufügen?

BN_CTX *ctx=BN_CTX_new();//Buffer 

Es scheint den Segmentierungsfehler zu lösen. Ich kompiliert von gcc main.c -o main -I /usr/local/ssl/include -L /usr/local/ssl/lib -lssl -lcrypto -ldl -Wall -std=c99

+0

Danke für deine Unterstützung @francis. Kleine Neugier: Warum wählen Sie C99 Standard und nicht C89 oder C11? Noch einmal Danke. – JLo

+0

Gern geschehen! Ich habe c99 verwendet, weil mein Compiler standardmäßig c89 ausführt. Daher habe ich den folgenden Fehler bekommen: ''für' Schleife initiale Deklarationen sind nur im C99-Modus erlaubt'. Daher wechselte ich auf c99. Natürlich könnte c11 stattdessen verwendet werden. – francis

+0

Vielen Dank @francis. Groß ! – JLo