mbedTLS简介

本文介绍了mbedTLS,一款由ARM公司维护的开源SSL/TLS库,专为小型嵌入式设备设计,提供模块化API和高效加密功能。我们详细解读了关键结构体如公钥算法类型、摘要算法类型以及证书处理,并通过HMAC示例展示了其实用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mbedTLS的背景介绍

MbedTLS前身是开源加密算法库PolarSLL,现已被arm公司收购并由arm技术团队进行维护更新,是对TLS和SSL协议实现的算法库。mbedTLS的目标是:易于理解,使用,集成和扩展。
MbedTLS核心代码用C编程语言编写,实现SSL模块和各种加密算法,并提供各种加密算法的自测试代码。和其他TLS/SSL算法库实现不同,mbedTLS主要是面向小型嵌入式设备,代码紧凑,最小完整的TLS堆栈需要60KB的程序空间和64KB的RAM空间,而且执行效率高,可以说是行业内最小巧的SSL加密算法库。
另外,mbedTLS是高度模块化的设计:每个组件,如加密函数,可以独立于框架的其余部分使用。mbedTLS完全是由C语言编写的,没有外部依赖,因此,mbedTLS是应用于嵌入式系统最理想的TLS加密算法库。更重要的一点是,mbedTSL是完全OpenSource的,支持Apache 2.0 license 或者GPL 2.0 license双重许可,可以自由应用于商业项目中。

关于mbedTLS的简要概括

ARM mbedtls使开发人员可以非常轻松地在(嵌入式产品中加入加密和 SSL/TLS 功能。它提供了具有直观的 API 和可读源代码的 SSL 库。该工具即开即用,可以在大部分系统上直接构建它,也可以手动选择和配置各项功能。
mbedtls 库提供了一组可单独使用和编译的加密组件,还可以使用单个配置头文件加入或排除这些组件。
从功能角度来看,该mbedtls分为三个主要部分:

  • SSL/TLS 协议实施
  • 一个加密库
  • 一个 X.509 证书处理库

mbedTLS常用结构体

1. 公钥算法类型mbedtls_pk_type_t

/*
 * \brief          Public key types
 */
typedef enum {
    MBEDTLS_PK_NONE=0,
    MBEDTLS_PK_RSA,
    MBEDTLS_PK_ECKEY,
    MBEDTLS_PK_ECKEY_DH,
    MBEDTLS_PK_ECDSA,
    MBEDTLS_PK_RSA_ALT,
    MBEDTLS_PK_RSASSA_PSS,
	MBEDTLS_PK_SM2,
} mbedtls_pk_type_t;

2. 摘要算法类型mbedtls_md_type_t

typedef enum {
    MBEDTLS_MD_NONE=0,
    MBEDTLS_MD_MD2,
    MBEDTLS_MD_MD4,
    MBEDTLS_MD_MD5,
    MBEDTLS_MD_SHA1,
    MBEDTLS_MD_SHA224,
    MBEDTLS_MD_SHA256,
    MBEDTLS_MD_SHA384,
    MBEDTLS_MD_SHA512,
    MBEDTLS_MD_RIPEMD160,
	MBEDTLS_MD_SM3,
} mbedtls_md_type_t;

3. 公钥上下文mbedtls_pk_context

/**
 * \brief           Public key container
 */
typedef struct
{
    const mbedtls_pk_info_t *   pk_info; /**< Public key informations  公钥信息        */
    void *                      pk_ctx;  /**< Underlying public key context  底层公钥上下文*/
} mbedtls_pk_context;

4. 解析证书得到的mbedtls_pk_info_t

struct mbedtls_pk_info_t //解析证书得到的
{
    /** Public key type */
    mbedtls_pk_type_t type;
    /** Type name */
    const char *name;
    /** Get key size in bits */
    size_t (*get_bitlen)( const void * );
    /** Tell if the context implements this type (e.g. ECKEY can do ECDSA) */
    int (*can_do)( mbedtls_pk_type_t type );
    /** Verify signature *///验证签名,证书,秘钥交换时服务器签名(如果有的话)
    int (*verify_func)( void *ctx, mbedtls_md_type_t md_alg,
                        const unsigned char *hash, size_t hash_len,
                        const unsigned char *sig, size_t sig_len );
 
    /** Make signature *///用秘钥来加密
    int (*sign_func)( void *ctx, mbedtls_md_type_t md_alg,
                      const unsigned char *hash, size_t hash_len,
                      unsigned char *sig, size_t *sig_len,
                      int (*f_rng)(void *, unsigned char *, size_t),
                      void *p_rng );
 
    /** Decrypt message *///秘钥交换,服务器解密使用
    int (*decrypt_func)( void *ctx, const unsigned char *input, size_t ilen,
                         unsigned char *output, size_t *olen, size_t osize,
                         int (*f_rng)(void *, unsigned char *, size_t),
                         void *p_rng );
 
    /** Encrypt message */ //秘钥交换时加密秘钥用
    int (*encrypt_func)( void *ctx, const unsigned char *input, size_t ilen,
                         unsigned char *output, size_t *olen, size_t osize,
                         int (*f_rng)(void *, unsigned char *, size_t),
                         void *p_rng );
 
    /** Check public-private key pair */
    int (*check_pair_func)( const void *pub, const void *prv );
    /** Allocate a new context */
    void * (*ctx_alloc_func)( void );
    /** Free the given context */
    void (*ctx_free_func)( void *ctx );
    /** Interface with the debug module */
    void (*debug_func)( const void *ctx, mbedtls_pk_debug_item *items );
};

mbedTLS使用事例

下面我们通过一个示例来说明如何使用mbedtls。这个示例通过介绍如何使用HMAC算法生成一个消息认证码。
hmac-test.c代码如下:

#include <string.h>
#include <stdio.h>
#include "mbedtls/md.h"
 
#define mbedtls_printf     printf
 
int main(void)
{
    int ret;
    unsigned char secret[] = "a secret";
    unsigned char buffer[] = "some data to hash";
    unsigned char digest[32];
    mbedtls_md_context_t sha_ctx;
 
    mbedtls_md_init(&sha_ctx);
    memset(digest, 0x00, sizeof(digest));
 
    ret = mbedtls_md_setup(&sha_ctx, mbedtls_md_info_from_type(MBEDTLS_MD_SHA256), 1);
    if (ret != 0)
    {
        mbedtls_printf("  ! mbedtls_md_setup() returned -0x%04x\n", -ret);
        goto exit;
    }
 
    mbedtls_md_hmac_starts(&sha_ctx, secret, sizeof(secret) - 1);
    mbedtls_md_hmac_update(&sha_ctx, buffer, sizeof(buffer) - 1);
    mbedtls_md_hmac_finish(&sha_ctx, digest );
 
    mbedtls_printf("HMAC: ");
    for (int i = 0; i < sizeof(digest); i++)
        mbedtls_printf("%02X", digest[i]);
    mbedtls_printf("\n");
 
exit:
    mbedtls_md_free( &sha_ctx );
 
    return ret;
}
  • hmac算法需要两个参数,一个称为秘钥,此处为secret,另一个称为消息,此处为buffer
  • 消息认证码保留在 digest 数组中
  • 此处hmac算法选择sha256算法作为单向散列函数,所以hmac的计算结果一定为32字节

在mbedtls中,消息认证码的生成分为三个步骤:

  • mbedtls_md_hmac_starts 设置密钥
  • mbedtls_md_hmac_update 填充消息,本示例仅填充了一次
  • mbedtls_md_hmac_finish 生成消息认证码,结果保存至digest中

最后把digest使用HEX格式打印至控制台。

mbedTLS_API分析

应用层 API 是提供给用户在 App 中直接使用的 API,这部分 API 屏蔽了 mbedtls 内部具体的操作步骤,简化了用户使用。
这里分享 ARM mbedtls API 手册给大家。

参考文章

http://www.elecfans.com/emb/20180524682699.html
https://blog.youkuaiyun.com/u010144805/article/details/78740541
https://blog.youkuaiyun.com/weixin_41965270/article/details/88687320

### 关于mbedTLS中的SM2加密算法实现与使用 #### mbedTLS简介及其优势 mbedTLS是一个轻量级的密码学库,适用于嵌入式系统和其他资源受限环境。该库不仅支持常见的国际标准加密算法,还提供了对中国国家商用密码标准的支持,其中包括SM2椭圆曲线公钥密码算法[^1]。 #### 实现过程概述 在基于mbedTLS实现SM2签名和验证功能时,开发者通常会遇到一定的挑战。为了简化集成工作并提高安全性,建议遵循官方文档以及社区贡献者的最佳实践案例。具体来说: - **初始化上下文对象**:创建用于执行特定操作所需的结构体实例。 ```c mbedtls_ecdsa_context ctx; mbedtls_ecp_keypair *keypair = NULL; mbedtls_ecdsa_init(&ctx); ``` - **加载私钥或生成密钥对**:如果已有私钥,则直接导入;否则调用相应API生成新的密钥对。 ```c // 加载PEM格式私钥 FILE *fp = fopen("private.pem", "rb"); size_t n = fread(buf, 1, sizeof buf - 1, fp); fclose(fp); mbedtls_pk_parse_key(&privkey, buf, n, pwd, pwdlen); ``` - **设置参数配置**:指定使用的椭圆曲线及其他必要选项。 ```c const char* curve_name = MBEDTLS_ECP_DP_SM2; mbedtls_ecp_group_id grp_id = mbedtls_ecp_grp_id_from_name(curve_name); mbedtls_ecp_group_load(&grp, grp_id); ``` - **执行签名运算** ```c unsigned char hash[32]; int ret = mbedtls_md_hmac_sha256(message, msg_len, key, key_len, hash, 32); if ((ret = mbedtls_ecdsa_sign_detached(&ctx, &sig_r, &sig_s, hash, 32)) != 0) { printf(" failed\n ! mbedtls_ecdsa_sign_detached returned %d\n\n", ret); goto exit; } ``` - **进行验签处理** 验证接收到的消息是否确实由预期发送方签署,并未被篡改。 ```c if ((ret = mbedtls_ecdsa_verify_restartable( &ctx, hash, 32, sig.r, sig.s)) != 0) { printf("failed\n ! mbedtls_ecdsa_verify returned %d\n\n", ret); goto exit; } else { printf("Signature is valid.\n"); } ``` 上述代码片段展示了如何利用mbedTLS完成基本的SM2签名及验证流程。值得注意的是,在实际应用中还需要考虑更多细节问题,如错误处理机制的设计、性能优化策略的选择等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值