5.2. 秘钥使用示例

目前支持私有数据的sdk补丁如下: (如果未能找到你需要的芯片型号或者需要写功能支持,请联系杰理公司)

芯片类型

补丁

AC701N

701N 补丁下载(点击此处下载)(2024/03/27)

AD14N

AD14N 补丁下载(点击此处下载)(2024/03/27)

AC695N_LARGE

AC695N_LARGE 补丁下载(点击此处下载)(2024/03/27)

补丁使用方式:找到对应sdk 的xxx\xxx\liba(例如:cpu\br28\liba、include_lib\liba\sh54)目录下,改名为secure_key.a(或者AD14N:secure_key_lib.a)并添加上。

codeblocks 里面添加上对应的库文件 如下图:

5.2.1. 具体的接口使用方式

Note

注意,示例代码, 前提是区域是FF才能使用写功能。
返回值:
typedef enum {
    SK_RV_OK = 0, // 0, 成功返回值
    SK_RV_OPEN_ERROR, //1, 打开加密区域失败, 检查INI文件是否配置好以及工具是否更新
    SK_RV_WRITE_ERROR, //2, 写入失败, 检查CPU库是否正确
    SK_RV_READ_ERROR, //3, 读出错, 无效返回 
    SK_RV_INIT_ERROR, //4, 初始化出错, 无效返回
    SK_PWD_MISMATCH, //5, page key 和传入 key不匹配, 当前page头的key不对或者为空
    SK_PWD_CHIP_VERSION_MISMATCH, //6  芯片版本不匹配, 芯片chip id不对应
    SK_PWD_INVALID, //7, 无效的passwd, 检查秘钥是否正确
    SK_FF_CHECK_ERROR, //8, 全FF检查出错,1、初始化时有脏数据不是全FF, 2、读出来是全FF 3、写入的时候不是全FF
    SK_RV_WRITE_NOTSUPPORT,  //9, 不支持写功能, 检查拿到的库是否支持写功能
    SK_PWD_VERSION_MISMATCH,  //10, passwd版本不匹配
    SK_RV_EMPTY,  //11, 空page, 第一次读检查是否为空page
    SK_RV_UNKNOWN
} SK_RETVAL_T;

调试过程中可能出现的问题:
1,使用只读库跑写入接口,会报错SK_RV_WRITE_ERROR。
2,已经写过的page,再一次去写,报SK_FF_CHECK_ERROR错误,表示非FF去写。
3,读page时候使用ID和page不对应、或者password不对应,会报错SK_PWD_MISMATCH。
4,page为空时候,第一次去读,会报空错误出来 SK_RV_EMPTY。
5,烧录器报错:固件未被添加key,请在download.bat中使用-key参数给固件添加KEY。 解决方法:使用2023/11/23后提供的私有数据授权读写的库生成的EW既可

如没有拿到请联系杰理科技获取

///////////////////////////////////烧写器识别说明事项///////////////////////////////////////////
***此结构体必须在代码中实现,不然会烧写器报错。***
struct _SK_MPAD {
    u8 magic_start[16];
    u8 owner_passwd[16];
    u8 magic_end[16];
};

填充示例,需要在自己的代码中定义上面的结构体,必须保持一致,下面定义的名字也必须要是priv_pad,便于库中调用.
struct _SK_MPAD priv_pad = {
    .magic_start = {0x50,0x52,0x49,0x56,0x17,0xeb,0x4a,0x47,0xae,0x47,0x8c,0x93,0xc2,0x17,0xa5,0x9e},
    .owner_passwd = { 0x94, 0x44, 0x15, 0x16, 0x28, 0xae, ...... }, //具体的秘钥向杰理拿取,
    .magic_end = {0x44,0x41,0x54,0x41,0x96,0xa3,0x41,0x97,0xa9,0x1f,0x2e,0x5e,0x18,0x3c,0xf4,0x98}
};
//////////////////////////////////////////////////////////////////////////////////////////

    int secure_key_write(int page_id, const void *passwd, const void *key); //写key进去
    int secure_key_read(int page_id, const void *passwd, void *key); //读 key
    void *secure_map_key_to_memory(int page_id, const void *passwd);//获取map地址

    //////////////////////////////////测试demo///////////////////////////////////////////
    #define PAGE_HEAD_LEN_TEST 16
    #define PAGE_LEN_TEST 256
    void sk_test_write()
    {
        int ret = 0 ;
        char key[PAGE_LEN_TEST];
        static char passwd[] = { 0x94, 0x44, 0x15, 0x16, 0x28, 0xae, ...... }; //具体的秘钥向杰理拿取
    
        for (int i = 0 ; i < PAGE_LEN_TEST; i++) {
            key[i] = i & 0xff;
        }
    
        for (int i = 0; i <  PAGE_HEAD_LEN_TEST - 1; i++) {
            y_printf(">>>[test]:+++++++++++++ i = %d\n", i);
            ret = secure_key_write(i, passwd, key);
            if (ret) {
                goto __exit;
            }
        }
    __exit:
        printf(">>>[test]:ret = %d\n", ret);
        while (1) {
            wdt_clear();
        }
    }

    void sk_test_read()
    {
        int ret = 0 ;
        char key[PAGE_LEN_TEST];
        static char passwd[] = { 0x94, 0x44, 0x15, 0x16, 0x28, 0xae, ...... }; //具体的秘钥向杰理拿取
    
        for (int i = 0; i <  PAGE_HEAD_LEN_TEST - 1; i++) {
            y_printf(">>>[test]:+++++++++++++ i = %d\n", i);
            memset(key, 0, PAGE_LEN_TEST);
            ret = secure_key_read(i, passwd, key);
            if (ret) {
                goto __exit;
            }
            put_buf((const u8 *)key, PAGE_LEN_TEST);
            void *logic_addr = secure_map_key_to_memory(i, passwd);
            y_printf(">>>[test]:---------------------logic_addr = 0x%x\n", (u32)logic_addr);
            put_buf((const u8 *)logic_addr, PAGE_LEN_TEST);
            wdt_clear();
        }
    __exit:
        printf(">>>[test]:ret = %d\n", ret);
        while (1) {
            wdt_clear();
        }
    }