在第三方OS上适配ID²-SE

本文以stm32f103vb-fmse平台,fm1280(国密芯片)SE芯片为例介绍在第三方OS上适配ID²-SE的方法。

步骤一:适配OSA层

  1. 适配日志打印。

    下面以通用Linux OS系统函数为例进行说明。

    a.实现ls_osa_print。

    void ls_osa_print(const char *fmt, ...)
    {
          va_list va_args;
          va_start(va_args, fmt);
          vprintf(fmt, va_args);
          va_end(va_args);
     }            

    b.实现ls_osa_snprintf。

    int ls_osa_snprintf(char *str, size_t size, const char *fmt, ...)
    {
        va_list args;
        int rc;
        va_start(args, fmt);
        rc = vsnprintf(str, size, fmt, args);
        va_end(args);
        return rc;
    }           
  2. 适配内存管理。

    a.实现ls_osa_calloc。

    void *ls_osa_calloc(size_t nmemb, size_t size)
    {
        return calloc(nmemb, size);
    }            

    b.实现ls_osa_free。

    void ls_osa_free(void *ptr)
    {
        free(ptr);
    }            
  3. 适配时间相关信息。

    a.实现ls_osa_msleep。

    void ls_osa_msleep(unsigned int msec)
    {
        usleep(msec * 1000);
    }            

    b.实现ls_osa_get_time_ms。

    long long ls_osa_get_time_ms(void)
    {
        struct timeval tv;
        long long ret = 0;
        gettimeofday(&tv, NULL);
        ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
        return ret;
    }           

步骤二:设置编译工具链

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

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

步骤三:编译并运行示例程序

在SDK根目录,执行make命令,完成样例程序的编译。

$ make clean
$ make           

生成./out/bin/id2_app后运行id2_app。

如果出现以下日志,说明上述的OS接口和编译环境设置正确。

<LS_LOG> id2_client_get_id 649: ID2: 000FFFFFDB1D8DC78DDC**** 
<LS_LOG> id2_client_generate_authcode 170: 
============ ID2 Validation Json Message ============: 
{ 
       "reportVersion":        "1.0.0", 
       "sdkVersion":   "2.0.0", 
       "date": "Aug 23 2019 18:17:13", 
       "testContent":  [{ 
               ....... 
               }] 
} 
<LS_LOG> id2_client_generate_authcode 186: =====>ID2 Client Generate AuthCode End.            

步骤四:SE驱动适配

  1. 适配SE芯片驱动接口。

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

    a.适配se_open_session。

    irot_result_t se_open_session(void** handle)
    {
            // 示例代码:SE 初始化,打开SE芯片电源
               fm_open_device();
            fm_device_init();
            fm_dev_power_on();
    }           

    b.适配se_transmit。

    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)
    {
            // 示例代码:发送apdu指令,并获取response
            result = pfm_SeFunc->fm_apdu_transceive(xxx)
    }            

    c.适配se_close_session。

    irot_result_t se_close_session(void* handle)
    {
            // 示例代码:关闭设备,关闭SE芯片电源
            fm_close_device();
            fm_power_off();
    }            
  2. 使能ID²载体为SE。

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

    #Link ID2 Config
    CONFIG_ID2_DEBUG   := n
    CONFIG_ID2_OTP     := n
    CONFIG_ID2_KM_SE   := y   ----> 修改为y            
  3. 重新编译运行。

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

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

    ============ ID2 Validation Json Message ============: 
    { 
           "reportVersion":        "1.0.0", 
           "sdkVersion":   "2.0.0", 
           "date": "Aug 23 2019 18:17:13", 
           "testContent":  [{ 
                   ....... 
                   }] 
    }            
  4. 在服务端验证调试结果。

    登录物联网设备身份认证,参考自主验证确认上述步骤的测试结果。如果验证成功,则ID²-SE在第三方OS上的适配完成。