Sun Studio下的SSE3 / SSSE3 + AES / RDRAND / RDSEED

时间:2016-06-12 08:40:24

标签: cryptography aes solaris sunstudio

我在SunOS 5.11(Solaris 11.3)上使用Sun Studio 12.3。我正在调整包含否定测试的脚本,其中包括奇怪的CPU功能组合。我们这样做是为了了解我们是否以及如何失败;并确保有no unexpected surprises

我正在试图找到一种方法来启用本机指令集以及AES,RDRAND和RDSEED。本机指令集是Xeon 5100的礼貌,实际上是SSE3 / SSSE3以及一些额外的指令。

使用/opt/solarisstudio12.3/bin/CC -DNDEBUG -g3 -xO2 -template=no%extdef -native -m64 -KPIC -xarch=aes -D__AES__=1编译所有源文件会导致:

$ ./cryptest.exe
ld.so.1: cryptest.exe: fatal: cryptest.exe: hardware capability (CA_SUNW_HW_1) unsupported: 0x1000000  [ SSE4.2 ]
Killed

这是预期的,因为Sun Studio假定功能和可用性的进展。当我修改makefile以构建cpu.cpp(用于功能测试),rijndael.cpp(提供AES实现)和test.cpp(执行测试)与-xarch=aes时,程序仍然崩溃,因为SSE4正在进入test.cpp

我尝试使用-xarch=aes -D__AES__=1 -xarch=no%sse4_1 -xarch=no%sse4_2删除不需要的指令集,但无法按预期编译。 no%sse4_1仅来自-template=no%extdef,因为no%前缀似乎是解决问题的方法。

如何在Sun Studio下使用SSE3 / SSSE3并添加AES / RDRAND / RDSEED?它甚至可能吗?

我们使用的模式,到目前为止运行良好,是将编译时支持与运行时支持相结合。所以AES代码看起来像:

#if (__AES__ >= 1) || (SUNPRO_CC >= 0x512)
# define HAVE_AES 1
#endif

#if defined(HAVE_AES)
if (HasAES())
{
    // Optimized implementation
    ...
    return;
}
#endif
{
    // Fall into C/C++ implementation
    ...
}

对于像Clang和GCC这样的编译器,我们只是-march=native -maes -mrdrnd -mrdseed。我很高兴接受没有发生交叉政治。

然后我浏览了Oracle留言板上的两条消息,表明在Sun Studio 12.3和12.4(here for 12.3here for 12.4)下RDRAND已被破坏。因此,我必须确保启用RDRAND以确保其经过测试,并且需要-xarch=aes

基于_mm_aeskeygenassist_si128 intrinsic requires at least -xarch=aes,这可能无法实现。这个问题实际上是尽职尽责,以确保我们尽我们所能确保无故障体验。

$ isainfo -v
64-bit amd64 applications
        ssse3 ahf cx16 sse3 sse2 sse fxsr mmx cmov amd_sysc cx8 tsc fpu 
32-bit i386 applications
        ssse3 ahf cx16 sse3 sse2 sse fxsr mmx cmov sep cx8 tsc fpu 

1 个答案:

答案 0 :(得分:1)

在那里,我为你创建了一个AES + SSSE3二进制文件。

$ cat tmp.c
#include 
#include 
#include 
int main(int argc, char* argv[])
{
   // SSE2
   int64_t x[2];
   __m128i y = _mm_loadu_si128((__m128i*)x);

   // AES
   __m128i z = _mm_aeskeygenassist_si128(y,0);

   return 0;
}

$ cat tmp2.c
#include 
#include 
void foo(void)
{       
        __m128i x;
        x       =  _mm_hadd_epi16 (x, x);
}

$ cc tmp.c tmp2.c -xarch=aes
tmp.c:
tmp2.c:

$ file a.out
a.out:          ELF 32-bit LSB executable 80386 Version 1 [AES SSSE3 SSE2 SSE], dynamically linked, not stripped

硬件功能位由编译器提供 取决于最终可执行文件中实际存在的insructions。

所以 tmp.o 分配了 AES 位。并且 tmp2.o 最多包含 SSSE3 位。

当链接在一起时,它们会生成 [AES SSSE3] 二进制文件。因为 HWCAP 位是 OR 一起编辑。