Mbedtls_pk_parse_public_key 返回 0xfffffff0 和 secp256k1 公钥

Posted

技术标签:

【中文标题】Mbedtls_pk_parse_public_key 返回 0xfffffff0 和 secp256k1 公钥【英文标题】:Mbedtls_pk_parse_public_key returns 0xfffffff0 with secp256k1 public key 【发布时间】:2021-11-15 15:20:13 【问题描述】:

大家好,

我想我错过了什么。我使用 openSSL 生成了一个私钥和公钥对。 使用的线路:

openssl ecparam -name secp256k1 -genkey -noout -out priv_key.pem

openssl ec -in .\priv_key.pem -pubout -out public_key.pem

这给了我我的密钥对。例如这个 私钥:

-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIOBYwBnXMgYHsRSv99H4zgtzSClALIcNBN97QbBPNFzHoAcGBSuBBAAK
oUQDQgAESqPVjJtZ+f7Q5DnhBX/7Xy6CUWi0aEuNbA0JilgF4+T8ruuWl16vrOrI
3dSDDfsafxatLS3BytvtmyOQxye98Q==
-----END EC PRIVATE KEY-----

公钥:

-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESqPVjJtZ+f7Q5DnhBX/7Xy6CUWi0aEuN
bA0JilgF4+T8ruuWl16vrOrI3dSDDfsafxatLS3BytvtmyOQxye98Q==
-----END PUBLIC KEY-----

我正在尝试使用 mbedtls_pk_parse_public_key 将我的公钥解析为 pk_context。我的代码如下所示:

int32_t s32Err = 0; 

mbedtls_pk_init(&pk);

int32_t tempsize = strlen(ecdsaPublic);

s32Err = mbedtls_pk_parse_public_key(&pk, ecdsaPublic, tempsize + 1);

我的公钥 (ecdsaPublic) 被复制/粘贴并格式化如下:

const char* ecdsaPublic =  "-----BEGIN PUBLIC KEY-----\n"
                      "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESqPVjJtZ+f7Q5DnhBX/7Xy6CUWi0aEuN\n"
                      "bA0JilgF4+T8ruuWl16vrOrI3dSDDfsafxatLS3BytvtmyOQxye98Q==\n"
                      "-----END PUBLIC KEY-----\n";

如果我现在让它运行,我会在 s32Err 中得到 0xFFFFFFF0 作为错误代码。可悲的是,我在图书馆的任何地方都找不到这个错误代码,或者我没有在正确的地方搜索。

如果我用另一个公钥尝试完全相同的代码,比如这个:

-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMALAAUWI7loxRd++n5VG+E6gl1NEC8Z
yQmtyzKEdwwJ+qrC9BSi6f5FmutbJYqu1wR6QitVCEXUrtN1rOBCQ78CAwEAAQ==
-----END PUBLIC KEY-----

解析返回0。

有没有人有想法或提示? 我的密钥生成错误吗?

最良好的祝愿和感谢您的帮助和建议!

马克

【问题讨论】:

为什么是tempsize + 1 我需要带有尾随 \0 的整个字符串。这就是我添加tempsize + 1 的原因。我添加了变量tempsize 来查看我传递给函数mbedtls_pk_parse_public_key 的大小。 s32Err是有符号整数,所以是-16,在mbedtls/bignum.h中写为-0x0010。如果您在本机构建 mbedtls,则可以运行 programs/util/strerror -16。其实programs/util/strerror 0xfffffff0 也可以。 @Gilles'SO-stopbeingevil' 你是绝对正确的。我将此信息添加到我的答案中! 【参考方案1】:

我发现了问题:由于我使用的是 Zephyr O/S,我有一个名为 CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE 的配置。这太小了,所以我得到了错误代码0xfffffff0,它代表MBEDTLS_ERR_MPI_ALLOC_FAILED

我现在将CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE 翻倍,并且解析按预期工作。

编辑: 正如@Gilles 'SO- stop be evil' 所提到的,因为 s32Err 是一个有符号整数,值 0xfffffff0 表示 -16 (-0x0010),可以在 mbedtls/bignum.h 中找到。

【讨论】:

以上是关于Mbedtls_pk_parse_public_key 返回 0xfffffff0 和 secp256k1 公钥的主要内容,如果未能解决你的问题,请参考以下文章