mbedtls學習(1)搭建環境

獲得mbedtls源碼
git clone -b mbedtls-2.7 https://github.com/ARMmbed/mbedtls.git

clone下來時這樣
在這裏插入圖片描述
上面主要4個目錄

  • configs 是mbedtls參考的配置文件
  • include 是源碼頭文件,mbedtls的默認配置頭文件是config.h就在這裏面
  • library 是源碼C文件,mbedtls的實現
  • programs 是一些示例,可以參考裏面的例子看怎麼用mbedtls
建立實驗工程編寫makefile

建立實驗工程目錄如下
在這裏插入圖片描述
mbedtls目錄就是clone下來的mbedtls源碼,projects是一個個工程目錄,si是用來保存各個工程source insight的文件。

每個project會使用這個makefile

PRJ_DIR         :=$(PWD)
#sdk路徑。。
SDK_DIR         :=$(PRJ_DIR)/../..
#components
COMPONENTS_DIR  :=$(SDK_DIR)/components
#libs
LIBS_DIR        :=$(SDK_DIR)/libs
#可執行文件輸出路徑
OUT_DIR         :=$(PRJ_DIR)/out

#工程名字
TARGET          ?=$(notdir $(PRJ_DIR))

CROSS_COMPILE   ?=
CC              := $(CROSS_COMPILE)gcc

$(shell if [ -f $(OUT_DIR) ];then echo "exist" ; else mkdir -p $(OUT_DIR); fi;)

#頭文件路徑
INCDIRS := $(COMPONENTS_DIR)/mbedtls/include 

#源文件路徑
SRCDIRS := $(COMPONENTS_DIR)/mbedtls/library \
		   $(PRJ_DIR)/src
		   
		   
ALL_INCLUDE := $(patsubst %, -I %, $(INCDIRS))

ALL_CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))

ALL_CFILENDIR := $(notdir $(ALL_CFILES))

ALL_COBJS := $(patsubst %, $(OUT_DIR)/%, $(ALL_CFILENDIR:.c=.o))

ALL_OBJS := $(ALL_COBJS)

VPATH := $(SRCDIRS)

#CFLAGS :=-I$(COMPONENTS_DIR)/mbedtls/configs -DMBEDTLS_CONFIG_FILE='<config-mini-tls1_1.h>'

$(TARGET) : $(ALL_OBJS)
	$(CC) -o $(TARGET) $^

$(ALL_OBJS) : $(OUT_DIR)/%.o : %.c
	$(CC) -c $(ALL_INCLUDE) $(CFLAGS) -o $@ $<

.PHONY: clean

clean:
	rm -rf $(TARGET) $(ALL_OBJS)
base64例子

procect:base64
base64是把非ASCII碼數據轉化成ASCII的編碼方法,經過base64後的數據長度會比原來長1/3且base64有填充算法,使編碼結果總是4字節整數倍。

#include <stdio.h>
#include <string.h>
#include <stdint.h>

#include "mbedtls/base64.h"
#include "mbedtls/platform.h"

static uint8_t msg[] = 
{
    0x14, 0xfb, 0x9c, 0x03, 0xd9, 0x7e
};

void dump_buf(char *info, uint8_t *buf, uint32_t len)
{
    mbedtls_printf("%s", info);
    for(uint32_t i = 0; i < len; i++) {
        mbedtls_printf("%02x ", msg[i]);
    }
    mbedtls_printf("\n");
}
int main(void)
{
    size_t len;
    uint8_t rst[512];

    len = sizeof(msg);
    dump_buf("\n  base64 message: ", msg, len);

    mbedtls_base64_encode(rst, sizeof(rst), &len, msg, len);
    mbedtls_printf("  base64 encode : %s len %d\n", rst,len);

    mbedtls_base64_decode(rst, sizeof(rst), &len, rst, len);
    dump_buf("  base64 decode : ", rst, len);
    printf("\n");
    return 0;
}

運行結果:
在這裏插入圖片描述

遍歷mbedtls安全套件

procect:ciphersuite-list
例如TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
密鑰協商算法ECDHE
身份認證算法ECDSA
對稱加密算法AES_256
消息認證算法GCM
僞隨機數算法SHA384
下面代碼可以遍歷mbedtls安全套件

#include <stdio.h>
#include "mbedtls/ssl.h"
#include "mbedtls/platform.h"
int main( void )
{
    int index = 1;
    const int *list;
    const char *name;

    mbedtls_printf("\n  Available Ciphersuite:\n");
    list = mbedtls_ssl_list_ciphersuites();
    for(; *list; list++) {
        name = mbedtls_ssl_get_ciphersuite_name(*list);
        mbedtls_printf("  [%03d] %s\n", index++, name);
    }
    mbedtls_printf("\n");
    return 0;
}

運行結果顯示默認(mbedtls-2.7)的config.h有120種安全套件
在這裏插入圖片描述
。。。省略

在這裏插入圖片描述
而添加宏定義-DMBEDTLS_CONFIG_FILE='<config-mini-tls1_1.h>'使用config-mini-tls1_1.h則裁剪到5種
在這裏插入圖片描述

參考書《密碼技術與物聯網安全:mbedtls開發實戰》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章