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

代码较多,先上传秘钥校验,借鉴了坛子里部分同学的代码

本文实现ATSHA204A 32字节随机数+16选1随机秘钥的MAC秘钥校验,如下是demo代码


static int atsha204_mac(struct i2c_client *client)

{
uint8_t recbuf[39] = {0};
uint8_t rand_buf[32] = {0};
int i = 0,ret = -99;
int ii=0;
int len = 0x58; //MsgBuf has 88 byte data
#define SLOT_COUNT  32
#define SLOT_NUMBER 66    // 32+32+4-1-1
#define SLOT_NUMBER_DIG 3 // 4+1-1-1
#define SLOT_COUNT_DIG  5
sha256_ctx ctx;
uint8_t MsgBuf[128] = {0x11,0x11,0x23,0xB6,0xCC,0x53,0xB7,0xB9,0xE9,0xBB,0x51,0xFD,0x2F,0x74,0xCD,0x0E,
  0x91,0xD9,0x7F,0xEB,0x84,0x7B,0x98,0x09,0xF4,0xCD,0x93,0x6A,0xB6,0x48,0x11,0x11,
  0x23,0x66,0x17,0xc8,0xba,0x55,0xf9,0x56,0x71,0x93,0x16,0xdc,0x5d,0xa2,0x76,0x46,
  0x14,0x85,0x46,0x95,0x31,0xaa,0x82,0x37,0x43,0xa6,0xe7,0xe8,0x39,0xd7,0x23,0x88,
  0x08,0x00,0x01,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0xee,0x00,0x00,0x00,0x00,0x01,0x23,0x00,0x00};
uint8_t Digest[32] = {0};
uint8_t buffer1[39] = {0x27,
                  0x08,0x00,0x01,0x00,
                  0x23,0x66,0x17,0xc8,0xba,0x55,0xf9,0x56,0x71,0x93,0x16,0xdc,0x5d,0xa2,0x76,0x46,
  0x14,0x85,0x46,0x95,0x31,0xaa,0x82,0x37,0x43,0xa6,0xe7,0xe8,0x39,0xd7,0x23,0x88,
  0x00,0x00};
get_random_bytes(rand_buf,sizeof(rand_buf));

for(i = 0;i < 32;i++)
atsh204_print("%02X ",rand_buf[i]);

memcpy(&MsgBuf[SLOT_COUNT],rand_buf,32);
memcpy(&buffer1[SLOT_COUNT_DIG],rand_buf,32);
ii = rand_buf[1] % 13; //magic 
atsh204_print("Slot Number =%d:\n ",ii);
switch(ii)
{
case 0:
memcpy(MsgBuf,&Buffer1[5],32);
break;
case 1:
memcpy(MsgBuf,&Buffer2[5],32);
break;
case 2:
memcpy(MsgBuf,&Buffer3[5],32);
break;
case 3:
memcpy(MsgBuf,&Buffer4[5],32);
break;
case 4:
memcpy(MsgBuf,&Buffer5[5],32);
break;
case 5:
memcpy(MsgBuf,&Buffer6[5],32);
break;
case 6:
memcpy(MsgBuf,&Buffer7[5],32);
break;
case 7:
memcpy(MsgBuf,&Buffer8[5],32);
break;
case 8:
memcpy(MsgBuf,&Buffer9[5],32);
break;
case 9:
memcpy(MsgBuf,&Buffer10[5],32);
break;
case 10:
memcpy(MsgBuf,&Buffer11[5],32);
break;
case 11:
memcpy(MsgBuf,&Buffer12[5],32);
break;
case 12:
memcpy(MsgBuf,&Buffer13[5],32);
break;
case 13:
memcpy(MsgBuf,&Buffer14[5],32);
break;
case 14:
memcpy(MsgBuf,&Buffer15[5],32);
break;
case 15:
memcpy(MsgBuf,&Buffer16[5],32);
break;
default:
break;
}

MsgBuf[SLOT_NUMBER] =  ii;
buffer1[3] = ii;
atsh204_print("final MsgBuf .... .\n");


for(i=0; i<32; i++)
atsh204_print("%02X ",MsgBuf[i]);
atsh204_print("\n");
for(i=32; i<64; i++)
atsh204_print("%02X ",MsgBuf[i]);
atsh204_print("\n");
for(i=64; i<88; i++)
atsh204_print("%02X ",MsgBuf[i]);
atsh204_print("\n");
//memcpy(MsgBuf,Buffer3,32);


sha204c_calculate_crc(37,buffer1,&buffer1[37]);
atsha204_i2c_write_bytes(client,COMMAND_ADDRESS,buffer1,buffer1[0]);
msleep(50); //different commands have different delay times
i2c_master_recv(client, recbuf, 35);
ret = sha204c_check_crc(recbuf);




sha256_init(&ctx);
sha256_update(&ctx, MsgBuf, len);
sha256_final(&ctx, Digest);

atsh204_dbg(">>>>>> atsha204 digest is :\n");
for(i = 0;i < 32;i++){
atsh204_dbg("%02X ",Digest[i]);
if(recbuf[i+1] != Digest[i]){
atsh204_dbg(">>>>>>> atsha204 check fail : Digest[i] != recbuf[i+1] :%2X <<<<<<<<<<<<\n",Digest[i]);
ret = -1;
break;
}
if((i+1) % 16 == 0)
atsh204_dbg("\n");
if(i == 31)
atsh204_dbg(">>>>>>> atsha204 check success <<<<<<<<<<<<\n");


}
}


for(i = 0;i < 35;i++){
atsh204_print("%02X ",recbuf[i]);
if(i % 16 == 0)
atsh204_dbg("\n");
}
return 0;
}
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值