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

本文实现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;
}

ATSHA204A加密芯片之--MAC校验代码相关推荐

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

    大家好,这是接上一篇使用篇的博客,本篇文章主讲atsha204a加密芯片的配置方式,前面讲到,atsha204a加密芯片内部rom分三个区域,一个是config zone,一个是slot zone,还 ...

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

    ATSHA204A加密芯片是ATMEL公司研发的一款高安全性的,功能丰富的加密IC,使用SHA-256算法进行加密操作,内置16*32字节的slot(EEPROM)可以存储用户数据和秘钥,唯一的9字节 ...

  3. 蓝牙:CRC原理详解(附crc16校验代码)

    CRC原理详解(附crc16校验代码) 参考链接: https://www.cnblogs.com/esestt/archive/2007/08/09/848856.html Cyclic Redun ...

  4. win 10 电脑与 H C-05蓝牙模块连接方法集合(含k60 CRC 校验代码软件下载地址)

    在飞思卡尔比赛,有时需要通过蓝牙模块让电脑和小车连接,然后用串口将小车的实时数据发送到电脑,以便调车.但是在蓝牙模块与电脑连接时,因为驱动等原因,容易连接失败.经过网上搜查,与个人及队友试验,总结以下 ...

  5. ipv4、ipv6格式校验代码

    ipv4.ipv6格式校验代码 一.题目 IPv4 地址格式: IPv4地址由4组十进制数组成,每组范围为 0 - 255,用"."分割. 注意:IPv4 地址内的数不能以 0 开 ...

  6. CRC-32校验和CRC-32校验代码

    crc-32校验代码:测试结果如下 uint32_t  crc32(uint8_t const * p_data, uint32_t size, uint32_t const * p_crc) {   ...

  7. html保留两位小数php,JS保留两位小数输入数校验代码

    这次给大家带来JS保留两位小数输入数校验代码,JS保留两位小数输入数校验的注意事项有哪些,下面就是实战案例,一起来看一下. 输入input 的格式校验:$(function(){ var data = ...

  8. 哪款Mac代码编辑器好用?Mac文本代码编辑器推荐—-CudaText for Mac

    一款好的代码编辑器可以使工作更有效率,今天要给大家推荐一款Mac文本代码编辑器推荐--CudaText.CudaText Mac版是一款轻便好用的跨平台文本代码编辑器,具有很好的配置可能性和许多高级功 ...

  9. 在线 OJ 项目(三) · 处理项目异常 · UUID · 校验代码的安全性 · 阶段性总结

    一.处理异常 二.区分不同请求的工作目录 UUID 对 Task 类进行重构 三.校验代码的安全性 四.阶段性总结 书接上回,我们自己测试没问题,是因为使用了正常数据:万一用户输入的是非法的请求,该咋 ...

最新文章

  1. 【Linux】10_存储管理EXT4文件系统详解
  2. 学习笔记Flink(二)—— Flink数据流模型、时间窗口和核心概念
  3. InnoDB与MyISAM等存储引擎对比
  4. java对象赋值给另一个对象_java面向对象编程
  5. [JAR包] android引入JAR包,打包成JAR包,打包成Library项目,导入Library项目
  6. CSS中position的4种定位详解
  7. 在Windows中为文件添加“可执行”权限(chmod +x 文件名 不起作用)
  8. Python机器学习的一些文档
  9. MATLAB 图像滤波器
  10. 互联网金融消费利用场景化带动行业发展趋势
  11. linux进程cpu时间片,Linux性能监控之CPU篇
  12. github新手入门
  13. scrapy框架之全站数据的爬取
  14. 1051 复数乘法 (C++)
  15. GitChat · 软件工程 | 一小时教你学会 Maven 项目的构建与管理
  16. 【AUTOSAR】【以太网】Eth驱动
  17. docker学习——杂记
  18. go语言生成指定个数数字验证码
  19. 硒鼓带不带芯片区别_硒鼓芯片的价格为什么相差悬殊?
  20. C#模拟HTTP请求Post JSON

热门文章

  1. 如何转载文章(主要是自用)
  2. TCP/IP详解之 《网络协议》图解 TCP 连接建立与释放
  3. oracle中sql%rowcount的作用
  4. 阿里云ecs和域名的购买,绑定,备案教程
  5. 娣卞害绁炵粡缃戠粶濡備綍璁粌
  6. httpunit爬虫
  7. 学习使我快乐 第六天
  8. “十步学习法”,如何快速掌握一门技能,如何快速学习新技术
  9. 初学者用js是怎么敲九九乘法表的
  10. html语言中tr,html元素tr标签的使用方法及作用