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.

[参考译文] TM4C129ENCPDT:SHA256保存和恢复中间值

Guru**** 2482105 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/713233/tm4c129encpdt-sha256-saving-and-restoring-intermediate-value

器件型号:TM4C129ENCPDT
Thread 中讨论的其他器件:SysConfig

我想处理 SHA256的一部分、保存中间结果

稍后加载中间结果、恢复下一位数据的哈希并最终确定哈希。

手册说明:

当哈希内核空闲或完成时、可以启动新的哈希操作。 任何其他信息
哈希内核所需的(操作模式、要处理的数据、如果不是从开始、则输入摘要)
必须通过在之前对 SHA 寄存器进行编程来提供算法常量或继续)
内核可以接受该操作

但是,我还没有找到如何做到这一点的任何例子

是否有人举例说明了保存和恢复散列摘要的过程、以便您可以在稍后继续?

或者、SHA256、SHAMD5、SHA224是否不可能这样做?

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

    您好 Barry、

    不幸的是、我们没有这方面的示例、我们的加密专家不再与团队合作、因此在尝试提供非常详细的支持时、我们可能会遇到一些挑战、但我会尽力提供最好的支持。

    查看数据表的 SHA 模式部分、第15.1.5.1节、列出了有关如何启动新散列的一组步骤。 在步骤3中、我们讨论了对于中间散列函数、您需要将 close_hash 位设置为0、直到发送最后一个必须进行散列的数据包、此时您需要将 close_hash 位设置为1。

    这就是在完成哈希之前加载数据块的方法。

    数据表的另一个相关段落如下:

    "重复此操作、直至达到要散列的消息长度。 然后、SHA_IRQSTATUS 寄存器中的 OUPTO_READY 位指示哈希运算已完成。 如果 SHA_SysConfig 寄存器中的 IT_EN 位被置位、则还会生成一个中断(低电平有效)以指示散列完成。

    然后、处理器可以读取包含哈希和/或 HMAC 结果的八个摘要寄存器 A 至 H。 如果哈希值是较大哈希值的中间结果、则还必须读取和保存摘要计数寄存器。"

    因此、您将在此基础上监控 output_ready 位、然后读取摘要寄存器以检索中间结果。 但您还需要读取并保存来自摘要计数寄存器 SHA_Digest 计数的内容。 然后、在执行下一轮散列时、您可以向 SHA_Digest _COUNT 寄存器写入保存的值。

    注意很遗憾、我看到数据表中有一些拼写错误、因此寄存器被称为 SHA_DIGESTCOUNT 和 SHA_Digest _COUNT -我将此记录为 DS 错误、但如果进行任何搜索、请注意这一点。

    我建议您也阅读第1051页的表15-5、因为它讨论了需要执行哪些设置和寄存器写入操作才能在3个步骤之间执行哈希、这三个步骤应该与您想要完成的操作一致。 我想您可以使用它来编写一些代码、以满足您的应用要求。

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

    您好 Ralph

    感谢您的回答。

    根据您提供的信息、我已经让它正常工作、下面是一个简单的 MD5示例、因此其他人知道我做了什么(也适用于 SHA1 SHA256等)。

    此代码通过一个字符串进行简单循环、并显示三个阶段、初始块、中间块和最终块。

    我发现需要注意的几个重要事项:

    1 -您只能在完全64字节写入后保存中间值、因此您需要确保缓冲任何较小的写入、并将其作为单个64字节块执行。  最后一个块可以是1到64字节。

    2 -当您写回值时、您需要在设置要写入的新数据包的长度之前执行此操作。  长度设置为当前块的长度、您无需知道最后一个块的长度。

    uint8_t hash-[80];
    uint32_t DigestCount;
    uint32_t Intermedial[8];
    uint32_t * ptr;
    uint16_t offset;
    uint16_t size;
    const AMDchar AMDStr[]="abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrhchargvwstudzAMD67890abcdefghijklr udlqrxyzwxyz1234567890abdlr
    
    
    
    
    
    
    
    
    
    
    
    
    udpf z67890abdromf amp = AMD64xrshdr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr dr f //第一个块的加载常量
    }
    否则((偏移+大小)=144)
    {
    SHAMD5ConfigSet (SHAMD5_base、SHAMD5_MODE_ALGO_MD5 | SHAMD5_MODE_CLOCK_HASH);//不加载常量、关闭最后一个块的哈希
    }
    否则
    {
    SHAMD5ConfigSet (SHAMD5_base、SHAMD5_MODE_HRADE_HMD5_BASE;SHAMD5_MODE_HSD5_HASH) //不要加载常量
    }
    
    //在写入模式之前等待上下文准备就绪。
    while ((HWREG (SHAMD5_base + SHAMD5_O_IRQSTATUS)& SHAMD5_INT_Context_READY)= 0)
    {
    
    
    if (offset!= 0) //从中间值恢复起始
    点{
    HWREG (SHAMD5_base + SHAMD5_O_Digest _count)= DigestCount;
    for (x = 0;x < 8;x++)
    {
    HWREG (SHAMD5_base + SHAMD5_O_IDIGEST_A +(x * 4)))= Intermedial[x];
    }
    
    
    我们正在添加数据大小/写入。
    SHAMD5HashLengthSet (SHAMD5_base、size);
    
    //等待引擎完成前一个块的处理。
    while ((HWREG (SHAMD5_base + SHAMD5_O_IRQSTATUS)& SHAMD5_INT_INPUT_READY)= 0)
    {
    }
    
    ptr =(uint32_t *)&hashStr[offset];
    for (x = 0;x < size;x += 4)
    {
    HWREG (uAMD5_base + SHUAMD5_O
    +*= 0+*
    
    //等待输出就绪
    while ((HWREG (SHAMD5_base + SHAMD5_O_IRQSTATUS)& SHAMD5_INT_OUTPUT_READY)= 0)
    {
    }
    
    if ((offset + size)= 144)
    {
    SHAMD5ResultRead (SHAMD5_base、(UINT32_t *) hash); //我们已经完成,得到结果
    }
    否则
    {//
    读取摘要计数和中间数据
    DigestCount = HWREG (SHAMD5_base + SHAMD5_O_Digimiz_count);
    for (x = 0;x < 8;x++)
    {
    Intermedi[x]= HWREG (SHAMD5_base + SHAMD5_O_IGIDEST +
    
    
    
    }*= 4);}+ offset *+ a
    
    

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

    非常感谢您与社区分享此代码、我们非常感谢这些后续帖子!! 我相信其他人将来也会感激。