如何在Mac上使用AES-NI指令集?

9

我正在尝试在Mac上编译一个C应用程序。我使用SSE4和AES-NI指令。

在Linux中,我只需要使用带有-msse4和-maes标志的gcc,并包含头文件,就可以调用SSE指令,例如_mm_add_epi64(a,b)或AES-NI指令,例如_mm_aesenc_si128(a,b),一切正常。

在Mac上,这更加困难,因为Apple使用llvm-gcc替换了GCC,而llvm-gcc尚不支持AES-NI。因此,SSE4指令可以正常工作,但AES指令无法正常工作。甚至对AES指令的内联汇编调用也无法识别。

Intel在其网站上提供了大量AES示例代码,但仅适用于Linux和Windows。

我注意到llvm-gcc也不支持RDRAND指令,但英特尔提供了一个解决方法,即使用C宏将其扩展为原始机器字节码。(请参见此英特尔库中rdrand.h示例文件)

很遗憾,对于AES-NI指令没有提供类似的解决方法,可能是因为这些指令具有参数,无法作为静态机器码字节进行评估。

在Mac上存在使用AES-NI的程序,包括苹果自己的文件保险库,所以一定有一些可行的方法!

为了使我的问题具体化,如何使用最新的Mac gcc-llvm 4.2(Mountain Lion xcode 4.4.1中的最新公共版本)编译以下简单调用:

 __m128i A, B, C;
  /* A, B, C initialized here... */
  A = _mm_aesenc_si128(B, C);   

感谢任何帮助!


你应该使用clang不是 gcc - Brett Hale
1个回答

8

苹果开发支持表示使用Xcode无法实现。事实上,他们的回复有点傲慢,暗示AES-NI不是开发者需要直接使用的东西,所以我不必费心。真是让人沮丧,谢谢你,苹果。

然而,我找到了两个可行的解决方案,都是通过避免使用苹果的软件来实现的。其中一个是使用英特尔自己的商业C++编译器。 另一个是从源代码下载和编译GCC 4.6或4.7,并直接使用它。这是我选择的选项。我按照这个指南操作。GCC的编译和安装(虽然干净)仍然是一个麻烦和变通的过程,只是为了使用单个CPU内部函数,但是它可以工作。感谢GCC团队!


4
这个答案已经改变了,现代的Xcode(4.6.3)可以实现,与苹果无关。 - user246672
asm volatile ("aesenc ...." : ... ); // 可在llvm和gcc-4.4+上运行,请确保首先检查CPUID.01H:ECX.AESNI[bit 25] = 1 - user246672
1
重点是要对加密货币保持警惕,无论是高级还是低级,因为只需要一个微小的编码错误就能暴露出很大的攻击面。 - user246672

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接