认识mbedTLS

认识mbedTLS是在code里面一个文件夹的名字,好奇这个是什么。

mbedTLS(前身 PolarSSL)是一个由 ARM 公司开源和维护的 SSL/TLS 算法库。其使用 C 编程语言以最小的编码占用空间实现了 SSL/TLS 功能及各种加密算法,易于理解、使用、集成和扩展,方便开发人员轻松地在嵌入式产品中使用 SSL/TLS 功能。

mbedTLS主要是面向小型嵌入式设备,代码紧凑,最小完整的TLS堆栈需要60KB的程序空间和64KB的RAM空间,而且执行效率高,可以说是行业内最小巧的SSL加密算法库。

另外,mbedTLS是高度模块化的设计:每个组件,如加密函数,可以独立于框架的其余部分使用。mbedTLS完全是由C语言编写的,没有外部依赖,因此,mbedTLS是应用于嵌入式系统最理想的TLS加密算法库。更重要的一点是,mbedTSL是完全OpenSource的,支持Apache 2.0 license 或者GPL 2.0 license双重许可,可以自由应用于商业项目中。

mbedTLS 软件包提供了如下的能力:

  • 完整的 SSL v3、TLS v1.0、TLS v1.1 和 TLS v1.2 协议实现
  • X.509 证书处理
  • 基于 TCP 的 TLS 传输加密+
  • 基于 UDP 的 DTLS(Datagram TLS)传输加密
  • 其它加解密库实现

二、安全通信连接应用工作原理

mbedTLS 建立安全通信连接需要经过以下几个步骤:

  • 初始化 SSL/TLS 上下文
  • 建立 SSL/TLS 握手
  • 发送、接收数据
  • 交互完成,关闭连接

其中,最关键的步骤就是 SSL/TLS 握手 连接的建立,这里需要进行证书校验。

1-SSL/TLS 握手流程

2-DTLS 握手流程

为了避免拒绝服务攻击,DTLS采用和IKE一样的无状态 cookie 技术。当客户端发送 client hello 消息后,服务器发送 HelloVerifyRequest 消息,这个消息包含了无状态 cookie。客户端收到之后必须重传添加上了 cookie 的 clienthello。

DTLS 握手流程如下图所示:

三、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     printfint 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】 手册给大家。

六、mbedtls安装与入门

如果你实在忍不住你的手,想自己实际操作一下,可以参考前辈的这篇blog:【mbedtls安装与入门】

https://blog.csdn.net/HORHEART/article/details/119973660
https://www.cnblogs.com/god-of-death/p/14365980.html

简单认识一下mbedTLS相关推荐

  1. stm32 lwip 如何发送不出_mbedtls | 移植mbedtls库到STM32裸机的两种方法

    一.mbedtls 开源库 1. mbedtls是什么 Mbed TLS是一个开源.可移植.易于使用.代码可读性高的SSL库.可实现加密原语,X.509证书操作以及SSL / TLS和 DTLS 协议 ...

  2. 基于mbedTLS算法库实现国密SM2签名和验签算法

    网上有大量的基于OpenSSL实现的国密算法库,比如著名的GmSSL,可以直接拿来用.我自己常用的是mbedTLS的算法库,比较小巧简单,在mbedTLS的大数算法的基础上实现了国密SM2的签名和验签 ...

  3. mbedTLS(PolarSSL)简单思路和函数笔记(Client端)

    转自: OpenSSL一直以来各种被诟病,具体挑了哪些刺,本文就不深究.作为OpenSSL有很多替代,我了解到的有cyaSSL(WolfSSL)和PolorSSL.其中PolarSSL已经被ARM收购 ...

  4. STM32 基础系列教程 50 – MbedTls

    前言 mbed TLS(以前称为PolarSSL)是TLS和SSL协议的实现,并且需要相应的加密算法和支持代码.这是双重许可与Apache许可证 2.0版(与GPLv2许可也可).网站上指出,mbed ...

  5. mbedtls 入门第四课--移植mbedtls到VS和ESP8266--8266SDK SHA256移植

    承接上篇,我们初步了解了mbedtls的文件路径以及文件作用以后就是想着如何将mbedtls移植到各种平台. 博主这里只有两种移植方法,第一是将代码移植到VS中,第二个是将代码移植到博主跑动的比较多的 ...

  6. mbedtls学习2.mbedtls从0使用指南

    1.使用指南 这里主要介绍 mbedtls 程序的基本使用流程,并针对使用过程中经常涉及到的结构体和重要 API 进行简要说明. mbedtls 的基本工作流程如下所示: 初始化 SSL/TLS 上下 ...

  7. mbedtls 库基础及其应用

    文章目录 1.引言 1.1 为什么要加密 1.2 SSL/TLS协议的历史 2.SSL/TLS演化 2.1 明文时代 2.2 对称加密时代 2.3 非对称加密时代 2.4 公证时代 2.5 TLS协议 ...

  8. 基于mbedtls的AES加密(C/C++)

    环境 操作系统:WSL2-Ubuntu22.04 加密库:mbedtls,Base64 在线AES计算网站:SSLeye 代码中需要用到mbedtls和Base64,可以根据上述链接获取 简介 高级加 ...

  9. mbedtls 安装与使用

    根据项目需求,从官网上下载相应的tar包,解压编译,并用网上大佬的demo进行测试,对整个使用进行简单的整理,希望能给大家的程序开发提供帮助.在此非常感谢网上大佬们的测试方法与问题解决思路,也非常感谢 ...

最新文章

  1. Oracle inline view 简介
  2. linux查看端口所占用的进程号
  3. WIFI 网络操作--------------------笔记
  4. 微电子学与计算机期刊2019,微电子与通信工程学院研究生两篇论文被人工智能顶级会议AAAI 2019接收...
  5. python 下载股票数据_利用python下载股票交易数据
  6. 中交四航局及中广核工程公司学员参加友勤第12期Oracle P6项目管理软件培训班
  7. 【官方文档】Fluent Bit 安装
  8. 一款 redis客户端工具RedisDesktopManager的安装和使用
  9. RSA算法生成2048位公私钥
  10. c语言编程串级控制,组态王-串级控制
  11. DCDC Bootstrap自举电路
  12. C语言数据结构——广义表
  13. c#中文件路径出现非法字符怎么办?解决也容易
  14. 【空心杯四旋翼TinyLeaf】四旋翼基础
  15. mysql meb物理备份
  16. 台湾国立大学郭彦甫Matlab教程笔记(1)schedule
  17. 【转录调控网络】典型的基因转录调控网络推导方法——微分方程方法
  18. mysql为什么要分库_mysql为什么要分库分表?
  19. 统信UOS从虚拟机(BIOS引导)迁移到本机物理机加UEFI改造
  20. Vue Echarts Bmap

热门文章

  1. 二维地图性能优化(一)
  2. 使用wsimport生成客户端代码
  3. 二叉搜索树、平衡二叉搜索树和红黑树
  4. 制作网上投票链接制作可以投票的链接制作制作一个投票链接
  5. 教你几个方法来保护自己的隐私
  6. Facebook广告投放目标的简化
  7. 零基础无实物一步一步学PLCS7-1200仿真(八)-按键控制数码管显示
  8. Couchebase命令行工具cbq
  9. java调用插件_从任何java应用程序调用自己的eclipse插件方法
  10. 阅读器也能个性化?屏保加密换字体,掌阅一个都不少