【问题标题】:SHA1 OpenSSL Segmentation Fault [duplicate]SHA1 OpenSSL 分段错误 [重复]
【发布时间】:2016-06-12 18:57:29
【问题描述】:

当我将代码 SHA_CTX shash 写入 SHA1_Final(hash, &shash) 时,我遇到了 Segmentation Fault 的错误,或者在另一种情况下我的返回值为 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;
}

【问题讨论】:

  • 如果我将代码从 SHA_CTX 注释到 SHA1_Final,那么这段代码可以工作。
  • 推荐使用更高版本的 OpenSSL(如 1.0.2 和 1.1.0)执行此操作的方法是 EVP 接口。另请参阅 OpenSSL wiki 上的 EVP Message Digests

标签: c openssl


【解决方案1】:

可以添加标志-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编译

【讨论】:

  • 感谢您对@francis 的支持。有点好奇:为什么选择 C99 Standard 而不是 C89 或 C11 ?再次感谢。
  • 不客气!我使用 c99 是因为我的编译器默认运行 c89。因此,我收到以下错误:‘for’ loop initial declarations are only allowed in C99 mode。因此,我切换到c99。当然,也可以使用 c11。
  • 非常感谢@francis。太好了!
猜你喜欢
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 2012-05-26
  • 2018-02-05
  • 1970-01-01
相关资源
最近更新 更多