AES-NI指令集


對於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與否,對數據處理的速度比較?

aes-ni demo

$ 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 opensll
libssl-dev
在ubuntu14.0下libssl.so和libcrypto.so位於/lib/x86_64-linux-gnu,默認的linux共享庫搜索路徑為/lib和/usr/lib兩個目錄(不包含子目錄),
若共享庫不在這兩個路徑,不能自動連接到(最典型的就是/usr/local/lib)。
所以提供一種通用方法:修改系統文件/etc/ld.so.conf,添加路徑,運行ldconfig命令。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM