2016-08-05 4 views
1

Я хочу проверить, есть ли у ЦП AES-NI код C++ в окнах. (MinGW GCC)В моей программе на C++ есть ли способ проверить, имеет ли процессор AES-NI

Я нашел решение, написанное на C#, с визуальной студией.

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

Есть простой способ сделать то же самое с C++? (GCC)

ответ

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 documentation

+0

Похоже, что это сработает. Я согласен с ответом на ур, как только я получу его работу в mingw (im sorta new) –

+0

Это сработало очень хорошо и легко. –

1

Для смешков вы можете сделать это ...

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

... но вам придется пройти /SECTION:.data,RWE линкер, и вы будете нахмурились ваши профессиональные коллеги. Вы можете похвастаться тем, как ваш код также работает в Linux, поскольку Security сопровождает вас из объекта.

В Windows начиная с Visual C++ 2005 вы можете сделать что-то вроде

#include<intrin.h> 

... 

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

EDIT: Я не расслышал, что вы используете MinGW, где intrin.h могут быть недоступны. В этом случае ответ J J. Hakala, вероятно, лучше.

+0

Еще спасибо за быстрый ответ .. –