【问题标题】:How can I use AES-NI intrinsics on a Mac?如何在 Mac 上使用 AES-NI 内部函数?
【发布时间】:2012-09-20 00:02:43
【问题描述】:

我正在尝试在 Mac 上编译 C 应用程序。我使用 SSE4 和 AES-NI 内在函数。

在 Linux 中,我只需使用 -msse4 和 -maes 标志调用 gcc 并包含 wmmintrin.h 标头,我可以调用像 _mm_add_epi64(a,b) 这样的 SSE 内在函数或像 @987654325 这样的 AES-NI 内在函数@ 一切正常。

在 Mac 上更难,因为 Apple 将 GCC 替换为尚不支持 AES-NI 的 llvm-gcc。所以 SSE4 内在函数工作正常,但不是 AES 的。 甚至无法识别对 AES 指令的内联汇编调用。

英特尔在其网站上有lots of AES example code,但它仅适用于 Linux 和 Windows。

我确实注意到 llvm-gcc 也不支持 RDRAND 指令,但英特尔通过使用扩展为原始机器字节码的 C 宏提供了一种解决方法。 (See the rdrand.h example file in this Intel library)

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

在 Mac 上确实存在使用 AES-NI 的程序,包括 Apple 自己的 File Vault,所以一定有一些可行的方法!

为了使我的问题具体化,我将如何获得以下简单调用以使用最新的 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

标签: xcode gcc aes sse llvm-gcc


【解决方案1】:

Apple 开发人员支持报告说无法使用 Xcode。 (事实上​​他们的回答有点刻薄,暗示 AES-NI 不是开发人员需要直接使用的东西,所以我不应该打扰。叹气,谢谢,Apple。)

但是,我确实找到了两个可行的解决方案,都是通过简单地避免使用 Apple 软件。一种是使用英特尔自己的商业 C++ 编译器。 另一种是从源码下载GCC 4.6或4.7编译后直接使用。这是我选择的选项。我关注this guide. GCC 编译和安装(虽然干净)仍然是一个麻烦和解决方法,只是为了使用单个 CPU 内在函数,但它可以工作。谢谢 GCC 团队!

【讨论】:

  • 这个答案已经改变,因为它可能与现代 Xcode (4.6.3) 无关,与 Apple 无关。
  • asm volatile ("aesenc ...." : ... ); // 适用于 llvm 和 gcc-4.4+,请务必先检查 CPUID.01H:ECX.AESNI[bit 25] = 1
  • 要警惕加密,无论是高级还是低级,因为只需要一个细微的编码错误就会暴露一个大的攻击面。
猜你喜欢
  • 2016-11-12
  • 2014-05-28
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多