使用MbedTLS3.X验证ECDSA签名



客户端向我发送一条用私钥签名的消息,键入ECDSA secp256R1。我拥有一份由客户提供的DER格式的叶子证书。此外,我还有原始消息和消息的sha256摘要。

我创建了一个结构,用于存储验证所需的所有信息,目的是在我的应用程序中提供一个公共的API:

struct SignatureVerifyData {
unsigned char *msg;
unsigned char *hash; // digest sha256 of msg
unsigned char *cert; // leaf cert in DER
unsigned char *signature; 
size_t msg_len;
size_t hash_len;
size_t cert_len;
size_t signature_len;
};

我正在阅读MbedTLS中的ecdsa.c示例,但在这种情况下,证书是在同一个示例中生成的,我可以使用mbedtls_x509_crt_parse_der()加载我的叶证书,但是,我应该将其移动到mbedtls_ecdsa_context对象中与mbedtls_ecdsa_read_signature()一起使用吗?

我应该使用其他方式加载叶证书吗?

困惑于如何使用组和点对象,或者我是否需要使用它们。

#define MBEDTLS_HAVE_ASM
#define MBEDTLS_HAVE_TIME
#define MBEDTLS_ALLOW_PRIVATE_ACCESS
#define MBEDTLS_PLATFORM_C
#define MBEDTLS_ECP_DP_SECP256R1_ENABLED
#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
#define MBEDTLS_SSL_PROTO_TLS1_2
#define MBEDTLS_AES_C
#define MBEDTLS_ASN1_PARSE_C
#define MBEDTLS_ASN1_WRITE_C
#define MBEDTLS_BIGNUM_C
#define MBEDTLS_CIPHER_C
#define MBEDTLS_CTR_DRBG_C
#define MBEDTLS_ECDH_C
#define MBEDTLS_ECDSA_C
#define MBEDTLS_ECP_C
#define MBEDTLS_ENTROPY_C
#define MBEDTLS_GCM_C
#define MBEDTLS_MD_C
#define MBEDTLS_NET_C
#define MBEDTLS_OID_C
#define MBEDTLS_PK_C
#define MBEDTLS_PK_PARSE_C
#define MBEDTLS_SHA224_C
#define MBEDTLS_SHA256_C
#define MBEDTLS_SHA384_C
#define MBEDTLS_SHA512_C
#define MBEDTLS_SSL_CLI_C
#define MBEDTLS_SSL_SRV_C
#define MBEDTLS_SSL_TLS_C
#define MBEDTLS_X509_CRT_PARSE_C
#define MBEDTLS_X509_USE_C
#define MBEDTLS_BASE64_C
#define MBEDTLS_PEM_PARSE_C
#define MBEDTLS_AES_ROM_TABLES
#define MBEDTLS_MPI_MAX_SIZE    48 // 384-bit EC curve = 48 bytes
#define MBEDTLS_ECP_WINDOW_SIZE        2
#define MBEDTLS_ECP_FIXED_POINT_OPTIM  0
#define MBEDTLS_ECP_NIST_OPTIM
#define MBEDTLS_ENTROPY_MAX_SOURCES 2
#define MBEDTLS_SSL_CIPHERSUITES                        
MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,    
MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
#define MBEDTLS_SSL_IN_CONTENT_LEN             1024
#define MBEDTLS_SSL_OUT_CONTENT_LEN             1024
#include "mbedtls/check_config.h"

mbedtls_x509_crt_parse_der构造类型为mbedtls_x509_crt的对象。该结构有一个名为pk的字段,该字段包含公钥。调用mbedtls_pk_verify验证签名。

以下是解析证书、计算哈希和验证签名的代码的总体思想。未测试的代码,直接输入到我的浏览器中。省略了错误检查,请确保检查所有函数调用是否成功。

#include <mbedtls/md.h>
#include <mbedtls/pk.h>
#include <mbedtls/x509_crt.h>
mbedtls_x509_crt crt;
mbedtls_x509_init(&crt);
mbedtls_x509_crt_parse_der(&crt, cert, cert_len);
const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
hash_len = mbedtls_md_get_size(md_info);
hash = malloc(hash_len);
mbedtls_md(md_info, msg, msg_len, hash);
mbedtls_pk_verify(&crt->pk, MBEDTLS_MD_SHA256, hash, hash_len, signature, signature_len);
mbedtls_x509_free(&crt);
free(hash);

最新更新