无法使用 mbedTLS 验证 RSA 签名

问题描述 投票:0回答:1

我正在将 mbedTLS 2.14.1 集成到在旧 ColdFire 处理器上运行的裸机应用程序上。这是 mbedTLS 的旧版本,但它已在我公司的其他项目中使用。

签名由 HSM(Hadrware 安全模块)遵循 PKCS#1 2.1 PSS 填充方案生成。它已通过以下命令行使用 openssl 进行验证:

openssl pkeyutl -verify -pubin -inkey pub.pem -pkeyopt digest:sha256 -pkeyopt rsa_padding_mode:pss -pkeyopt rsa_pss_saltlen:32 -in sha256.bin -sigfile signature.bin

第一步,我只是在我的软件中添加了公钥、SHA256 和签名,并尝试验证签名。密钥存储为字符串(pem 格式,行分隔 )以及哈希和签名作为字节数组,由

hexdump -C
从 sha256.bin 和签名.bin 文件中提取。

unsigned char memory_buff[60000];
static const unsigned char pubKey [] = "-----BEGIN PUBLIC KEY-----\n xxx \n etc... \n-----END PUBLIC KEY-----";
unsigned char sha256[32] = {0x12, ...};
unsigned char signature[512] = {0x34,  ...};
mbedtls_pk_context pk_pub;

/* don't use dynamic allocation */
mbedtls_memory_buffer_alloc_init( (unsigned char *)memory_buff, sizeof(memory_buff) );

/* context init */
mbedtls_pk_init(&pk_pub);

/* key parsing */
ret = mbedtls_pk_parse_public_key( (mbedtls_pk_context *)&pk_pub, pubKey, strlen((const char *)pubKey) + 1);
if( ret != 0 )
{        
    /* do something */
}

/* padding PKCS#1 2.1 */
mbedtls_rsa_set_padding(mbedtls_pk_rsa(pk_pub), MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA256);


ret = mbedtls_rsa_pkcs1_verify( (mbedtls_rsa_context *)pk_pub.pk_ctx, NULL, NULL, MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA256, 0, sha256, signature );
if( ret != 0 )
{        
    /* do something */
}

mbedTLS的配置为:

#define MBEDTLS_HAVE_INT32
#define MBEDTLS_NO_UDBL_DIVISION
/* #define MBEDTLS_HAVE_TIME*/
/* #define MBEDTLS_HAVE_TIME_DATE */
#define MBEDTLS_PLATFORM_MEMORY
#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
#define MBEDTLS_ENTROPY_HARDWARE_ALT
#define MBEDTLS_REMOVE_ARC4_CIPHERSUITES
#define MBEDTLS_NO_PLATFORM_ENTROPY
/*#define MBEDTLS_SELF_TEST*/
#define MBEDTLS_PLATFORM_FPRINTF_MACRO
#define MBEDTLS_PLATFORM_PRINTF_MACRO
#define MBEDTLS_PLATFORM_SNPRINTF_MACRO snprintf
#define MBEDTLS_VERSION_FEATURES
#define MBEDTLS_AES_C
#define MBEDTLS_CIPHER_MODE_CBC
#define MBEDTLS_AES_ROM_TABLES
#define MBEDTLS_ARC4_C
#define MBEDTLS_ASN1_PARSE_C
#define MBEDTLS_ASN1_WRITE_C
#define MBEDTLS_BASE64_C
#define MBEDTLS_BIGNUM_C
#define MBEDTLS_CERTS_C
/*#define MBEDTLS_CIPHER_C*/
#define MBEDTLS_CTR_DRBG_C
#define MBEDTLS_ENTROPY_C
#define MBEDTLS_ERROR_C
#define MBEDTLS_HMAC_DRBG_C
#define MBEDTLS_MD_C
#define MBEDTLS_MEMORY_BUFFER_ALLOC_C
#define MBEDTLS_OID_C
/*#define MBEDTLS_PADLOCK_C*/
#define MBEDTLS_PEM_PARSE_C
#define MBEDTLS_PEM_WRITE_C
#define MBEDTLS_PLATFORM_C
#define MBEDTLS_SHA1_C
#define MBEDTLS_SHA256_C
#define MBEDTLS_VERSION_C

#define MBEDTLS_PKCS1_V21
#define MBEDTLS_PKCS1_V15

#define MBEDTLS_RSA_C
#define MBEDTLS_BIGNUM_C
#define MBEDTLS_OID_C

#define MBEDTLS_PK_C
#define MBEDTLS_PK_PARSE_C

我收到错误 MBEDTLS_ERR_RSA_VERIFY_FAILED。

我使用 mbedTLS 时可能有一个错误,你有什么想法吗?

c rsa mbedtls
1个回答
0
投票

验证错误是由于我的lib配置造成的。由于我的目标堆栈有限,我将

MBETLS_MPI_WINDOW_SIZE
减少到 4(而不是 6),将
MBEDTLS_MPI_MAX_SIZE
减少到 512(而不是 1024)。

使用原始配置验证OK

© www.soinside.com 2019 - 2024. All rights reserved.