mbedtls 入門


mbedtls 入門

https://segmentfault.com/a/1190000012007117

 

ARM mbedtls使開發人員可以非常輕松地在嵌入式產品中加入加密和SSL/TLS功能。它提供了具有直觀的API和可讀源代碼的SSL庫,可以在大部分系統上直接構建它,也可以手動選擇和配置各項功能。mbedtls庫提供了一組可單獨使用和編譯的加密組件,還可以使用單個配置頭文件加入或排除這些組件。從功能角度來看,該mbedtls分為三個主要部分:

  • SSL/TLS協議實施;

  • 一個加密庫;

  • 一個X.509證書處理庫。

編譯安裝

mbedtls支持makecmake等多種安裝方式,本文介紹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.hconfig-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.solibmbedcrypto.solibmbedx509.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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM