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 公钥的主要内容,如果未能解决你的问题,请参考以下文章