是否有 API 来检测 iOS 上的 CPU 功能?
Posted
技术标签:
【中文标题】是否有 API 来检测 iOS 上的 CPU 功能?【英文标题】:Is there an API to detect CPU features on iOS? 【发布时间】:2017-09-18 03:13:28 【问题描述】:我有一些具有多个实现的加密代码,在运行时根据运行它的 CPU 的特性来选择哪个实现。到目前为止,移植它一直很简单,Windows、Linux 和 android 都很容易。
但在 ios 中,这似乎并不容易。虽然 x86 CPU 有 cpuid
指令来检测功能,即使在用户模式下,ARM 等效项也具有特权。没有操作系统合作,无法检测 ARM 上的 CPU 功能。
在 Windows 中,IsProcessorFeaturePresent
用于检测 ARM CPU 功能。在 Linux 上,/proc/cpuinfo
是要走的路。 Android 有一个 cpufeatures
库(并且 /proc/cpuinfo
仍然可以使用)。 Mac OS 有sysctlbyname
和hw.optional.*
。
但是 iOS 呢? iOS 内核有 hw.optional.*
和 Mac OS 一样,但它在 iOS 10 中是 locked down。(因此,我的问题不是 this one 的重复,因为情况已经发生了变化。)此外,获得这些似乎困难 - Apple 的开源网站运行一个自动化流程,从他们公开提供的操作系统源中清除所有 ARM 特定代码,以使越狱者更加努力。
【问题讨论】:
如何运行不同的方法并检查它们是否可用或测量使用的时间。这显然需要编写更多代码,但我不知道有任何其他方法可以检测您的加密代码的最佳实现.. 【参考方案1】:您可以查看iOS Security Guide for business
显然,如果你能得到CPU系列名称,你也可以从documentation.中推断出是哪个加密组件以及它是如何工作的
您可能会注意到某些设备具有安全区域:
Secure Enclave 是 Apple T1 中制造的协处理器,Apple S2、Apple S3、Apple A7 或更高版本的 A 系列处理器。
第 6 页
您可能会推断出任何较旧的 CPU 版本都没有。
每个 iOS 设备都有一个内置的专用 AES-256 加密引擎 闪存和主系统内存之间的 DMA 路径 [...]
在 T1、S2、S3 和 A9 或更高版本的 A 系列处理器上,每个 Secure Enclave 生成自己的 UID(唯一 ID)。
第 12 页
访问加密组件的方法取决于您要访问的数据或存储类型(本地数据存储/同步/家庭数据/应用程序/siri/icloud/安全便笺/keybag/支付/applepay/***/ wifi密码/单点登录/空投/等等……)
您能否详细说明您需要在您的用例中访问加密部分的哪一部分?
您还可以查看 here 和 here 以获取有关 iOS 原生安全和加密 API 的更多信息。
【讨论】:
我说的不是那些加密组件。我的意思是 ARMv8 加密指令集。不涉及安全飞地,因为这完全是用户模式加密。不涉及加密 API,因为我正在执行加密 API 不支持的加密算法 - 即 AES-GCM。【参考方案2】:iOS 屏蔽某些硬件信息的原因很简单。请阅读Apple A11 processor。里面有很多东西,也有很多东西,永远不会被记录下来。
Apple 只是不希望开发人员知道并使用它。我不希望在这个话题上取得任何进展。
目前唯一的出路是绕过操作系统直接与硬件对话。您会惊讶于里面的东西以及它的反应速度!
【讨论】:
“除非有人从实验室逃到非引渡国家,否则我不希望在这个话题上取得任何进展”:) 您是说我们应该只使用扩展的处理器功能并希望如果它们丢失我们不会崩溃?那为什么还要在 SDK 中提供 arm_neon.h 之类的东西呢? 我写道,并非所有内容都始终记录在案。芯片制造商通常不会记录某些特性。一些寄存器中的一个简单位设置为 1 可以打开一些额外的功能,这些功能在官方文档中是找不到的。就是这样,有人说例如这个位是为将来使用而保留的。就是这样。 但是许多 ARM 核心功能几乎都是标准的,例如用于进行点积的dotprod
指令。我应该只使用它们并让我的应用程序在某些 iphone 上崩溃,而不是在其他 iPhone 上崩溃吗?这没有任何意义。以上是关于是否有 API 来检测 iOS 上的 CPU 功能?的主要内容,如果未能解决你的问题,请参考以下文章