MOD8ID
(模微半导体推出的一款基于硬件安全引擎的加密芯片)
加密芯片是一种专门设计用于保护计算机、物联网设备和嵌入式系统等信息安全的硬件。它通过内置的加密算法对数据进行加密和解密,以保证数据的隐私和完整性,防止黑客攻击和窃取敏感数据,加密芯片的主要作用包括一下几个方面:
数据加密和解密:加密芯片内置的加密算法可以对数据进行加密和解密,保护数据的隐私性和完整性
认证和身份验证:加密芯片可以实现身份验证,防止黑客攻击和非法用户的访问
安全存储:加密芯片可以提供安全存储功能,防止敏感数据被窃取或篡改。
物联网设备连接各种各样的物品,包括传感器、执行器、智能家居、智能车辆等等,这些设备需要在互联网中进行通信,并保证通信过程的安全和隐私。
身份认证和安全通信:
在物联网设备之间进行通信的时候,必须进行身份认证和安全通信。身份认证是可以防止黑客攻击和恶意用户的访问。而安全通信可以保护数据的隐私性和完整性。
MOD8ID加密芯片是模微半导体推出的一种高安全性、低功耗、高集成度的加密芯片、支持ECC加密算法、具有256位安全密钥,同时提供了硬件随机数生成器、加密密钥管理和防攻击等安全功能。
嵌入式软件防克隆:
嵌入式系统中的软件往往是公司的重要资产,需要进行保护。加密芯片可以提供软件防克隆功能,以防止黑客攻击和盗版行为。MOD8ID加密芯片都具有软件防克隆功能。
MOD8ID加密芯片内置的Secure Boot功能可以防止恶意软件的启动和运行,它通过验证设备的软件是否合法和未被篡改来防止攻击。同时MOD8ID还可以用于保护程序代码和数据的完整性,防止黑客的攻击和窃取。
MOD8ID支持多种加密算法和协议,包括AES、ECC、SHA-256、HMAC和ECDSA等,MOD8ID还具有Secure Boot功能和软件防克隆功能,可以保护设备的安全性和知识产权。
MOD8ID是模微半导体推出的一款基于硬件安全引擎的加密芯片,它提供了一个安全存储和运行环境,已经许多加密和认证功能。
函数流程如下:
生成128字节的随机明文数据,并打印输出。
使用随机生成的IV和密钥对明文进行加密,得到密文和身份验证标记,并打印输出。
使用相同的密钥和IV对密文进行解密,得到解密后的明文和身份验证标记,并打印输出。
验证解密的身份验证标记是否与加密时计算的身份验证标记匹配。
比较原始明文数据和解密后的明文数据是否匹配,如果匹配则返回真,否则返回假。
其中,mod8_generate_random函数用于生成演示用随机明文数据,mod8_encrypt_data和mod8_decrypt_data函数分别用于加密和解密数据
// MODSEMI MOD8ID for AES-GCM test function
bool mod8_test_enc_dec()
{
//Generate random 128 byte plain text for encryption
for (int idx = 0; idx < 4; idx++)
{
if (!mod8_generate_random(_gDevice,plaintext + (idx * 32)))
{
printf( "Random data generation fail\r\n");
return false;
}
}
printf( "Plain text : ");
for (int i = 0; i < 128; i++)
{
printf( "%02X", plaintext[i]);
}
printf( "\r\n");
// Encrypt data by MOD8ID
if (!mod8_encrypt_data(MSE_TEMPKEY_KEYID, plaintext, 128, cipherText, authTag, NULL, iv))
{
printf( "Encryption failed\r\n");
return false;
}
printf( "IV : ");
for (int i = 0; i < (AES_IV_LENGTH); i++)
{
printf( "%02X", iv[i]);
}
printf( "\n Cipher text : \n");
for (int i = 0; i < 128; i++)
{
printf( "%02X", cipherText[i]);
}
printf( "\n Auth tag : \n");
for (int i = 0; i < AES_AUTH_TAG_SIZE; i++)
{
printf( "%02X", authTag[i]);
}
// Decrypt data by MOD8ID
if (!mod8_decrypt_data(MSE_TEMPKEY_KEYID, cipherText, 128, iv, authTag, decryptedText, &isVerified))
{
printf( "\n Decryption failed \r");
return false;
}
printf( "\n Decrypted data : ");
for (int i = 0; i < 128; i++)
{
printf( "%02X", decryptedText[i]);
}
if (isVerified == false)
{
printf( "\nDecryption authentication failed \r\n");
}
else{
printf( "Decrypted data authenticated\r\n");
}
//Check if the plain text and decrypted texts match
if (memcmp(plaintext, decryptedText, 128) == 0)
{
printf( "Decrypted text matches plain text\r\n");
return true;
}
return false;
}
其中MOD8ID与芯片之间相沟通
I2C通信
IIC(Inter-Integrated Circuit)总线是一种两线式串行总线,半双工通信。
协议就是规则,由发明I2C通信的大佬们定下的,也是方便微处理器和外设通信,双方约定好协议,以保证传输数据的有效性和正确性。
1、物理接口
(1)SCL(serial clock)
时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道。
(2)SDA(serial data)
数据线,通信数据(命令、地址、数据)都通过SDA线传输。
2、通信特征
(1)串行通信
所有的数据以比特为单位在SDA线上串行传输,但每次传输8bit。
(2)同步通信
通信双方工作在同一个时钟。A方通过CLK信号线传输时钟给B,B工作在A传输的时钟下。
(3)电平信号
因为I2C通信速率不高,而且通信双方距离很近,所以使用电平信号通信。
(4)低速率通信
I2C一般用在同一个板子上的2个IC之间,传输的数据量不大,因此本身通信速率很低。一般几百KHz,不同I2C芯片的通信速率可能不同,在编程的时候要看具体设备允许的I2C通信最高速率。
3、突出特征
(1)分为主设备与从设备
通信由主设备发起和主导,从设备只是按照I2C时序协议被动地接受主设备的通信。
谁是主从设备,由通信双方来决定,I2C协议并无规定。
(2)允许多个从设备挂在一条总线上
主设备负责调度总线,决定某一时间与哪个从设备通信。
同一时刻,只能有一个从设备和主设备通信,其他从设备处于休眠状态。
每个I2C从设备在通信中都有一个I2C从设备地址,它是从设备本身固有的属性。这个地址在电路板上是唯一的,但不是全球唯一的。这个地址共7个bit,理论上有128个地址,但有几个保留地址如广播地址0x00等,因此数量少于128个。另外标准协议里预见了地址的局限性,扩充了10位地址的概念。
系统中可能有多个同种芯片,因此从设备的地址分为固定部分和可编程部份。
通信时主设备需要知道从设备的地址,然后在通信中通过地址来甄别是不是自己要找的那个从设备。
IIC可以挂多少个设备?对于同一个地址的设备来说,在不进行地址扩充(片选)的情况下只能挂一个;对于不同的设备来说,标准协议里面没有限制具体的数量,这个由线路布线情况、软件情况以及工作模式确定。对于标准模式,只要总线上的负载电容不超过400pf,不超过芯片的负载能力既可以。
(3)采用大端传输方式
SDA传输数据是大端传输,每次传输的有效数据都是1个字节。
4、应用领域
SoC和周边外设之间的通信,典型的如EEPROM、电容触摸IC、各种sensor等。
通过API操控加密应用:
CryptoAuthLib
Atmel CryptoAuthentication Library是Atmel 兼容其加密芯片系列一个总的软件库,里面实现了从底层到命令层以及应用层开发使用的所有API,并支持Git使用。
该库还在不断完善,兼容Atmel许多开发板,目前能够support的加密芯片有:
Lib中最主要的三种对象类型:
ATCADevice:Device 设备对象
由ATCAIface和ATCACommand实例组成,初始化Basic 的API会自动创建一个对象,通过该对象完成各种operation,There is one instance of an ATCADevice per physical device expected to manage the system.
ATCAIface :Interface 包括硬件抽象层中,底层驱动操作(收发数据)
ATCAIface定义了与底层加密芯片通信的接口函数,将 HAL 的API函数与应用层关联起来 ,以屏蔽底层通讯层(I2C、UART)的差异。
ATCACommand:Command 包括加密芯片支持的各种命令
ATCACommand对象主要将命令重组成数组,以便发送到加密芯片。ATCACommand对象不发送命令,只build命令;例如确定命令响应包的大小、计算CRC等。
Test main主要进程流程分析:
- 初始化:
atcab_init
在atca_iface.c (libraries\cryptoauthlib\lib目录)中 ,有_atinit()这么一个函数,会在atcab_init初始化设备时调用,函数里实现了hal层通讯函数与API层的绑定:
在lib中,底层通讯相关驱动都在**/lib/hal/** 目录下。
同时MOD8ID可完美兼容替代ATECC608A/ATECC508A系列。
因此对于MOD8ID芯片来说,是以上述两个芯片支持来维护的。
status = atcab_init (&cfg_ateccx08a_i2c)
在atca_hal.c (libraries\cryptoauthlib\lib\hal) 中,实现了Hal层与底层通讯驱动函数的绑定,例如在前面我们打开了I2C宏: ATCA_I2C_IFACE,则现在hal层各函数就会与I2C相关函数绑定: