【发布时间】:2018-12-01 03:39:01
【问题描述】:
我正在尝试通过 CPU 加密扩展使用硬件加速 SHA256 转换/“数据块排序”来使用 ARMv8/Aarch64 程序集实现。
问题是我不明白现有的区别
void sha256_transform(uint32_t *state, const uint32_t *block, int swap) (1) https://github.com/fireworm71/veriumMiner/blob/main/algo/sha2.c#LC81
和新的 ARMv8 sha256 函数
void sha256_block_data_order (uint32_t *ctx, const void *in, size_t num) (2) https://github.com/glukolog/m-cpuminer-v2.1-armv8/blob/master/miner.h#L135 我试图与预处理器集成,条件是要么将原始代码留在 if not aarch64 要么 将工作重定向到硬件加速 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_t *state, const uint32_t *block, int swap)里面使用的代码
#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
对于最后一个循环,我猜测它在另一个应用程序中的等价物,其中 ARMv8 sha256_block_data_order is being used already 至少在其 C implementation 中,但对汇编的理解不够好,无法查看 same is being done there。 uint32_t S 被用于 sha256_transform 的 C 实现中,但我无法判断它是否在我上面代码的最后循环之前以任何方式被更改。
在链接 (2) 中,有一个 sha256_transform 的声明,但不适用,尽管您可以将输入(两个单独的应用程序共享相同的实现)与同样在此处声明的 sha256_block_data_order 进行比较以查看差异。
在我尝试完成这项工作的各种尝试中,我能够让它在没有错误的情况下编译并在基准测试模式下运行 cpuminer 二进制文件,但是当我让它为服务器真正工作时,所有结果都被拒绝。此外,我只发现性能上的个位数差异(以哈希率衡量)。这是否意味着即使我可以让它正常工作,我也不会看到任何有价值的性能提升?
我在这方面花了几天时间,但不是很有经验或技术,所以才在这里问。感谢您提供任何反馈或建议。
【问题讨论】:
标签: assembly cryptography sha256 armv8