首页 > 解决方案 > Mbedtls_pk_parse_public_key 返回 0xfffffff0 和 secp256k1 公钥

问题描述

大家好,

我想我错过了一些东西。我使用 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。

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

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

马克

标签: ccryptographymbedtls

解决方案


我发现了问题:因为我使用的是 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.


推荐阅读