闲扯一下

好久没写博客了,技术之路在于坚持,长期写博客,总结, 是对自己一个不错的锻炼,希望看到的博友能够坚持下去,一起互勉。

前言

最近由于产品需要,加班加点完成了这个项目的预研。加密芯片的目的,哪里都可搜索的到,这里就不多说,主要谈一些自己在接触中的一些心得,以及技术备注,以便以后查阅和使用。

资料参考列表:

ATSHA204A加密芯片攻略——使用篇

atsha204a加密芯片使用攻略——配置篇

github源码实例

配置

以下所讲是如何直接使用,以及探讨所实现过程中的问题解决,遗留问题。

GitHub源码不建议直接运行,需要在理解的基础上。自己的配置代码如下:

void read_config(int fd, struct atsha204a_command_packet *command_packet)
{uint8_t status;//1.du入测试memset(readdata, -1, 32);cmd_args.op_code = command_packet->op_code;cmd_args.param_1 = command_packet->param1;cmd_args.param_2 = command_packet->param2;cmd_args.data_len_1 = command_packet->data_len;cmd_args.data_1 = command_packet->data;cmd_args.data_len_2 = 0;cmd_args.data_2 = NULL;cmd_args.data_len_3 = 0;cmd_args.data_3 = NULL;cmd_args.tx_size = 0x10;cmd_args.tx_buffer = global_tx_buffer;cmd_args.rx_size = 0x10;cmd_args.rx_buffer = global_rx_buffer;status = sha204m_execute(fd, &cmd_args);if (status != SHA204_SUCCESS) { printf(" Read data zone  FAILED! \n"); }else{ printf(" Read data zone  SUCCESS! \n"); }printf("read_data addr:%02x\n", command_packet->param2);printf_hex_array("readdata: ", 32, readdata);memcpy(readdata, &global_rx_buffer[1], 32);printf_hex_array("readdata: ", 32, readdata);
}
void write_config(int fd, struct atsha204a_command_packet *command_packet)
{uint8_t status;memset(readdata, -1, 32);cmd_args.op_code = command_packet->op_code;cmd_args.param_1 = command_packet->param1;cmd_args.param_2 = command_packet->param2;cmd_args.data_len_1 = command_packet->data_len;cmd_args.data_1 = command_packet->data;cmd_args.data_len_2 = 0;cmd_args.data_2 = NULL;cmd_args.data_len_3 = 0;cmd_args.data_3 = NULL;cmd_args.tx_size = 0x10;cmd_args.tx_buffer = global_tx_buffer;cmd_args.rx_size = 0x10;cmd_args.rx_buffer = global_rx_buffer;status = sha204m_execute(fd, &cmd_args);if (status != SHA204_SUCCESS) { printf(" Write data zone  FAILED! \n"); }else{ printf(" Write data zone  SUCCESS! \n"); }printf("read_data addr:%02x\n", command_packet->param2);printf_hex_array("readdata: ", 32, readdata);memcpy(readdata, &global_rx_buffer[1], 32);printf_hex_array("readdata: ", 32, readdata);
}
void my_config(int fd, uint8_t* key_15)
{static uint8_t status = SHA204_SUCCESS;uint8_t serect[32] = { 0 };   //the key of slot 0uint8_t tmp_conf[2];uint8_t data1[4] = { 0x80, 0xA0, 0x80, 0xA0 };int slot = 10;uint16_t slot_addr = (uint16_t)(10 * 8);//1.du入测试 0x05get_sn_command.op_code = 0x02;get_sn_command.param1 = 0x00;get_sn_command.param2 = 0x05;get_sn_command.data_len = 0;get_sn_command.data = NULL;read_config(fd, &get_sn_command);//1.du入测试 SNget_sn_command.op_code = 0x02;get_sn_command.param1 = 0x80;get_sn_command.param2 = 0x00;get_sn_command.data_len = 0;get_sn_command.data = NULL;read_config(fd, &get_sn_command);//1.du入测试 0x15get_sn_command.op_code = 0x02;get_sn_command.param1 = 0x00;get_sn_command.param2 = 0x15;get_sn_command.data_len = 0;get_sn_command.data = NULL;read_config(fd, &get_sn_command);printf("===================开始配置========================\n");//1.config区配置solt0/1(key_15) 加密读 加密写 关联的solt区为 solt10(key_0)   printf("config区配置solt0/1\n");// data1[4] = { 0x8A, 0xA0, 0x8A, 0xA0 };data1[0] = 0x8A; data1[1] = 0xA0; data1[2] = 0x8A; data1[3] = 0xA0;get_sn_command.op_code = 0x12;get_sn_command.param1 = 0x00;get_sn_command.param2 = 0x05;get_sn_command.data_len = 4;get_sn_command.data = data1;write_config(fd, &get_sn_command);//1.du入测试 0x05get_sn_command.op_code = 0x02;get_sn_command.param1 = 0x00;get_sn_command.param2 = 0x05;get_sn_command.data_len = 0;get_sn_command.data = NULL;read_config(fd, &get_sn_command);//2.solt10(key_0)  可随意读写//锁定后还能进行读写吗?因该是不能写printf("config区配置solt10/11\n");// data1[4] = { 0x00, 0x00, 0x00, 0x00 };data1[0] = 0x00; data1[1] = 0x00; data1[2] = 0x00; data1[3] = 0x00;get_sn_command.op_code = 0x12;get_sn_command.param1 = 0x00;get_sn_command.param2 = 0x0A;get_sn_command.data_len = 4;get_sn_command.data = data1;write_config(fd, &get_sn_command);//3.锁定config区//3.1 读取0x15地址配置信息printf("3.1 读取0x15地址配置信息\n");get_sn_command.op_code = 0x02;get_sn_command.param1 = 0x00;get_sn_command.param2 = 0x15;get_sn_command.data_len = 0;get_sn_command.data = NULL;read_config(fd, &get_sn_command);//3.2锁定config区data1[0] = 0x00; data1[1] = 0x00; data1[2] = 0x55; data1[3] = 0x00;get_sn_command.op_code = 0x17;get_sn_command.param1 = 0x80;get_sn_command.param2 = 0x00;get_sn_command.data_len = 0;get_sn_command.data = NULL;write_config(fd, &get_sn_command);//3.3 读取0x15地址配置信息printf("3.3 读取0x15地址配置信息\n");get_sn_command.op_code = 0x02;get_sn_command.param1 = 0x00;get_sn_command.param2 = 0x15;get_sn_command.data_len = 0;get_sn_command.data = NULL;read_config(fd, &get_sn_command);//0x00 0x00 0x55 0x00 成功//4. 写入秘钥 slot printf("4.1 读取slot数据\n");slot_addr = (uint16_t)(0 * 8);get_sn_command.op_code = 0x02;get_sn_command.param1 = 0x82;get_sn_command.param2 = slot_addr;get_sn_command.data_len = 0;get_sn_command.data = NULL;read_config(fd, &get_sn_command);//4.2 往slot0写入秘钥slot_addr = (uint16_t)(0 * 8);get_sn_command.op_code = 0x12;get_sn_command.param1 = 0x82;get_sn_command.param2 = slot_addr;get_sn_command.data_len = 32;get_sn_command.data = key_15;write_config(fd, &get_sn_command);//4.3 往slot10写入秘钥slot_addr = (uint16_t)(10 * 8);get_sn_command.op_code = 0x12;get_sn_command.param1 = 0x82;get_sn_command.param2 = slot_addr;get_sn_command.data_len = 32;get_sn_command.data = key_0;write_config(fd, &get_sn_command);//4.4 锁定slot data区get_sn_command.op_code = 0x17;get_sn_command.param1 = 0x81;get_sn_command.param2 = 0x00;get_sn_command.data_len = 0;get_sn_command.data = NULL;write_config(fd, &get_sn_command);//4.5 读取0x15地址配置信息printf("4.5 读取0x15地址配置信息\n");get_sn_command.op_code = 0x02;get_sn_command.param1 = 0x00;get_sn_command.param2 = 0x15;get_sn_command.data_len = 0;get_sn_command.data = NULL;read_config(fd, &get_sn_command);//0x00 0x00 0x00 0x00 成功}

具体的配置意义可以详细查看atsha204a加密芯片使用攻略——配置篇或者官方的Datasheet文档。

遗留问题

当前调用验证函数random_challenge_response_authentication(),出现验证码不一致的问题,几经调整无果,其他的问题暂时没有。

主要排除方法:更换mac命令的mode参数,使用temp_key或者使用slot区秘钥来查看Mac后的digest结果,查看代码生成验证码是否有误。

当前验证码结果依然不一致,后期若解决再做记录。

-------------------------------------------------------------------------------

验证结果不一致排查:

1.检查配置区是否存在问题;

2.检查配置命令是否错误;

定位到:主机端生成验证码存在问题!更换主机端SHA256算法,结果验证码一致,验证通过!!!

------------------------------------------------------------------------------

配置过程注意:

1.芯片的config区和data区一旦锁定,没有办法解锁,锁的方法只能通过lock command来进行锁定。配置错误,芯片基本之间废了,我在这个过程中浪费了两片。

2.config区在没锁定的时候,可以使用write command来进行写操作,但注意,0x00-0x03地址(word地址,详情请参考手册)不能被写,0x15word地址不能使用write command来写。

3.在config锁定前,data区(包括slot区和OTP区)既不能写也不能读。而在config锁定后,data区锁定前,data区只能写不能读,在data区锁定后,可以根据config中的配置来进行读写。

【加密芯片】加密芯片——ATSHA204A的使用相关推荐

  1. ATSHA204A加密芯片攻略——使用篇

    ATSHA204A加密芯片是ATMEL公司研发的一款高安全性的,功能丰富的加密IC,使用SHA-256算法进行加密操作,内置16*32字节的slot(EEPROM)可以存储用户数据和秘钥,唯一的9字节 ...

  2. atsha204a加密芯片使用攻略——配置篇

    大家好,这是接上一篇使用篇的博客,本篇文章主讲atsha204a加密芯片的配置方式,前面讲到,atsha204a加密芯片内部rom分三个区域,一个是config zone,一个是slot zone,还 ...

  3. ATSHA204A加密芯片的使用

    为了防止自己辛辛苦苦开发了产品被别人抄板仿制,我们使用了ATSHA204A的认证功能.在应用启动的时候,首先我们要验证PCBA上焊接的ATSHA204A芯片中存放的密钥是否匹配,如果不匹配将程序挂起: ...

  4. ATSHA204A加密芯片之--MAC校验代码

    代码较多,先上传秘钥校验,借鉴了坛子里部分同学的代码 本文实现ATSHA204A 32字节随机数+16选1随机秘钥的MAC秘钥校验,如下是demo代码 static int atsha204_mac( ...

  5. 加密芯片ATSHA204读序列号(Serial Number)

    近段时间一个项目使用了atsha204,硬件电路设计好后,需要设计一个程序来测试芯片是否正常工作,于是写了一个读Serial Number的程序. 本文参考了博文 <atsha204a加密芯片使 ...

  6. 适合防抄板,耗材认证,核心算法授权,程序保护,数据传输加解密等应用的逻辑加密芯片和带安全内核加密芯片

    适合防抄板,耗材认证,核心算法授权,程序保护,数据传输加解密等应用的逻辑加密芯片和带安全内核加密芯片.有需求的朋友可以了解下: 1.品牌:MICROCHIP/ATMEL  国别:美国:代表型号:ATS ...

  7. ATSHA204A-MAHDA-T国产替代加密芯片

    ATSHA204A-MAHDA-T是一款用于固件版权保护,防抄板仿克隆的加密芯片.包含16个密钥存储区用于安全存储密钥.同时提供OTP区用于存储用户固定信息. MODSEMI的MOD208加密芯片,无 ...

  8. UART接口算法移植加密芯片的调试技巧——通讯调试

    算法移植类加密芯片是凌科芯安公司的专利产品,主要功能是芯片内部嵌入凌科芯安公司的LKCOS智能操作系统,用户可以把MCU中程序一部分关键算法函数移植到芯片中运行.用户采用标准C语言编写代码,通过KEI ...

  9. ilm 和dlm差异_电力通信系统--加密芯片.pdf

    电力通信系统--加密芯片 1 芯片结构 FD/TD/VD NVM ILM_RAM DLM_RAM AHB_RAM2 WDT (548KB) (16KB) (24KB) (256B) EMPU TIME ...

最新文章

  1. Github标星2.3k+!这个仓库提供了靠谱的入门人工智能的路线及资料!
  2. 【windwos bat】批量把windows下的wav文件转为raw文件
  3. swift LOG 输出
  4. Eclipse 中 SDK无法更新---解决方法
  5. 火力发电厂与变电站设计防火标准_火力发电厂与变电站设计防火规范
  6. 【PM模块】维护业务处理流程—内部维护(维护工单)
  7. .net 面试题系列文章一(附答案)
  8. linux bash命令_Ultimate Linux命令行指南-Full Bash教程
  9. 进程的创建-Process⼦类
  10. python2和python3的默认编码_python2和python3哪个版本新
  11. 交换机VLAN、 TRUNK 、VTP 配置
  12. python `__str__`
  13. Mat类具体解释(二)
  14. JNDI RMI 注入(Log4j2漏洞)
  15. CISC 332*/CMPE 332* –Database Management Systems
  16. 1分钟读懂人口普查大数据——第七次人口普查数据可视化BI分析
  17. 视频教程-2020软考--网络规划设计师【综合知识】视频精讲-软考
  18. 《采购与供应链管理》读书笔记
  19. web前端学习13-19(HTML常用标签)
  20. 手机进水开机android,手机进水后开机只有启动画面进不了桌面怎么处理?

热门文章

  1. mysql 数据表内容_mysql数据库内容相关操作
  2. python timestamp to date
  3. 软件测试 -- 进阶 7 软件测试环境构建 与 测试数据准备
  4. 快速傅里叶变换FFT的代码实现
  5. gitlab 拆分某项目的子项目到独立的git项目
  6. 中国电子价签驱动IC市场现状研究分析与发展前景预测报告
  7. 建设移动统一消息管理中心
  8. 儿童讲堂 - 反义词
  9. 开学不容错过的蓝牙耳机,高品质蓝牙耳机排行榜
  10. 2021-2027全球及中国数控机床中心行业研究及十四五规划分析报告