wolfSSL/wolfPKCS11
GitHub: wolfSSL/wolfPKCS11
基于 wolfSSL 的轻量级 PKCS#11 加密令牌库,支持 TPM 硬件后端和嵌入式部署。
Stars: 18 | Forks: 23
# wolfPKCS11
使用 wolfSSL 实现加密算法的 PKCS#11 库。
## 项目特性
## 构建
构建 wolfSSL:
```
git clone https://github.com/wolfSSL/wolfssl.git
cd wolfssl
./autogen.sh
./configure --enable-aescfb --enable-rsapss --enable-keygen --enable-pwdbased --enable-scrypt C_EXTRA_FLAGS="-DWOLFSSL_PUBLIC_MP -DWC_RSA_DIRECT -DHAVE_AES_ECB -DHAVE_AES_KEYWRAP"
make
make check
sudo make install
sudo ldconfig
```
autogen.sh 需要:automake 和 libtool:`sudo apt-get install automake libtool`
构建 wolfPKCS11:
```
git clone https://github.com/wolfSSL/wolfPKCS11.git
cd wolfPKCS11
./autogen.sh
./configure
make
make check
```
### 使用 wolfTPM 的 TPM 支持
启用 TPM 用于加密和密钥存储。
已使用 `./configure --enable-singlethreaded --enable-wolftpm --disable-dh CFLAGS="-DWOLFPKCS11_TPM_STORE" && make` 进行测试。
注意:TPM 不支持 DH,因此仅支持 RSA 和 ECC。
### 可选:AES-CCM 支持
要在 wolfPKCS11 中支持 AES-CCM,请在配置 wolfSSL 和 wolfPKCS11 时添加 `--enable-aesccm`。
### 可选:AES-ECB 支持
要在 wolfPKCS11 中支持 AES-ECB,请在定义了 C 宏 `HAVE_AES_ECB` 的情况下配置 wolfSSL。例如,`CFLAGS="-DHAVE_AES_ECB"`。然后在配置步骤中为 wolfPKCS11 添加 `--enable-aesecb` 以启用它。
警告:ECB (Electronic Code Book) 模式的 AES 通常被认为是不安全的。请考虑使用其他 AES 模式。
### 构建选项和定义
#### 定义 WOLFPKCS11_TPM_STORE
使用 `WOLFPKCS11_TPM_STORE` 将对象存储在 TPM NV 中。
#### 定义 WOLFPKCS11_NO_STORE
禁用 token 的存储。
#### 定义 WOLFPKCS11_DEBUG_STORE
为存储启用调试 printf。
#### 定义 WOLFPKCS11_CUSTOM_STORE
移除存储函数的默认实现。
请参阅 wolfpkcs11/store.h 以获取需要实现的函数原型。
#### 定义 WOLFPKCS11_KEYPAIR_GEN_COMMON_LABEL
在生成密钥对时,将私钥的标签设置为公钥的标签。
#### Analog Devices, Inc. MAXQ10xx 安全元件 ([MAXQ1065](https://www.analog.com/en/products/maxq1065.html)/MAXQ1080)
已增加对使用 MAXQ10xx 硬件进行加密操作和证书存储的支持。
使用前:
1. 确保已安装 maxq10xx-sdk,并且它已将正确的头文件安装到 wolfPKCS11 的源代码中。
2. 编辑 `examples/maxq10xx_init.sh` 以确保其指向正确的路径。
3. 执行 `examples/maxq10xx_init.sh` 以确保其已正确初始化。
注意:在代码中,我们嵌入了一个测试密钥。在生产环境中必须更改此密钥!!请联系 Analog Devices 了解如何获取和使用生产密钥。
## 使用 CMake 构建
wolfPKCS11 使用源外构建(out-of-source builds)。它还需要 CMake 3.16 或更高版本(建议 3.22+)。
### 使用 CMake 构建 wolfSSL
wolfPKCS11 依赖于 wolfSSL。请先使用 CMake 构建并安装 wolfSSL:
```
git clone https://github.com/wolfSSL/wolfssl.git
cd wolfssl
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr/local \
-DWOLFSSL_AES=yes -DWOLFSSL_AESCBC=yes -DWOLFSSL_AESCCM=yes \
-DWOLFSSL_AESCFB=yes -DWOLFSSL_AESECB=yes -DWOLFSSL_AESCTR=yes \
-DWOLFSSL_AESGCM=yes -DWOLFSSL_AESKEYWRAP=yes -DWOLFSSL_AESOFB=yes \
-DWOLFSSL_AESCTS=yes -DWOLFSSL_DH=yes -DWOLFSSL_DH_DEFAULT_PARAMS=yes \
-DWOLFSSL_ECC=yes -DWOLFSSL_HKDF=yes -DWOLFSSL_KEYGEN=yes \
-DWOLFSSL_MD5=yes -DWOLFSSL_RSA=yes -DWOLFSSL_RSA_PSS=yes \
-DWOLFSSL_SHA=yes -DWOLFSSL_SHA224=yes -DWOLFSSL_SHA3=yes \
-DWOLFSSL_SHA384=yes -DWOLFSSL_SHA512=yes \
-DWOLFSSL_SP_MATH_ALL=yes -DWOLFSSL_PUBLIC_MP=yes \
-DWOLFSSL_WC_RSA_DIRECT=yes -DCMAKE_BUILD_TYPE=Release \
..
cmake --build .
sudo cmake --install .
```
若要安装到非系统目录,请设置 `-DCMAKE_INSTALL_PREFIX=`,并在下方构建 wolfPKCS11 时将相同的路径作为 `-DCMAKE_PREFIX_PATH=` 传入。
### 使用 CMake 构建 wolfPKCS11
```
cd wolfPKCS11
mkdir build && cd build
cmake ..
cmake --build .
ctest
```
要启用其他功能,请在配置步骤中传递选项:
```
cmake -DWOLFPKCS11_DEBUG=yes \
-DWOLFPKCS11_AESKEYWRAP=yes \
-DWOLFPKCS11_AESCTR=yes \
-DWOLFPKCS11_AESCCM=yes \
-DWOLFPKCS11_AESECB=yes \
-DWOLFPKCS11_AESCTS=yes \
-DWOLFPKCS11_AESCMAC=yes \
-DWOLFPKCS11_PBKDF2=yes \
..
cmake --build .
ctest
```
如果 wolfSSL 安装在非系统前缀路径下,请向 CMake 指出该路径:
```
cmake -DCMAKE_PREFIX_PATH=/path/to/wolfssl/install ..
```
### CMake 构建选项
| 选项 | 默认值 | 描述 |
|--------|---------|-------------|
| `WOLFPKCS11_DEBUG` | `no` | 启用调试日志 |
| `WOLFPKCS11_SINGLE_THREADED` | `no` | 单线程模式 |
| `WOLFPKCS11_RSA` | `yes` | RSA 支持 |
| `WOLFPKCS11_OAEP` | `yes` | RSA OAEP 支持 |
| `WOLFPKCS11_RSA_PSS` | `yes` | RSA-PSS 支持 |
| `WOLFPKCS11_KEYGEN` | `yes` | 密钥生成支持 |
| `WOLFPKCS11_ECC` | `yes` | ECC 支持 |
| `WOLFPKCS11_DH` | `yes` | DH 支持 |
| `WOLFPKCS11_AES` | `yes` | AES 支持 |
| `WOLFPKCS11_AESCBC` | `yes` | AES-CBC 支持 |
| `WOLFPKCS11_AESGCM` | `yes` | AES-GCM 支持 |
| `WOLFPKCS11_AESKEYWRAP` | `no` | AES Key Wrap 支持 |
| `WOLFPKCS11_AESCTR` | `no` | AES-CTR 支持 |
| `WOLFPKCS11_AESCCM` | `no` | AES-CCM 支持 |
| `WOLFPKCS11_AESECB` | `no` | AES-ECB 支持 |
| `WOLFPKCS11_AESCTS` | `no` | AES-CTS 支持 |
| `WOLFPKCS11_AESCMAC` | `no` | AES-CMAC 支持 |
| `WOLFPKCS11_HMAC` | `yes` | HMAC 支持 |
| `WOLFPKCS11_HKDF` | `yes` | HKDF 支持 |
| `WOLFPKCS11_PBKDF2` | `no` | 用于 PIN 哈希的 PBKDF2 |
| `PBKDF2_ITERATIONS` | `600000` | PBKDF2 迭代次数(当 `WOLFPKCS11_PBKDF2=yes` 时使用) |
| `WOLFPKCS11_MD5` | `yes` | MD5 支持 |
| `WOLFPKCS11_SHA1` | `yes` | SHA-1 支持 |
| `WOLFPKCS11_SHA224` | `yes` | SHA-224 支持 |
| `WOLFPKCS11_SHA256` | `yes` | SHA-256 支持 |
| `WOLFPKCS11_SHA384` | `yes` | SHA-384 支持 |
| `WOLFPKCS11_SHA512` | `yes` | SHA-512 支持 |
| `WOLFPKCS11_SHA3` | `yes` | SHA-3 支持 |
| `WOLFPKCS11_TPM` | `no` | wolfTPM 密钥库支持 |
| `WOLFPKCS11_NSS` | `no` | NSS 特定修改 |
| `WOLFPKCS11_PKCS11_V3_0` | `yes` | PKCS#11 v3.0 支持 |
| `WOLFPKCS11_PKCS11_V3_2` | `no` | PKCS#11 v3.2 支持 |
| `WOLFPKCS11_EXAMPLES` | `yes` | 构建示例 |
| `WOLFPKCS11_TESTS` | `yes` | 构建并注册测试 |
| `WOLFPKCS11_COVERAGE` | `no` | 代码覆盖率支持 |
| `WOLFPKCS11_INSTALL` | `yes` | 创建安装目标 |
| `WOLFPKCS11_DEFAULT_TOKEN_PATH` | `""` | 编译进库的默认 token 存储路径 |
| `WOLFPKCS11_BUILD_OUT_OF_TREE` | `yes` | 在源码树之外生成构建产物 |
| `BUILD_SHARED_LIBS` | `ON` | 构建共享库 (`ON`) 或静态库 (`OFF`) |
注意:wolfSSL 必须在启用了相应功能的情况下构建,上述选项才能生效(例如,启用 `WOLFPKCS11_AESCCM` 需要构建 wolfSSL 时带有 `-DWOLFSSL_AESCCM=yes`)。
## 环境变量
### WOLFPKCS11_TOKEN_PATH
存储包含 token 数据的文件的路径。如果未设置,wolfPKCS11 将按顺序尝试:由 `WOLFPKCS11_TOKEN_PATH` 指定的目录、由 NSS 配置的任何存储目录、用户主目录(POSIX 上为 `~/.wolfPKCS11` 或 Windows 上为 `%APPDIR%\wolfPKCS11`),最后是可选的 `WOLFPKCS11_DEFAULT_TOKEN_PATH` 构建时设置。不会回退到 `/tmp`;部署必须显式提供一个安全的存储位置。
### WOLFPKCS11_NO_STORE
设置为任意值以停止存储 token 数据。
## 发布说明
### wolfPKCS11 Release 2.0 (2025年8月26日)
**概要**
此版本包含许多新功能,使其可以作为 NSS 的 PKCS11 后端。它还包含许多错误修复。
**详情**
* 新增示例
* 为 wolfPKCS11 添加了证书存储
* 添加了新的 AES 算法:
- `AES-CCM`
- `AES-ECB`
- `AES-CTS`
- `AES-CTR`
* 编译器修复
* 对 TPM 存储的巨大改进
* 减少了对象的内存使用
* 增加了对 MAXQ1065 的支持
* 修复了未提供公共指数时的 RSA 问题
* 修复了对 `CKC_X_509` 的 `CKA_CERTIFICATE_TYPE` 搜索
* 修复了未提供模数时的 RSA 问题
* 修复了对证书对象执行 `C_FindObjects` 时的错误内存访问
* 添加了新功能:
- `C_Digest*`
- `C_SignEncryptUpdate`
- `C_DecryptVerifyUpdate`
- `C_GetOperationState` 和 `C_SetOperationState` (仅 Digest)
- `C_SignRecoverInit` 和 `C_VerifyRecover`
- `wolfPKCS11_Debugging_On` 和 `wolfPKCS11_Debugging_Off`
* 添加了新机制:
- `CKM_ECDSA_SHA*`
- `CKM_SHA*_RSA*`
- `CKM_AES_CMAC_GENERAL`
- `CKM_AES_CMAC`
- `CKM_AES_CBC_ENCRYPT_DATA`
- `CKM_HKDF_DATA`
- `CKM_HKDF_KEY_GEN`
- `CKM_TLS12_KEY_AND_MAC_DERIVE`
- `CKM_TLS12_MASTER_KEY_DERIVE`
- `CKM_TLS12_MASTER_KEY_DERIVE_DH`
- `CKM_NSS_TLS_EXTENDED_MASTER_KEY_DERIVE` (仅限 NSS 构建)
- `CKM_NSS_TLS_EXTENDED_MASTER_KEY_DERIVE_DH` (仅限 NSS 构建)
- `CKM_NSS_TLS_PRF_GENERAL_SHA256` (仅限 NSS 构建)
- `CKM_TLS_MAC`
- `CKM_SHA1_RSA_PKCS`
- `CKM_SHA1_RSA_PKCS_PSS`
- `CKM_SHA3*`
- `CKM_MD5`
- `CKM_NSS_PKCS12_PBE_SHA*_HMAC_KEY_GEN` (仅限 NSS 构建)
- `CKM_PKCS5_PBKD2`
* 添加了新类型:
- `CKO_DATA`
- `CKO_NSS_TRUST` (仅限 NSS 构建)
* 添加了新属性:
- `CKA_CERTIFICATE_TYPE`
- `CKA_CERTIFICATE_CATEGORY`
- `CKA_ID`
- `CKA_ISSUER`
- `CKA_SERIAL_NUMBER`
- `CKA_PUBLIC_KEY_INFO`
- `CKA_URL`
- `CKA_HASH_OF_SUBJECT_PUBLIC_KEY`
- `CKA_HASH_OF_ISSUER_PUBLIC_KEY`
- `CKA_NAME_HASH_ALGORITHM`
- `CKA_CHECK_VALUE`
- `CKA_CERT_SHA1_HASH` (仅限 NSS 构建)
- `CKA_CERT_MD5_HASH` (仅限 NSS 构建)
- `CKA_TRUST_SERVER_AUTH` (仅限 NSS 构建)
- `CKA_TRUST_CLIENT_AUTH` (仅限 NSS 构建)
- `CKA_TRUST_EMAIL_PROTECTION` (仅限 NSS 构建)
- `CKA_TRUST_CODE_SIGNING` (仅限 NSS 构建)
- `CKA_TRUST_STEP_UP_APPROVED` (仅限 NSS 构建)
- `CKA_NSS_EMAIL` (仅限 NSS 构建)
- `CKA_NSS_DB` (仅限 NSS 构建,不存储)
* 为 digest 和 HMAC 添加了 SHA3 支持
* 添加了 AES 密钥生成和密钥封装
* 添加了 `--enable-nss` 用于 NSS 特定的 PKCS11 特性
* 修复了 ECC 派生密钥曲线错误
* 修复了对象布尔属性和权限
* 修复了 `C_SetAttributeValue` 有时会擦除密钥的问题
* 修复了 wolfCrypt FIPSv5 和 FIPSv6 支持
* 修复了加载错误时的 token 擦除问题
* 修复了各种内存泄漏
* 完全重写了基于文件的 token 路径处理
* 添加了调试输出
* 修复了可见性问题
* 修复了 ECC 密钥的 x963 用法
* 增加了对旧版 wolfSSL 的支持
* 修复了 token 覆盖先前对象的问题
* 修复了 token 加载错误处理
* 改进了 `C_Login` 的错误处理
* 改进了 Debian 打包
* 修复了 wolfBoot 的构建问题
* 修复了 `malloc(0)` 代码路径
修复了 `C_CopyObject` 未执行深拷贝的问题
* 添加了 `CKM_RSA_PKCS` 以进行封装/解封
* 修复了 FIPSv5 的 ECC 曲线查找
* 修复了密钥的默认属性
* `C_DestroyObject` 现在会删除文件而不是留下截断的文件
* 增加了对 STM32U5 DHUK 封装的支持
* 增加了对 pin 的 PBKDF2 支持
- FIPS 默认启用
- 使用 `--enable-pbkdf2` 或定义 `WOLFPKCS11_PBKDF2` 启用
* 添加了 `--pbkdf2-iterations` 和 `PBKDF2_ITERATIONS` 以设置 pin 处理的 PBKDF2 迭代次数(默认 600,000)。
### wolfPKCS11 Release 1.3 (2024年3月22日)
**概要**
为 wolfPKCS11 添加了 Visual Studio 支持。修复了转换警告和可移植性问题。
**详情**
* 修复了当 data == NULL 时 `C_GetAttributeValue` 错误地报错 `CKR_ATTRIBUTE_VALUE_INVALID` 的问题。`C_GetAttributeValue` 应在数据字段为 NULL 时设置长度。(PR #27)
* 修复了几个转换警告和可能使用未初始化值的问题。(PR #28)
* 修复了 `WOLFPKCS11_USER_SETTINGS` 的可移植性问题。(PR #28)
* 为 wolfPKCS11 添加了 Visual Studio 支持。(PR #28)
- 这包括带有 Windows TBS 接口的 wolfTPM 支持
* 重新设计了共享库版本控制。(PR #29)
### wolfPKCS11 Release 1.2 (2023年12月26日)
**概要**
使用 wolfTPM 添加了对 TPM 2.0 的后端支持。添加了 AES CBC 密钥封装/解封支持。可移植性改进。通过 GitHub Actions 改进了测试。
**详情**
* 针对轻微的转换警告、拼写检查进行清理,并忽略生成的测试文件 (PR #14)
* 添加了对使用 aes_cbc_pad 封装/解封 RSA 的支持。(PR #15)
* 修复了创建后公钥标签的设置问题(在解码前初始化 ECC 对象)(PR #16)
* 刷新密钥存储中的写入。(PR #17)
* 添加了用于嵌入式用途的构建选项 (PR #18)
- `WOLFSSL_USER_SETTINGS` 以避免包含 `wolfssl/options.h`
- `WOLFPKCS11_USER_SETTINGS` 以避免包含 `wolfPKCS11/options.h`
- `WOLFPKCS11_NO_TIME` 使 wc_GetTime() 可选(它禁用了 token 登录时的暴力破解保护)
* 仅在使用 `WOLFPKCS11_NO_TIME` 时重置失败的登录计数器 (PR #18)
* 修复了 `SetMPI`/`GetMPIData` 中的参数传递 (PR #19)
* 修复了释放 PKCS11 对象时的 `NO_DH` ifdef 门控 (PR #20)
* 添加了 GitHub CI action (PR #21)
* 修复了来自 `./autogen.sh` 的警告。更新了 m4 宏。(PR #21)
* 添加了额外的 GitHub CI action 测试。(PR #22)
* 添加了 wolfPKCS11 对使用 TPM 2.0 模块作为后端的支持。使用 wolfTPM 并支持 RSA 和 ECC。需要 https://github.com/wolfSSL/wolfTPM/pull/311 (PR #23)
* 添加了带有 wolfTPM 后端和单线程的 wolfPKCS11 CI 测试。(PR #23)
* 添加了 PKCS11 TPM NV 存储(通过 `WOLFPKCS11_TPM_STORE` 启用)。允许在 TPM 用例中使用 `WOLFPKCS11_NO_STORE`。(PR #23)
* 修复了来自 mingw 的编译器警告。(PR #23)
* 添加了可移植性宏 `WOLFPKCS11_NO_ENV`,用于 setenv/getenv 不可用的情况。(PR #23)
* 修复为仅非静态构建需要 `-ldl`。(PR #23)
* 可移植性修复。添加了 `NO_MAIN_DRIVER`。支持 `SINGLE_THREADED`。为某些全局变量添加了 `static`。(PR #24)
* 修复了 `XREALLOC` 不可用时的可移植性问题。(PR #25)
* 添加了使用 `WOLFPKCS11_USER_ENV` 支持自定义 setenv/getenv。(PR #25)
* 修复了边缘情况 pin 失败后 init 未被调用 final 的问题。(PR #25)
* 添加了使用 SHA2-256 哈希 PIN 的支持。
- PKS11 使用 scrypt,这会使用数 MB 内存,对于嵌入式系统不实用。(PR #25)
### wolfPKCS11 Release 1.1 (2022年5月6日)
* 添加了对 CKM_AES_CBC_PAD 的支持
* 添加了对 token 数据存储的支持。
* 添加了对加密私钥的支持。
* 在 slot 标志中添加了 CKF_LOGIN_REQUIRED。
* 添加了用于签名/验证的 RSA X_509 支持
* 添加了缺失的 `CK_INVALID_SESSION`。
* 添加了一些缺失的 PKCS11 类型。
* 修复了使用 FIPS 140-2 (fipsv2) 的构建。
* 修复了 `WP11_API` 可见性。
* 修复了测试 pin 以满足 FIPS HMAC 要求的至少 14 个字符。
* 修复了获取操作标志的布尔值。
* 修复了误导性的缩进修复。
* 改进了 FIPS 下的 `curve_oid` 查找。
* 从公共 pkcs11.h 头文件中移除了 `config.h`。
* 将存储库转换为 GPLv3。
### wolfPKCS11 Release 1.0 (2021年10月20日)
* 初始 PKCS11 支持
标签:AES, Bash脚本, DNS 反向解析, ECC, PKCS#11, ProjectDiscovery, RSA, SamuraiWTF, TPM支持, wolfSSL, 令牌存储, 加密库, 子域名变形, 安全中间件, 客户端加密, 密码学, 嵌入式安全, 开发库, 开源, 手动系统调用, 数据保护, 硬件安全模块, 网络安全, 隐私保护