全部产品
云市场

5.1,ID²-SE在三方OS上适配

更新时间:2019-09-02 00:38:08

以平台stm32f103vb-fmse为例,使用的SE芯片名称为fm1280(国密芯片)。

1. OSA层适配

1.1 适配日志打印

以通用Linux OS系统函数为例:

  1. 实现ls_osa_print
  1. void ls_osa_print(const char *fmt, ...)
  2. {
  3. va_list va_args;
  4. va_start(va_args, fmt);
  5. vprintf(fmt, va_args);
  6. va_end(va_args);
  7. }
  1. 实现ls_osa_snprintf
  1. int ls_osa_snprintf(char *str, size_t size, const char *fmt, ...)
  2. {
  3. va_list args;
  4. int rc;
  5. va_start(args, fmt);
  6. rc = vsnprintf(str, size, fmt, args);
  7. va_end(args);
  8. return rc;
  9. }

1.2 适配内存管理

  1. 实现ls_osa_calloc
  1. void *ls_osa_calloc(size_t nmemb, size_t size)
  2. {
  3. return calloc(nmemb, size);
  4. }
  1. 实现ls_osa_free
  1. void ls_osa_free(void *ptr)
  2. {
  3. free(ptr);
  4. }

1.3 适配时间相关

  1. 实现ls_osa_msleep
  1. void ls_osa_msleep(unsigned int msec)
  2. {
  3. usleep(msec * 1000);
  4. }
  1. 实现ls_osa_get_time_ms
  1. long long ls_osa_get_time_ms(void)
  2. {
  3. struct timeval tv;
  4. long long ret = 0;
  5. gettimeofday(&tv, NULL);
  6. ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
  7. return ret;
  8. }

2. 设置编译工具链

修改make.rules,设置CROSS_COMPILE为用户平台对应的交叉工具链,例如:

  1. CROSS_COMPILE := /usr/bin/arm-linux/arm-linux-

3 编译并运行示例程序

在SDK根目录下,编译:

  1. $ make clean
  2. $ make

生成./out/bin/id2_app
运行id2_app,日志如下:

  1. <LS_LOG> id2_client_get_id 649: ID2: 000FFFFFDB1D8DC78DDCB800
  2. <LS_LOG> id2_client_generate_authcode 170:
  3. ============ ID2 Validation Json Message ============:
  4. {
  5. "reportVersion": "1.0.0",
  6. "sdkVersion": "2.0.0",
  7. "date": "Aug 23 2019 18:17:13",
  8. "testContent": [{
  9. .......
  10. }]
  11. }
  12. <LS_LOG> id2_client_generate_authcode 186: =====>ID2 Client Generate AuthCode End.

出现上述日志,说明前面的OS接口和编译环境设置正确。下面开始SE芯片的适配和测试。

4. SE 驱动适配

4.1 适配SE芯片驱动接口

根据SE芯片驱动的控制方式,需要适配以下3个驱动接口。

  1. 适配se_open_session
  1. irot_result_t se_open_session(void** handle)
  2. {
  3. // 示例代码:SE 初始化,打开SE芯片电源
  4. fm_open_device();
  5. fm_device_init();
  6. fm_dev_power_on();
  7. }
  1. 适配se_transmit
  1. irot_result_t se_transmit(void* handle, const uint8_t* cmd_apdu, const uint32_t cmd_len, uint8_t* rsp_buf, uint32_t* rsp_len)
  2. {
  3. // 示例代码:发送apdu指令,并获取response
  4. result = pfm_SeFunc->fm_apdu_transceive(xxx)
  5. }
  1. 适配se_close_session
  1. irot_result_t se_close_session(void* handle)
  2. {
  3. // 示例代码:关闭设备,关闭SE芯片电源
  4. fm_close_device();
  5. fm_power_off();
  6. }

4.2 使能ID载体为SE

ID2 Client SDK默认编译时选择的是Demo为载体,适配好SE芯片后,需要配置工程切换为SE芯片为载体。
进入make.settings修改CONFIG_ID2_KM_SE为y即可

  1. #Link ID2 Config
  2. CONFIG_ID2_DEBUG := n
  3. CONFIG_ID2_OTP := n
  4. CONFIG_ID2_KM_SE := y ----> 修改为y

4.3 重新编译运行

  1. $ make clean && make
  2. $ ./out/bin/id2_app

如果移植正确,会生成和Demo示例相同格式的Json格式的测试结果:

  1. ============ ID2 Validation Json Message ============:
  2. {
  3. "reportVersion": "1.0.0",
  4. "sdkVersion": "2.0.0",
  5. "date": "Aug 23 2019 18:17:13",
  6. "testContent": [{
  7. .......
  8. }]
  9. }

4.4 服务端验证调试结果

登录ID²控制台,通过自主验证 来验证前一步骤的测试结果。
如果验证成功,至此ID2-SE在第三方OS上的适配工作基本完成。