-
Notifications
You must be signed in to change notification settings - Fork 9
Release Notes
Release 2.0.0 adds standardized HSS/LMS signatures, COSE countersignatures, PSA/EAT attestation, RFC 9864 fully specified signature algorithms, experimental COSE-HPKE, delegated signing, expanded key and CBOR APIs, and extensive parser and key-handling hardening. wolfCOSE remains a zero-allocation C implementation of CBOR and COSE backed solely by wolfCrypt.
This is a major release because WOLFCOSE_KEY gained fields since 1.0.0.
Applications must be recompiled against the 2.0.0 headers. Code that
initializes keys with wc_CoseKey_Init() and attaches keys through the
wc_CoseKey_Set*() APIs does not need source changes.
- No CVEs were assigned for this release.
- Added delegated signing for
COSE_Sign1and multi-signerCOSE_Sign.WOLFCOSE_ENABLE_EXT_SIGNlets an HSM, secure element, PSA Crypto service, or remote KMS produce signatures without exposing the private key to wolfCOSE. (#59) - Added
wc_CoseSign1_Sign_ex()for tagged or untagged output andwc_CoseSign1_SignSize_ex()for exact sizing without signing, consuming an RNG, or advancing an external signer. (#65) - Expanded the COSE_Key API with public-only encoding, exact encoded-size queries, raw ECC coordinate encoding, and metadata inspection before key import. Added CBOR context initializers, int-or-text label decoding, and zero-copy skipped-item capture helpers. (#66)
- Added RFC 8778 HSS/LMS signatures and COSE_Key support for
COSE_Sign1, multi-signerCOSE_Sign, delegated signing, and lean sign/verify profiles. Signing state remains owned and persisted by the caller. (#72) - Added RFC 9338 full and abbreviated countersignatures across all six tagged COSE message types, including in-place creation, independent verification, CLI support, and RFC interoperability vectors. (#74)
- Added RFC 9783 PSA/EAT token issuance, verification, UEID-selected key resolution, software-component iteration, delegated signing, current and legacy profile handling, and Sign1 and Mac0 envelopes. PSA/EAT remains explicitly enabled by application-selected compile-time gates. (#75)
- Added RFC 9864 fully specified signature algorithms
ESP256,ESP384,ESP512,Ed25519, andEd448as the default IDs. The deprecated RFC 9053 polymorphic IDs remain available withWOLFCOSE_ENABLE_DEPRECATED_ALGS. (#85) - Added a two-step compile-time gate for draft features. A draft feature must
select its own operation gate and acknowledge unstable specifications with
WOLFCOSE_EXPERIMENTAL. (#68) - Added experimental COSE-HPKE P0 support for
COSE_Encrypt0and multi-recipientCOSE_Encrypt, including CLI commands and tests. It is off by default and requiresWOLFCOSE_EXPERIMENTALplus the selected HPKE operation gates while the specification remains an Internet-Draft. (#70) - Added the I-CUBE-wolfCOSE STM32Cube pack, STM32CubeMX/IDE integration documentation, and an on-device test. (#61)
- Rejected COSE_Key decoding into an attached wolfCrypt key object of a different type before any import occurs. Thanks to Omoikane Labs for the report. (#64)
- Hardened CBOR and COSE parsing, cryptographic dispatch, length handling, strict serialization checks, key encoding and decoding, and cleanup on error paths. (#67)
- Rejected invalid protected and skipped recipient structures, including nested Direct recipients and conflicting recipient metadata. (#77)
- Tightened COSE_Key metadata validation, public/private material checks, constant-time ML-DSA public-key comparison, and attached-key type and curve validation across signing, verification, and ECDH operations. (#78, #80)
- Hardened detached input checks, critical-header handling, ECDSA signing prerequisites, protected-header pointers, AES cleanup, CBOR state tracking, public API contracts, and recipient depth accounting. (#81, #82)
- Hardened RSA COSE_Key import and export by validating component presence and widths, bounding output by RSA capacity, fully initializing modulus buffers, and requiring hardened private-key import behavior. (#83)
- Guarded COSE header label conversion against values outside the supported signed range. (#86)
- Split the former monolithic implementation into per-area source modules for smaller selective builds and easier analysis. (#73)
- Added
pkg-configdiscovery while retaining explicit wolfSSL include and library overrides. (#69) - Expanded interoperability testing against t_cose/QCBOR, go-cose, python-cwt, Rust coset, OpenSSL, COSE WG examples, and RFC vectors. (#71)
- Tightened internal integer and size types for MISRA C analysis and fixed static-analysis stability in the test suite. (#62, #79)
- Added optional RFC 6979 deterministic ECDSA signing through
WOLFCOSE_ENABLE_DETERMINISTIC_ECDSA. (#67) - Refreshed the README, algorithm documentation, build guidance, and measured ES256 and ML-DSA-44 performance and footprint references. (#87, #88)
- Added release-only qualification targets for advanced feature scenarios, C++ compilation, Valgrind, merged coverage profiles, metadata validation, and reproducible smoke-tested source archives. (#89)
-
WOLFCOSE_KEYgained delegated-signing and internal key-type tracking fields. Recompile applications against the 2.0.0 headers. - New messages use the RFC 9864 fully specified signature IDs. Existing
messages using
ES256,ES384,ES512, orEdDSArequireWOLFCOSE_ENABLE_DEPRECATED_ALGS; changing a protected algorithm ID also requires re-signing the message. See Algorithms#Migrating from RFC 9053 Signature IDs. - COSE-HPKE is experimental. Its wire format and API may change until the IETF specification is finalized.
-
LIBWOLFCOSE_VERSION_STRINGis now"2.0.0"andLIBWOLFCOSE_VERSION_HEXis0x02000000.
Release 1.0.0 is the first stable release of wolfCOSE, a complete, zero-allocation C implementation of CBOR (RFC 8949) and COSE (RFC 9052/9053) on top of wolfCrypt. It provides all six COSE message types in both single-actor and multi-actor forms, 40 algorithms across signing, encryption, MAC, and key distribution, and standardized post-quantum ML-DSA signatures (RFC 9964), all heap-allocation-free and within a tiny footprint.
- None. This is the initial release.
- CBOR engine implementing RFC 8949 encode/decode with no external dependency, enforcing deterministic/preferred-encoding rules and rejecting non-preferred or trailing input on decode.
- All six COSE message types (RFC 9052):
COSE_Sign1,COSE_Sign,COSE_Encrypt0,COSE_Encrypt,COSE_Mac0, andCOSE_Mac, including the multi-signer and multi-recipient variants. See Message Types. - 40 algorithms across signing, encryption, MAC, and key distribution (RFC 9053): ES256/384/512, EdDSA (Ed25519/Ed448), PS256/384/512, ML-DSA-44/65/87, AES-GCM (128/192/256), ChaCha20-Poly1305, AES-CCM variants, HMAC-SHA256/384/512, AES-MAC, Direct, AES Key Wrap, and ECDH-ES+HKDF. See Algorithms.
- Standardized post-quantum signatures: ML-DSA (FIPS 204) at all three security
levels, conformant to RFC 9964 ("ML-DSA for JOSE and COSE"). COSE keys use the
RFC 9964 AKP key type (
kty7) with a requiredalg, the public key inpub(-1), and the 32-byte seed private key inpriv(-2). -
COSE_Key/COSE_KeySetserialization for all supported key types, including full RFC 8230 RSA private keys (n, e, d, p, q, dP, dQ, qInv). - Zero dynamic allocation: every operation uses caller-provided buffers, with no
heap,
.data, or.bssusage. - Path to FIPS 140-3 through wolfCrypt FIPS Certificate #4718 (sole crypto dependency).
-
WOLFCOSE_LEANconfiguration layer withWOLFCOSE_HAVE_*feature gates,WOLFCOSE_LEAN_VERIFY/ ML-DSA lean profiles for verify-only targets, and aWOLFCOSE_MIN_BUFFERSbounded-stack profile. Verify-only ECC builds link against sign-disabled wolfCrypt (NO_ECC_SIGN,NO_ASN, nomp_int); the ECC signing helpers are gated out so a verify-only image never pulls in sign code, enforced in CI without-ffunction-sectionsgarbage collection. See Macros. -
LIBWOLFCOSE_VERSION_STRING/LIBWOLFCOSE_VERSION_HEXinwolfcose/version.hfor compile-time version checks.
- RSA private
COSE_Keyencode/decode now emits the RFC 8230 MUST-presentdP(-6) anddQ(-7) CRT exponents and encodesdat full modulus width, so a private RSA key round-trips reliably against strict RSA decoders. -
COSE_Macemits an empty protected header for direct-key recipients, matching the COSE structure other implementations expect on the wire. -
COSE_Keyemits preferred (shortest) CBOR length for the RSAnanddbyte strings, keeping serialized keys deterministic.
- Minimal footprint: an ES256
COSE_Sign1build is ~5.1 KB verify-only and ~6.8 KB sign + verify for the wolfCOSE COSE + CBOR engine. See Footprint. - MISRA C:2012 and C:2023 checked. See MISRA Compliance.
- API hardening:
COSE_Encryptandwc_CoseMac_Createdirect mode now require an explicitWOLFCOSE_ALG_DIRECTand reject a zero-initialized algorithm id;wc_CoseMac_Verifyclassifies the recipient algorithm and enforces the algId policy; the CBORwc_CBOR_PeekTypepeek is guarded against NULL and end-of-buffer reads with a single-exit sentinel return; thewc_CoseSign1_Verifyand symmetricCOSE_Encrypt0key parameters areconst-qualified; and ephemeralCOSE_Keycurve ids are range-checked before any narrowing cast. - Coverity DEADCODE findings in the COSE MAC and CBOR decode paths resolved;
static analysis (cppcheck, Clang analyzer, GCC
-fanalyzer, Coverity) is clean. - CI matrix covering Ubuntu/macOS, GCC 10-14 and Clang 14-18, ~240 algorithm
combination tests, static analysis (cppcheck, Clang analyzer, GCC
-fanalyzer, Coverity), security scanning (CodeQL, Semgrep) and house-style gates, sanitizers (ASan/UBSan), a wolfCOSE <-> t_cose wire-interop conformance suite, and a wolfSSL version matrix with explicit ML-DSA/PQC rows. See Testing. - Expanded negative and boundary coverage: 4 KB large-payload round-trips for
COSE_Encrypt0/COSE_Mac0, empty-payload round-trips across AES-GCM/AES-CCM/ChaCha20-Poly1305, CBOR integer argument-width boundaries through the 8-byte andINT64_MINextremes with pinned encoded lengths, HMAC-384/512 short-key rejection, and pinned MAC tag lengths (including an AES-CBC-MAC block-boundary known-answer test) with IV-chaining tamper checks.
wolfCOSE 1.0.0 has been developed according to wolfSSL's development and QA process (see the wolfSSL Software Development Process and Quality Assurance page) and successfully passed the quality criteria.
Requires wolfSSL 5.8.0 or later as the crypto backend; ML-DSA support requires wolfSSL 5.9.2 or later. See Getting Started for build instructions.