Other Parts Discussed in Thread: MSPM0G3519
器件型号: LP-MSPM0G3519
主题: MSPM0G3519 中讨论的其他器件
尊敬的 TI 团队:
我正在验证 AES CMAC 生成 使用了 AESADV 硬件加速器 亮起 MSPM0G3519 。
对于 16 字节和 32 字节消息、固件的 CMAC 输出与 NIST SP800-38B 测试向量非常匹配。
但是、对于 A 40 字节消息(16 的非倍数) 、则固件的 CMAC 输出将执行 不匹配 预期值。
下面是我详细的观察结果和测试设置。
AES 密钥 :2b7e151628aed2a6abf7158809cf4f3c
AES-ECB(零)L : 7df76b0c1ab899b33e42f047b91b546f
派生 K1 :fbeed618357133667c85e08f7236a8de
派生 K2 :f7ddac306ae266ccf90bc11ee46d513b
消息(40 字节):
6bc1bee22e409f96e93d7e117393172ae2d8a571e03ac9c
9eb76fac45af8e5130c81c46a35ce411
部分(未填充)最后 8 个字节:30c81c46a35ce411
填充块(在 XOR K2 之前) :30c81c46a35ce4118000000000000000
K2. :f7ddac306ae266ccf90bc11ee46d513b
最后一个块(填充^ k2) :c715b076c9be82dd790bc11ee46d513b
预期 CMAC (NIST SP800-38B):
dfa66747de9ae630ca32611497c827
固件 CMAC(观察):
465AF15ED86DBF7223C13 C77682B884D
使用以下命令加载密钥:
DL_AESADV_setKeySize (AESADV、DL_AESADV_KEY_SIZE_128);
DL_AESADV_setKey (AESADV、(uint32_t *) AES_KEY);
使用的固件函数
void GENERATE_CMAC (uint8_t *msg、uint32_t msgLen、uint8_t *Tagout)
{
__attribute__((aligned (4))) uint8_t lastBlock[16]={0};
if ((msg == NULL_ptr)||(Tagout == NULL_ptr)||(msgLen == 0U))
返回;
DL_AESADV_Config config ={
.MODE = DL_AESADV_MODE_CMAC、
.direction = DL_AESADV_DIR_encrypt、
.k1 = rub_output_subkey1、
.k2 = rub_output_subkey2、
.lowerCryptoLength = msgLen、
.upperCryptoLength = 0U、
.aadLength = 0U、
.iv = NULL、
.nonce = NULL
};
DL_AESADV_initCMAC (AESADV、&CONFIG);
uint32_t fullBlocks = msgLen/16U;
uint32_t remBytes = msgLen % 16u;
对于 (uint32_t i = 0;i < fullBlocks;i++)
{
while(!DL_AESADV_isInputReady (AESADV)){;}
DL_AESADV_STATUS st = DL_AESADV_loadInputData (AESADV、msg +(I * 16U));
if (st != DL_AESADV_STATUS_SUCCESS){__BKPT(0); return;}
}
if (remBytes > 0u)
{
memcpy (lastBlock、msg +(fullBlocks * 16U)、remBytes);
lastBlock[remBytes]= 0x80;
对于 (int i = 0;i < 16;i++)
lastBlock[i]^= rub_output_subkey2[i];
while(!DL_AESADV_isInputReady (AESADV)){;}
DL_AESADV_loadInputDataAligned (AESADV、(uint32_t *) lastBlock);
}
while(!DL_AESADV_isSavedOutputContextReady (AESADV)){;}
DL_AESADV_STATUS st = DL_AESADV_readTAG (AESADV、Tagout);
if (st != DL_AESADV_STATUS_SUCCESS){__BKPT(0); return;}
memset (lastBlock、0、sizeof (lastBlock));
}
要求澄清
请确认以下几点:
-
DL_AESADV_MODE_CMAC会自动处理 填充和子键 (K1/K2) XOR 内部、
或者固件应该在调用之前手动应用异或和填充DL_AESADV_loadInputDataAligned()吗? -
进行 AESADV 支持为非 16 之倍数的消息长度生成 CMAC (例如 7 或 40 字节)?
我观察到什么时候msgLen不是 16 的倍数 、CMAC 不正确。
也是通过 0 字节作为长度 会导致没有有效输出。 -
是这样预期的 仅为 16 字节的倍数 是否支持 CMAC 操作?
如果不是、是否有额外的配置步骤来启用部分块处理?
此致、
Kasirajan C
