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.

[参考译文] 使用 SHAMD5DataWrite &SHAMD5HashLengthSet 执行所有哈希计算时出现问题。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/598042/problems-using-shamd5datawrite-shamd5hashlengthset-in-incrementall-hash-calculation

我正在尝试使用 Tivaware 哈希加速函数来处理 超长文件(SHA256)、方法是调用 SHAMD5DataWrite ()& SHAMD5ResultRead () Tivaware API。 但在这些示例中,我发现此函数(SHAMD5DataWrite (())  需要预先使用 SHAMD5HashLengthSet (),它需要先验地知道 要为哈希计算处理的字节的总长度。 查看 源代码 、我注意 到该函数会在调用哈希函数时将其重置计算:

空 SHAMD5HashLengthSet (uint32_t ui32Base、uint32_t ui32Length)

    //
    //检查参数。
    //
    断言(ui32Base == SHAMD5_base);

    //
    //设置长度寄存器并开始处理。  
    //
    HWREG (ui32Base + SHAMD5_O_length)= ui32Length;

我已经测试过、我得出结论。  SHAMD5HashLengthSet ()以增量方式调用,则之前的哈希计算会丢失。

在我的情况下,为了准确地知道数据的总长度(以字节为单位),必须处理整个文件以计算字节(这将需要宝贵 的时间)或将文件加载到内存中(由于  文件的大容量,这是不可能的)。 几十兆字节。)

因此、我询问   是否可以使用 SHAMD5DataWrite ()保存哈希计算的先前状态  、以便  以真正增量的方式处理哈希、而无需事先了解要处理的总字节、这在某些 SW 库中发生 (  使用速度非常慢,在 USB 笔驱动器中保存相同大小的文件时,浪费了大约30%的时间)。

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

    我尝试 使用 上表中描述的程序,但它不起作用。

    对于前 64个字节、它可以正常工作并计算摘要、但当我尝试为第二个交叉写入 lenight、algo、algo_constant 或 SHA 模式寄存器时、 上一个摘要的值将丢失(所有 h 都变为零)  即使   我将之前的部分 摘要直接 写入 SHA_IDIGEST_A 到 SHA_IDIGEST_H 寄存    器中、它也不起作用、因为该寄存器看起来是只读的、根本不接受写入值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ricardo、
    您是否可以预先计算输入长度并将此长度信息编码为有效负载的一部分、即有效负载的第一个字将包含输入文件的长度。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经解决了这个问题、只是通过软件完成散列、我放了一些代码。
    在我的测试中、  它运行良好、散列 速度比 仅软件快40倍。

    静态无符号字符 SHA256_Padding[64]=

    0x80、0、0、0、0、 0、0、0、0、0、 0、0、0、0、0、 0、
    0、0、0、0、0、 0、0、0、0、0、 0、0、0、0、0、 0、
    0、0、0、0、0、 0、0、0、0、0、 0、0、0、0、0、 0、
    0、0、0、0、0、 0、0、0、0、0、 0、0、0、0、0、 0
    };

    #define PUT_UINT32 (n、b、i)\
    {\
    (b)[(i)]=(unsigned char)((n)>> 24);\
    (b)[(i)+ 1]=(无符号字符)(n)>> 16);\
    (b)[(i)+ 2]=(unsigned char)((n)>> 8);\
    (b)[(i)+ 3]=(unsigned char)((n));\


    //写入64字节的块
    void SHAMD5DataWriteInc (uint32_t ui32Base、uint32_t * pui32Src、int Block)

    uint32_t ui32计数器;

    if (Block = 0) HashCount=0;
    否则 HashCount+=64;


    if (块>0)

    //块>0;
    // algo 常数=0
    if (HWREG (ui32Base + SHAMD5_O_MODE)|SHAMD5_MODE_ALGO_CONSTANT)
    HWREG (ui32Base + SHAMD5_O_MODE)&=~(SHAMD5_MODE_ALGO_CONSTANT);

    HWREG (ui32Base +SHAMD5_O_Digit_count)=HashCount;


    否则{
    //块= 0;
    // algo 常量= 1
    HWREG (ui32Base + SHAMD5_O_MODE)= SHAMD5_算法 SHA256 | SHAMD5_MODE_ALGO_CONSTANT;

    if ((HWREG (ui32Base + SHAMD5_O_MODE)|(SHAMD5_MODE_CLOSE_HASH)))
    HWREG (ui32Base + SHAMD5_O_MODE)&=~(SHAMD5_MODE_CLOCK_HASH);

    //
    //等待模块准备好接受数据。
    //

    HWREG (ui32Base + SHAMD5_O_length)= 64;


    while ((HWREG (ui32Base + SHAMD5_O_IRQSTATUS)& SHAMD5_INT_INPUT_READY)= 0)


    //
    //写入16个字的数据。
    //
    for (ui32Counter = 0;ui32Counter < 64;ui32Counter += 4)

    HWREG (ui32Base + SHAMD5_O_DATA_0_IN + ui32Counter)=* pui32Src++;

    //写入最后几个字节并关闭哈希
    void SHAMD5DataWriteLast (uint32_t ui32Base、uint32_t * pui32Src、int last、int lenight、int Block)

    uint32_t ui32计数器;
    unsigned char msglen[8];
    unsigned int padn=0;


    if (块>0)

    //通过软件完成散列
    memset (LastBuffer、0、sizeof (LastBuffer));
    memcpy (LastBuffer、pui32Src、last);
    unsigned int high =(lengight >> 29);
    unsigned int low =(lenight <<3);

    PUT_UINT32 (HIGH、msglen、0);
    PUT_UINT32 (low、msglen、4);
    padn =(最后一个< 56)? (56-最后):(120-最后);
    memcpy (&LastBuffer[Last]、SHA256_padding、padn);

    memcpy (&LastBuffer[last+padn]、msglen、8);
    lenight =最后+padn+8;

    pui32Src=(uint32_t *) LastBuffer;

    if (Block >0){
    // algo 常数=0
    HWREG (ui32Base + SHAMD5_O_length)=长度;
    HWREG (ui32Base + SHAMD5_O_MODE)&=~(SHAMD5_MODE_ALGO_CONSTANT);
    HWREG (ui32Base + SHAMD5_O_MODE)|=(SHAMD5_MODE_CLOCK_HASH);

    否则{
    // algo 常量= 1
    HWREG (ui32Base ++ SHAMD5_O_MODE)= SHAMD5_算法 SHA256|SHAMD5_MODE_ALGO_CONSTANT
    HWREG (ui32Base + SHAMD5_O_length)=长度;


    //
    //等待模块准备好接受数据。
    //
    while ((HWREG (ui32Base + SHAMD5_O_IRQSTATUS)& SHAMD5_INT_INPUT_READY)=0 && lent>0)

    //
    //写入数据的最后一个字。
    //
    for (ui32Counter = 0;ui32Counter < lenight;ui32Counter += 4)

    HWREG (ui32Base + SHAMD5_O_DATA_0_IN + ui32Counter)=* pui32Src++;


    while ((HWREG (ui32Base + SHAMD5_O_IRQSTATUS)& SHAMD5_INT_OUTPUT 就绪)==
    0)