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

Cryptography SSE3/SSSE3+;Sun Studio下的AES/RDRAND/RDSEED,cryptography,aes,solaris,sunstudio,Cryptography,Aes,Solaris,Sunstudio,我在SunOS5.11(Solaris 11.3)上的Sun Studio 12.3下工作。我正在调整一个脚本,它包含否定测试,并且包含CPU特性的奇怪组合。我们这样做是为了了解我们是否失败以及如何失败;并确保有 我正在试图找到一种方法来启用本机指令集加上AES、RDRAND和RDSEED。本机指令集由Xeon 5100提供,实际上是SSE3/SSSE3加上一些附加指令 使用/opt/solaristudio12.3/bin/CC-DNDEBUG-g3-xO2-template=no%extde

我在SunOS5.11(Solaris 11.3)上的Sun Studio 12.3下工作。我正在调整一个脚本,它包含否定测试,并且包含CPU特性的奇怪组合。我们这样做是为了了解我们是否失败以及如何失败;并确保有

我正在试图找到一种方法来启用本机指令集加上AES、RDRAND和RDSEED。本机指令集由Xeon 5100提供,实际上是SSE3/SSSE3加上一些附加指令

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

$ ./cryptest.exe
ld.so.1: cryptest.exe: fatal: cryptest.exe: hardware capability (CA_SUNW_HW_1) unsupported: 0x1000000  [ SSE4.2 ]
Killed
这在某种程度上是意料之中的,因为Sun Studio假定了一系列功能和可用性。当我用
-xarch=AES
修改makefile以构建
cpu.cpp
(用于功能测试)、
rijndael.cpp
(提供AES实现)和
test.cpp
(执行测试)时,程序仍然会崩溃,因为SSE4正在潜入
test.cpp

我试图使用
-xarch=aes-D_uu-aes\uuu=1-xarch=no%sse4\u 1-xarch=no%sse4\u 2
删除不需要的指令集,但未能按预期编译<代码>否%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这样的编译器,我们只需要简单地修改一下。我很高兴地接受没有发生交叉冲突

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


基于此,这可能是不可能的。这个问题实际上是尽职调查,以确保我们正在尽一切努力确保无故障体验



在这里,我为您创建了一个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 $cat tmp.c #包括 #包括 #包括 int main(int argc,char*argv[]) { //SSE2 int64_t x[2]; __m128i y=_mm_loadu_si128((u m128i*)x); //AES __m128i z=_mm_aeskeygenassist_si128(y,0); 返回0; } $cat tmp2.c #包括 #包括 无效foo(无效) { __m128ix; x=_-mm_-hadd_-epi16(x,x); } $cc tmp.c tmp2.c-xarch=aes tmp.c: tmp2.c: $file a.out a、 输出:ELF 32位LSB可执行文件80386版本1[AES SSSE3 SSE2 SSE],动态链接,未剥离 硬件功能位由编译器分配 取决于最终可执行文件中指令的实际存在

因此tmp.o分配了AES位。而tmp2.o最多分配了SSSE3

当链接在一起时,它们产生[AES SSSE3]二进制。因为HWCAP位是合并在一起的

$ 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