当我将代码 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;
}
答案 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
编译