Assembly 将ARMv8加密加速SHA256集成到现有的C实现函数中
我试图通过CPU加密扩展使用硬件加速的SHA256转换/“数据块排序”来使用ARMv8/Aarch64汇编实现 问题是我不明白现有的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
无效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];
#否则
对于最后一个循环,我猜测它在另一个应用程序中是等效的,其中ARMv8sha256_块_数据_顺序
至少在其内部,但我不太了解汇编,因此无法确定在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