Assembly 将ARMv8加密加速SHA256集成到现有的C实现函数中

Assembly 将ARMv8加密加速SHA256集成到现有的C实现函数中,assembly,cryptography,sha256,armv8,Assembly,Cryptography,Sha256,Armv8,我试图通过CPU加密扩展使用硬件加速的SHA256转换/“数据块排序”来使用ARMv8/Aarch64汇编实现 问题是我不明白现有的 无效sha256_变换(uint32_t*状态、常数uint32_t*块、整数交换)(1) 以及新的ARMv8 sha256功能 void sha256\u block\u data\u order(uint32\u t*ctx,const void*in,size\u t num)(2)我试图将其与一个预处理器集成,条件是要么将原始代码保留在if notaarc

我试图通过CPU加密扩展使用硬件加速的SHA256转换/“数据块排序”来使用ARMv8/Aarch64汇编实现

问题是我不明白现有的
无效sha256_变换(uint32_t*状态、常数uint32_t*块、整数交换)
(1) 以及新的ARMv8 sha256功能
void sha256\u block\u data\u order(uint32\u t*ctx,const void*in,size\u t num)
(2)我试图将其与一个预处理器集成,条件是要么将原始代码保留在if notaarch64中,要么将工作重定向到硬件加速的
sha256_block_data_order
中,而仅仅将原始的
sha256_transform
作为包装函数,以便其他函数对其进行大量调用不需要太多的编辑

我想提请大家注意
sha256_transform
int swap
参数,原始C实现将该参数视为对块数据参数执行某些操作的条件,其中位于相同位置的
sha256_block_data_order
参数似乎与“块数”有关没有关系。在我最近的一次尝试中,我在调用
sha256_block_data_order
之前保留了“int swap”代码,因此数据将按照最初的意图进行操作,并尝试在其函数调用中进行强制转换,认为这是其背后的罪魁祸首……下面是我最近编写的用于
void sha256_transform的代码(uint32\u t*状态、常数uint32\u t*块、整数交换)

#如果已定义(uu aarch64_uu)
uint32_t W[64];
uint32_t S[8];
int i;
//1.准备消息时间表W。
如果(互换){
对于(i=0;i<16;i++)
W[i]=swab32(区块[i]);
}否则
memcpy(W,block,64);
对于(i=16;i<64;i+=2){
W[i]=s1(W[i-2])+W[i-7]+s0(W[i-15])+W[i-16];
W[i+1]=s1(W[i-1])+W[i-6]+s0(W[i-14])+W[i-15];
}
sha256块数据顺序(状态,(常量无符号字符*)W,1);
对于(i=0;i<8;i++)
状态[i]+=S[i];
#否则
对于最后一个循环,我猜测它在另一个应用程序中是等效的,其中ARMv8
sha256_块_数据_顺序
至少在其内部,但我不太了解汇编,因此无法确定在
sha256_转换
的C实现中是否使用了。
uint32_t S
,但我无法判断它是否以任何方式被更改在上面代码的最后一个循环之前

在链接(2)中有一个
sha256_transform
的声明,但是不适用,尽管您可以将输入(两个独立的应用程序共享相同的实现)与
sha256_block_data_order
进行比较,以查看其差异

在我的各种尝试中,我能够让它无错误地编译,并在基准测试模式下运行cpuminer二进制文件,但当我让它为服务器做实际工作时,所有结果都被拒绝。此外,我只发现性能上的个位数差异(以哈希率衡量).这是否意味着即使我能让它正常工作,我也不会看到任何有价值的性能提升


我花了好几天的时间在这方面,由于经验不足或技术不熟练,我求助于这里。任何反馈或建议都将不胜感激。

我最终设法解决了这个问题。如果有兴趣,请参阅github fork repo。由于内联sha256函数的收缩,哈希应用程序的速度提高了约1%。此外还有更好的memcpy和双重问题优化

#if defined(__aarch64__)

    uint32_t W[64];
    uint32_t S[8];
    int i;

    // 1. Prepare message schedule W.
    if (swap) {
        for (i = 0; i < 16; i++)
            W[i] = swab32(block[i]);
        } else
        memcpy(W, block, 64);
        for (i = 16; i < 64; i += 2) {
            W[i]   = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
            W[i+1] = s1(W[i - 1]) + W[i - 6] + s0(W[i - 14]) + W[i - 15];
    }

sha256_block_data_order(state, (const unsigned char *) W, 1);

    for (i = 0; i < 8; i++)
        state[i] += S[i];
#else