Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GmSSL-master\include\gmssl\endian.h 中PUTU64宏的使用存在bug #1779

Open
ckooying opened this issue Jan 5, 2025 · 0 comments
Open

GmSSL-master\include\gmssl\endian.h 中PUTU64宏的使用存在bug #1779

ckooying opened this issue Jan 5, 2025 · 0 comments

Comments

@ckooying
Copy link

ckooying commented Jan 5, 2025

昨天在项目中使用sm4_gcm解密数据时发现比Aes_gcm慢很多,通过跟踪分析发现在文件GmSSL-master\src\gf128.c中gf128_to_bytes函数里的PUTU64宏的使用很可疑,其里面包含了对reverse_bits函数调用,按理每次PUTU64应该只调用一次reverse_bits,但实际日志发现每次PUTU64调用了8次reverse_bits,而reverse_bits是对64bit数据的反转,后通过将 reverse_bits(a[0]) 移出PUTU64宏调用,程序性能立即变好了,sm4_gcm和Aes_gcm不相上下,故确认宏的这种使用存在问题,编译器没有优化成只进行一次调用,而是8次调用。
原有代码如下:
void gf128_to_bytes(const gf128_t a, uint8_t p[16])
{
PUTU64(p, reverse_bits(a[0]));
PUTU64(p + 8, reverse_bits(a[1]));
}
修改代码如下:
void gf128_to_bytes(const gf128_t a, uint8_t p[16])
{
uint64_t a0=reverse_bits(a[0]);
PUTU64(p, a0);
uint64_t a1=reverse_bits(a[1]);
PUTU64(p + 8, a1);
}
具体测试数据见附件
修改前测试结果
修改后测试结果

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant