最近公司要用到Atsha204a做軟件和硬件的綁定加密,於是就調了它的驅動,將使用過程中遇到的坑整理下,也好讓各位同仁少加點班;廢話少說,直接入正題。
0.加密原理:
主控端和Atsha204a端有相同的16 組密碼,用一串明文(一般生成一組32byte隨機數),主控端用約定的一組密碼使用sha256()加密算法將明文生成Hash值(32 byte),同時主控將明文傳遞給Atsha204a端,用與主控約定好的一組(SlotNum)密碼內部生成sha256 Hash值。然後主控讀取Atsha204a生成的hash,與自身生成的hash進行對比,若相同則成功。
注意:通訊線路中(iic)不傳遞密碼,Atsha204a端密碼區先燒錄好16組密碼(根據配置,密碼可以設置不可讀,就算出來的,也是0xff),只傳遞加密前的明文和約定密碼的組號即可。
1.往Atsha204a裏寫密鑰:
1.1 配置 config zone:
主要是16組密碼的屬性(如是否明文顯示,是否可讀,是否可寫),如下的幾個配置:
int8_t data1[4]={0x80,0x80,0x80,0x80}; //data鎖定後不可讀,也不可寫
uint8_t data2[4]={0x80,0x00,0x80,0x00}; //
uint8_t data3[4]={0x00,0x00,0x00,0x00};//data鎖定可明文讀,也可寫
uint8_t data4[4]={0xC0,0x80,0xC0,0x80};//
uint8_t data5[4]={0xC0,0x00,0xC0,0x00};//
設備16組密碼的屬性:
Set_Zone_4byte(0,20,data1);
Set_Zone_4byte(0,24,data2);
Set_Zone_4byte(0,28,data3);
Set_Zone_4byte(0,32,data4);
Set_Zone_4byte(0,36,data5);
Set_Zone_4byte(0,40,data3);
Set_Zone_4byte(0,44,data3);
Set_Zone_4byte(0,48,data3);
1.2:lock config zone;一旦lock無法無法解鎖;
Lock(0x80);
1.3: write opt zone(我的沒有使用);
無
1.4: 確保2後可以進行 slot zone 密碼區進行讀寫;
在zone 3寫入16組密碼(每組32byte)
1.5: lock slot zone;一旦lock無法無法解鎖;
Lock(0x81);
6.操作完成,可以進入2的加密和驗證操作。
2.加密和驗證:
char ch;
static int slotNum = 0;
unsigned char recBuf[35]={0}; //接收ATSHA204計算結果
unsigned char randomNum[35]={0}; //隨機數BUF
CATsha204(); //定義一個類
ch = GenerateRandomNum(randomNum); //產生隨機數
if(ch != 0){
printk("==atsha204 iic com failed,exit==\n");
return -1;
}
printk("slotNum =%d\n",slotNum);
if(check_lock() != 1){
printk("\n this is a new atsha204,will fac_lock_atsha204\n");
//fac_lock_atsha204();
}
ch=Mac(slotNum,randomNum+1,recBuf); //進行密碼驗證
if(ch)
{
printk("-------------mac ok---------------\n");
}
else
{
printk("-------------mac fail---------------\n");
}
slotNum++;
if(slotNum >=16)
slotNum = 0;
return 0;