openssl EC_KEY_new_by_curve_name потерпел крах без информации - PullRequest
0 голосов
/ 03 мая 2020

В моей функции get_keypair я хочу создать структуру EC_KEY с помощью EC_KEY_new_by_curve_name(NID_secp256k1). Благодаря этому я получил cra sh на моем vs2019 без подробностей. Ниже приводится мой код.

bool get_keypair(EC_KEY** key, bool getcompressed,uint8_t* rawprikey,  uint8_t rawprikeylen) {
    BIGNUM* priv; //prikey bignum
    BN_CTX* ctx; //hold the operation
    const EC_GROUP* group;
    EC_POINT* pub; //pubkey point st
    *key = EC_KEY_new_by_curve_name(NID_secp256k1); //secp256k1, !!!crashed here
    if (*key == 0) {
        printf("new ec key failed");
        exit(-1);
    }
    priv = BN_new(); //create bignum
    BN_bin2bn(rawprikey, 32, priv); //fill the bigbum with prikey
    EC_KEY_set_private_key(*key, priv); //put prikey bignum to key pair

    ctx = BN_CTX_new(); //create context
    BN_CTX_start(ctx); //init context
    group = EC_KEY_get0_group(*key); //G
    pub = EC_POINT_new(group); //create pub st
    EC_POINT_mul(group, pub, priv, NULL, NULL, ctx); //P = n * G
    EC_KEY_set_public_key(*key, pub); //fill the key pair, !!!crashed here
    EC_KEY_set_conv_form(*key, getcompressed ? POINT_CONVERSION_COMPRESSED : POINT_CONVERSION_UNCOMPRESSED); //compressd or not 
    uint64_t pubkeylen = i2o_ECPublicKey(*key, NULL);
    uint8_t *pubkey = calloc(pubkeylen, sizeof(uint8_t));

    uint8_t* pub_copy = pubkey;
    if (i2o_ECPublicKey(*key, &pub_copy) != pubkeylen) {
        puts("Unable to decode public key");
        return false;
    }

    /*for (int i = 0; i < *pubkeylen; i++) {
        printf("%02X", (*pubkey)[i]);
    }*/

    EC_POINT_free(pub);//free all
    BN_CTX_end(ctx);
    BN_CTX_free(ctx);
    BN_clear_free(priv);
    return true;
}

Просто подтверждение работы, никаких проверок не было добавлено. И я много раз перезапускал программу, видел, что программа взломает sh с другим кодом. Ниже приведены некоторые снимки, сделанные при сбое программы.

, разбившийся при EC_KEY_new_by_curve_name

, разбившийся при EC_KEY_set_public_key

при сбое на главном выходе

связанные библиотеки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...