SHA1 OpenSSL分段错误

时间:2016-06-12 10:18:35

标签: c openssl

当我将代码 SHA_CTX shash 写入 SHA1_Final(哈希,& shash)时,我遇到了分段错误的错误,或者在其他情况下我有返回值255.我不明白为什么会发生。这是一个简单的例子。

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

1 个答案:

答案 0 :(得分:3)

可以添加标志-Wall以在编译程序时启用每个警告。其中一个警告表明了问题的根源:

  

main4.c:36:23:警告:'ctx'在此函数中未初始化使用[-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编译