aidangarske/wolfCOSE

GitHub: aidangarske/wolfCOSE

一个基于 wolfSSL 的轻量级零分配 COSE 库,支持后量子签名并为资源受限嵌入式环境提供 CBOR 数据的签名、加密和消息认证功能。

Stars: 2 | Forks: 0

# wolfCOSE 一个轻量级、零分配的 C 语言库,实现了 [CBOR (RFC 8949)](https://www.rfc-editor.org/rfc/rfc8949) 和 [COSE (RFC 9052/9053)](https://www.rfc-editor.org/rfc/rfc9052),并使用 [wolfSSL](https://www.wolfssl.com/) 作为加密后端。 专为资源受限的 IoT 设备、FIPS 限定部署以及任何需要在极小 RAM 中处理已认证 CBOR 负载的场景而构建。 ## 亮点 - **首个支持后量子签名的 C 语言 COSE 库** -- 支持所有三个安全级别的 ML-DSA (FIPS 204 / Dilithium) - **涵盖签名、加密和 MAC 的 26 种算法** -- 从经典的 ECC 到后量子算法 - **符合 CNSA 2.0 标准** -- ML-DSA-44/65/87 用于抗量子数字签名 - **零动态分配** -- 所有操作均使用调用者提供的缓冲区,无 `malloc` - **极小的占用空间** -- 核心库约 15KB `.text`,零 `.data`/`.bss` - **在 <1KB RAM 中完成完整 COSE 生命周期**(不包括 wolfCrypt 数学内部组件) ## 关键特性 - **零拷贝 CBOR 解码器** -- 单次遍历,数据指针直接引用输入缓冲区 - **C99 / MISRA-C:2023** -- 单一出口模式,无递归,记录偏差 - **wolfCrypt 集成** -- 利用 wolfSSL 的 FIPS 140-3 验证加密引擎 - **基于指针的密钥结构** -- `WOLFCOSE_KEY` 持有指向调用者拥有的 wolfCrypt 密钥的指针(约 48 字节,而非千字节) - **编译时算法调度** -- `#ifdef` 梯度判断,零开销,无函数指针 - **敏感数据擦除** -- 对所有栈上的加密材料使用 `wc_ForceZero()` ## 支持的算法 ### COSE_Sign1 (数字签名) | Algorithm | COSE ID | wolfCrypt Guard | Notes | |-----------|---------|-----------------|-------| | ES256 | -7 | `HAVE_ECC` | ECDSA with P-256 / SHA-256 | | ES384 | -35 | `HAVE_ECC` | ECDSA with P-384 / SHA-384 | | ES512 | -36 | `HAVE_ECC` | ECDSA with P-521 / SHA-512 | | EdDSA (Ed25519) | -8 | `HAVE_ED25519` | Curve25519 | | EdDSA (Ed448) | -8 | `HAVE_ED448` | Curve448 (Goldilocks) | | PS256 | -37 | `WC_RSA_PSS` | RSA-PSS with SHA-256 | | PS384 | -38 | `WC_RSA_PSS` | RSA-PSS with SHA-384 | | PS512 | -39 | `WC_RSA_PSS` | RSA-PSS with SHA-512 | | ML-DSA-44 | -48 | `HAVE_DILITHIUM` | Post-quantum, FIPS 204 Level 2 | | ML-DSA-65 | -49 | `HAVE_DILITHIUM` | Post-quantum, FIPS 204 Level 3 | | ML-DSA-87 | -50 | `HAVE_DILITHIUM` | Post-quantum, FIPS 204 Level 5 | ### COSE_Encrypt0 (认证加密) | Algorithm | COSE ID | wolfCrypt Guard | Notes | |-----------|---------|-----------------|-------| | A128GCM | 1 | `HAVE_AESGCM` | AES-GCM 128-bit | | A192GCM | 2 | `HAVE_AESGCM` | AES-GCM 192-bit | | A256GCM | 3 | `HAVE_AESGCM` | AES-GCM 256-bit | | ChaCha20/Poly1305 | 24 | `HAVE_CHACHA && HAVE_POLY1305` | 256-bit, software-friendly | | AES-CCM-16-64-128 | 10 | `HAVE_AESCCM` | 128-bit key, 8-byte tag | | AES-CCM-16-64-256 | 11 | `HAVE_AESCCM` | 256-bit key, 8-byte tag | | AES-CCM-64-64-128 | 12 | `HAVE_AESCCM` | 128-bit key, 8-byte tag, short nonce | | AES-CCM-64-64-256 | 13 | `HAVE_AESCCM` | 256-bit key, 8-byte tag, short nonce | | AES-CCM-16-128-128 | 30 | `HAVE_AESCCM` | 128-bit key, 16-byte tag | | AES-CCM-16-128-256 | 31 | `HAVE_AESCCM` | 256-bit key, 16-byte tag | | AES-CCM-64-128-128 | 32 | `HAVE_AESCCM` | 128-bit key, 16-byte tag, short nonce | | AES-CCM-64-128-256 | 33 | `HAVE_AESCCM` | 256-bit key, 16-byte tag, short nonce | ### COSE_Mac0 (消息认证) | Algorithm | COSE ID | wolfCrypt Guard | Notes | |-----------|---------|-----------------|-------| | HMAC 256/256 | 5 | `!NO_HMAC` | SHA-256, 32-byte tag | | HMAC 384/384 | 6 | `WOLFSSL_SHA384` | SHA-384, 48-byte tag | | HMAC 512/512 | 7 | `WOLFSSL_SHA512` | SHA-512, 64-byte tag | ### 密钥类型 | COSE kty | Guard | Algorithms | |----------|-------|------------| | EC2 (2) | `HAVE_ECC` | ES256, ES384, ES512 | | OKP (1) | `HAVE_ED25519` / `HAVE_ED448` / `HAVE_DILITHIUM` | EdDSA, ML-DSA | | RSA (3) | `WC_RSA_PSS` | PS256, PS384, PS512 | | Symmetric (4) | always | AES-GCM, AES-CCM, ChaCha20, HMAC | ### 路线图 计划未来支持的算法: - **ML-KEM** (FIPS 203 / Kyber) -- 用于 COSE_Encrypt 的后量子密钥封装 - **XMSS / LMS** -- 基于哈希的有状态签名 (NIST SP 800-208) - **SLH-DSA** (SPHINCS+) -- 无状态基于哈希的签名 ## 前置条件 需启用所需算法的 wolfSSL 5.x: ``` cd wolfssl ./autogen.sh ./configure --enable-ecc --enable-ed25519 --enable-ed448 \ --enable-curve25519 --enable-aesgcm --enable-aesccm \ --enable-sha384 --enable-sha512 --enable-keygen \ --enable-rsapss --enable-chacha --enable-poly1305 \ --enable-dilithium make && sudo make install sudo ldconfig ``` 对于最小构建(仅 ECC + AES-GCM): ``` ./configure --enable-ecc --enable-aesgcm --enable-sha384 \ --enable-sha512 --enable-keygen ``` ## 构建 ``` # 核心库 (libwolfcose.a) make # 运行单元测试 make test # 构建并运行 CLI tool round-trip 测试(所有算法) make tool-test # 运行 lifecycle demo(11 种算法) make demo ``` ### 构建目标 | Target | Description | |--------|-------------| | `make all` | 构建 `libwolfcose.a`(仅核心库) | | `make shared` | 构建 `libwolfcose.so` | | `make test` | 构建并运行 CBOR 和 COSE 单元测试 | | `make tool` | 构建 CLI 工具 (`tools/wolfcose_tool`) | | `make tool-test` | 所有 17 种算法的往返自测 | | `make demo` | 构建并运行生命周期演示(11 种算法) | | `make clean` | 移除所有构建产物 | ## 项目结构 ``` include/wolfcose/ wolfcose.h Public API (types, constants, all functions) visibility.h WOLFCOSE_API export macros src/ wolfcose_cbor.c CBOR encoder/decoder (RFC 8949, no wolfCrypt dep) wolfcose.c COSE Sign1/Encrypt0/Mac0/Key (RFC 9052/9053, wolfCrypt) wolfcose_internal.h Internal helpers (BE macros, header codec, AEAD dispatch) tests/ test_cbor.c CBOR vectors (RFC 8949 Appendix A) + round-trip test_cose.c COSE Sign1/Encrypt0/Mac0/Key tests test_main.c Test harness (CI exit codes) tools/ wolfcose_tool.c CLI: keygen, sign, verify, encrypt, decrypt, mac, info, test examples/ lifecycle_demo.c Edge-to-cloud producer/consumer demo (11 algorithms) ``` 核心库由两个目标文件组成。仅使用 CBOR 的项目只需链接 `wolfcose_cbor.o`。 ## 快速入门 ### 签名与验证 (C API) ``` #include /* Caller owns all buffers and key lifecycle */ ecc_key eccKey; WOLFCOSE_KEY coseKey; uint8_t scratch[WOLFCOSE_MAX_SCRATCH_SZ]; uint8_t out[256]; size_t outLen; WC_RNG rng; /* Setup */ wc_ecc_init(&eccKey); wc_ecc_make_key(&rng, 32, &eccKey); wc_CoseKey_Init(&coseKey); wc_CoseKey_SetEcc(&coseKey, WOLFCOSE_CRV_P256, &eccKey); /* Sign */ wc_CoseSign1_Sign(&coseKey, WOLFCOSE_ALG_ES256, kid, kidLen, payload, payloadLen, NULL, 0, scratch, sizeof(scratch), out, sizeof(out), &outLen, &rng); /* Verify */ WOLFCOSE_HDR hdr; const uint8_t* decoded; size_t decodedLen; wc_CoseSign1_Verify(&coseKey, out, outLen, NULL, 0, scratch, sizeof(scratch), &hdr, &decoded, &decodedLen); /* Cleanup -- caller frees wolfCrypt key, not wolfCOSE */ wc_ecc_free(&eccKey); ``` ### 后量子签名 (ML-DSA) ``` #include dilithium_key dlKey; WOLFCOSE_KEY coseKey; uint8_t scratch[8192]; /* PQC needs larger scratch */ uint8_t out[8192]; size_t outLen; wc_dilithium_init(&dlKey); wc_dilithium_set_level(&dlKey, 2); /* Level 2 = ML-DSA-44 */ wc_dilithium_make_key(&dlKey, &rng); wc_CoseKey_Init(&coseKey); wc_CoseKey_SetDilithium(&coseKey, WOLFCOSE_ALG_ML_DSA_44, &dlKey); wc_CoseSign1_Sign(&coseKey, WOLFCOSE_ALG_ML_DSA_44, NULL, 0, payload, payloadLen, NULL, 0, scratch, sizeof(scratch), out, sizeof(out), &outLen, &rng); ``` ### CLI 工具 ``` # 为各种算法生成密钥 ./tools/wolfcose_tool keygen -a ES256 -o ec.key ./tools/wolfcose_tool keygen -a PS256 -o rsa.key ./tools/wolfcose_tool keygen -a ML-DSA-44 -o pqc.key # 签名和验证 ./tools/wolfcose_tool sign -k ec.key -a ES256 -i data.bin -o data.cose ./tools/wolfcose_tool verify -k ec.key -i data.cose # 加密和解密 ./tools/wolfcose_tool keygen -a A128GCM -o sym.key ./tools/wolfcose_tool enc -k sym.key -a A128GCM -i secret.bin -o secret.cose ./tools/wolfcose_tool dec -k sym.key -i secret.cose -o recovered.bin # MAC 和验证 ./tools/wolfcose_tool keygen -a HMAC256 -o hmac.key ./tools/wolfcose_tool mac -k hmac.key -a HMAC256 -i data.bin -o data.mac ./tools/wolfcose_tool macverify -k hmac.key -i data.mac # 检查 COSE 结构 ./tools/wolfcose_tool info -i data.cose # 运行所有 round-trip self-tests ./tools/wolfcose_tool test --all # 测试单一算法 ./tools/wolfcose_tool test -a ML-DSA-87 ``` ### 支持的 CLI 算法 ``` ES256, EdDSA, Ed448, PS256, PS384, PS512, ML-DSA-44, ML-DSA-65, ML-DSA-87, A128GCM, A192GCM, A256GCM, ChaCha20, AES-CCM, HMAC256, HMAC384, HMAC512 ``` ## 在真实硬件上部署 ### 交叉编译 ``` # 示例:ARM Cortex-M 与 arm-none-eabi-gcc make CC=arm-none-eabi-gcc \ CFLAGS="-std=c99 -Os -mcpu=cortex-m4 -mthumb \ -I./include -I/path/to/wolfssl/include \ -DWOLFSSL_USER_SETTINGS" ``` 请提供一个包含您的 wolfSSL 配置的 `user_settings.h`,以代替 `wolfssl/options.h`。有关嵌入式构建选项,请参阅 [wolfSSL 手册](https://www.wolfssl.com/documentation/manuals/wolfssl/chapter02.html)。 ### 针对受限目标的调优 ``` /* In your user_settings.h or build flags: */ /* Reduce scratch buffer (default 512, minimum depends on payload size) */ #define WOLFCOSE_MAX_SCRATCH_SZ 256 /* Reduce protected header buffer */ #define WOLFCOSE_PROTECTED_HDR_MAX 32 /* Reduce CBOR nesting depth (default 8) */ #define WOLFCOSE_CBOR_MAX_DEPTH 4 /* For PQC (ML-DSA), increase scratch and signature buffers */ /* #define WOLFCOSE_MAX_SCRATCH_SZ 8192 */ /* #define WOLFCOSE_MAX_SIG_SZ 4627 */ ``` ### 集成检查清单 1. 为您的目标构建仅包含所需算法的 wolfSSL 2. 链接 `libwolfcose.a`(或直接编译 `src/wolfcose_cbor.c` + `src/wolfcose.c`) 3. **不要**在生产固件中包含 `tools/` 或 `examples/` 4. 将密钥预置在安全存储中 -- 参见 `lifecycle_demo.c 了解模式` 5. 调用者拥有所有 `WC_RNG`、密钥、缓冲区的生命周期 -- wolfCOSE 从不分配内存 ### 栈预算 各函数的栈使用情况(来自 `-fstack-usage`,GCC,`-Os`,aarch64): | Function | Stack (bytes) | |----------|--------------| | `wc_CoseSign1_Sign` | 464 | | `wc_CoseSign1_Verify` | 288 | | `wc_CoseEncrypt0_Encrypt` | 1120 | | `wc_CoseEncrypt0_Decrypt` | 1072 | | `wc_CoseMac0_Create` | 1104 | | `wc_CoseMac0_Verify` | 1072 | | `wc_CoseKey_Encode` | 352 | | `wc_CoseKey_Decode` | 224 | | `wc_CBOR_Skip` | 112 | | CBOR encode/decode | 0-48 | ## CI / 测试 wolfCOSE 在每次推送和拉取请求时运行以下 CI 检查: - **构建和测试** -- Ubuntu (latest + 22.04), macOS,包含完整的单元测试套件 - **多编译器** -- GCC 10/11/12/13/14 和 Clang 14/15/16/17/18 - **示例** -- 生命周期演示(11 种算法)和工具往返测试(17 种算法) - **静态分析** -- cppcheck, Clang analyzer, GCC `-fanalyzer` - **Coverity Scan** -- 每晚缺陷分析 Coverity Scan Build Status ## 许可证 wolfCOSE 是根据 [GPLv3](https://www.gnu.org/licenses/gpl-3.0.html) 许可的自由软件。 Copyright (C) 2026 wolfSSL Inc. ## 支持 如需商业许可、支持和 FIPS 验证构建,请联系 [wolfSSL](https://www.wolfssl.com/contact/)。
标签:CBOR, CNSA 2.0, COSE, CVE, DNS 反向解析, ECDSA, Ed25519, FIPS 140-3, IoT安全, MISRA C, ML-DSA, PQC, RFC 8949, RFC 9052, RSA-PSS, wolfCrypt, wolfSSL, 低功耗安全, 后量子密码学, 完整性校验, 客户端加密, 客户端加密, 嵌入式加密, 数字签名, 数据加密, 本体建模, 物联网, 资源受限环境, 轻量级库, 零分配, 零拷贝, 静态分配