1. 程式人生 > >mbedtls安裝與入門(mbedtls安裝與入門)

mbedtls安裝與入門(mbedtls安裝與入門)

引用http://www.mamicode.com/info-detail-1831476.html

下面需要修改的地方(CMakeLists.txt 檔名大小寫敏感),(使用sudo vim /etc/ld.so.conf 新增內容:/etc/local/lib ;然後呼叫sudo ldconfig 使修改生效),(需要安裝編譯器sudo apt-get install g++),(CMakeLists.txt 內容中移除CMakeLists.txt ), (make出錯請檢測.c檔案內容是否一致比如#include<String.h>變成了include<String.h>等)

mbedtls簡介

ARM mbedtls使開發人員可以非常輕鬆地在(嵌入式產品中加入加密和 SSL/TLS 功能。它提供了具有直觀的 API 和可讀原始碼的 SSL 庫。該工具即開即用,可以在大部分系統上直接構建它,也可以手動選擇和配置各項功能。

mbedtls 庫提供了一組可單獨使用和編譯的加密元件,還可以使用單個配置標頭檔案加入或排除這些元件。 
從功能角度來看,該mbedtls分為三個主要部分: 
- SSL/TLS 協議實施。 
- 一個加密庫。 
- 一個 X.509 證書處理庫。

mbedtls安裝

下面介紹如何在 Ubuntu/Debian/raspbian環境下正確安裝mbedtls。

克隆原始碼

前往github克隆最新版的mbedtls原始碼。獲取最新版原始碼之前需要在Ubuntu/Debian中正確安裝Git工具

 git clone https://github.com/ARMmbed/mbedtls.git
  • 1
  • 1

切換分支(可選)

切換到某個release分支,此處選擇mbedtls-2.4。

git checkout -b mbedtls-2.4 origin/mbedtls-2.4
  • 1
  • 1

通過git checkout可檢出具體分支 
- checkout 切換分支 
- -b mbedtls-2.4 建立本地分支 
- origin/mbedtls-2.4 切換到遠端分支mbedtls-2.4

檢視分支

通過git branch檢視分支,確認已經切換到mbedtls-2.4分支

git branch 
  development
* mbedtls-2.4
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

安裝

mbedtls支援make、cmake等多種安裝方式。下面介紹make方式和cmake方式編譯原始碼,並在目標主機中安裝mbedtls動態連結庫和標頭檔案。本文推薦使用cmake工具安裝mbedtls。

make方式

make SHARED=1
sudo make install
  • 1
  • 2
  • 1
  • 2
  • 使用make時預設情況下並不會生成動態連結庫
  • SHARED=1 生成動態連結庫

cmake方式(推薦)

cmake方式比make方式的步驟要多一些,如果目標主機並沒有安裝cmake工具,可通過apt-get工具安裝cmake。

# 更新軟體源
sudo apt-get update
# 通過軟體源安裝cmake
sudo apt-get install cmake
# 生成makefile檔案,啟用生成動態連結庫選項
cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On.# 以下步驟和make方式相同
make
sudo make install
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • -DUSE_SHARED_MBEDTLS_LIBRARY=On 生成動態連結庫
  • 使用cmake時,不要忘記之後cmake指令之後的 . ,該點表示當前目錄

修改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
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

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 .
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

安裝總結

  • 預設情況下 動態連結庫安裝至 /usr/local/lib 包括libmbedtls.so libmbedcrypto.so libmbedx509.so
  • 預設情況下 標頭檔案安裝至 /usr/local/include/mbedtls
  • 預設情況下 mbedtls的相關工具將安裝只 /usr/local/bin目錄下,例如gen_key等

基礎示例

示例程式碼

下面我們通過一個示例來說明如何使用mbedtls。這個示例通過介紹如何使用HMAC演算法生成一個訊息認證碼。hmac-test.c程式碼如下:

#include<string.h>#include<stdio.h>#include"mbedtls/md.h"#define mbedtls_printf     printf

int main(void){int ret;unsignedchar secret[]="a secret";unsignedchar buffer[]="some data to hash";unsignedchar 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);gotoexit;}

    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;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • hmac演算法需要兩個引數,一個稱為祕鑰,此處為secret,另一個稱為訊息,此處為buffer
  • 訊息認證碼保留在 digest 陣列中
  • 此處hmac演算法選擇sha256演算法作為單向雜湊函式,所以hmac的計算結果一定為32位元組。
  • 在mbedtls中,訊息認證碼的生成分為三個步驟 
    1. mbedtls_md_hmac_starts 設定金鑰
    2. mbedtls_md_hmac_update 填充訊息,本示例僅填充了一次
    3. mbedtls_md_hmac_finish 生成訊息認證碼,結果儲存至digest中
  • 最後把digest使用HEX格式列印至控制檯

cmake

在hmac-test.c同目錄中新建一個名為CMakeLists.txt 的檔案,檔案內容如下

#cmake_minimum_required(VERSION 2.6)# 定義工程名稱project("hmac-test")# 定義依賴動態連結庫set(libs
    mbedtls
    mbedcrypto 
    mbedx509
)set(targets
    hmac-test
)add_executable(hmac-test hmac-test.c)target_link_libraries(hmac-test ${libs})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

驗證測試

# 生成makefile檔案
cmake .# 執行makefile,生成可執行檔案hmac-test
make
# 執行可執行檔案hmac-test./hmac-test
# 控制檯輸出執行結果
HMAC:7FD04DF92F636FD450BC841C9418E5825C17F33AD9C87C518115A45971F7F77E
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

更多角度驗證

如果不確定mbedtls的運算結果,也可以編寫一個Node.js指令碼,使用相同引數的情況下兩者的計算結果應該完全相同。

const crypto =require(crypto‘);const hmac = crypto.createHmac(sha256‘,a secret‘);

hmac.update(some data to hash‘);
console.log(hmac.digest(hex‘));// Prints:// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

總結

  1. 安裝mbedtls可使用make方法和cmake方法,兩種方式均可正確安裝mbedtls
  2. mbedtls提供三個重要動態連結庫——libmbedtls.so libmbedcrypto.so libmbedx509.so
  3. 通過cmake方式可更方便的編寫mbedtls應用