This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LP-MSPM0G3519:AES CMAC 40 字节消息验证–固件输出不匹配

Guru**** 2680875 points

Other Parts Discussed in Thread: MSPM0G3519

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1584565/lp-mspm0g3519-aes-cmac-40-byte-message-validation-firmware-output-mismatch

器件型号: 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));
}

要求澄清

请确认以下几点:

  1. DL_AESADV_MODE_CMAC会自动处理 填充和子键 (K1/K2) XOR 内部、
    或者固件应该在调用之前手动应用异或和填充DL_AESADV_loadInputDataAligned()吗?

  2. 进行 AESADV 支持为非 16 之倍数的消息长度生成 CMAC (例如 7 或 40 字节)?
    我观察到什么时候 msgLen不是 16 的倍数 、CMAC 不正确。
    也是通过 0 字节作为长度 会导致没有有效输出。

  3. 是这样预期的 仅为 16 字节的倍数 是否支持 CMAC 操作?
    如果不是、是否有额外的配置步骤来启用部分块处理?


此致、
Kasirajan C

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好  Kasirajan、

    1.它不会  自动处理填充和子键异或。

    2、根据 TRM、我相信下图可以回答您其余两个问题、输入数据应为 16 个字节、长度必须大于 0。

    谢谢!

    此致、
    彼得

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Peter:  

    如果我有误、请纠正我。根据我的上述理解、AESADV 的 AES CMAC 输入必须是 16 字节(16、32、48 等)的倍数。 如果消息不是 16 的倍数、固件应填充0x80后跟零、直到达到 16 个字节、然后与最后一个块进行异或运算 K2 .i 对 40 字节消息应用了此规则:

    6BC1BEE22E409F96E93D7E117393172A
    AE2D8A571E03AC9C9EB76FAC45AF8E51
    C715B076C9BE82DD790BC11EE46D513B←填充⊕K2

    不过、的 CMAC 输出DL_AESADV_readTAG()为:
    465AF15ED86DBF7223C13C77682B884D

    但预期的 CMAC(根据 RFC 4493/NIST SP800-38B)为:
    DFA66747DE9AE63030CA32611497C827

    为什么即使最后一个块和填充正确、硬件也会返回不正确的 CMAC?

    谢谢、
    Kasirajan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kasirajan:

    我来澄清一下有关 CMAC 的基于 AESADV 的更多信息:

    • 如果输入数据没有 16 字节对齐、客户需要使用 0b1000...手动填充输入缓冲器 STREAM(如您所说的 0x80 后跟零)、以确保输入缓冲器为 16 字节对齐。
    • CMAC 最后一步(与 K1/K2 异或)由硬件 AESADV 模块本身实现、因此此步骤无需在固件中计算。
    • 如果输入数据没有 16 字节对齐、您还需要设置 C_LENGTH_0 寄存器(CMAC 配置中的.lowerCryptoLength 字段)作为 实际长度 (示例中为 40)。  

    此致、

    Pengfei

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的答复。