2016-06-12 45 views
2

当我写的代码SHA_CTX词shashSHA1_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

使用更高版本的OpenSSL(如1.0.2和1.1.0)的建议方法是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

感谢您的支持@francis。小好奇心:为什么选择C99标准而不是C89或C11?再次感谢。 – JLo

+0

不客气!我使用了c99,因为我的编译器默认运行c89。因此,我得到了以下错误:''for'循环初始声明只允许在C99模式下。因此,我切换到c99。当然,c11本来可以用来代替。 – francis

+0

非常感谢@francis。太好了! – JLo