对于intel的AES-NI新指令集,需要i5处理器及以上的相关硬件支持.在编译时,可能会出现
/usr/lib/gcc/x86_64-linux-gnu/4.8/include/wmmintrin.h:34:3: error: #error "AES/PCLMUL instructions not enabled"
很显然,可以通过查其头文件,定位到
#if !defined (__AES__) && !defined (__PCLMUL__) # error "AES/PCLMUL instructions not enabled" #else
那么,很明显是因为没有定义两个宏.问题正因找到了,怎么解决呢?
对于gcc/g++编译器,需要添加编译选项-maes和-mpclmul;
对于vs系列,根据microsoft官网介绍,最低版本要求为visual studio 2010及以上
而对于下列问题:
error: request for member ‘m128i_u64’ in ‘a’, which is of non-class type ‘__m128i {aka __vector(2) long long int}’
a.1] = 0x8899AABBCCDDEEFF;(其中__m128i a;)
主要是对于变量a,在vs2010中,存在结构体成员a.m128i_u64[0],a.m128i_u64[1],而对于gcc/g++,存在a[0],a[1].这一点需要注意的.
下面是几个问题,也许你在学习中会遇到,现总结如下:
1.如何判断当前系统是否支持aes-ni指令集?
方法一:
$ sort -u /proc/crypto | grep module
module : aesni_intel
module : aes_x86_64
module : arc4
module : crc32_pclmul
module : crct10dif_pclmul
module : ghash_clmulni_intel
module : kernel
方法二:对于这个方法,需要安装cpuid。
$ cpuid | grep -i aes
AES instruction = true
AES instruction = true
AES instruction = true
AES instruction = true
附文:
查看cpu信息
$ cat /proc/cpuinfo
$ lscpu
方法三:intel官网说这种方法不太可靠
$ cat /proc/cpuinfo| grep aes
$grep aes /proc/cpuinfo
flags: ***** aes *****
2.linux下openssl使用aes-ni与否,对数据处理的速度比较?
$ openssl speed -elapsed -evp aes-128-cbc
$ OPENSSL_ia32cap="~0x200000200000000" openssl speed -elapsed -evp aes-128-cbc
openssl支持aes-ni指令集,但并没有将其作为一个engine.因此,为了支持aes-ni指令集,在openssl中需要添加
-evp
(“envelope”) mode模块.
3.#error "SSE4.1 instruction set not enabled"或者说如何添加SSE4.1指令集?
给gcc或者g++编译器添加flags: -march=native or -msse2 / -msse3 / -mssse3 / -msse4.1
注意:使用-march=native编译选项时,编译器会根据处理器选择最好的CPU架构和flags。或者对于distcc,直接食用-march=corei7 -mavx -mpclmul。
CFLAGS+= -msse4.1
通过以上总结:
$ g++ -std=c++11 -maes -mpclmul -msse4.1 main.cpp -o main
$ g++ -Wall -std=c++11 -march=native main.cpp -o main
4.Debian/Ubuntu安装openssl及开发库
$ sudo apt-get install openslllibssl-dev
在ubuntu14.0下libssl.so和libcrypto.so位于/lib/x86_64-linux-gnu,默认的linux共享库搜索路径为/lib和/usr/lib两个目录(不包含子目录),
若共享库不在这两个路径,不能自动连接到(最典型的就是/usr/local/lib)。
所以提供一种通用方法:修改系统文件/etc/ld.so.conf,添加路径,运行ldconfig命令。