Swift Crypto 是一个开源项目,实现了 Apple CryptoKit API 的大部分,适用于 Linux 平台。它使得跨平台或服务器应用程序能够利用 CryptoKit 的优势。
Swift Crypto 以 Swift Package Manager 包的形式提供。要使用它,请在您的 Package.swift
中添加以下依赖项
// swift-crypto 1.x, 2.x and 3.x are almost API compatible, so most clients
// should allow any of them
.package(url: "https://github.com/apple/swift-crypto.git", "1.0.0" ..< "4.0.0"),
并添加到您的目标,添加 Crypto
到您的依赖项中。 然后您可以 import Crypto
来访问 Swift Crypto 的功能。
Swift Crypto 将 CryptoKit API 中不依赖专用硬件的部分暴露给任何 Swift 应用程序。它提供了安全的 API,可以抽象出许多现代应用程序需要使用的复杂密码学原语。 这些 API 鼓励安全使用底层原语,遵循密码学最佳实践,并且应该是构建需要使用密码学的应用程序的首选。
Swift Crypto 目前的功能涵盖密钥交换、密钥派生、加密和解密、哈希、消息认证等等。
有关具体的 API 文档,请参阅我们的文档。
Swift Crypto 根据构建的平台以两种不同的模式编译。
当构建 Swift Crypto 以在已经可以使用 CryptoKit 的 Apple 平台上使用时,Swift Crypto 会将其整个 API 表面编译成空,并且仅仅重新导出 CryptoKit 的 API。 这意味着,当使用 Apple 平台时,Swift Crypto 只是将所有工作委托给 CryptoKit 的核心实现,就好像 Swift Crypto 根本不存在一样。
当构建 Swift Crypto 以在 Linux 上使用时,Swift Crypto 构建的代码会多得多。 具体来说,我们构建:
API 代码和一些直接在 Swift 中实现的密码学原语对于 Apple CryptoKit 和 Swift Crypto 是完全相同的。 基于 BoringSSL 的底层实现是 Swift Crypto 独有的。
Swift Crypto 的绝大部分代码都旨在与当前版本的 Apple CryptoKit 保持同步。 因此,扩展 Swift Crypto API 的补丁将会被谨慎评估。 对于任何此类扩展,添加 API 可能有两个结果。
首先,如果 API 被认为通常有价值且适合贡献给 Apple CryptoKit,则该 API 将合并到 Swift Crypto 的 Staging 命名空间中。 此 Staging 命名空间是预期将在 Apple CryptoKit 中可用但今天不可用的任何 API 的临时位置。 这使用户能够在合并后尽快使用该 API。 当 API 在 CryptoKit 中普遍可用时,该 API 将在 Staging 命名空间中被弃用,并在主 Swift Crypto 命名空间中可用。
其次,如果 API 被认为不符合在通用 CryptoKit 中被接受的标准,但对于服务器用例而言足够重要,则它将被合并到 Server 命名空间中。 API 不希望离开此命名空间,因为它表明它们通常不可用,而只能在使用 Swift Crypto 时访问。
请注意,Swift Crypto 不打算支持所有可能的密码学原语。 Swift Crypto 将专注于安全、现代的密码学原语,这些原语用途广泛且不易被滥用。 这意味着某些密码学算法可能永远不会被支持:例如,由于安全部署的难度及其遗留状态,3DES 极不可能被 Swift Crypto 支持。 在提议向 Swift Crypto 添加新原语时,请注意,由于这个原因,该提案可能会被拒绝。
此存储库中的文件分为两组,基于它们的名称是否以 _boring
结尾或位于 BoringSSL
目录中,或者是否不是。
符合上述标准的文件特定于 Swift Crypto 实现。 可以相对容易地更改这些文件,只要它们符合以下标准。 如果您的文件需要 import CCryptoBoringSSL
或访问 BoringSSL API,则需要以这种方式标记它。
没有 _boring
后缀的文件是 CryptoKit 公共 API 的一部分。 更改这些文件需要通过更高的标准,因为这些文件中的任何更改都必须伴随 CryptoKit 本身的变化。
在贡献之前,请阅读 CONTRIBUTING.md,同时请务必阅读以下两个部分。
要向 Swift Crypto 贡献新的密码学原语,您应该回答以下问题:
此外,只有在彻底测试了实现的情况下,包括使用所有当前可用的测试向量进行测试,才会接受新的原语实现。 如果 Wycheproof 项目为算法提供了向量,也应该对这些向量进行测试。 必须能够确保我们可以适当地对我们的实现进行回归测试。
如果您发现 Swift Crypto 存在错误,请通过 GitHub 报告它。
如果您有兴趣修复错误,请随意打开一个 pull request。 请同时提交包含错误修复的回归测试,以确保它们在将来不会被回归。
如果您对 CryptoKit 而不是 Swift Crypto 有问题,请使用 Feedback Assistant 像往常一样提交这些问题。
此项目中的某些文件是使用名为 gyb ("generate your boilerplate") 的 Swift Utils 工具自动生成(元编程)的。 gyb
包含在 ./scripts/gyb
中。
gyb
将从某个 Foobar.swift.gyb
*模板*文件生成一些 Foobar.swift
Swift 文件。 您不应该直接编辑 Foobar.swift
,因为下次运行 gyb
时,该生成文件中的所有手动编辑都将被覆盖。
您可以像这样为单个文件运行 gyb
:
./scripts/gyb --line-directive "" Sources/Foobar.swift.gyb -o Sources/Foobar.swift
更方便的是,您可以运行 bash 脚本 ./scripts/generate_boilerplate_files_with_gyb.sh
从其对应的 gyb 模板生成所有 Swift 文件。
如果您添加了新的 .gyb
文件,您应该在其内部附加一个 // MARK: - Generated file, do NOT edit
警告,例如:
// MARK: - Generated file, do NOT edit
// any edits of this file WILL be overwritten and thus discarded
// see section `gyb` in `README` for details.
如果您认为您已经确定了 Swift Crypto 中的漏洞,请通过通常的渠道向 Apple 报告该漏洞。
最新版本的 Swift Crypto 支持 Swift 5.7 及更高版本。 以下详细说明了 Swift Crypto 版本支持的最低 Swift 版本
Swift Crypto | 最低 Swift 版本 |
---|---|
2.0.0 ..< 2.1.0 |
5.2 |
2.1.0 ..< 2.2.0 |
5.4 |
2.2.0 ..< 2.4.2 |
5.5 |
2.4.2 ..< 3.1.0 |
5.6 |
3.1.0 ..< 3.3.0 |
5.7 |
3.3.0 ..< 3.8.0 |
5.8 |
3.8.0 ... |
5.9 |
Swift Crypto 遵循 SemVer 2.0.0。 我们的公共 API 与 CryptoKit 的 API 相同(除非我们完全缺乏实现),以及 Server 和 Staging 命名空间中的所有内容。 任何以下划线开头的符号,以及任何以下划线开头的产品,都不受语义版本控制的约束:这些 API 可能会在没有警告的情况下更改。 我们不维护稳定的 ABI,因为 Swift Crypto 是一个仅源代码分发。
这对您意味着您应该依赖于 Swift Crypto 的版本范围,该范围涵盖从您需要的最低 Swift Crypto 版本到下一个主要版本之间的所有内容。 在 SwiftPM 中,可以通过指定例如 from: "1.0.0"
轻松完成此操作,这意味着您支持从 1.0.0 到(不包括)2.0.0 的每个版本的 Swift Crypto。 SemVer 和 Swift Crypto 的公共 API 保证应该会导致一个正常工作的程序,而无需担心测试每个版本的兼容性。
Swift Crypto 2.0.0 于 2021 年 9 月发布。 Swift Crypto 2.0.0 和 1.0.0 之间唯一的重大更改是在 CryptoKitError
枚举中添加了新案例。 因此,对于大多数用户来说,依赖于 1.0.0 *或* 2.0.0 系列版本是安全的。
为此,请在您的 Package.swift
中使用以下依赖项
.package(url: "https://github.com/apple/swift-crypto.git", "1.0.0" ..< "3.0.0"),
Swift Crypto 通常会将 macOS 上 CryptoKit 的操作系统实现推迟。 当然,这使得在 macOS 上开发 Swift Crypto 变得棘手。 要让 Swift Crypto 在 macOS 上构建开源实现,请在 Package.swift
中将 let development = false
更改为 let development = true
,因为这将强制 Swift Crypto 构建其公共 API。