2016-06-12 10 views
2

IコードSHA_CTXのshashにSHA1_Final(ハッシュ、& shash)を記述する場合、私はセグメンテーション違反のエラーを持っている、または別の場合には、私は255の戻り値が、私はありませんなぜ起こるのか理解する。これは簡単な例です。SHA1 OpenSSLのセグメンテーション違反

#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

によってコンパイルしました。私がSHA_CTXからSHA1_Finalにコードをコメントすると、このコードは動作します。 – JLo

+0

1.0.2と1.1.0のようなOpenSSLのそれ以降のバージョンでこれを行うための推奨される方法は、EVPインターフェイスです。 OpenSSL wikiの[EVP Message Digests](http://wiki.openssl.org/index.php/EVP_Message_Digests)も参照してください。 – jww

答えて

3

フラグ-Wallを追加して、プログラムがコンパイルされるたびに警告を有効にすることができます。

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

確かに、ポインタctxの値が初期化されていません:警告の一つは、問題の起源を示唆しています。したがって、ctxは任意の場所を指すことができ、これはセグメンテーションフォルトなどの未定義の動作につながります。

次の行を追加できますか?

BN_CTX *ctx=BN_CTX_new();//Buffer 

セグメント化エラーを解決するようです。私はgcc main.c -o main -I /usr/local/ssl/include -L /usr/local/ssl/lib -lssl -lcrypto -ldl -Wall -std=c99

+0

ご協力ありがとうございます@フランシス。少し好奇心:なぜあなたはC99またはC11ではなくC99標準を選択しますか?もう一度ありがとう。 – JLo

+0

歓迎です!私はコンパイラがデフォルトでc89を実行しているので、私はc99を使用しました。したがって、私は次のエラーを受け取りました: 'for'ループの初期宣言はC99モードでのみ許されます '。したがって、私はc99に切り替えました。もちろん、代わりにc11を使用することもできます。 – francis

+0

ありがとう@francis。すばらしいです ! – JLo

関連する問題