rfc-9964

ML-DSA for JSON Object Signing and Encryption (JOSE) and CBOR Object Signing and Encryption (COSE)

M. Prorock, O. Steele
date2026-05 streamIETF areasec wgcose statusPROPOSED STANDARD pages55 canonicalhttps://www.rfc-editor.org/rfc/rfc9964 doi10.17487/RFC9964
This document specifies JSON Object Signing and Encryption (JOSE) and CBOR Object Signing and Encryption (COSE) serializations for the Module-Lattice-Based Digital Signature Standard (ML-DSA), a Post-Quantum Cryptography (PQC) digital signature scheme defined in US NIST FIPS 204.

Extracted elements (24)

design-rationale §7.2

HashML-DSA (FIPS 204 Section 5.4) is not specified because its verify routines differ from pure ML-DSA, requiring additional algorithm registrations, and RFC 9881 Section 8.3 notes the increased complexity and compatibility concerns with existing implementations.

crypto, security

design-rationale §3

The AKP key type is intentionally generic, designed for use with algorithms beyond ML-DSA. AKP thumbprint computations are similarly suitable for any algorithm registered under the AKP key type.

jose, cbor, crypto

design-rationale §4

This document specifies ML-DSA private keys using only the seed format (not the expanded private key format supported by RFC 9881) to provide a single, compact representation consistent across both COSE and JOSE, simplifying key management and reducing storage requirements.

crypto, jose, cbor

interoperability-note §5

ML-DSA produces significantly larger public keys and signatures compared to traditional algorithms (e.g., ML-DSA-87 public key is 2592 bytes, signature 4627 bytes). This may make ML-DSA unsuitable for deployments with limited bandwidth, memory, or processing capacity. Use of thumbprints per RFC 7638 and RFC 9679 can reduce the need to repeat public key representations.

crypto, jose, cbor

interoperability-note §4

Unlike RFC 9881 (X.509 ML-DSA), which supports the expanded private key format to maximize interoperability with existing implementations, this document uses only the seed format. Implementations interoperating with RFC 9881-based systems must handle the difference in private key representation.

crypto, jose, cbor

normative-requirement §4 MUST

For ML-DSA private keys, the priv parameter MUST be the seed and MUST have a length of 32 bytes. The expanded private key representation from FIPS 204 is intentionally not defined in order to maintain a single representation across COSE and JOSE.

jose, cbor, crypto

normative-requirement §3 REQUIRED

The alg JWK parameter or COSE Key Common parameter is REQUIRED for all AKP keys.

jose, cbor, crypto

normative-requirement §5 MUST

The ctx parameter MUST be the empty string for ML-DSA-44, ML-DSA-65, and ML-DSA-87.

crypto

normative-requirement §3 MUST NOT

The priv parameter MUST NOT be present in public keys.

jose, cbor, crypto, security

normative-requirement §3 REQUIRED

The pub parameter contains public information and is REQUIRED for AKP keys.

jose, cbor, crypto

normative-requirement §7.3 MUST

When an AKP algorithm requires or encourages key validation, all algorithm-related key parameters MUST be validated. For ML-DSA, the seed length check MUST be performed (256 bits / 32 bytes).

crypto, security

normative-requirement §7.3 MUST

When the expanded priv parameter is used via KeyGen_internal, the skEncode and skDecode algorithms from FIPS 204 MUST be used.

crypto, security

protocol-element §6

AKP COSE Key Thumbprint requires kty (label 1, value 7), alg (label 3, int), and pub (label -1, bstr) as required parameters, computed per RFC 9679 Section 3. AKP JWK Thumbprint requires kty, alg, and pub in lexicographic order (alg, kty, pub), computed per RFC 7638 Section 3.

jose, cbor, crypto

protocol-element §3

The Algorithm Key Pair (AKP) key type is a generic cryptographic key structure for expressing public and private keys for use with algorithms. It uses an 'alg' parameter to indicate the algorithm, a 'pub' parameter for public information, and an optional 'priv' parameter for private information. When expressed as JWKs, parameters are base64url encoded; in COSE keys, no encoding is needed.

jose, cbor, crypto, registry

protocol-element §5

Three ML-DSA parameter sets are defined: ML-DSA-44 (public key 1312 bytes, signature 2420 bytes), ML-DSA-65 (public key 1952 bytes, signature 3309 bytes), ML-DSA-87 (public key 2592 bytes, signature 4627 bytes). The priv seed is always 32 bytes regardless of parameter set.

crypto, jose, cbor

registry §8.1.2

New entry in the IANA 'COSE Key Types' registry: AKP with value 7, capabilities [kty(7)], for Algorithm Key Pairs.

registry, cbor, crypto

registry §8.1.5

New entry in the IANA 'JSON Web Key Types' registry: AKP (Algorithm Key Pair) with JOSE Implementation Requirements 'Optional'.

registry, jose, crypto

registry §8.1.1

Three new entries added to the IANA 'COSE Algorithms' registry: ML-DSA-44 (value -48), ML-DSA-65 (value -49), and ML-DSA-87 (value -50), each with capabilities [kty] and Recommended: Yes.

registry, cbor, crypto

registry §8.1.4

Three new entries in the IANA 'JSON Web Signature and Encryption Algorithms' registry: ML-DSA-44, ML-DSA-65, ML-DSA-87, all with Algorithm Usage Location 'alg' and JOSE Implementation Requirements 'Optional'.

registry, jose, crypto

registry §8.1.3

Two new entries in the IANA 'COSE Key Type Parameters' registry for key type 7 (AKP): pub (label -1, CBOR type bstr, public key) and priv (label -2, CBOR type bstr, private key).

registry, cbor, crypto

registry §8.1.6

Two new entries in the IANA 'JSON Web Key Parameters' registry for kty AKP: pub (Public information class) and priv (Private information class).

registry, jose, crypto

security-consideration §7.1

The ML-DSA seed and the private key expanded from the seed require the same level of protection. If an unauthorized party obtains the seed, they can forge signatures, undermining authenticity and integrity guarantees.

security, crypto

security-consideration §7.4

When using an AKP key with an algorithm, mismatched or tampered public and private information class parameters can range in consequence from operation failure to private key compromise depending on the algorithm and implementation.

security, crypto

wire-format §5

When producing JSON Web Signatures, ML-DSA signature byte strings are base64url encoded, making the encoded signature larger than the raw byte sizes in Table 1. When producing COSE signatures, no encoding is needed; signatures are raw byte strings per RFC 9052 Section 4.

jose, cbor, crypto