加密芯片加密芯片——ATSHA204A的使用
Posted 一厘阳光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加密芯片加密芯片——ATSHA204A的使用相关的知识,希望对你有一定的参考价值。
闲扯一下
好久没写博客了,技术之路在于坚持,长期写博客,总结, 是对自己一个不错的锻炼,希望看到的博友能够坚持下去,一起互勉。
前言
最近由于产品需要,加班加点完成了这个项目的预研。加密芯片的目的,哪里都可搜索的到,这里就不多说,主要谈一些自己在接触中的一些心得,以及技术备注,以便以后查阅和使用。
资料参考列表:
配置
以下所讲是如何直接使用,以及探讨所实现过程中的问题解决,遗留问题。
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 0
uint8_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入测试 0x05
get_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入测试 SN
get_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入测试 0x15
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);
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入测试 0x05
get_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的使用的主要内容,如果未能解决你的问题,请参考以下文章
宏思 HSC32I1 身份设备认证防抄板安全芯片软硬件完全兼容ATSHA204A