2016-08-05 39 views
1

Ich möchte in der Lage zu prüfen, ob eine CPU AES-NI mit C++ - Code auf Windows verfügbar ist. (MinGW GCC)In meinem C++ - Programm gibt es eine Möglichkeit zu überprüfen, ob die CPU AES-NI

Ich fand eine Lösung in C# mit Visual Studio geschrieben.

Test for AES-NI instructions from C#

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; 
} 

Gibt es eine einfache Möglichkeit, das gleiche mit c zu tun ++? (GCC)

Antwort

2

Es gibt einen Code in pycrypto, der scheint zutreffen. Ich nahm die wesentliche Teile des Codes für die Prüfung:

#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; 
} 

Die Ergebnisse scheinen mit den Informationen von/proc/cpuinfo oder Informationen, die von Intel Web-Seiten bereitgestellt entsprechen.

Für andere Funktionen finden clang documentation

+0

Das sieht so aus als würde es funktionieren .. Ich werde deine Antwort akzeptieren, sobald ich es in mingw (im sorta neu) funktioniere –

+0

Das hat wirklich gut und einfach funktioniert. –

1

Für kichert, dies zu tun ...

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

... aber Sie werden /SECTION:.data,RWE an den Linker passieren und Sie werden verpönt auf von Ihren professionellen Kollegen. Sie können angeben, wie Ihr Code auch unter Linux funktioniert, da Security Sie aus der Einrichtung herausführt.

Unter Windows seit Visual C++ 2005 Sie so etwas wie

#include<intrin.h> 

... 

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

EDIT tun können: Ich habe nicht fangen, dass Sie mingw verwendet haben, wo intrin.h möglicherweise nicht zur Verfügung. In diesem Fall ist die Antwort J J. Hakala wahrscheinlich besser.

+0

Vielen Dank für die schnelle Antwort .. –