ID²和硬件主控的驱动移植
接下去部分实现ID² SE芯片移植
移植准备
SE安全芯片:FM1230
硬件电路:主控—iic—FM1230
原厂提供了STM32下的IIC下的驱动示例
根据自己主控来移植IIC驱动部分,这里是采用GPIO模拟IIC来实现
IIC驱动移植
模拟IIC驱动部分比较常见,我也是从网上找的,贴出几个参考:
https://blog.csdn.net/shaguahaha/article/details/70766665
https://blog.csdn.net/return_oops/article/details/80965437
几个需要注意点是:
- SE芯片的IIC地址,FM1230是 0xE2
- 在移植过程中设备FM1230从机有回复,但是数据始终不对
计算算法时不通过,原来是模拟IIC和采用ST 标准IIC库的有不同的地方【原厂支持很重要】
IIC和FM1230的通讯,移植过程中采用逻辑分析仪抓包的记录:
hal相关移植
IIC驱动OK后,主要涉及std_se_adapter.c、se_driver.c两个函数移植
参考原厂示例基本不会有问题
验证ID2相关
我没有将此部分代码一开始就移植到ID²的sdk中去跑,而是单独将此部分调试通过后,跑FM1230部分的示例代码,SM4的加密。
这里需要注意几点:
- irot_hal_get_id2中,函数中注释异常判断
irot_result_t irot_hal_get_id2(uint8_t* id, uint32_t* len)
{
irot_result_t ret;
irot_result_t close_ret;
void* handle = NULL;
uint8_t cmd_buf[MAX_CMD_APDU_LENGTH];
uint8_t rsp_buf[MAX_RSP_APDU_LENGTH];
uint32_t rsp_len = sizeof(rsp_buf);
// open session
ret = open_session(&handle);
if (ret != IROT_SUCCESS)
{
goto EXIT;
}
// select application
#if ID2_SEND_SELECT_COMMAND
ret = select_application(handle, cmd_buf, rsp_buf, &rsp_len);
if (ret != IROT_SUCCESS)
{
goto EXIT;
}
#endif
// get ID
memset(cmd_buf, 0x00, CMD_APDU_HEAD_LENGTH);
cmd_buf[INDEX_CLA] = CLA_VALUE;
cmd_buf[INDEX_INS] = INS_GET_ID;
cmd_buf[INDEX_LC] = 0x00;
rsp_len = sizeof(rsp_buf);
ret = apdu_transmit_wrap(handle, cmd_buf, CMD_APDU_HEAD_LENGTH, rsp_buf, &rsp_len);
if (ret != IROT_SUCCESS)
{
goto EXIT;
}
// 3 bytes head
if (rsp_len != (0x03 + SE_ID2_LENGTH))
{
ret = IROT_ERROR_GENERIC;
goto EXIT;
}
// ID2 data
if (rsp_buf[2] != SE_ID2_LENGTH)
{
ret = IROT_ERROR_GENERIC;
goto EXIT;
}
rsp_len -= 0x03;
/* 注释掉
if (rsp_len > *len)
{
ret = IROT_ERROR_GENERIC;
goto EXIT;
}
else
*/
{
// | 2 TAG | 1 len |
memcpy(id, rsp_buf + 3, rsp_len);
*len = rsp_len;
}
EXIT:
// close session
close_ret = close_session(handle);
return ret == IROT_SUCCESS ? close_ret : ret;
}
- irot_hal_sym_crypto
第二个参数传参为1,后面对应移植时也要注意。
PS: 将IIC和系统层,需要在示例中跑通后再将此移植到ID²的sdk中会容易很多
SE相关部分移植到ID² sdk
将上文中对应的SE芯片相关代码移植到ID² sdk,先看目录结构
主目录结构
modules/irot 目录结构
移植步骤
cmake方式改写makefile
确保makefile中对应的配置切换到SE就行了
对应cmake下CMakeLists.txt配置如下,关注irot部分就是选择SE目录下的源文件
cmake_minimum_required(VERSION 3.13)
# ... 部分系统相关省略
# set id_lib dir
set(id_lib_dir ${CMAKE_CURRENT_SOURCE_DIR}/id_lib)
# my libs path
set(id_lib_path ${CMAKE_CURRENT_SOURCE_DIR}/lib)
function(add_subdirectory_if_exist dir)
if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${dir})
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/CMakeLists.txt)
add_subdirectory(${dir})
endif()
endif()
endfunction()
# add lib crypto
set(ID2_CRYPTO_DIR id_lib/modules/crypto)
add_subdirectory_if_exist(${ID2_CRYPTO_DIR})
# add lib crypto
set(ID2_HAL_DIR id_lib/modules/hal)
add_subdirectory_if_exist(${ID2_HAL_DIR})
# add lib ID2
set(ID2_ID2_DIR id_lib/modules/id2/lib)
add_subdirectory_if_exist(${ID2_ID2_DIR})
# add lib irot
set(ID2_IROT_DIR id_lib/modules/irot/se)
# set(ID2_IROT_DIR id_lib/modules/irot/demo/)
add_subdirectory_if_exist(${ID2_IROT_DIR})
# add lib itls
set(ID2_ITLS_DIR id_lib/modules/itls)
add_subdirectory_if_exist(${ID2_ITLS_DIR})
# add lib osa
set(ID2_OSA_DIR id_lib/modules/osa)
add_subdirectory_if_exist(${ID2_OSA_DIR})
SE目录原始makefile文件,根据makefile改过来关注重点的部分修改自己的CMakeLists.txt文件
修改后的CMakeLists.txt文件
cmake_minimum_required(VERSION 3.13)
set(SOURCE_TOP_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(BINARY_TOP_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(CMAKE_C_COMPILER_FORCED 1)
set(CMAKE_CXX_COMPILER_FORCED 1)
set(out_hex_dir ${CMAKE_CURRENT_BINARY_DIR}/hex)
# set(out_lib_dir ${CMAKE_CURRENT_BINARY_DIR}/lib)
set(out_lib_dir ${CMAKE_SOURCE_DIR}/lib)
set(out_inc_dir ${CMAKE_CURRENT_BINARY_DIR}/rel)
set(out_inc_dir ${CMAKE_CURRENT_BINARY_DIR}/include)
set(tools_dir ${CMAKE_CURRENT_SOURCE_DIR}/tools)
set(CHIP_NAME myse)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../include/osa
${CMAKE_CURRENT_SOURCE_DIR}/../../../include/irot
${CMAKE_CURRENT_SOURCE_DIR}/../../../include/irot/se
${CMAKE_CURRENT_SOURCE_DIR}/../../../include/crypto
${CMAKE_CURRENT_SOURCE_DIR}/./inc
${CMAKE_CURRENT_SOURCE_DIR}/./chipset/${CHIP_NAME}
)
project(irot)
set(target km)
message(STATUS "build target: " ${target})
message(STATUS "CMAKE_CURRENT_SOURCE_DIR: " ${CMAKE_CURRENT_SOURCE_DIR})
message(STATUS "CMAKE_SOURCE_DIR: " ${CMAKE_SOURCE_DIR})
# debug info
add_definitions(-DCONFIG_ID2_DEBUG
-DCONFIG_CHIP_KEY_TYPE=CHIP_KEY_TYPE_SM4
)
file(GLOB SRC_CORE ${CMAKE_CURRENT_SOURCE_DIR}/src/core/*.c)
file(GLOB SRC_LOG ${CMAKE_CURRENT_SOURCE_DIR}/src/log/*.c)
file(GLOB SRC_CHIPSET ${CMAKE_CURRENT_SOURCE_DIR}/chipset/${CHIP_NAME}/se_driver/*.c)
add_library(${target} STATIC
${SRC_CORE}
${SRC_LOG}
${SRC_CHIPSET}
)
set(LIBRARY_OUTPUT_PATH ${out_lib_dir})
# set_target_properties
target_include_directories(${target} PUBLIC include)
根据make.settings修改宏定义
add_definitions(-DCONFIG_ID2_DEBUG
-DCONFIG_CHIP_KEY_TYPE=CHIP_KEY_TYPE_SM4
)
适配接口层
前文提到SM4的加密方式,在irot_hal_sym_crypto中第二个参数改为1
include/irot/se/id2_irot_hal.h(原始文件名称为irot_hal.h)
修改KEY_ID_ID2宏定义为1
实际调用文件是modules/irot/se/src/core/km_to_irot.c
验证和测试
为了验证该模块移植是否成功,需要编译app/id2_app对应demo代码,验证是否ok
PS: 这部分不可缺少,这部分没有问题后,再做下一步基本不会出错。
lib库检查
到目前为止已经得到了关键几个lib静态库