gpt4 book ai didi

openssl - 如何检查 OpenSSL 是否支持/使用 Intel AES-NI?

转载 作者:行者123 更新时间:2023-12-02 00:57:51 57 4
gpt4 key购买 nike

请告诉我,如何检查 OpenSSL 是否支持/使用英特尔 AES-NI?

最佳答案

how can I check if OpenSSL is support/use the Intel AES-NI?

事情没那么简单,尽管应该如此。 OpenSSL 曾经提供了一个函数来获取 ia32 处理器检测到的功能,但它不再可用。请参阅 OPENSSL_ia32cap man page 中对 OPENSSL_ia32cap_loc 的讨论。 。另请参阅Verify AES-NI use at runtime?在 OpenSSL 邮件列表中。

如果您要链接到 OpenSSL 静态库,那么您可以使用:

extern unsigned int OPENSSL_ia32cap_P[];
# define AESNI_CAPABLE (OPENSSL_ia32cap_P[1]&(1<<(57-32)))

if(AESNI_CAPABLE)
/* AES-NI is available */

如果您要链接到 OpenSSL 共享对象,则OPENSSL_ia32cap_P 符号不会导出。在这种情况下,您需要编写自己的检测代码。

我什至不关心 OpenSSL,因为它只适用于库的静态链接。我在下面分享了我用于检测的代码。我相信我从 Intel 的 Dave Johnston 那里窃取了其中的很大一部分(他设计了 RDRAND 电路)。

注意:下面的代码可能会错误地拒绝 AMD processor with AES-NI 。我没有可供测试的处理器,因此无法提供代码。

注意:下面的代码在 Valgrind 下不会按预期执行。没有对 AES-NI 或 RDRAND 指令的模拟,因此 Valgrind 从 CPUID 返回一个“经过修改的”值,因此看起来它们不可用。请参阅Incorrect results from inline assembly when running under Valgrind在邮件列表中。

<小时/>

尽管 AES-NI 可用,但它并不意味着您将使用它。

如果您使用 AES_* 等低级原语,那么您将不会使用 AES-NI,因为它是一种软件实现。

如果您使用高级 EVP_* 装备,那么您将使用 AES-NI(如果可用)。该库将自动切换到 AES-NI。

<小时/>

如果 AES-NI 可用但您不想使用它,请在启动程序之前执行以下操作:

$ export OPENSSL_ia32cap="~0x200000200000000"

您可以使用以下 OpenSSL 命令测试速度差异。切换上面的导出以查看差异:

$ openssl speed -elapsed -evp aes-128-ecb
<小时/>
struct CPUIDinfo {
unsigned int EAX;
unsigned int EBX;
unsigned int ECX;
unsigned int EDX;
};

int HasIntelCpu();
int HasAESNI();
int HasRDRAND();

void cpuid_info(CPUIDinfo *info, const unsigned int func,
const unsigned int subfunc);

int HasIntelCpu() {
CPUIDinfo info;
cpuid_info(&info, 0, 0);
if (memcmp((char *) (&info.EBX), "Genu", 4) == 0
&& memcmp((char *) (&info.EDX), "ineI", 4) == 0
&& memcmp((char *) (&info.ECX), "ntel", 4) == 0) {

return 1;
}

return 0;
}

int HasAESNI() {
if (!HasIntelCpu())
return 0;

CPUIDinfo info;
cpuid_info(&info, 1, 0);

static const unsigned int AESNI_FLAG = (1 << 25);
if ((info.ECX & AESNI_FLAG) == AESNI_FLAG)
return 1;

return 0;
}

int HasRDRAND() {

if (!HasIntelCpu())
return 0;

CPUIDinfo info;
cpuid_info(&info, 1, 0);

static const unsigned int RDRAND_FLAG = (1 << 30);
if ((info.ECX & RDRAND_FLAG) == RDRAND_FLAG)
return 1;

return 0;
}

void cpuid_info(CPUIDinfo *info, unsigned int func, unsigned int subfunc) {
__asm__ __volatile__ (
"cpuid"
: "=a"(info->EAX), "=b"(info->EBX), "=c"(info->ECX), "=d"(info->EDX)
: "a"(func), "c"(subfunc)
);
}

关于openssl - 如何检查 OpenSSL 是否支持/使用 Intel AES-NI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25284119/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com