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
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
typedef struct
{
const mbedtls_pk_info_t * pk_info;
void * pk_ctx;
} mbedtls_pk_context;
4. 解析证书得到的mbedtls_pk_info_t
struct mbedtls_pk_info_t
{
mbedtls_pk_type_t type;
const char *name;
size_t (*get_bitlen)( const void * );
int (*can_do)( mbedtls_pk_type_t type );
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 );
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 );
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 );
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 );
int (*check_pair_func)( const void *pub, const void *prv );
void * (*ctx_alloc_func)( void );
void (*ctx_free_func)( void *ctx );
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.csdn.net/u010144805/article/details/78740541 https://blog.csdn.net/weixin_41965270/article/details/88687320
|