【问题标题】:Verify ECDSA signature with MbedTLS 3.X使用 MbedTLS 3.X 验证 ECDSA 签名
【发布时间】:2022-10-18 03:45:10
【问题描述】:

客户向我发送一条使用私钥签名的消息,键入 ECDSA secp256R1。我拥有客户提供的 DER 格式的叶子证书。此外,我还有原始消息和 msg 的 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_contextmbedtls_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"

【问题讨论】:

    标签: signing verify ecdsa mbedtls


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多