如何让OpenSSL填充EC_KEY中的EC_POINT?

时间:2017-03-02 16:42:04

标签: c encryption openssl elliptic-curve

示例代码:

void BN_println_fp(char* name, BIGNUM* value) {
    if (value != NULL) {
        printf("%s: ", name);
        BN_print_fp(stdout, value);
        printf("\n");
    }
}

void populatePublicKey(int curveName) {
    EC_GROUP *ecgrp = EC_GROUP_new_by_curve_name( curveName );
    EC_KEY* eccKey = EC_KEY_new_by_curve_name(curveName);
    EC_KEY_set_asn1_flag(eccKey, OPENSSL_EC_NAMED_CURVE);
    EC_KEY_set_enc_flags(eccKey, 0);
    if (EC_KEY_generate_key(eccKey) != 1) {
        return NULL;
    }
    EC_POINT *pub = EC_POINT_new( ecgrp );
    const BIGNUM* pbn = EC_KEY_get0_private_key(eccKey);
    EC_POINT_mul( ecgrp, pub, pbn, NULL, NULL, NULL );
    EC_KEY_set_public_key( eccKey, pub);
    BN_println_fp("X", pub->X);
    BN_println_fp("Y", pub->Y);
    BN_println_fp("Z", pub->Z);
}

输出是不可预测的,但由于访问pub中的无效指针而总是会引起恐慌。但是,如果我使用以下功能打印出密钥,我会打印一个公钥。

void printECDSA(EVP_PKEY *pkey) {
    BIO* fp = BIO_new_fp(stdout, BIO_NOCLOSE);
    EVP_PKEY_print_public(fp, pkey, 3, NULL);
    EVP_PKEY_print_private(fp, pkey, 3, NULL);
    BIO_free(fp);
}

是什么给出了?

0 个答案:

没有答案