
A fast, portable, and lightweight COSE + CBOR implementation for embedded systems. Supports PQC, FIPS 140-3, DO-178, and MISRA C. Powered by wolfSSL.
wolfCOSE is a lightweight C library implementing CBOR (RFC 8949), COSE (RFC 9052/9053), and post-quantum ML-DSA for COSE (RFC 9964) using wolfSSL as the crypto backend.
COSE_Sign and multi-recipient COSE_Encrypt / COSE_MacCOSE_Key (AKP key type, seed-based private keys).data/.bss)COSE_Sign1 wolfCOSE (COSE + CBOR engine) ~5.1 KB verify-only and ~6.8 KB sign + verify.
Total flash including wolfCrypt is ~26.2 KB verify-only (WOLFCOSE_LEAN_VERIFY) and ~34.6 KB sign + verifyCOSE_Sign1, x86_64, wolfCrypt sp_256 asm): 66,538 sign/s, 26,437 verify/sCOSE_Sign1 total flash including wolfCrypt is ~20.8 KB verify-only
(WOLFCOSE_LEAN_VERIFY_MLDSA) and ~35.8 KB sign + verify, within about 1 KB of classical ES256. The wolfCOSE portion
alone is 4.6 KB and ~6.6 KB respectively. See FootprintSigning: ES256, ES384, ES512, EdDSA (Ed25519/Ed448), PS256/384/512, ML-DSA-44/65/87
Encryption: AES-GCM (128/192/256), ChaCha20-Poly1305, AES-CCM variants
MAC: HMAC-SHA256/384/512, AES-MAC
Key Distribution: Direct, AES Key Wrap, ECDH-ES+HKDF
wolfCOSE has implemented all RFC 9052 messages both single-actor and multi-actor variants:
wolfCOSE requires wolfSSL as its crypto backend. Minimum supported version: v5.8.0-stable (first release with the public wc_ForceZero symbol). Post-quantum signing uses the canonical FIPS 204 wc_MlDsaKey API, which lands in wolfSSL after v5.9.1-stable; building wolfCOSE against v5.8.0–v5.9.1 works for everything except ML-DSA. Older 5.x releases can technically be supported but require source-level changes; contact wolfSSL for commercial support.
Choose a build configuration based on the algorithms you need.
This gives you COSE Sign1 (ES256/384/512) and Encrypt0 (AES-GCM):
cd wolfssl
./autogen.sh
./configure --enable-ecc --enable-aesgcm \
--enable-sha384 --enable-sha512 --enable-keygen
make && sudo make install
sudo ldconfig
Algorithms enabled: ES256, ES384, ES512, AES-GCM-128/192/256
For a smaller wolfCrypt footprint, add --enable-cryptonly to drop the TLS
stack and disable the algorithms a Sign1 + Encrypt0 build never uses:
./configure --enable-cryptonly --enable-ecc --enable-aesgcm \
--enable-sha384 --enable-sha512 --enable-keygen \
--enable-lowresource \
--disable-dh --disable-rsa --disable-aescbc \
--disable-sha --disable-md5 --disable-chacha --disable-poly1305 \
--disable-errorstrings
See Tuning for Size and Tuning for Speed for squeezing wolfCOSE and wolfCrypt further on MCUs.
For pure post-quantum signing with ML-DSA-44/65/87:
cd wolfssl
./autogen.sh
./configure --enable-cryptonly --enable-mldsa
make && sudo make install
sudo ldconfig
Algorithms enabled: ML-DSA-44, ML-DSA-65, ML-DSA-87
(SHAKE-128/256 are pulled in automatically by --enable-mldsa. The
wc_MlDsaKey API requires wolfSSL newer than v5.9.1-stable.)
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-mldsa \
--enable-hkdf --enable-aeskeywrap
make && sudo make install
sudo ldconfig
# Core library (libwolfcose.a)
make
# Run unit tests
make test
# Build and run CLI tool round-trip tests (all algorithms)
make tool-test
# Run lifecycle demo (11 algorithms)
make demo
See examples/ for complete working code:
sign1_demo.c, encrypt0_demo.c, mac0_demo.c: algorithm demoslifecycle_demo.c: full edge-to-cloud workflowcomprehensive/: algorithm matrix testsscenarios/: firmware signing, attestation, fleet configRuns on every push and PR:
-fanalyzer--addon=misra checking all wolfCOSE code pathsbugprone-*, cert-*, clang-analyzer-*, misc-*)make coverage # Run tests with gcov
make coverage-force-failure # Include crypto failure path testing
Full documentation is available in the Wiki:
The current release is 1.0.0, the first stable release: the complete RFC 9052 COSE message set (all six message types, single- and multi-actor), 40 algorithms, and standardized post-quantum ML-DSA (RFC 9964), all with zero dynamic allocation. See ChangeLog.md for the full release notes.
wolfCOSE 1.0.0 has been developed according to wolfSSL's development and QA process (see https://www.wolfssl.com/about/wolfssl-software-development-process-quality-assurance) and successfully passed the quality criteria.
wolfCOSE is free software licensed under GPLv3; see LICENSE for the full text.
Copyright (C) 2026 wolfSSL Inc.
For commercial licensing, professional support contracts, or to discuss moving wolfCOSE into your production environment, contact wolfSSL.
| Message | RFC 9052 | API | Purpose |
|---|
COSE_Sign1 | Sec. 4.2 | wc_CoseSign1_Sign / wc_CoseSign1_Verify | Single-signer signature |
COSE_Sign | Sec. 4.1 | wc_CoseSign_Sign / wc_CoseSign_Verify | Multi-signer (independent signatures over the same payload) |
COSE_Encrypt0 | Sec. 5.2 | wc_CoseEncrypt0_Encrypt / wc_CoseEncrypt0_Decrypt | Single-recipient AEAD |
COSE_Encrypt | Sec. 5.1 | wc_CoseEncrypt_Encrypt / wc_CoseEncrypt_Decrypt | Multi-recipient (one ciphertext, many recipients via Direct / AES-KW / ECDH-ES) |
COSE_Mac0 | Sec. 6.2 | wc_CoseMac0_Create / wc_CoseMac0_Verify | Single-recipient MAC |
COSE_Mac | Sec. 6.1 | wc_CoseMac_Create / wc_CoseMac_Verify | Multi-recipient MAC (shared MAC key, distributed to recipients) |
COSE_Key / COSE_KeySet | Sec. 7 | wc_CoseKey_Encode / wc_CoseKey_Decode | Key serialization for all key types |
| Target | Description |
|---|
make all | Build libwolfcose.a (core library only) |
make shared | Build libwolfcose.so |
make test | Build + run CBOR and COSE unit tests |
make tool | Build CLI tool (tools/wolfcose_tool) |
make tool-test | Round-trip self-test for all 17 algorithms |
make demo | Build + run lifecycle demo (11 algorithms) |
make clean | Remove all build artifacts |