当前位置:   article > 正文

【加密芯片】加密芯片——ATSHA204A的使用_atsha204a验证码不一致

atsha204a验证码不一致

闲扯一下

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

前言

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

资料参考列表:

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

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

github源码实例

配置

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

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

  1. void read_config(int fd, struct atsha204a_command_packet *command_packet)
  2. {
  3. uint8_t status;
  4. //1.du入测试
  5. memset(readdata, -1, 32);
  6. cmd_args.op_code = command_packet->op_code;
  7. cmd_args.param_1 = command_packet->param1;
  8. cmd_args.param_2 = command_packet->param2;
  9. cmd_args.data_len_1 = command_packet->data_len;
  10. cmd_args.data_1 = command_packet->data;
  11. cmd_args.data_len_2 = 0;
  12. cmd_args.data_2 = NULL;
  13. cmd_args.data_len_3 = 0;
  14. cmd_args.data_3 = NULL;
  15. cmd_args.tx_size = 0x10;
  16. cmd_args.tx_buffer = global_tx_buffer;
  17. cmd_args.rx_size = 0x10;
  18. cmd_args.rx_buffer = global_rx_buffer;
  19. status = sha204m_execute(fd, &cmd_args);
  20. if (status != SHA204_SUCCESS) { printf(" Read data zone FAILED! \n"); }
  21. else{ printf(" Read data zone SUCCESS! \n"); }
  22. printf("read_data addr:%02x\n", command_packet->param2);
  23. printf_hex_array("readdata: ", 32, readdata);
  24. memcpy(readdata, &global_rx_buffer[1], 32);
  25. printf_hex_array("readdata: ", 32, readdata);
  26. }
  27. void write_config(int fd, struct atsha204a_command_packet *command_packet)
  28. {
  29. uint8_t status;
  30. memset(readdata, -1, 32);
  31. cmd_args.op_code = command_packet->op_code;
  32. cmd_args.param_1 = command_packet->param1;
  33. cmd_args.param_2 = command_packet->param2;
  34. cmd_args.data_len_1 = command_packet->data_len;
  35. cmd_args.data_1 = command_packet->data;
  36. cmd_args.data_len_2 = 0;
  37. cmd_args.data_2 = NULL;
  38. cmd_args.data_len_3 = 0;
  39. cmd_args.data_3 = NULL;
  40. cmd_args.tx_size = 0x10;
  41. cmd_args.tx_buffer = global_tx_buffer;
  42. cmd_args.rx_size = 0x10;
  43. cmd_args.rx_buffer = global_rx_buffer;
  44. status = sha204m_execute(fd, &cmd_args);
  45. if (status != SHA204_SUCCESS) { printf(" Write data zone FAILED! \n"); }
  46. else{ printf(" Write data zone SUCCESS! \n"); }
  47. printf("read_data addr:%02x\n", command_packet->param2);
  48. printf_hex_array("readdata: ", 32, readdata);
  49. memcpy(readdata, &global_rx_buffer[1], 32);
  50. printf_hex_array("readdata: ", 32, readdata);
  51. }
  52. void my_config(int fd, uint8_t* key_15)
  53. {
  54. static uint8_t status = SHA204_SUCCESS;
  55. uint8_t serect[32] = { 0 }; //the key of slot 0
  56. uint8_t tmp_conf[2];
  57. uint8_t data1[4] = { 0x80, 0xA0, 0x80, 0xA0 };
  58. int slot = 10;
  59. uint16_t slot_addr = (uint16_t)(10 * 8);
  60. //1.du入测试 0x05
  61. get_sn_command.op_code = 0x02;
  62. get_sn_command.param1 = 0x00;
  63. get_sn_command.param2 = 0x05;
  64. get_sn_command.data_len = 0;
  65. get_sn_command.data = NULL;
  66. read_config(fd, &get_sn_command);
  67. //1.du入测试 SN
  68. get_sn_command.op_code = 0x02;
  69. get_sn_command.param1 = 0x80;
  70. get_sn_command.param2 = 0x00;
  71. get_sn_command.data_len = 0;
  72. get_sn_command.data = NULL;
  73. read_config(fd, &get_sn_command);
  74. //1.du入测试 0x15
  75. get_sn_command.op_code = 0x02;
  76. get_sn_command.param1 = 0x00;
  77. get_sn_command.param2 = 0x15;
  78. get_sn_command.data_len = 0;
  79. get_sn_command.data = NULL;
  80. read_config(fd, &get_sn_command);
  81. printf("===================开始配置========================\n");
  82. //1.config区配置solt0/1(key_15) 加密读 加密写 关联的solt区为 solt10(key_0)
  83. printf("config区配置solt0/1\n");
  84. // data1[4] = { 0x8A, 0xA0, 0x8A, 0xA0 };
  85. data1[0] = 0x8A; data1[1] = 0xA0; data1[2] = 0x8A; data1[3] = 0xA0;
  86. get_sn_command.op_code = 0x12;
  87. get_sn_command.param1 = 0x00;
  88. get_sn_command.param2 = 0x05;
  89. get_sn_command.data_len = 4;
  90. get_sn_command.data = data1;
  91. write_config(fd, &get_sn_command);
  92. //1.du入测试 0x05
  93. get_sn_command.op_code = 0x02;
  94. get_sn_command.param1 = 0x00;
  95. get_sn_command.param2 = 0x05;
  96. get_sn_command.data_len = 0;
  97. get_sn_command.data = NULL;
  98. read_config(fd, &get_sn_command);
  99. //2.solt10(key_0) 可随意读写//锁定后还能进行读写吗?因该是不能写
  100. printf("config区配置solt10/11\n");
  101. // data1[4] = { 0x00, 0x00, 0x00, 0x00 };
  102. data1[0] = 0x00; data1[1] = 0x00; data1[2] = 0x00; data1[3] = 0x00;
  103. get_sn_command.op_code = 0x12;
  104. get_sn_command.param1 = 0x00;
  105. get_sn_command.param2 = 0x0A;
  106. get_sn_command.data_len = 4;
  107. get_sn_command.data = data1;
  108. write_config(fd, &get_sn_command);
  109. //3.锁定config区
  110. //3.1 读取0x15地址配置信息
  111. printf("3.1 读取0x15地址配置信息\n");
  112. get_sn_command.op_code = 0x02;
  113. get_sn_command.param1 = 0x00;
  114. get_sn_command.param2 = 0x15;
  115. get_sn_command.data_len = 0;
  116. get_sn_command.data = NULL;
  117. read_config(fd, &get_sn_command);
  118. //3.2锁定config区
  119. data1[0] = 0x00; data1[1] = 0x00; data1[2] = 0x55; data1[3] = 0x00;
  120. get_sn_command.op_code = 0x17;
  121. get_sn_command.param1 = 0x80;
  122. get_sn_command.param2 = 0x00;
  123. get_sn_command.data_len = 0;
  124. get_sn_command.data = NULL;
  125. write_config(fd, &get_sn_command);
  126. //3.3 读取0x15地址配置信息
  127. printf("3.3 读取0x15地址配置信息\n");
  128. get_sn_command.op_code = 0x02;
  129. get_sn_command.param1 = 0x00;
  130. get_sn_command.param2 = 0x15;
  131. get_sn_command.data_len = 0;
  132. get_sn_command.data = NULL;
  133. read_config(fd, &get_sn_command);//0x00 0x00 0x55 0x00 成功
  134. //4. 写入秘钥 slot
  135. printf("4.1 读取slot数据\n");
  136. slot_addr = (uint16_t)(0 * 8);
  137. get_sn_command.op_code = 0x02;
  138. get_sn_command.param1 = 0x82;
  139. get_sn_command.param2 = slot_addr;
  140. get_sn_command.data_len = 0;
  141. get_sn_command.data = NULL;
  142. read_config(fd, &get_sn_command);
  143. //4.2 往slot0写入秘钥
  144. slot_addr = (uint16_t)(0 * 8);
  145. get_sn_command.op_code = 0x12;
  146. get_sn_command.param1 = 0x82;
  147. get_sn_command.param2 = slot_addr;
  148. get_sn_command.data_len = 32;
  149. get_sn_command.data = key_15;
  150. write_config(fd, &get_sn_command);
  151. //4.3 往slot10写入秘钥
  152. slot_addr = (uint16_t)(10 * 8);
  153. get_sn_command.op_code = 0x12;
  154. get_sn_command.param1 = 0x82;
  155. get_sn_command.param2 = slot_addr;
  156. get_sn_command.data_len = 32;
  157. get_sn_command.data = key_0;
  158. write_config(fd, &get_sn_command);
  159. //4.4 锁定slot data
  160. get_sn_command.op_code = 0x17;
  161. get_sn_command.param1 = 0x81;
  162. get_sn_command.param2 = 0x00;
  163. get_sn_command.data_len = 0;
  164. get_sn_command.data = NULL;
  165. write_config(fd, &get_sn_command);
  166. //4.5 读取0x15地址配置信息
  167. printf("4.5 读取0x15地址配置信息\n");
  168. get_sn_command.op_code = 0x02;
  169. get_sn_command.param1 = 0x00;
  170. get_sn_command.param2 = 0x15;
  171. get_sn_command.data_len = 0;
  172. get_sn_command.data = NULL;
  173. read_config(fd, &get_sn_command);//0x00 0x00 0x00 0x00 成功
  174. }

具体的配置意义可以详细查看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中的配置来进行读写。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/81607
推荐阅读
相关标签
  

闽ICP备14008679号