mbed TLS 简明教程(一)

原文地址
译者:远方的自由
转载请注明出处: http://blog.csdn.net/z2066411585

概述

mbed tls库的设计可以轻松地与现有(嵌入式)应用程序集成,并为安全通讯、密码学和密钥管理提供构建模块.本教程将帮助你了解如何执行这些步骤.

mbed tls 被设计成尽可能松散耦合,让你只需要整合你需要的部分,而不需要关注其余部分.这也为mbed tls 带来了非常低内存占用和构建足迹.通过消除你系统中不需要的部分,你可以将构建版本从低至45kB的版本升级到更典型的300kB版本,以实现更加全面的功能.

mbed tls 被设计成以嵌入式环境作为主要目标的便携式C语言,运行在像ARM和AVR到PCS和iPad,iphones甚至是xbox这样的嵌入式平台上.

堆栈解释(Stack explanation)

本教程的目的是向你展示如何确保你的客户端和服务端与mbed tls的通信.让我们开始展示所涉及的主要组件.
mbedtls-stack.png

从下往上:

  • 硬件(Hardware)

硬件平台提供物理处理器,存储器,内存和网络接口

  • 操作系统(Operating System)
    操作系统提供以太网驱动程序和标准服务.这取决于操作系统,包括调度,线程安全,和一个完整的网络堆栈.

  • 网络堆栈(Network Stack)
    取决于操作系统,网络堆栈要么完全集成,要么是一个单独的模块,从网络接口提供抽象层.最常用的是 lwIP TCP/IP stackuIP TCP/IP stack.

  • mbed TLS SSL/TLS Library
    建立在网络接口之上, mbed tls 为安全通信提供了一个抽象层.

  • 客户端应用(Client Application)
    客户端应用程序使用mbed tls 本身抽象安全通信.

将mbed tls 集成到应用程序的确切步骤非常依赖与上面特定组件.在基本教程中,我们将假设一个集成了BSD-like TCP/IP 堆栈的操作系统

SSL/TLS 说明

mbed tls的ssl/tls部分提供了使用ssl/tls通过安全通信通道建立和通信方法.

  • 其基本规定是:
    • 初始化一个SSL/TLS context
    • 执行一个SSL/TLS握手(handshake)
    • 发送/接收数据
    • 通知对方一个连接正在关闭
  • 一个通道很多方面都是通过参数和回调函数来设置的.
    • 端点角色(endpoint role),客户端和服务器 
    • 身份验证模式: 是否应该进行证书验证
    • 主机到主机通信通道: 发送和接收功能
    • 随机数生成器(RNG)功能
    • 用于加密/解密的密码
    • 证书验证功能
    • 会话控制: 会话获取和设置功能
    • 证书处理和密钥交换的X.509参数 

mbed 通过创建一个SSL/TLS服务器和客户端,通过提供一个框架来建立和通过SSL/TLS通信通道进行通信.SSL/TLS部分直接依赖于库的证书解析,对称和非对称和哈希模块.

参考

  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mbedtls中,可以使用以下代码生成一个ECDSA公钥和私钥: ```c #include <stdio.h> #include "mbedtls/ecdsa.h" #include "mbedtls/pk.h" #include "mbedtls/error.h" int main(void) { int ret = 0; mbedtls_pk_context key; mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; const char *pers = "ecdsa_genkey"; const mbedtls_ecp_curve_info *curve_info; mbedtls_ecdsa_context ecdsa; mbedtls_pk_init(&key); mbedtls_ctr_drbg_init(&ctr_drbg); mbedtls_entropy_init(&entropy); mbedtls_ecdsa_init(&ecdsa); //初始化随机数生成器 ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *) pers, strlen(pers)); if (ret != 0) { mbedtls_printf("mbedtls_ctr_drbg_seed failed: %d\n", ret); goto exit; } //选择椭圆曲线 curve_info = mbedtls_ecp_curve_info_from_name(MBEDTLS_ECP_DP_SECP256R1); if (curve_info == NULL) { mbedtls_printf("mbedtls_ecp_curve_info_from_name failed\n"); goto exit; } //生成密钥对 ret = mbedtls_pk_setup(&key, mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY)); if (ret != 0) { mbedtls_printf("mbedtls_pk_setup failed: %d\n", ret); goto exit; } ret = mbedtls_ecp_gen_keypair(&curve_info->grp, mbedtls_pk_ec(key), mbedtls_ctr_drbg_random, &ctr_drbg); if (ret != 0) { mbedtls_printf("mbedtls_ecp_gen_keypair failed: %d\n", ret); goto exit; } //获取公钥和私钥 mbedtls_ecdsa_init(&ecdsa); mbedtls_ecdsa_from_keypair(&ecdsa, mbedtls_pk_ec(key)); //打印公钥和私钥 mbedtls_printf("Private key: "); for (size_t i = 0; i < mbedtls_pk_ec(key)->d_len; i++) { mbedtls_printf("%02x", mbedtls_pk_ec(key)->d[i]); } mbedtls_printf("\n"); mbedtls_printf("Public key: "); for (size_t i = 0; i < 2 * curve_info->grp.pbits / 8 + 1; i++) { mbedtls_printf("%02x", ecdsa.Qp.X.p[i]); } for (size_t i = 0; i < 2 * curve_info->grp.pbits / 8 + 1; i++) { mbedtls_printf("%02x", ecdsa.Qp.Y.p[i]); } mbedtls_printf("\n"); exit: mbedtls_pk_free(&key); mbedtls_ctr_drbg_free(&ctr_drbg); mbedtls_entropy_free(&entropy); mbedtls_ecdsa_free(&ecdsa); return ret; } ``` 在上面的代码中,使用了SECP256R1椭圆曲线生成密钥对,如果需要使用其他椭圆曲线,可以替换`MBEDTLS_ECP_DP_SECP256R1`和`mbedtls_ecp_curve_info_from_name`中的参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值