5.2. 秘钥使用示例
目前支持私有数据的sdk补丁如下: (如果未能找到你需要的芯片型号或者需要写功能支持,请联系杰理公司)
芯片类型 |
补丁 |
---|---|
AC701N |
|
AD14N |
|
AC695N_LARGE |
补丁使用方式:找到对应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();
}
}