c - 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。
有没有人有想法或提示?我的密钥生成错误吗?
最良好的祝愿和感谢您的帮助和建议!
马克
解决方案
我发现了问题:因为我使用的是 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
.
推荐阅读
- bazel - `cc_test` 和 `bazel test` 到底是做什么的?
- c++ - 如何生成没有两个相邻连续数字的排列?
- java - Java基础,反转单词以及如何通过for循环实现
- python - Django - 从 db 过滤或在 python 中计算
- php - PHP 方法存在不起作用。如何解决?
- facebook-opengraph - 开放图元标记被标记为无效
- powershell - 一次处理 4 个 For 循环?
- libgdx - ClickListener 仅适用于 Table Libgdx 中的元素
- python - Python 3.6:在 AWS Ubuntu 上写入文件时忽略新行命令“/n”
- sql - 按子句顺序使用列名时出现歧义错误