獲得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開發實戰》