aws/aws-lc

GitHub: aws/aws-lc

AWS-LC 是 AWS 维护的通用加密库,基于 BoringSSL 和 OpenSSL,提供高性能、经过形式化验证的加密算法实现,并兼容 OpenSSL API。

Stars: 802 | Forks: 199

# AWS libcrypto (AWS-LC) AWS-LC 是一个通用加密库,由 AWS Cryptography 团队为 AWS 及其客户进行维护。它基于 Google BoringSSL 项目和 OpenSSL 项目的代码。 AWS-LC 包含 TLS 和常见应用所需算法的可移植 C 语言实现。对于性能至关重要的算法,还包含了针对 x86 和 ARM 的优化汇编版本。 ## Amazon Linux 2 快速入门 AWS-LC 的 libcrypto 是一个 C 语言库,需要 C 编译器。AWS-LC 的 libssl 是一个 C++ 语言库,需要 C++ 编译器。 在 GitHub 上 Fork AWS-LC 并运行以下命令,以开启优化和调试信息来构建 AWS-LC,运行所有测试并进行安装: ``` sudo yum install cmake3 ninja-build clang perl golang git clone https://github.com/${YOUR_GITHUB_ACCOUNT_NAME}/aws-lc.git mkdir aws-lc-build && cd aws-lc-build cmake3 -GNinja \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCMAKE_INSTALL_PREFIX=../aws-lc-install \ ../aws-lc ninja-build run_tests && ninja-build install cd ../aws-lc-install/ ls * ``` 请参阅 [Building.md](https://github.com/aws/aws-lc/blob/main/BUILDING.md) 获取有关所需依赖项和构建选项的更多信息。如果您有兴趣参与贡献,请[提交一个 issue](https://github.com/aws/aws-lc/issues/new/choose) 来讨论您的计划。 [Contributing.md](https://github.com/aws/aws-lc/blob/main/CONTRIBUTING.md) 包含有关如何具体进行更改并获得 AWS-LC 维护者审查的信息。 如果您只是想使用 AWS-LC,请查阅公共头文件中的现有文档。如果您正在将您的应用从 OpenSSL 迁移过来,请参阅[移植指南](https://github.com/aws/aws-lc/blob/main/PORTING.md)获取更多信息。 ## 为什么选择 AWS-LC? AWS-LC 的目标是维护一个安全的 libcrypto,并与 AWS 使用的软件和应用保持兼容。AWS-LC 也是 AWS Cryptography 团队发布开源贡献和增强功能的新阵地,这些贡献和增强功能也会被提交到其他 libcrypto 项目中。 ## AWS-LC 特性 ### API 兼容性 AWS-LC 与绝大多数 OpenSSL API 兼容,使其易于在现有应用中使用。我们非常乐意在[issue](https://github.com/aws/aws-lc/issues/new/choose)中讨论添加缺失的功能以及了解您的使用场景。 ### 算法优化支持 包含了所有算法的可移植 C 语言实现,并针对部分 x86 和 Arm CPU 提供了特定算法的优化汇编实现。我们使用 [AWS Graviton 处理器](https://aws.amazon.com/ec2/graviton/) 来测试 ARMv8 优化,并使用 Intel CPU 来测试 x86 和 x86-64 优化。 [Intel Software Development Emulator](https://software.intel.com/content/www/us/en/develop/articles/intel-software-development-emulator.html) 被用于在多种不同的 x86 处理器上运行测试。 如果您使用的是其他 CPU,并希望确保我们会对其进行测试,或者想讨论添加某种汇编优化算法的实现,请提交一个 issue 来讨论将其添加到我们的 CI 中。 ### 发行版打包 AWS-LC 支持发行版打包模式,用于在 Linux 和 BSD 系统上进行系统级安装。当使用 `-DENABLE_DIST_PKG=1` 构建时,AWS-LC 将启用: - **SONAME 版本控制**:库使用标准 SONAME(例如,`libcrypto-awslc.so.1`) - **符号版本控制**:使用 ELF 符号版本控制来跟踪 ABI 稳定性(例如,`AWS_LC_1.0`) - **共存头文件**:头文件安装在 `include/aws-lc/openssl/` 目录下,以便与其他加密库共存 符号版本控制将每个公共 API 符号分配给一个命名的版本节点。未来版本中引入的新符号将获得继承自其前代版本的新版本节点,从而实现细粒度的兼容性跟踪。详情请参阅 [docs/SymbolVersioning.md](docs/SymbolVersioning.md)。 ## 平台支持 AWS-LC 的正确性已在多种*平台*(即 操作系统/CPU 组合)上进行了测试。以下是我们积极支持或已知社区感兴趣的平台概览。 如果您使用的平台未在下方列出,并希望请求将其添加到我们的 CI 中,请提交一个 [issue](https://github.com/aws/aws-lc/issues/new/choose) 进行讨论。 无论我们对特定平台的支持程度如何,我们都非常乐意考虑接受能够改善或扩展我们支持的贡献。 ### 受支持的平台 以下平台在我们的 CI 流水线中进行了积极测试。其中一些平台会跨多个编译器或编译器版本进行测试。对于每个 pull request,我们都会验证提议的更改,以确认其能够成功构建并通过这些平台的测试。 有关我们测试设置的更完整描述可以在 [CI README](https://github.com/aws/aws-lc/blob/main/tests/ci/README.md) 中找到。 | 操作系统 | CPU | |---------|---------------------------------------| | Android | aarch64 | | iOS | aarch64 | | Linux | aarch64, ppc, ppc64, ppc64le, x86-64 | | macOS | aarch64, x86-64 | | Windows | x86-64 | ### 其他平台 以下列出的是我们或社区感兴趣的平台。但是,针对这些平台报告的问题可能不会被我们的团队优先处理。我们欢迎能够改善消费者在这些平台上体验的贡献。 | 操作系统 | CPU | |------------|----------------------------------| | Android | arm32 | | Emscripten | wasm32 | | FreeBSD | arm64, x86-64 | | Linux | arm32, loongarch64, risc-v64, s390x, x86 | | NetBSD | arm64, x86-64 | | OpenBSD | arm64, x86-64 | | Windows | aarch64 | ### WebAssembly (WASM) 支持 可以使用 Emscripten 为 WebAssembly 构建 AWS-LC。此支持目前处于实验阶段,并且具有重大的安全考量: - **无 FIPS 模式**:WASM 构建无法通过 FIPS 验证 - **随机性**:依赖于运行时的 `getentropy()` 实现 - **无侧信道保护**:原生构建中存在的针对时序和基于缓存的侧信道缓解措施可能不适用于 WASM 环境 - **线程限制**:使用 Web Worker,其安全特性与原生线程不同 有关构建说明,请参阅 [BUILDING.md](./BUILDING.md)。 ### FIPS 合规性 有关 FIPS 合规性、在 FIPS 模式下构建 AWS-LC 以及平台限制的信息,请参阅 [crypto/fipsmodule/FIPS.md](crypto/fipsmodule/FIPS.md)。 ### 后量子密码学 有关 AWS-LC 支持的后量子算法的详细信息,请参阅 [PQREADME](https://github.com/aws/aws-lc/tree/main/crypto/fipsmodule/PQREADME.md)。 ## AWS-LC 安全机制 ### 自动化测试 每项更改都会通过我们的 [CI](https://github.com/aws/aws-lc/blob/main/tests/ci/README.md) 进行测试,其中包括正负向单元测试、模糊测试、Sanitizers( [Address](https://clang.llvm.org/docs/AddressSanitizer.html), [Memory](https://clang.llvm.org/docs/MemorySanitizer.html), [Control flow integrity](https://clang.llvm.org/docs/ControlFlowIntegrity.html), [Thread](https://clang.llvm.org/docs/ThreadSanitizer.html), 和 [Undefined behavior](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html)), [Valgrind](https://valgrind.org/) 以及形式化验证。 ### 形式化验证 AWS-LC 的部分内容已在 [AWS-LC Formal Verification](https://github.com/awslabs/aws-lc-verification) 中进行了形式化验证, 这些检查会在每次更改时在 AWS-LC 的 CI 中运行。在特定 CPU 上经过验证(附带注意事项)的算法包括: | 算法 | 参数 | CPUs | | ----------| ------------| ----------- | SHA-2 | 384, 512 | SandyBridge+ | | SHA-2 | 384 | neoverse-n1, neoverse-v1 | | HMAC | 使用 SHA-384 | SandyBridge+ | | AES-KW(P) | 256 | SandyBridge+ | | AES-GCM | 256 | SandyBridge+ | 代码经过验证的 CPU 定义在下表中。 | CPUs | 描述 | | --------------- | ------------| | SandyBridge+ | 带有 AES-NI、CLMUL 和 AVX 的 x86-64。 | neoverse-n1 | 不带 SHA512 的 aarch64。 | neoverse-v1 | 带有 SHA512 的 aarch64。 有关已验证 API 函数、注意事项及所用技术的更多详细信息,请查看 [AWS-LC Formal Verification](https://github.com/awslabs/aws-lc-verification) 代码库。 此外,我们使用 [s2n-bignum](https://github.com/awslabs/s2n-bignum) 中的汇编代码来实现 x86_64 和 aarch64 的算法或子例程。这些函数已在 HOL Light 中进行了形式化验证。详情请见下表。 | 算法 | 函数 | CPUs | | ----------| ------------| ------------| | RSA | `montgomery_s2n_bignum_mul_mont` | aarch64 | | P-256 | `bignum_montinv_p256`, `p256_montjscalarmul_selector` | aarch64, x86_64 | | P-384 | `bignum_add_p384`, `bignum_sub_p384`, `bignum_neg_p384`, `bignum_tolebytes_6`, `bignum_fromlebytes_6`, `bignum_to_mont_p384_selector`, `bignum_deamont_p384_selector`, `bignum_montmul_p384_selector`, `bignum_montsqr_p384_selector`, `bignum_nonzero_6`, `bignum_montinv_p384`, `p384_montjdouble_selector`, `p384_montjscalarmul_selector` | aarch64, x86_64 | | P-521 | `bignum_add_p521`, `bignum_sub_p521`, `bignum_neg_p521`, `bignum_tolebytes_p521`, `bignum_fromlebytes_p521`, `bignum_mul_p521_selector`, `bignum_sqr_p521_selector`, `bignum_inv_p521`, `p521_jdouble_selector`, `p521_jscalarmul_selector` | aarch64, x86_64 | | X25519 | `curve25519_x25519_byte_selector`, `curve25519_x25519base_byte_selector` | aarch64, x86_64 | | Ed25519 | `bignum_mod_n25519`, `bignum_neg_p25519`, `bignum_madd_n25519_selector`, `edwards25519_encode`, `edwards25519_decode_selector`, `edwards25519_scalarmulbase_selector`, `edwards25519_scalarmuldouble_selector` | aarch64, x86_64 | ## 有疑问? 我们使用 [GitHub Issues](https://github.com/aws/aws-lc/issues) 来管理功能请求、错误报告或有关 AWS-LC API 使用的问题。 如果您认为自己可能发现了具有安全影响的问题,请改为遵循我们的[安全通报流程](#security-issue-notifications)。 ## 安全问题通报 如果您在 AWS-LC 中发现潜在的安全问题,我们请求您通过我们的[漏洞报告页面](https://aws.amazon.com/security/vulnerability-reporting/)通知 AWS Security。请**不要**创建公开的 GitHub issue。 如果您对 AWS-LC 进行打包或分发,或者将 AWS-LC 作为大型多用户服务的一部分使用,您可能有资格获得未来 AWS-LC 版本的预先通知。请联系 aws-lc-pre-notifications@amazon.com。
标签:Bash脚本, C/C++, TLS/SSL, 事务性I/O, 加密算法, 安全报告生成, 密码学库, 底层开发, 日志审计