1

我希望能够通过 Windows 上的 C++ 代码检查 CPU 是否具有可用的 AES-NI。(MinGW GCC)

我找到了一个用 Visual Studio 用 C# 编写的解决方案。

测试来自 C# 的 AES-NI 指令

 private static bool IsAESNIPresent()
 {
    byte[] sn = new byte[16]; // !!! Here were 8 bytes

    if (!ExecuteCode(ref sn))
        return false;

    var ecx = BitConverter.ToUInt32(sn, 8);
    return (ecx & (1 << 25)) != 0;
 }

有没有一种简单的方法可以用 c++ 做同样的事情?(海合会)

4

2 回答 2

2

pycrypto中有一些似乎适用的代码。我将代码的基本部分用于测试:

#include <cpuid.h>
#include <stdint.h>
#include <stdio.h>

int main()
{
    uint32_t eax, ebx, ecx, edx;

    eax = ebx = ecx = edx = 0;
    __get_cpuid(1, &eax, &ebx, &ecx, &edx);
    printf("%08x %08x %08x %08x\n", eax, ebx, ecx, edx);
    printf("Has AES-NI: %d\n", (ecx & bit_AES) > 0);

    return 0;
}

结果似乎与 /proc/cpuinfo 提供的信息或 intel 网页提供的信息相对应。

有关其他功能,请参阅clang 文档

于 2016-08-05T23:28:49.990 回答
1

对于傻笑,你可以这样做......

int have_aes_ni = (((int(*)())"1\xc0\xb0\1\xf\xa2\x89\xc8\xc3")()>>25)&1;

...但是您必须传递/SECTION:.data,RWE给链接器,并且您的专业同事会不赞成您。您可以吹嘘您的代码如何在 Linux 中运行,因为 Security 会护送您离开设施。

在自 Visual C++ 2005 以来的 Windows 上,您可以执行类似的操作

#include<intrin.h>

...

  int regs[4];
  __cpuid( regs, 1 );
  int have_aes_ni = ( regs[2] >> 25 ) & 1;

编辑:我没有发现您正在使用 mingw,其中intrin.h可能不可用。在这种情况下,J J. Hakala的答案可能会更好。

于 2016-08-06T03:13:41.350 回答