日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【加密芯片】加密芯片——ATSHA204A的使用

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【加密芯片】加密芯片——ATSHA204A的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閑扯一下

好久沒寫博客了,技術之路在于堅持,長期寫博客,總結,?是對自己一個不錯的鍛煉,希望看到的博友能夠堅持下去,一起互勉。

前言

最近由于產品需要,加班加點完成了這個項目的預研。加密芯片的目的,哪里都可搜索的到,這里就不多說,主要談一些自己在接觸中的一些心得,以及技術備注,以便以后查閱和使用。

資料參考列表:

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的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。