mbedtls 入門
https://segmentfault.com/a/1190000012007117
ARM mbedtls
使開發人員可以非常輕松地在嵌入式產品中加入加密和SSL/TLS
功能。它提供了具有直觀的API
和可讀源代碼的SSL
庫,可以在大部分系統上直接構建它,也可以手動選擇和配置各項功能。mbedtls
庫提供了一組可單獨使用和編譯的加密組件,還可以使用單個配置頭文件加入或排除這些組件。從功能角度來看,該mbedtls
分為三個主要部分:
-
SSL/TLS
協議實施; -
一個加密庫;
-
一個
X.509
證書處理庫。
編譯安裝
mbedtls
支持make
、cmake
等多種安裝方式,本文介紹make
方式和cmake
方式編譯源代碼,並在目標主機中安裝mbedtls
動態鏈接庫和頭文件。首先通過git clone https://github.com/ARMmbed/mbedtls.git
命令下載源碼。
make
方式
$ make SHARED=1 $ make install DESTDIR=xxx
使用make
時默認情況下並不會生成動態鏈接庫,SHARED=1
生成動態鏈接庫,DESTDIR
指定安裝目錄。
cmake
方式
cmake
方式比make
方式的步驟要多一些,如果目標主機並沒有安裝cmake
工具,可通過apt-get
工具安裝cmake
。
$ cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On . $ make $ sudo make install
-DUSE_SHARED_MBEDTLS_LIBRARY=On
生成動態鏈接庫。
修改mbedtls
配置
mbedtls
也可以通過修改配置文件的方式進行裁剪,mbedtls
提供了幾個參考模板,具體的config.h
文件可參考mbedtls/configs
目錄,該目錄中包括config-ccm-psk-tls1_2.h
, config-mini-tls1_1.h
等文件。和mbedtls
安裝方法相似,可通過make
方法和cmake
方法修改具體配置。
make
方法
# 設置MBEDTLS_CONFIG_FILE宏,指向config-ccm-psk-tls1_2.h $ CFLAGS="-I$PWD/configs -DMBEDTLS_CONFIG_FILE='<config-ccm-psk-tls1_2.h>'" # 重新編譯 $ make
cmake
方法
# 刪除之前cmake相關中間文件,但是不包括CMakeLists.txt文件 $ find . -iname '*cmake*' -not -name CMakeLists.txt -exec rm -rf {} + # 指定配置文件為 config-ccm-psk-tls1_2.h,重新編譯 $ CFLAGS="-I$PWD/configs -DMBEDTLS_CONFIG_FILE='<config-ccm-psk-tls1_2.h>'" $ cmake .
默認情況下,動態鏈接庫安裝至/usr/local/lib
(包括libmbedtls.so
、libmbedcrypto.so
、libmbedx509.so
),頭文件安裝至/usr/local/include/mbedtls
,mbedtls的相關工具將安裝在/usr/local/bin
目錄下(例如gen_key
等)。
示例代碼
示例通過介紹如何使用HMAC
算法生成一個消息認證碼,代碼如下:
#include <string.h> #include <stdio.h> #include "mbedtls/md.h" int main(int argc, char** argv) { int ret = -1; 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) { 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); printf("HMAC: "); for (int i = 0; i < sizeof(digest); i++) { printf("%02X", digest[i]); } 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
格式打印至控制台。
編譯后,執行輸出如下:
$ ./cmake-build/out/src/hmac-test HMAC: 7FD04DF92F636FD450BC841C9418E5825C17F33AD9C87C518115A45971F7F77E
適配打印模塊
mbedtls
調試打印接口使用的是標准庫函數printf()
,如果要替換為自己的接口,可以定義MBEDTLS_PLATFORM_PRINTF_MACRO
來添加自己的打印接口。也可以通過定義 MBEDTLS_PLATFORM_PRINTF_ALT
,然后調用mbedtls_platform_set_printf()
接口設置自己的打印接口。
參考文章
libuv-mbedtls
借助mbedTLS了解DTLS握手協議
AES在openssl和mbedtls中的簡單代碼示例
mbedTLS(PolarSSL)簡單思路和函數筆記(Client端)
mbedtls 入門
Makefile 編譯時如何輸出打印信息
系統編譯:如何給Make命令來傳遞參數
============= End