ATSHA204A-MAHDA-T是一款用于固件版权保护,防抄板仿克隆的加密芯片。包含16个密钥存储区用于安全存储密钥。同时提供OTP区用于存储用户固定信息。
MODSEMI的MOD208加密芯片,无论是硬件,还是指令API软件,做到了完美兼容ATSHA204A-MAHDA-T。包括密钥slot配置,认证指令,以及驱动方式。压力测试比ATSHA204A更加稳定,可靠性非常好.
--ATSHA204A与MOD208加密芯片兼容性指令列表对比---
安全命令 | 说明 | ATSHA204A | MOD208加密芯片 |
DeriveKey | 从目标密钥或父密钥获取目标密钥值。 | 支持 | 支持 |
DevRev | 返回加密芯片版本信息。 | 支持 | 支持 |
GenDig | 通过随机数或输入种子和密钥产生数据保护摘要。 | 支持 | 支持 |
HMAC | 利用 HMAC/SHA-256 计算密钥和其他内部数据响应 | 支持 | 支持 |
CheckMac | 验证其他 CryptoAuthentication 芯片计算的 MAC。 | 支持 | 支持 |
Lock | 禁止加密芯片分区的后续更新。 | 支持 | 支持 |
MAC | 利用 SHA-256 从密钥和其他内部数据计算应答。 | 支持 | 支持 |
Nonce | 生成 32-byte 随机数和内部存储临时数据值即 tempkey。 | 支持 | 支持,且支持真随机 |
Pause | 可选地将一个以外所有共享总线的定芯片送入待机状态。 | 支持 | 支持 |
Random | 生成随机数。 | 支持 | 支持 |
Read | 从芯片读 4 字节,可使用或不使用身份认证和加密。 | 支持 | 支持 |
SHA | 计算任何用途的 SHA256 摘要。 | 支持 | 支持 |
UpdateExtra | 在配置分区锁定后,更新配置分区内的字节 84 或 85。 | 支持 | 支持 |
Write | 写 4 或 32 字节到芯片,有或无认证与加密。 | 支持 | 支持 |
ATSHA204A-MAHDA-T 为UDFN8(或称DNF8)封装,MOD208同样提供UDNF8封装规格,也提供SOP8封装。
密钥配置和认证代码完全兼容:
while (1) {
printf("--> 按下按钮开始配置MOD208加密芯片...");
while (LL_GPIO_IsInputPinSet(KEY_S2_GPIO_Port, KEY_S2_Pin) == 1);
printf("OK\r\n");
delay_ms(1000);
for (I2C_BusIdx = 0; I2C_BusIdx < MAX_I2C_BUSES; I2C_BusIdx++) {
printf("------------------- START -------------------\r\n\r\n");
printf("********* 当前处理第 %02u 片加密芯片 *********\r\n", I2C_BusIdx);
// 初始化 CryptoAuthlib 加密库,申请 "堆 Heap" 内存,用于存放相关对象实例
cryptoauthlib_init();
if (atcab_read_serial_number(sn) != SUCCESS) {
printf("--> 读取序列号失败,请核对芯片型号是否与程序相符合...\r\n\r\n");
} else {
printf("--> 当前芯片序列号: 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\r\n", sn[0], sn[1], sn[2], sn[3], sn[4], sn[5], sn[6], sn[7], sn[8]);
}
// Provision the device with the configuration and shared secret data
#if IP_PROTECTION_LOAD_CONFIG
if (device_provision(CRYPTOAUTH_DEVICE_AUTH_KEY_SLOT) != SUCCESS) {
printf("--> 加密芯片配置失败...\r\n");
printf("--> 检查设备然后复位重试...\r\n");
}
#endif
// Initialize the time for the authentication to perform
g_auth_interval_msec = (rand() % AUTHENTICATION_RANGE_MSEC) + AUTHENTICATION_MIN_MSEC;
// Forcing to do Authentication at the start
g_do_auth = true;
if (authenticate_application() == NOT_AUTHENTICATED) {
printf("--> 加密芯片验证失败,1秒后重试...\r\n\r\n");
delay_ms(1000);
}