Thread 中讨论的其他器件: CC2640、 CC2650
工具/软件:TI-RTOS
如果在论坛中搜索提示、但我没有得到任何有用的提示。
我正在使用 CC2650STK - Sensortag。
我要尝试的是、传感器值(湿度和 IR-温度) 通过 AES-CCM 进行加密。 稍后、RaspberryPi 3会连接到它并收集数据、然后对其解密。
如果阅读《开发人员指南》(CC2640和 CC2650 SimpleLink低功耗 Bluetooth
软件栈2.2.1),则说明存在加密驱动程序。 它发布为:C:\TI\tirtos_cc13xx_cc26xx_2_20_01_08\products\tidrivers_cc13xx_cc26xx_2_20_01_10\docs\doxygen\html\index.html。 这将引导我进入 CryptoCC26XX.h 文件参考-部分。
I'v 使用了示例代码(sensortag_hum.c 内部-文件从 第328行开始-->就在 SensorHdc1000_read (&data.v.rawTemp、&data.v.rawHum)函数之后):
#define macLength (4)
#define clearTextLength (16)
#define cipherTextLength (macLength + clearTextLength)
#define NonceLength (12)
#define aadLength (14)
//保持此示例的 AES-CCM 设置
typedef 结构
{
uint8_t key[16]; // 128位 AES 密钥
CryptoCC26XX_KeyLocation 密钥位置; //硬件中的8个关键位置之一
uint8_t clearAndCniText[cnextlength];//保留前面的 cleartext 和 cnitext
//完成加密操作后。
//加密文本=加密文本+消息身份验证代码(MAC)。
uint8_t nonce[非 ceLength ];//仅使用一次的值(加密术语'nonce')
uint8_t header[aadLength ];//未加密但在操作(AAD)中经过身份验证的标头
。} AesCcmExamples;
AesCcmExamples CCMSetup =
{
.key ={0x2B、0x7E、0x15、0x16、0x28、 0xAE、0xD2、0xA6、
0xAB、0xF7、0x15、0x88、0x09、 0xCF、0x4F、0x3C}、
.keyLocation = CRYPTOCC26XX_KEY_0、
.clearAndChiText ={"t"、"h"、"i"、"S"、"i"、"a"、"p"、"l"、"a"、"i"、"n"、"t"、"e"、"e"、"x"、"t"、"t"、"0"、"0"、"0"、"0"、"0"、"0"、"0"、"0"、"0"、"0"、"0"、"0"、"0"、"0"、"0"、"0"、
.nonce ={"t"、"h"、"i"、"S"、"i"、"S"、"a"、"n"、"o"、"n"、"c"、"e"}、
.header={"t"、"h"、"i"、"S"、"i"、"S"、"h"、"e"、"a"、"a"、"d"、"d"、"e"、"e"、"r"、"1"}
};
CryptoCC26XX_handle 句柄;
内部32_t KeyIndex;
CryptoCC26XX_AESCM_Transaction Trans;
内部32_t 状态;
//初始化 Crypto 驱动程序结构
CryptoCC26XX_init();
//使用非独占访问和默认参数打开加密硬件。
Handle = CryptoCC26XX_open (Board_crypto、false、NULL);
if (handle == NULL){
//System_abort ("CryptoCC26XX did not open");
CryptoOpen = 0;
}否则{
CryptoOpen = 1;
}
//在硬件中分配密钥存储位置
KeyIndex = CryptoCC26XX_allocateKey (handle、CCMSetup.keyLocation、(const UINT32_t *) CCMSetup.key);
if (keyIndex =CRYPTOCC26XX_STATUS_ERROR){
//System_abort ("未分配密钥位置。");
KeyLocation = 0;
} 否则{
KeyLocation = 1;
}
//加密并验证消息
CryptoCC26XX_transac_init ((CryptoCC26XX_Transaction *)&trans、CRYPTOCC26XX_OP_AES_CCM);
TRANS.keyIndex = keyIndex;
trans.authLength = macLength;
trans.nonce =(char *) ccmSetup.nonce;
TRANS.HEADER =(char *) CCMSetup.HEADER;
TRANS.Fieldbength = 3;
TRANS.msgInLength = clearTextLength;
TRANS.headerLength = aadLength;
TRANS.msgIn =(char *)&(CCMSetup.clearAndChinText[0]); //消息已加密到位
TRANS.msgOut =(char *)&(CCMSetup.clearAndCipherText[clearTextLength ]);// MAC 将被写入此位置
状态= CryptoCC26XX_transact (handle、(CryptoCC26XX_Transaction *)&trans);
if (status!= CRYPTOCC26XX_STATUS_SUCCESS){
//System_abort ("加密和签名失败。");
encryption_and_signing = 0;
} 否则{
encryption_and_signing = 1;
}
//解密和验证消息
CryptoCC26XX_transac_init ((CryptoCC26XX_Transaction *)&trans、CRYPTOCC26XX_OP_AES_CCMINV);
TRANS.keyIndex = keyIndex;
trans.authLength = macLength;
trans.nonce =(char *) ccmSetup.nonce;
TRANS.HEADER =(char *) CCMSetup.HEADER;
TRANS.Fieldbength = 3;
TRANS.msgInLength =密码文本长度;
TRANS.headerLength = aadLength;
TRANS.msgIn =(char *)&(CCMSetup.clearAndChinText[0]); //在适当的位置解密消息
TRANS.msgOut =(char *)&(CCMSetup.clearAndCipherText[clearTextLength ]);//指向 MAC、在这里用作输入
//进行 AES-CCM 解密和身份验证
状态= CryptoCC26XX_transact (handle、(CryptoCC26XX_Transaction *)&trans);
if (status!= CRYPTOCC26XX_STATUS_SUCCESS){
//System_abort ("解密和验证失败。");
decrytion_and_ath = 0;
}
否则{
decrytion_and_ath = 1;
}
//释放关键位置
状态= CryptoCC26XX_releaseKey (handle、&keyIndex);
if (status!= CRYPTOCC26XX_STATUS_SUCCESS){
//System_abort ("密钥释放失败。");
keyRealease = 0;
} 否则{
keyRealease = 1;
}
调试时、 我的虚拟变量(cryptoOpen、keyLocation、encryption_and_signing、decrytion_and_ath、keyRelease)始终具有值1、这意味着一切都应该正常工作。 遗憾的是、我无法访问 trans 变量(更精确的 transrs.msgOut、它应该是密码+ MAC)。
I'v 还尝试了 crypto.c/crypto.h (第一个出现在该线程中: e2e.ti.com/.../2298769):
uint32_t plaintext[16]={'t'、'h'、'i'、's'、'i'、'p'、'l'、'a'、'i'、'n'、't'、'e'、'x'、't'}; uint32_t c'、's' 、'n'、't' 、't32'、't'、't'、't'、't'、't'、't'、't'、 t'、t'、't'、't'、t'、't'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、t'、 nonce、crypto_key_area_0、true、false); status = CRYPTOAesCbcStatus (); if (status!= AES_SUCCESS) { //Error encryption_and_signing = 0; }否则{ //Success encryption_and_signing = 1; }
这会导致应用程序停止(似乎它卡在 CRYPTOAesCbc ()-function <- I'v 这次尝试了另一种模式(CBC)))。
是否有办法加密(使用 AES-CCM)值、例如 uint16_t rawTemp、huminidity typdef 联合体的 rawHum、然后像正常值一样发送它? 就我所知:
uint8* const pValue;
最多可获得512个八位位组、这对于加密长度为(2*16bit = 4字节+ 16字节身份验证长度)足够。
感谢您的任何帮助、并提前感谢您。


