Mbedtls_pk_parse_public_key returns 0xfffffff0 与 secp256k1 public 密钥

Mbedtls_pk_parse_public_key returns 0xfffffff0 with secp256k1 public key

Heija 大家,

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

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-----

public键:

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

我正在尝试将带有 mbedtls_pk_parse_public_key 的 public 密钥解析为 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);

我的 public 密钥 (ecdsaPublic) 是 copy/pasted 并且格式如下:

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

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

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

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

解析returns0.

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

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

马克

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

我现在加倍了 CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE 并且解析工作正常。

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

中找到