如何使用OpenSSL验证来自wolfSSL的ECC签名

时间:2016-10-12 09:13:29

标签: c cryptography elliptic-curve challenge-response wolfssl

我是Elliptic Curve Cryptography,openSSL和wolfSSL的新手。我的上下文是我使用openssl从命令行生成KeyPair并将私钥导入我的代码。然后我使用wolfSSL生成签名并输出它。

我以DER格式保存输出并尝试使用openSSL验证,验证失败。

如果我在我的代码中使用wolfSSL进行签名和验证,它会成功验证,如果我在命令行中使用openSSL进行签名和验证,它也会成功。

是否存在编码问题,我不确定?

更新代码

// ECC public key
const uint8_t pubKey[] ={Hex Format key};
// ECC Signature from wolfSSL
char* sigString = {Signature from wolfSSL returned as char};
/* TYPE CONVERTIONS*/
const uint8_t *der_bytes_copy;
const uint8_t *pub_bytes_copy;
der_bytes_copy = (const unsigned char*)sigString;
pub_bytes_copy = pubKey;


EC_KEY *ECpubkey;
size_t keySize = sizeof(pubKey);
int eccgrp;
eccgrp = OBJ_txt2nid("secp256r1");
 ECpubkey = EC_KEY_new_by_curve_name(eccgrp);
o2i_ECPublicKey(&ECpubkey, &pub_bytes_copy, keySize);
ECDSA_SIG *signature;
signature = d2i_ECDSA_SIG(NULL, &der_bytes_copy, signedSize);
uint8_t digest[36];
int verified;
const char message[] = "Test for Authenticate Kernel with ECC";
SHA256_CTX ctx;
SHA256_Init(&ctx);
SHA256_Update(&ctx, (const uint8_t*)message,sizeof(message));
SHA256_Final(digest, &ctx);
verified = ECDSA_do_verify(digest, sizeof(digest), signature, ECpubkey);

私钥与wolfSSL一起用于签名消息,然后使用openssl进行公钥验证,但这会突然停止。

1 个答案:

答案 0 :(得分:1)

过去使用openSSL并将符号值与wolfSSL进行比较时,我发现OpenSSL在签名时执行以下步骤:

  1. 读入并解码密钥
  2. 计算哈希
  3. 签名编码哈希
  4. 签署编码哈希
  5. Base64编码签名
  6. OpenSSL不会使这个显而易见或用户友好,所以不幸的是,你必须发现它的内容。

    请使用wolfSSL中的以下步骤来实现所需的输出:

    1创建或导入ECC密钥
    2像以前一样计算输入上的sha哈希值 3使用此API调用对哈希进行编码:encodedSz = wc_EncodeSignature(encodedOutput, hashInput, SHA256_DIGEST_SIZE, SHA256h);
    4签署编码的散列
    5现在进行验证

    请告诉我们这是否适合您。