summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc9053.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rfc/rfc9053.txt')
-rw-r--r--doc/rfc/rfc9053.txt2443
1 files changed, 2443 insertions, 0 deletions
diff --git a/doc/rfc/rfc9053.txt b/doc/rfc/rfc9053.txt
new file mode 100644
index 0000000..3eff936
--- /dev/null
+++ b/doc/rfc/rfc9053.txt
@@ -0,0 +1,2443 @@
+
+
+
+
+Internet Engineering Task Force (IETF) J. Schaad
+Request for Comments: 9053 August Cellars
+Obsoletes: 8152 August 2022
+Category: Informational
+ISSN: 2070-1721
+
+
+ CBOR Object Signing and Encryption (COSE): Initial Algorithms
+
+Abstract
+
+ Concise Binary Object Representation (CBOR) is a data format designed
+ for small code size and small message size. There is a need to be
+ able to define basic security services for this data format. This
+ document defines a set of algorithms that can be used with the CBOR
+ Object Signing and Encryption (COSE) protocol (RFC 9052).
+
+ This document, along with RFC 9052, obsoletes RFC 8152.
+
+Status of This Memo
+
+ This document is not an Internet Standards Track specification; it is
+ published for informational purposes.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Not all documents
+ approved by the IESG are candidates for any level of Internet
+ Standard; see Section 2 of RFC 7841.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ https://www.rfc-editor.org/info/rfc9053.
+
+Copyright Notice
+
+ Copyright (c) 2022 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (https://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Revised BSD License text as described in Section 4.e of the
+ Trust Legal Provisions and are provided without warranty as described
+ in the Revised BSD License.
+
+Table of Contents
+
+ 1. Introduction
+ 1.1. Requirements Terminology
+ 1.2. Changes from RFC 8152
+ 1.3. Document Terminology
+ 1.4. CDDL Grammar for CBOR Data Structures
+ 1.5. Examples
+ 2. Signature Algorithms
+ 2.1. ECDSA
+ 2.1.1. Security Considerations for ECDSA
+ 2.2. Edwards-Curve Digital Signature Algorithm (EdDSA)
+ 2.2.1. Security Considerations for EdDSA
+ 3. Message Authentication Code (MAC) Algorithms
+ 3.1. Hash-Based Message Authentication Codes (HMACs)
+ 3.1.1. Security Considerations for HMAC
+ 3.2. AES Message Authentication Code (AES-CBC-MAC)
+ 3.2.1. Security Considerations for AES-CBC-MAC
+ 4. Content Encryption Algorithms
+ 4.1. AES-GCM
+ 4.1.1. Security Considerations for AES-GCM
+ 4.2. AES-CCM
+ 4.2.1. Security Considerations for AES-CCM
+ 4.3. ChaCha20 and Poly1305
+ 4.3.1. Security Considerations for ChaCha20/Poly1305
+ 5. Key Derivation Functions (KDFs)
+ 5.1. HMAC-Based Extract-and-Expand Key Derivation Function
+ (HKDF)
+ 5.2. Context Information Structure
+ 6. Content Key Distribution Methods
+ 6.1. Direct Encryption
+ 6.1.1. Direct Key
+ 6.1.2. Direct Key with KDF
+ 6.2. Key Wrap
+ 6.2.1. AES Key Wrap
+ 6.3. Direct Key Agreement
+ 6.3.1. Direct ECDH
+ 6.4. Key Agreement with Key Wrap
+ 6.4.1. ECDH with Key Wrap
+ 7. Key Object Parameters
+ 7.1. Elliptic Curve Keys
+ 7.1.1. Double Coordinate Curves
+ 7.2. Octet Key Pair
+ 7.3. Symmetric Keys
+ 8. COSE Capabilities
+ 8.1. Assignments for Existing Algorithms
+ 8.2. Assignments for Existing Key Types
+ 8.3. Examples
+ 9. CBOR Encoding Restrictions
+ 10. IANA Considerations
+ 10.1. Changes to the "COSE Key Types" Registry
+ 10.2. Changes to the "COSE Algorithms" Registry
+ 10.3. Changes to the "COSE Key Type Parameters" Registry
+ 10.4. Expert Review Instructions
+ 11. Security Considerations
+ 12. References
+ 12.1. Normative References
+ 12.2. Informative References
+ Acknowledgments
+ Author's Address
+
+1. Introduction
+
+ There has been an increased focus on small, constrained devices that
+ make up the Internet of Things (IoT). One of the standards that has
+ come out of this process is "Concise Binary Object Representation
+ (CBOR)" [STD94]. CBOR extended the data model of JavaScript Object
+ Notation (JSON) [STD90] by allowing for binary data, among other
+ changes. CBOR has been adopted by several of the IETF working groups
+ dealing with the IoT world as their method of encoding data
+ structures. CBOR was designed specifically to be small in terms of
+ both messages transported and implementation size and to have a
+ schema-free decoder. A need exists to provide message security
+ services for IoT, and using CBOR as the message-encoding format makes
+ sense.
+
+ The core COSE specification consists of two documents. [RFC9052]
+ contains the serialization structures and the procedures for using
+ the different cryptographic algorithms. This document provides an
+ initial set of algorithms for use with those structures.
+
+1.1. Requirements Terminology
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
+ capitals, as shown here.
+
+1.2. Changes from RFC 8152
+
+ * Extracted the sections dealing with specific algorithms and placed
+ them into this document. The sections dealing with structure and
+ general processing rules are placed in [RFC9052].
+
+ * Made text clarifications and changes in terminology.
+
+ * Removed all of the details relating to countersignatures and
+ placed them in [COUNTERSIGN].
+
+1.3. Document Terminology
+
+ In this document, we use the following terminology:
+
+ Byte: A synonym for octet.
+
+ Constrained Application Protocol (CoAP): A specialized web transfer
+ protocol for use in constrained systems. It is defined in
+ [RFC7252].
+
+ Authenticated Encryption (AE) algorithms [RFC5116]: Encryption
+ algorithms that provide an authentication check of the contents
+ along with the encryption service. An example of an AE algorithm
+ used in COSE is AES Key Wrap [RFC3394]. These algorithms are used
+ for key encryption, but Authenticated Encryption with Associated
+ Data (AEAD) algorithms would be preferred.
+
+ AEAD algorithms [RFC5116]: Encryption algorithms that provide the
+ same authentication service of the content as AE algorithms do,
+ and also allow associated data that is not part of the encrypted
+ body to be included in the authentication service. An example of
+ an AEAD algorithm used in COSE is AES-GCM [RFC5116]. These
+ algorithms are used for content encryption and can be used for key
+ encryption as well.
+
+ The term "byte string" is used for sequences of bytes, while the term
+ "text string" is used for sequences of characters.
+
+ The tables for algorithms contain the following columns:
+
+ * A name for the algorithm for use in documents.
+
+ * The value used on the wire for the algorithm. One place this is
+ used is the algorithm header parameter of a message.
+
+ * A short description so that the algorithm can be easily identified
+ when scanning the IANA registry.
+
+ Additional columns may be present in a table depending on the
+ algorithms.
+
+1.4. CDDL Grammar for CBOR Data Structures
+
+ When COSE was originally written, the Concise Data Definition
+ Language (CDDL) [RFC8610] had not yet been published in an RFC, so it
+ could not be used as the data description language to normatively
+ describe the CBOR data structures employed by COSE. For that reason,
+ the CBOR data objects defined here are described in prose.
+ Additional (non-normative) descriptions of the COSE data objects are
+ provided in a subset of CDDL, described in [RFC9052].
+
+1.5. Examples
+
+ A GitHub project has been created at [GitHub-Examples] that contains
+ a set of testing examples. Each example is found in a JSON file that
+ contains the inputs used to create the example, some of the
+ intermediate values that can be used for debugging, and the output of
+ the example. The results are encoded using both hexadecimal and CBOR
+ diagnostic notation format.
+
+ Some of the examples are designed to be failure-testing cases; these
+ are clearly marked as such in the JSON file.
+
+2. Signature Algorithms
+
+ Section 8.1 of [RFC9052] contains a generic description of signature
+ algorithms. This document defines signature algorithm identifiers
+ for two signature algorithms.
+
+2.1. ECDSA
+
+ The Elliptic Curve Digital Signature Algorithm (ECDSA) [DSS] defines
+ a signature algorithm using Elliptic Curve Cryptography (ECC).
+ Implementations SHOULD use a deterministic version of ECDSA such as
+ the one defined in [RFC6979]. The use of a deterministic signature
+ algorithm allows systems to avoid relying on random number generators
+ in order to avoid generating the same value of "k" (the per-message
+ random value). Biased generation of the value "k" can be attacked,
+ and collisions of this value lead to leaked keys. It additionally
+ allows performing deterministic tests for the signature algorithm.
+ The use of deterministic ECDSA does not lessen the need to have good
+ random number generation when creating the private key.
+
+ The ECDSA signature algorithm is parameterized with a hash function
+ (h). In the event that the length of the hash function output is
+ greater than the group of the key, the leftmost bytes of the hash
+ output are used.
+
+ The algorithms defined in this document can be found in Table 1.
+
+ +=======+=======+=========+==================+
+ | Name | Value | Hash | Description |
+ +=======+=======+=========+==================+
+ | ES256 | -7 | SHA-256 | ECDSA w/ SHA-256 |
+ +-------+-------+---------+------------------+
+ | ES384 | -35 | SHA-384 | ECDSA w/ SHA-384 |
+ +-------+-------+---------+------------------+
+ | ES512 | -36 | SHA-512 | ECDSA w/ SHA-512 |
+ +-------+-------+---------+------------------+
+
+ Table 1: ECDSA Algorithm Values
+
+ This document defines ECDSA as working only with the curves P-256,
+ P-384, and P-521. This document requires that the curves be encoded
+ using the "EC2" (two coordinate elliptic curve) key type.
+ Implementations need to check that the key type and curve are correct
+ when creating and verifying a signature. Future documents may define
+ it to work with other curves and key types in the future.
+
+ In order to promote interoperability, it is suggested that SHA-256 be
+ used only with curve P-256, SHA-384 be used only with curve P-384,
+ and SHA-512 be used only with curve P-521. This is aligned with the
+ recommendation in Section 4 of [RFC5480].
+
+ The signature algorithm results in a pair of integers (R, S). These
+ integers will be the same length as the length of the key used for
+ the signature process. The signature is encoded by converting the
+ integers into byte strings of the same length as the key size. The
+ length is rounded up to the nearest byte and is left padded with zero
+ bits to get to the correct length. The two integers are then
+ concatenated together to form a byte string that is the resulting
+ signature.
+
+ Using the function defined in [RFC8017], the signature is:
+
+ Signature = I2OSP(R, n) | I2OSP(S, n)
+
+ where n = ceiling(key_length / 8)
+
+ When using a COSE key for this algorithm, the following checks are
+ made:
+
+ * The "kty" field MUST be present, and it MUST be "EC2".
+
+ * If the "alg" field is present, it MUST match the ECDSA signature
+ algorithm being used.
+
+ * If the "key_ops" field is present, it MUST include "sign" when
+ creating an ECDSA signature.
+
+ * If the "key_ops" field is present, it MUST include "verify" when
+ verifying an ECDSA signature.
+
+2.1.1. Security Considerations for ECDSA
+
+ The security strength of the signature is no greater than the minimum
+ of the security strength associated with the bit length of the key
+ and the security strength of the hash function.
+
+ Note: Use of a deterministic signature technique is a good idea even
+ when good random number generation exists. Doing so both reduces the
+ possibility of having the same value of "k" in two signature
+ operations and allows for reproducible signature values, which helps
+ testing. There have been recent attacks involving faulting the
+ device in order to extract the key. This can be addressed by
+ combining both randomness and determinism [CFRG-DET-SIGS].
+
+ There are two substitution attacks that can theoretically be mounted
+ against the ECDSA signature algorithm.
+
+ * Changing the curve used to validate the signature: If one changes
+ the curve used to validate the signature, then potentially one
+ could have two messages with the same signature, each computed
+ under a different curve. The only requirements on the new curve
+ are that its order be the same as the old one and that it be
+ acceptable to the client. An example would be to change from
+ using the curve secp256r1 (aka P-256) to using secp256k1. (Both
+ are 256-bit curves.) We currently do not have any way to deal
+ with this version of the attack except to restrict the overall set
+ of curves that can be used.
+
+ * Changing the hash function used to validate the signature: If one
+ either has two different hash functions of the same length or can
+ truncate a hash function, then one could potentially find
+ collisions between the hash functions rather than within a single
+ hash function. For example, truncating SHA-512 to 256 bits might
+ collide with a SHA-256 bit hash value. As the hash algorithm is
+ part of the signature algorithm identifier, this attack is
+ mitigated by including a signature algorithm identifier in the
+ protected-header bucket.
+
+2.2. Edwards-Curve Digital Signature Algorithm (EdDSA)
+
+ [RFC8032] describes the elliptic curve signature scheme Edwards-curve
+ Digital Signature Algorithm (EdDSA). In that document, the signature
+ algorithm is instantiated using parameters for the edwards25519 and
+ edwards448 curves. The document additionally describes two variants
+ of the EdDSA algorithm: Pure EdDSA, where no hash function is applied
+ to the content before signing, and HashEdDSA, where a hash function
+ is applied to the content before signing and the result of that hash
+ function is signed. For EdDSA, the content to be signed (either the
+ message or the prehash value) is processed twice inside of the
+ signature algorithm. For use with COSE, only the pure EdDSA version
+ is used. This is because it is not expected that extremely large
+ contents are going to be needed and, based on the arrangement of the
+ message structure, the entire message is going to need to be held in
+ memory in order to create or verify a signature. Therefore, there
+ does not appear to be a need to be able to do block updates of the
+ hash, followed by eliminating the message from memory. Applications
+ can provide the same features by defining the content of the message
+ as a hash value and transporting the COSE object (with the hash
+ value) and the content as separate items.
+
+ The algorithm defined in this document can be found in Table 2. A
+ single signature algorithm is defined, which can be used for multiple
+ curves.
+
+ +=======+=======+=============+
+ | Name | Value | Description |
+ +=======+=======+=============+
+ | EdDSA | -8 | EdDSA |
+ +-------+-------+-------------+
+
+ Table 2: EdDSA Algorithm Value
+
+ [RFC8032] describes the method of encoding the signature value.
+
+ When using a COSE key for this algorithm, the following checks are
+ made:
+
+ * The "kty" field MUST be present, and it MUST be "OKP" (Octet Key
+ Pair).
+
+ * The "crv" field MUST be present, and it MUST be a curve defined
+ for this signature algorithm.
+
+ * If the "alg" field is present, it MUST match "EdDSA".
+
+ * If the "key_ops" field is present, it MUST include "sign" when
+ creating an EdDSA signature.
+
+ * If the "key_ops" field is present, it MUST include "verify" when
+ verifying an EdDSA signature.
+
+2.2.1. Security Considerations for EdDSA
+
+ Public values are computed differently in EdDSA and Elliptic Curve
+ Diffie-Hellman (ECDH); for this reason, the public key from one
+ should not be used with the other algorithm.
+
+ If batch signature verification is performed, a well-seeded
+ cryptographic random number generator is REQUIRED (Section 8.2 of
+ [RFC8032]). Signing and nonbatch signature verification are
+ deterministic operations and do not need random numbers of any kind.
+
+3. Message Authentication Code (MAC) Algorithms
+
+ Section 8.2 of [RFC9052] contains a generic description of MAC
+ algorithms. This section defines the conventions for two MAC
+ algorithms.
+
+3.1. Hash-Based Message Authentication Codes (HMACs)
+
+ HMAC [RFC2104] [RFC4231] was designed to deal with length extension
+ attacks. The HMAC algorithm was also designed to allow new hash
+ functions to be directly plugged in without changes to the hash
+ function. The HMAC design process has been shown to be solid;
+ although the security of hash functions such as MD5 has decreased
+ over time, the security of HMAC combined with MD5 has not yet been
+ shown to be compromised [RFC6151].
+
+ The HMAC algorithm is parameterized by an inner and outer padding, a
+ hash function (h), and an authentication tag value length. For this
+ specification, the inner and outer padding are fixed to the values
+ set in [RFC2104]. The length of the authentication tag corresponds
+ to the difficulty of producing a forgery. For use in constrained
+ environments, we define one HMAC algorithm that is truncated. There
+ are currently no known issues with truncation; however, the security
+ strength of the message tag is correspondingly reduced in strength.
+ When truncating, the leftmost tag-length bits are kept and
+ transmitted.
+
+ The algorithms defined in this document can be found in Table 3.
+
+ +=============+=======+=========+============+======================+
+ | Name | Value | Hash | Tag Length | Description |
+ +=============+=======+=========+============+======================+
+ | HMAC | 4 | SHA-256 | 64 | HMAC w/ SHA-256 |
+ | 256/64 | | | | truncated to 64 bits |
+ +-------------+-------+---------+------------+----------------------+
+ | HMAC | 5 | SHA-256 | 256 | HMAC w/ SHA-256 |
+ | 256/256 | | | | |
+ +-------------+-------+---------+------------+----------------------+
+ | HMAC | 6 | SHA-384 | 384 | HMAC w/ SHA-384 |
+ | 384/384 | | | | |
+ +-------------+-------+---------+------------+----------------------+
+ | HMAC | 7 | SHA-512 | 512 | HMAC w/ SHA-512 |
+ | 512/512 | | | | |
+ +-------------+-------+---------+------------+----------------------+
+
+ Table 3: HMAC Algorithm Values
+
+ Some recipient algorithms transport the key, while others derive a
+ key from secret data. For those algorithms that transport the key
+ (such as AES Key Wrap), the size of the HMAC key SHOULD be the same
+ size as the output of the underlying hash function. For those
+ algorithms that derive the key (such as ECDH), the derived key MUST
+ be the same size as the output of the underlying hash function.
+
+ When using a COSE key for this algorithm, the following checks are
+ made:
+
+ * The "kty" field MUST be present, and it MUST be "Symmetric".
+
+ * If the "alg" field is present, it MUST match the HMAC algorithm
+ being used.
+
+ * If the "key_ops" field is present, it MUST include "MAC create"
+ when creating an HMAC authentication tag.
+
+ * If the "key_ops" field is present, it MUST include "MAC verify"
+ when verifying an HMAC authentication tag.
+
+ Implementations creating and validating MAC values MUST validate that
+ the key type, key length, and algorithm are correct and appropriate
+ for the entities involved.
+
+3.1.1. Security Considerations for HMAC
+
+ HMAC has proved to be resistant to attack even when used with
+ weakened hash algorithms. The current best known attack is to brute
+ force the key. This means that key size is going to be directly
+ related to the security of an HMAC operation.
+
+3.2. AES Message Authentication Code (AES-CBC-MAC)
+
+ AES-CBC-MAC is the instantiation of the CBC-MAC construction (defined
+ in [MAC]) using AES as the block cipher. For brevity, we also use
+ "AES-MAC" to refer to AES-CBC-MAC. (Note that this is not the same
+ algorithm as AES Cipher-Based Message Authentication Code (AES-CMAC)
+ [RFC4493].)
+
+ AES-CBC-MAC is parameterized by the key length, the authentication
+ tag length, and the Initialization Vector (IV) used. For all of
+ these algorithms, the IV is fixed to all zeros. We provide an array
+ of algorithms for various key and tag lengths. The algorithms
+ defined in this document are found in Table 4.
+
+ +=========+=======+============+============+==================+
+ | Name | Value | Key Length | Tag Length | Description |
+ +=========+=======+============+============+==================+
+ | AES-MAC | 14 | 128 | 64 | AES-MAC 128-bit |
+ | 128/64 | | | | key, 64-bit tag |
+ +---------+-------+------------+------------+------------------+
+ | AES-MAC | 15 | 256 | 64 | AES-MAC 256-bit |
+ | 256/64 | | | | key, 64-bit tag |
+ +---------+-------+------------+------------+------------------+
+ | AES-MAC | 25 | 128 | 128 | AES-MAC 128-bit |
+ | 128/128 | | | | key, 128-bit tag |
+ +---------+-------+------------+------------+------------------+
+ | AES-MAC | 26 | 256 | 128 | AES-MAC 256-bit |
+ | 256/128 | | | | key, 128-bit tag |
+ +---------+-------+------------+------------+------------------+
+
+ Table 4: AES-MAC Algorithm Values
+
+ Keys may be obtained from either a key structure or a recipient
+ structure. Implementations creating and validating MAC values MUST
+ validate that the key type, key length, and algorithm are correct and
+ appropriate for the entities involved.
+
+ When using a COSE key for this algorithm, the following checks are
+ made:
+
+ * The "kty" field MUST be present, and it MUST be "Symmetric".
+
+ * If the "alg" field is present, it MUST match the AES-MAC algorithm
+ being used.
+
+ * If the "key_ops" field is present, it MUST include "MAC create"
+ when creating an AES-MAC authentication tag.
+
+ * If the "key_ops" field is present, it MUST include "MAC verify"
+ when verifying an AES-MAC authentication tag.
+
+3.2.1. Security Considerations for AES-CBC-MAC
+
+ A number of attacks exist against Cipher Block Chaining Message
+ Authentication Code (CBC-MAC) that need to be considered.
+
+ * A single key must only be used for messages of a fixed or known
+ length. If this is not the case, an attacker will be able to
+ generate a message with a valid tag given two message and tag
+ pairs. This can be addressed by using different keys for messages
+ of different lengths. The current structure mitigates this
+ problem, as a specific encoding structure that includes lengths is
+ built and signed. (CMAC also addresses this issue.)
+
+ * In Cipher Block Chaining (CBC) mode, if the same key is used for
+ both encryption and authentication operations, an attacker can
+ produce messages with a valid authentication code.
+
+ * If the IV can be modified, then messages can be forged. This is
+ addressed by fixing the IV to all zeros.
+
+4. Content Encryption Algorithms
+
+ Section 8.3 of [RFC9052] contains a generic description of content
+ encryption algorithms. This document defines the identifier and
+ usages for three content encryption algorithms.
+
+4.1. AES-GCM
+
+ The Galois/Counter Mode (GCM) mode is a generic AEAD block cipher
+ mode defined in [AES-GCM]. The GCM mode is combined with the AES
+ block encryption algorithm to define an AEAD cipher.
+
+ The GCM mode is parameterized by the size of the authentication tag
+ and the size of the nonce. This document fixes the size of the nonce
+ at 96 bits. The size of the authentication tag is limited to a small
+ set of values. For this document, however, the size of the
+ authentication tag is fixed at 128 bits.
+
+ The set of algorithms defined in this document is in Table 5.
+
+ +=========+=======+==========================================+
+ | Name | Value | Description |
+ +=========+=======+==========================================+
+ | A128GCM | 1 | AES-GCM mode w/ 128-bit key, 128-bit tag |
+ +---------+-------+------------------------------------------+
+ | A192GCM | 2 | AES-GCM mode w/ 192-bit key, 128-bit tag |
+ +---------+-------+------------------------------------------+
+ | A256GCM | 3 | AES-GCM mode w/ 256-bit key, 128-bit tag |
+ +---------+-------+------------------------------------------+
+
+ Table 5: Algorithm Values for AES-GCM
+
+ Keys may be obtained from either a key structure or a recipient
+ structure. Implementations that are encrypting or decrypting MUST
+ validate that the key type, key length, and algorithm are correct and
+ appropriate for the entities involved.
+
+ When using a COSE key for this algorithm, the following checks are
+ made:
+
+ * The "kty" field MUST be present, and it MUST be "Symmetric".
+
+ * If the "alg" field is present, it MUST match the AES-GCM algorithm
+ being used.
+
+ * If the "key_ops" field is present, it MUST include "encrypt" or
+ "wrap key" when encrypting.
+
+ * If the "key_ops" field is present, it MUST include "decrypt" or
+ "unwrap key" when decrypting.
+
+4.1.1. Security Considerations for AES-GCM
+
+ When using AES-GCM, the following restrictions MUST be enforced:
+
+ * The key and nonce pair MUST be unique for every message encrypted.
+
+ * The total number of messages encrypted for a single key MUST NOT
+ exceed 2^32 [SP800-38D]. An explicit check is required only in
+ environments where it is expected that this limit might be
+ exceeded.
+
+ * [RFC8446] contains an analysis on the use of AES-CGM for its
+ environment. Based on that recommendation, one should restrict
+ the number of messages encrypted to 2^24.5.
+
+ * A more recent analysis in [ROBUST] indicates that the number of
+ failed decryptions needs to be taken into account as part of
+ determining when a key rollover is to be done. Following the
+ recommendation in DTLS (Section 4.5.3 of [RFC9147]), the number of
+ failed message decryptions should be limited to 2^36.
+
+ Consideration was given to supporting smaller tag values; the
+ constrained community would desire tag sizes in the 64-bit range.
+ Such use drastically changes both the maximum message size (generally
+ not an issue) and the number of times that a key can be used. Given
+ that Counter with CBC-MAC (CCM) is the usual mode for constrained
+ environments, restricted modes are not supported.
+
+4.2. AES-CCM
+
+ CCM is a generic authentication encryption block cipher mode defined
+ in [RFC3610]. The CCM mode is combined with the AES block encryption
+ algorithm to define an AEAD cipher that is commonly used in
+ constrained devices.
+
+ The CCM mode has two parameter choices. The first choice is M, the
+ size of the authentication field. The choice of the value for M
+ involves a trade-off between message growth (from the tag) and the
+ probability that an attacker can undetectably modify a message. The
+ second choice is L, the size of the length field. This value
+ requires a trade-off between the maximum message size and the size of
+ the nonce.
+
+ It is unfortunate that the specification for CCM specified L and M as
+ a count of bytes rather than a count of bits. This leads to possible
+ misunderstandings where AES-CCM-8 is frequently used to refer to a
+ version of CCM mode where the size of the authentication is 64 bits
+ and not 8 bits. In most cryptographic algorithm specifications,
+ these values have traditionally been specified as bit counts rather
+ than byte counts. This document will follow the convention of using
+ bit counts so that it is easier to compare the different algorithms
+ presented in this document.
+
+ We define a matrix of algorithms in this document over the values of
+ L and M. Constrained devices are usually operating in situations
+ where they use short messages and want to avoid doing recipient-
+ specific cryptographic operations. This favors smaller values of
+ both L and M. Less-constrained devices will want to be able to use
+ larger messages and are more willing to generate new keys for every
+ operation. This favors larger values of L and M.
+
+ The following values are used for L:
+
+ 16 bits (2): This limits messages to 2^16 bytes (64 KiB) in length.
+ This is sufficiently long for messages in the constrained world.
+ The nonce length is 13 bytes allowing for 2^104 possible values of
+ the nonce without repeating.
+
+ 64 bits (8): This limits messages to 2^64 bytes in length. The
+ nonce length is 7 bytes, allowing for 2^56 possible values of the
+ nonce without repeating.
+
+ The following values are used for M:
+
+ 64 bits (8): This produces a 64-bit authentication tag. This
+ implies that there is a 1 in 2^64 chance that a modified message
+ will authenticate.
+
+ 128 bits (16): This produces a 128-bit authentication tag. This
+ implies that there is a 1 in 2^128 chance that a modified message
+ will authenticate.
+
+ +====================+=======+====+=====+========+===============+
+ | Name | Value | L | M | Key | Description |
+ | | | | | Length | |
+ +====================+=======+====+=====+========+===============+
+ | AES-CCM-16-64-128 | 10 | 16 | 64 | 128 | AES-CCM mode |
+ | | | | | | 128-bit key, |
+ | | | | | | 64-bit tag, |
+ | | | | | | 13-byte nonce |
+ +--------------------+-------+----+-----+--------+---------------+
+ | AES-CCM-16-64-256 | 11 | 16 | 64 | 256 | AES-CCM mode |
+ | | | | | | 256-bit key, |
+ | | | | | | 64-bit tag, |
+ | | | | | | 13-byte nonce |
+ +--------------------+-------+----+-----+--------+---------------+
+ | AES-CCM-64-64-128 | 12 | 64 | 64 | 128 | AES-CCM mode |
+ | | | | | | 128-bit key, |
+ | | | | | | 64-bit tag, |
+ | | | | | | 7-byte nonce |
+ +--------------------+-------+----+-----+--------+---------------+
+ | AES-CCM-64-64-256 | 13 | 64 | 64 | 256 | AES-CCM mode |
+ | | | | | | 256-bit key, |
+ | | | | | | 64-bit tag, |
+ | | | | | | 7-byte nonce |
+ +--------------------+-------+----+-----+--------+---------------+
+ | AES-CCM-16-128-128 | 30 | 16 | 128 | 128 | AES-CCM mode |
+ | | | | | | 128-bit key, |
+ | | | | | | 128-bit tag, |
+ | | | | | | 13-byte nonce |
+ +--------------------+-------+----+-----+--------+---------------+
+ | AES-CCM-16-128-256 | 31 | 16 | 128 | 256 | AES-CCM mode |
+ | | | | | | 256-bit key, |
+ | | | | | | 128-bit tag, |
+ | | | | | | 13-byte nonce |
+ +--------------------+-------+----+-----+--------+---------------+
+ | AES-CCM-64-128-128 | 32 | 64 | 128 | 128 | AES-CCM mode |
+ | | | | | | 128-bit key, |
+ | | | | | | 128-bit tag, |
+ | | | | | | 7-byte nonce |
+ +--------------------+-------+----+-----+--------+---------------+
+ | AES-CCM-64-128-256 | 33 | 64 | 128 | 256 | AES-CCM mode |
+ | | | | | | 256-bit key, |
+ | | | | | | 128-bit tag, |
+ | | | | | | 7-byte nonce |
+ +--------------------+-------+----+-----+--------+---------------+
+
+ Table 6: Algorithm Values for AES-CCM
+
+ Keys may be obtained from either a key structure or a recipient
+ structure. Implementations that are encrypting or decrypting MUST
+ validate that the key type, key length, and algorithm are correct and
+ appropriate for the entities involved.
+
+ When using a COSE key for this algorithm, the following checks are
+ made:
+
+ * The "kty" field MUST be present, and it MUST be "Symmetric".
+
+ * If the "alg" field is present, it MUST match the AES-CCM algorithm
+ being used.
+
+ * If the "key_ops" field is present, it MUST include "encrypt" or
+ "wrap key" when encrypting.
+
+ * If the "key_ops" field is present, it MUST include "decrypt" or
+ "unwrap key" when decrypting.
+
+4.2.1. Security Considerations for AES-CCM
+
+ When using AES-CCM, the following restrictions MUST be enforced:
+
+ * The key and nonce pair MUST be unique for every message encrypted.
+ Note that the value of L influences the number of unique nonces.
+
+ * The total number of times the AES block cipher is used MUST NOT
+ exceed 2^61 operations. This limit is the sum of times the block
+ cipher is used in computing the MAC value and performing stream
+ encryption operations. An explicit check is required only in
+ environments where it is expected that this limit might be
+ exceeded.
+
+ * [RFC9147] contains an analysis on the use of AES-CCM for its
+ environment. Based on that recommendation, one should restrict
+ the number of messages encrypted to 2^23.
+
+ * In addition to the number of messages successfully decrypted, the
+ number of failed decryptions needs to be tracked as well.
+ Following the recommendation in DTLS (Section 4.5.3 of [RFC9147]),
+ the number of failed message decryptions should be limited to
+ 2^23.5. If one is using the 64-bit tag, then the limits are
+ significantly smaller if one wants to keep the same integrity
+ limits. A protocol recommending this needs to analyze what level
+ of integrity is acceptable for the smaller tag size. It may be
+ that, to keep the desired level of integrity, one needs to rekey
+ as often as every 2^7 messages.
+
+ [RFC3610] additionally calls out one other consideration of note. It
+ is possible to do a precomputation attack against the algorithm in
+ cases where portions of the plaintext are highly predictable. This
+ reduces the security of the key size by half. Ways to deal with this
+ attack include adding a random portion to the nonce value and/or
+ increasing the key size used. Using a portion of the nonce for a
+ random value will decrease the number of messages that a single key
+ can be used for. Increasing the key size may require more resources
+ in the constrained device. See Sections 5 and 10 of [RFC3610] for
+ more information.
+
+4.3. ChaCha20 and Poly1305
+
+ ChaCha20 and Poly1305 combined together is an AEAD mode that is
+ defined in [RFC8439]. This is an algorithm defined using a cipher
+ that is not AES and thus would not suffer from any future weaknesses
+ found in AES. These cryptographic functions are designed to be fast
+ in software-only implementations.
+
+ The ChaCha20/Poly1305 AEAD construction defined in [RFC8439] has no
+ parameterization. It takes as inputs a 256-bit key and a 96-bit
+ nonce, as well as the plaintext and additional data, and produces the
+ ciphertext as an output. We define one algorithm identifier for this
+ algorithm in Table 7.
+
+ +===================+=======+==========================+
+ | Name | Value | Description |
+ +===================+=======+==========================+
+ | ChaCha20/Poly1305 | 24 | ChaCha20/Poly1305 w/ |
+ | | | 256-bit key, 128-bit tag |
+ +-------------------+-------+--------------------------+
+
+ Table 7: Algorithm Value for ChaCha20/Poly1305
+
+ Keys may be obtained from either a key structure or a recipient
+ structure. Implementations that are encrypting or decrypting MUST
+ validate that the key type, key length, and algorithm are correct and
+ appropriate for the entities involved.
+
+ When using a COSE key for this algorithm, the following checks are
+ made:
+
+ * The "kty" field MUST be present, and it MUST be "Symmetric".
+
+ * If the "alg" field is present, it MUST match the ChaCha20/Poly1305
+ algorithm being used.
+
+ * If the "key_ops" field is present, it MUST include "encrypt" or
+ "wrap key" when encrypting.
+
+ * If the "key_ops" field is present, it MUST include "decrypt" or
+ "unwrap key" when decrypting.
+
+4.3.1. Security Considerations for ChaCha20/Poly1305
+
+ The key and nonce values MUST be a unique pair for every invocation
+ of the algorithm. Nonce counters are considered to be an acceptable
+ way of ensuring that they are unique.
+
+ A more recent analysis in [ROBUST] indicates that the number of
+ failed decryptions needs to be taken into account as part of
+ determining when a key rollover is to be done. Following the
+ recommendation in DTLS (Section 4.5.3 of [RFC9147]), the number of
+ failed message decryptions should be limited to 2^36.
+
+ [RFC8446] notes that the (64-bit) record sequence number would wrap
+ before the safety limit is reached for ChaCha20/Poly1305. COSE
+ implementations should not send more than 2^64 messages encrypted
+ using a single ChaCha20/Poly1305 key.
+
+5. Key Derivation Functions (KDFs)
+
+ Section 8.4 of [RFC9052] contains a generic description of key
+ derivation functions. This document defines a single context
+ structure and a single KDF. These elements are used for all of the
+ recipient algorithms defined in this document that require a KDF
+ process. These algorithms are defined in Sections 6.1.2, 6.3.1, and
+ 6.4.1.
+
+5.1. HMAC-Based Extract-and-Expand Key Derivation Function (HKDF)
+
+ The HKDF key derivation algorithm is defined in [RFC5869] and [HKDF].
+
+ The HKDF algorithm takes these inputs:
+
+ secret: A shared value that is secret. Secrets may be either
+ previously shared or derived from operations like a Diffie-Hellman
+ (DH) key agreement.
+
+ salt: An optional value that is used to change the generation
+ process. The salt value can be either public or private. If the
+ salt is public and carried in the message, then the "salt"
+ algorithm header parameter defined in Table 9 is used. While
+ [RFC5869] suggests that the length of the salt be the same as the
+ length of the underlying hash value, any positive salt length will
+ improve the security, as different key values will be generated.
+ This parameter is protected by being included in the key
+ computation and does not need to be separately authenticated. The
+ salt value does not need to be unique for every message sent.
+
+ length: The number of bytes of output that need to be generated.
+
+ context information: Information that describes the context in which
+ the resulting value will be used. Making this information
+ specific to the context in which the material is going to be used
+ ensures that the resulting material will always be tied to that
+ usage. The context structure defined in Section 5.2 is used by
+ the KDFs in this document.
+
+ PRF: The underlying pseudorandom function to be used in the HKDF
+ algorithm. The PRF is encoded into the HKDF algorithm selection.
+
+ HKDF is defined to use HMAC as the underlying PRF. However, it is
+ possible to use other functions in the same construct to provide a
+ different KDF that is more appropriate in the constrained world.
+ Specifically, one can use AES-CBC-MAC as the PRF for the expand step,
+ but not for the extract step. When using a good random shared secret
+ of the correct length, the extract step can be skipped. For the AES
+ algorithm versions, the extract step is always skipped.
+
+ The extract step cannot be skipped if the secret is not uniformly
+ random -- for example, if it is the result of an ECDH key agreement
+ step. This implies that the AES HKDF version cannot be used with
+ ECDH. If the extract step is skipped, the "salt" value is not used
+ as part of the HKDF functionality.
+
+ The algorithms defined in this document are found in Table 8.
+
+ +==============+===================+========================+
+ | Name | PRF | Description |
+ +==============+===================+========================+
+ | HKDF SHA-256 | HMAC with SHA-256 | HKDF using HMAC |
+ | | | SHA-256 as the PRF |
+ +--------------+-------------------+------------------------+
+ | HKDF SHA-512 | HMAC with SHA-512 | HKDF using HMAC |
+ | | | SHA-512 as the PRF |
+ +--------------+-------------------+------------------------+
+ | HKDF AES- | AES-CBC-MAC-128 | HKDF using AES-MAC as |
+ | MAC-128 | | the PRF w/ 128-bit key |
+ +--------------+-------------------+------------------------+
+ | HKDF AES- | AES-CBC-MAC-256 | HKDF using AES-MAC as |
+ | MAC-256 | | the PRF w/ 256-bit key |
+ +--------------+-------------------+------------------------+
+
+ Table 8: HKDF Algorithms
+
+ +======+=======+======+============================+=============+
+ | Name | Label | Type | Algorithm | Description |
+ +======+=======+======+============================+=============+
+ | salt | -20 | bstr | direct+HKDF-SHA-256, | Random salt |
+ | | | | direct+HKDF-SHA-512, | |
+ | | | | direct+HKDF-AES-128, | |
+ | | | | direct+HKDF-AES-256, ECDH- | |
+ | | | | ES+HKDF-256, ECDH-ES+HKDF- | |
+ | | | | 512, ECDH-SS+HKDF-256, | |
+ | | | | ECDH-SS+HKDF-512, ECDH- | |
+ | | | | ES+A128KW, ECDH-ES+A192KW, | |
+ | | | | ECDH-ES+A256KW, ECDH- | |
+ | | | | SS+A128KW, ECDH-SS+A192KW, | |
+ | | | | ECDH-SS+A256KW | |
+ +------+-------+------+----------------------------+-------------+
+
+ Table 9: HKDF Algorithm Parameters
+
+5.2. Context Information Structure
+
+ The context information structure is used to ensure that the derived
+ keying material is "bound" to the context of the transaction. The
+ context information structure used here is based on that defined in
+ [SP800-56A]. By using CBOR for the encoding of the context
+ information structure, we automatically get the same type and length
+ separation of fields that is obtained by the use of ASN.1. This
+ means that there is no need to encode the lengths for the base
+ elements, as it is done by the encoding used in JSON Object Signing
+ and Encryption (JOSE) (Section 4.6.2 of [RFC7518]).
+
+ The context information structure refers to PartyU and PartyV as the
+ two parties that are doing the key derivation. Unless the
+ application protocol defines differently, we assign PartyU to the
+ entity that is creating the message and PartyV to the entity that is
+ receiving the message. By defining this association, different keys
+ will be derived for each direction, as the context information is
+ different in each direction.
+
+ The context structure is built from information that is known to both
+ entities. This information can be obtained from a variety of
+ sources:
+
+ * Fields can be defined by the application. This is commonly used
+ to assign fixed names to parties, but it can be used for other
+ items such as nonces.
+
+ * Fields can be defined by usage of the output. Examples of this
+ are the algorithm and key size that are being generated.
+
+ * Fields can be defined by parameters from the message. We define a
+ set of header parameters in Table 10 that can be used to carry the
+ values associated with the context structure. Examples of this
+ are identities and nonce values. These header parameters are
+ designed to be placed in the unprotected bucket of the recipient
+ structure; they do not need to be in the protected bucket, since
+ they are already included in the cryptographic computation by
+ virtue of being included in the context structure.
+
+ +==========+=======+======+===========================+=============+
+ | Name | Label | Type | Algorithm | Description |
+ +==========+=======+======+===========================+=============+
+ | PartyU | -21 | bstr | direct+HKDF-SHA-256, | PartyU |
+ | identity | | | direct+HKDF-SHA-512, | identity |
+ | | | | direct+HKDF-AES-128, | information |
+ | | | | direct+HKDF-AES-256, | |
+ | | | | ECDH-ES+HKDF-256, | |
+ | | | | ECDH-ES+HKDF-512, | |
+ | | | | ECDH-SS+HKDF-256, | |
+ | | | | ECDH-SS+HKDF-512, | |
+ | | | | ECDH-ES+A128KW, | |
+ | | | | ECDH-ES+A192KW, | |
+ | | | | ECDH-ES+A256KW, | |
+ | | | | ECDH-SS+A128KW, | |
+ | | | | ECDH-SS+A192KW, | |
+ | | | | ECDH-SS+A256KW | |
+ +----------+-------+------+---------------------------+-------------+
+ | PartyU | -22 | bstr | direct+HKDF-SHA-256, | PartyU |
+ | nonce | | / | direct+HKDF-SHA-512, | provided |
+ | | | int | direct+HKDF-AES-128, | nonce |
+ | | | | direct+HKDF-AES-256, | |
+ | | | | ECDH-ES+HKDF-256, | |
+ | | | | ECDH-ES+HKDF-512, | |
+ | | | | ECDH-SS+HKDF-256, | |
+ | | | | ECDH-SS+HKDF-512, | |
+ | | | | ECDH-ES+A128KW, | |
+ | | | | ECDH-ES+A192KW, | |
+ | | | | ECDH-ES+A256KW, | |
+ | | | | ECDH-SS+A128KW, | |
+ | | | | ECDH-SS+A192KW, | |
+ | | | | ECDH-SS+A256KW | |
+ +----------+-------+------+---------------------------+-------------+
+ | PartyU | -23 | bstr | direct+HKDF-SHA-256, | PartyU |
+ | other | | | direct+HKDF-SHA-512, | other |
+ | | | | direct+HKDF-AES-128, | provided |
+ | | | | direct+HKDF-AES-256, | information |
+ | | | | ECDH-ES+HKDF-256, | |
+ | | | | ECDH-ES+HKDF-512, | |
+ | | | | ECDH-SS+HKDF-256, | |
+ | | | | ECDH-SS+HKDF-512, | |
+ | | | | ECDH-ES+A128KW, | |
+ | | | | ECDH-ES+A192KW, | |
+ | | | | ECDH-ES+A256KW, | |
+ | | | | ECDH-SS+A128KW, | |
+ | | | | ECDH-SS+A192KW, | |
+ | | | | ECDH-SS+A256KW | |
+ +----------+-------+------+---------------------------+-------------+
+ | PartyV | -24 | bstr | direct+HKDF-SHA-256, | PartyV |
+ | identity | | | direct+HKDF-SHA-512, | identity |
+ | | | | direct+HKDF-AES-128, | information |
+ | | | | direct+HKDF-AES-256, | |
+ | | | | ECDH-ES+HKDF-256, | |
+ | | | | ECDH-ES+HKDF-512, | |
+ | | | | ECDH-SS+HKDF-256, | |
+ | | | | ECDH-SS+HKDF-512, | |
+ | | | | ECDH-ES+A128KW, | |
+ | | | | ECDH-ES+A192KW, | |
+ | | | | ECDH-ES+A256KW, | |
+ | | | | ECDH-SS+A128KW, | |
+ | | | | ECDH-SS+A192KW, | |
+ | | | | ECDH-SS+A256KW | |
+ +----------+-------+------+---------------------------+-------------+
+ | PartyV | -25 | bstr | direct+HKDF-SHA-256, | PartyV |
+ | nonce | | / | direct+HKDF-SHA-512, | provided |
+ | | | int | direct+HKDF-AES-128, | nonce |
+ | | | | direct+HKDF-AES-256, | |
+ | | | | ECDH-ES+HKDF-256, | |
+ | | | | ECDH-ES+HKDF-512, | |
+ | | | | ECDH-SS+HKDF-256, | |
+ | | | | ECDH-SS+HKDF-512, | |
+ | | | | ECDH-ES+A128KW, | |
+ | | | | ECDH-ES+A192KW, | |
+ | | | | ECDH-ES+A256KW, | |
+ | | | | ECDH-SS+A128KW, | |
+ | | | | ECDH-SS+A192KW, | |
+ | | | | ECDH-SS+A256KW | |
+ +----------+-------+------+---------------------------+-------------+
+ | PartyV | -26 | bstr | direct+HKDF-SHA-256, | PartyV |
+ | other | | | direct+HKDF-SHA-512, | other |
+ | | | | direct+HKDF-AES-128, | provided |
+ | | | | direct+HKDF-AES-256, | information |
+ | | | | ECDH-ES+HKDF-256, | |
+ | | | | ECDH-ES+HKDF-512, | |
+ | | | | ECDH-SS+HKDF-256, | |
+ | | | | ECDH-SS+HKDF-512, | |
+ | | | | ECDH-ES+A128KW, | |
+ | | | | ECDH-ES+A192KW, | |
+ | | | | ECDH-ES+A256KW, | |
+ | | | | ECDH-SS+A128KW, | |
+ | | | | ECDH-SS+A192KW, | |
+ | | | | ECDH-SS+A256KW | |
+ +----------+-------+------+---------------------------+-------------+
+
+ Table 10: Context Algorithm Parameters
+
+ We define a CBOR object to hold the context information. This object
+ is referred to as COSE_KDF_Context. The object is based on a CBOR
+ array type. The fields in the array are:
+
+ AlgorithmID: This field indicates the algorithm for which the key
+ material will be used. This normally is either a key wrap
+ algorithm identifier or a content encryption algorithm identifier.
+ The values are from the "COSE Algorithms" registry. This field is
+ required to be present. The field exists in the context
+ information so that a different key is generated for each
+ algorithm even if all of the other context information is the
+ same. In practice, this means if algorithm A is broken and thus
+ finding the key is relatively easy, the key derived for algorithm
+ B will not be the same as the key derived for algorithm A.
+
+ PartyUInfo: This field holds information about PartyU. The
+ PartyUInfo is encoded as a CBOR array. The elements of PartyUInfo
+ are encoded in the order presented below. The elements of the
+ PartyUInfo array are:
+
+ identity: This contains the identity information for PartyU. The
+ identities can be assigned in one of two manners. First, a
+ protocol can assign identities based on roles. For example,
+ the roles of "client" and "server" may be assigned to different
+ entities in the protocol. Each entity would then use the
+ correct label for the data it sends or receives. The second
+ way for a protocol to assign identities is to use a name based
+ on a naming system (i.e., DNS or X.509 names).
+
+ We define an algorithm parameter, "PartyU identity", that can
+ be used to carry identity information in the message. However,
+ identity information is often known as part of the protocol and
+ can thus be inferred rather than made explicit. If identity
+ information is carried in the message, applications SHOULD have
+ a way of validating the supplied identity information. The
+ identity information does not need to be specified and is set
+ to nil in that case.
+
+ nonce: This contains a nonce value. The nonce can be either
+ implicit from the protocol or carried as a value in the
+ unprotected header bucket.
+
+ We define an algorithm parameter, "PartyU nonce", that can be
+ used to carry this value in the message; however, the nonce
+ value could be determined by the application and its value
+ obtained in a different manner.
+
+ This option does not need to be specified; if not needed, it is
+ set to nil.
+
+ other: This contains other information that is defined by the
+ protocol. This option does not need to be specified; if not
+ needed, it is set to nil.
+
+ PartyVInfo: This field holds information about PartyV. The content
+ of the structure is the same as for the PartyUInfo but for PartyV.
+
+ SuppPubInfo: This field contains public information that is mutually
+ known to both parties, and is encoded as a CBOR array.
+
+ keyDataLength: This is set to the number of bits of the desired
+ output value. This practice means if algorithm A can use two
+ different key lengths, the key derived for the longer key size
+ will not contain the key for the shorter key size as a prefix.
+
+ protected: This field contains the protected parameter field. If
+ there are no elements in the "protected" field, then use a
+ zero-length bstr.
+
+ other: This field is for free-form data defined by the
+ application. For example, an application could define two
+ different byte strings to be placed here to generate different
+ keys for a data stream versus a control stream. This field is
+ optional and will only be present if the application defines a
+ structure for this information. Applications that define this
+ SHOULD use CBOR to encode the data so that types and lengths
+ are correctly included.
+
+ SuppPrivInfo: This field contains private information that is
+ mutually known private information. An example of this
+ information would be a pre-existing shared secret. (This could,
+ for example, be used in combination with an ECDH key agreement to
+ provide a secondary proof of identity.) The field is optional and
+ will only be present if the application defines a structure for
+ this information. Applications that define this SHOULD use CBOR
+ to encode the data so that types and lengths are correctly
+ included.
+
+ The following CDDL fragment corresponds to the text above.
+
+ PartyInfo = (
+ identity : bstr / nil,
+ nonce : bstr / int / nil,
+ other : bstr / nil
+ )
+
+ COSE_KDF_Context = [
+ AlgorithmID : int / tstr,
+ PartyUInfo : [ PartyInfo ],
+ PartyVInfo : [ PartyInfo ],
+ SuppPubInfo : [
+ keyDataLength : uint,
+ protected : empty_or_serialized_map,
+ ? other : bstr
+ ],
+ ? SuppPrivInfo : bstr
+ ]
+
+6. Content Key Distribution Methods
+
+ Section 8.5 of [RFC9052] contains a generic description of content
+ key distribution methods. This document defines the identifiers and
+ usage for a number of content key distribution methods.
+
+6.1. Direct Encryption
+
+ A direct encryption algorithm is defined in Section 8.5.1 of
+ [RFC9052]. Information about how to fill in the COSE_Recipient
+ structure is detailed there.
+
+6.1.1. Direct Key
+
+ This recipient algorithm is the simplest; the identified key is
+ directly used as the key for the next layer down in the message.
+ There are no algorithm parameters defined for this algorithm. The
+ algorithm identifier value is assigned in Table 11.
+
+ When this algorithm is used, the "protected" field MUST be zero
+ length. The key type MUST be "Symmetric".
+
+ +========+=======+============================================+
+ | Name | Value | Description |
+ +========+=======+============================================+
+ | direct | -6 | Direct use of content encryption key (CEK) |
+ +--------+-------+--------------------------------------------+
+
+ Table 11: Direct Key
+
+6.1.1.1. Security Considerations for Direct Key
+
+ This recipient algorithm has several potential problems that need to
+ be considered:
+
+ * These keys need to have some method of being regularly updated
+ over time. All of the content encryption algorithms specified in
+ this document have limits on how many times a key can be used
+ without significant loss of security.
+
+ * These keys need to be dedicated to a single algorithm. There have
+ been a number of attacks developed over time when a single key is
+ used for multiple different algorithms. One example of this is
+ the use of a single key for both the CBC encryption mode and the
+ CBC-MAC authentication mode.
+
+ * Breaking one message means all messages are broken. If an
+ adversary succeeds in determining the key for a single message,
+ then the key for all messages is also determined.
+
+6.1.2. Direct Key with KDF
+
+ These recipient algorithms take a common shared secret between the
+ two parties and apply the HKDF function (Section 5.1), using the
+ context structure defined in Section 5.2 to transform the shared
+ secret into the CEK. The "protected" field can be of nonzero length.
+ Either the "salt" parameter for HKDF (Table 9) or the "PartyU nonce"
+ parameter for the context structure (Table 10) MUST be present (both
+ can be present if desired). The value in the "salt"/"nonce"
+ parameter can be generated either randomly or deterministically. The
+ requirement is that it be a unique value for the shared secret in
+ question.
+
+ If the salt/nonce value is generated randomly, then it is suggested
+ that the length of the random value be the same length as the output
+ of the hash function underlying HKDF. While there is no way to
+ guarantee that it will be unique, there is a high probability that it
+ will be unique. If the salt/nonce value is generated
+ deterministically, it can be guaranteed to be unique, and thus there
+ is no length requirement.
+
+ A new IV must be used for each message if the same key is used. The
+ IV can be modified in a predictable manner, a random manner, or an
+ unpredictable manner (e.g., encrypting a counter).
+
+ The IV used for a key can also be generated using the same HKDF
+ functionality used to generate the key. If HKDF is used for
+ generating the IV, the algorithm identifier is set to 34 ("IV-
+ GENERATION").
+
+ The set of algorithms defined in this document can be found in
+ Table 12.
+
+ +=====================+=======+==============+=====================+
+ | Name | Value | KDF | Description |
+ +=====================+=======+==============+=====================+
+ | direct+HKDF-SHA-256 | -10 | HKDF SHA-256 | Shared secret w/ |
+ | | | | HKDF and SHA-256 |
+ +---------------------+-------+--------------+---------------------+
+ | direct+HKDF-SHA-512 | -11 | HKDF SHA-512 | Shared secret w/ |
+ | | | | HKDF and SHA-512 |
+ +---------------------+-------+--------------+---------------------+
+ | direct+HKDF-AES-128 | -12 | HKDF AES- | Shared secret w/ |
+ | | | MAC-128 | AES-MAC 128-bit key |
+ +---------------------+-------+--------------+---------------------+
+ | direct+HKDF-AES-256 | -13 | HKDF AES- | Shared secret w/ |
+ | | | MAC-256 | AES-MAC 256-bit key |
+ +---------------------+-------+--------------+---------------------+
+
+ Table 12: Direct Key with KDF
+
+ When using a COSE key for this algorithm, the following checks are
+ made:
+
+ * The "kty" field MUST be present, and it MUST be "Symmetric".
+
+ * If the "alg" field is present, it MUST match the algorithm being
+ used.
+
+ * If the "key_ops" field is present, it MUST include "derive key" or
+ "derive bits".
+
+6.1.2.1. Security Considerations for Direct Key with KDF
+
+ The shared secret needs to have some method of being regularly
+ updated over time. The shared secret forms the basis of trust.
+ Although not used directly, it should still be subject to scheduled
+ rotation.
+
+ These methods do not provide for perfect forward secrecy, as the same
+ shared secret is used for all of the keys generated; however, if the
+ key for any single message is discovered, only the message or series
+ of messages using that derived key are compromised. A new key
+ derivation step will generate a new key that requires the same amount
+ of work to get the key.
+
+6.2. Key Wrap
+
+ Key wrap is defined in Section 8.5.2 of [RFC9052]. Information about
+ how to fill in the COSE_Recipient structure is detailed there.
+
+6.2.1. AES Key Wrap
+
+ The AES Key Wrap algorithm is defined in [RFC3394]. This algorithm
+ uses an AES key to wrap a value that is a multiple of 64 bits. As
+ such, it can be used to wrap a key for any of the content encryption
+ algorithms defined in this document. The algorithm requires a single
+ fixed parameter, the initial value. This is fixed to the value
+ specified in Section 2.2.3.1 of [RFC3394]. There are no public key
+ parameters that vary on a per-invocation basis. The protected header
+ bucket MUST be empty.
+
+ Keys may be obtained from either a key structure or a recipient
+ structure. Implementations that are encrypting or decrypting MUST
+ validate that the key type, key length, and algorithm are correct and
+ appropriate for the entities involved.
+
+ When using a COSE key for this algorithm, the following checks are
+ made:
+
+ * The "kty" field MUST be present, and it MUST be "Symmetric".
+
+ * If the "alg" field is present, it MUST match the AES Key Wrap
+ algorithm being used.
+
+ * If the "key_ops" field is present, it MUST include "encrypt" or
+ "wrap key" when encrypting.
+
+ * If the "key_ops" field is present, it MUST include "decrypt" or
+ "unwrap key" when decrypting.
+
+ +========+=======+==========+=============================+
+ | Name | Value | Key Size | Description |
+ +========+=======+==========+=============================+
+ | A128KW | -3 | 128 | AES Key Wrap w/ 128-bit key |
+ +--------+-------+----------+-----------------------------+
+ | A192KW | -4 | 192 | AES Key Wrap w/ 192-bit key |
+ +--------+-------+----------+-----------------------------+
+ | A256KW | -5 | 256 | AES Key Wrap w/ 256-bit key |
+ +--------+-------+----------+-----------------------------+
+
+ Table 13: AES Key Wrap Algorithm Values
+
+6.2.1.1. Security Considerations for AES Key Wrap
+
+ The shared secret needs to have some method of being regularly
+ updated over time. The shared secret is the basis of trust.
+
+6.3. Direct Key Agreement
+
+ Direct Key Agreement is defined in Section 8.5.4 of [RFC9052].
+ Information about how to fill in the COSE_Recipient structure is
+ detailed there.
+
+6.3.1. Direct ECDH
+
+ The mathematics for ECDH can be found in [RFC6090]. In this
+ document, the algorithm is extended to be used with the two curves
+ defined in [RFC7748].
+
+ ECDH is parameterized by the following:
+
+ Curve Type/Curve: The curve selected controls not only the size of
+ the shared secret, but the mathematics for computing the shared
+ secret. The curve selected also controls how a point in the curve
+ is represented and what happens for the identity points on the
+ curve. In this specification, we allow for a number of different
+ curves to be used. A set of curves is defined in Table 18.
+
+ The math used to obtain the computed secret is based on the curve
+ selected and not on the ECDH algorithm. For this reason, a new
+ algorithm does not need to be defined for each of the curves.
+
+ Computed Secret to Shared Secret: Once the computed secret is known,
+ the resulting value needs to be converted to a byte string to run
+ the KDF. The x-coordinate is used for all of the curves defined
+ in this document. For curves X25519 and X448, the resulting value
+ is used directly, as it is a byte string of a known length. For
+ the P-256, P-384, and P-521 curves, the x-coordinate is run
+ through the Integer-to-Octet-String primitive (I2OSP) function
+ defined in [RFC8017], using the same computation for n as is
+ defined in Section 2.1.
+
+ Ephemeral-Static or Static-Static: The key agreement process may be
+ done using either a static or an ephemeral key for the sender's
+ side. When using ephemeral keys, the sender MUST generate a new
+ ephemeral key for every key agreement operation. The ephemeral
+ key is placed in the "ephemeral key" parameter and MUST be present
+ for all algorithm identifiers that use ephemeral keys. When using
+ static keys, the sender MUST either generate a new random value or
+ create a unique value for use as a KDF input. For the KDFs used,
+ this means that either the "salt" parameter for HKDF (Table 9) or
+ the "PartyU nonce" parameter for the context structure (Table 10)
+ MUST be present (both can be present if desired). The value in
+ the parameter MUST be unique for the pair of keys being used. It
+ is acceptable to use a global counter that is incremented for
+ every Static-Static operation and use the resulting value. Care
+ must be taken that the counter is saved to permanent storage in a
+ way that avoids reuse of that counter value. When using static
+ keys, the static key should be identified to the recipient. The
+ static key can be identified by providing either the key ("static
+ key") or a key identifier for the static key ("static key id").
+ Both of these header parameters are defined in Table 15.
+
+ Key Derivation Algorithm: The result of an ECDH key agreement
+ process does not provide a uniformly random secret. As such, it
+ needs to be run through a KDF in order to produce a usable key.
+ Processing the secret through a KDF also allows for the
+ introduction of context material: how the key is going to be used
+ and one-time material for Static-Static key agreement. All of the
+ algorithms defined in this document use one of the HKDF algorithms
+ defined in Section 5.1 with the context structure defined in
+ Section 5.2.
+
+ Key Wrap Algorithm: No key wrap algorithm is used. This is
+ represented in Table 14 as "none". The key size for the context
+ structure is the content layer encryption algorithm size.
+
+ COSE does not have an Ephemeral-Ephemeral version defined. The
+ reason for this is that COSE is not an online protocol by itself and
+ thus does not have a method of establishing ephemeral secrets on both
+ sides. The expectation is that a protocol would establish the
+ secrets for both sides, and then they would be used as Static-Static
+ for the purposes of COSE, or that the protocol would generate a
+ shared secret and a direct encryption would be used.
+
+ The set of direct ECDH algorithms defined in this document is found
+ in Table 14.
+
+ +==========+=======+=========+==================+=====+=============+
+ |Name | Value | KDF | Ephemeral-Static |Key |Description |
+ | | | | |Wrap | |
+ +==========+=======+=========+==================+=====+=============+
+ |ECDH-ES + | -25 | HKDF -- | yes |none |ECDH ES w/ |
+ |HKDF-256 | | SHA-256 | | |HKDF -- |
+ | | | | | |generate key |
+ | | | | | |directly |
+ +----------+-------+---------+------------------+-----+-------------+
+ |ECDH-ES + | -26 | HKDF -- | yes |none |ECDH ES w/ |
+ |HKDF-512 | | SHA-512 | | |HKDF -- |
+ | | | | | |generate key |
+ | | | | | |directly |
+ +----------+-------+---------+------------------+-----+-------------+
+ |ECDH-SS + | -27 | HKDF -- | no |none |ECDH SS w/ |
+ |HKDF-256 | | SHA-256 | | |HKDF -- |
+ | | | | | |generate key |
+ | | | | | |directly |
+ +----------+-------+---------+------------------+-----+-------------+
+ |ECDH-SS + | -28 | HKDF -- | no |none |ECDH SS w/ |
+ |HKDF-512 | | SHA-512 | | |HKDF -- |
+ | | | | | |generate key |
+ | | | | | |directly |
+ +----------+-------+---------+------------------+-----+-------------+
+
+ Table 14: ECDH Algorithm Values
+
+ +===========+=======+==========+===================+=============+
+ | Name | Label | Type | Algorithm | Description |
+ +===========+=======+==========+===================+=============+
+ | ephemeral | -1 | COSE_Key | ECDH-ES+HKDF-256, | Ephemeral |
+ | key | | | ECDH-ES+HKDF-512, | public key |
+ | | | | ECDH-ES+A128KW, | for the |
+ | | | | ECDH-ES+A192KW, | sender |
+ | | | | ECDH-ES+A256KW | |
+ +-----------+-------+----------+-------------------+-------------+
+ | static | -2 | COSE_Key | ECDH-SS+HKDF-256, | Static |
+ | key | | | ECDH-SS+HKDF-512, | public key |
+ | | | | ECDH-SS+A128KW, | for the |
+ | | | | ECDH-SS+A192KW, | sender |
+ | | | | ECDH-SS+A256KW | |
+ +-----------+-------+----------+-------------------+-------------+
+ | static | -3 | bstr | ECDH-SS+HKDF-256, | Static |
+ | key id | | | ECDH-SS+HKDF-512, | public key |
+ | | | | ECDH-SS+A128KW, | identifier |
+ | | | | ECDH-SS+A192KW, | for the |
+ | | | | ECDH-SS+A256KW | sender |
+ +-----------+-------+----------+-------------------+-------------+
+
+ Table 15: ECDH Algorithm Parameters
+
+ This document defines these algorithms to be used with the curves
+ P-256, P-384, P-521, X25519, and X448. Implementations MUST verify
+ that the key type and curve are correct. Different curves are
+ restricted to different key types. Implementations MUST verify that
+ the curve and algorithm are appropriate for the entities involved.
+
+ When using a COSE key for this algorithm, the following checks are
+ made:
+
+ * The "kty" field MUST be present, and it MUST be "EC2" or "OKP".
+
+ * If the "alg" field is present, it MUST match the key agreement
+ algorithm being used.
+
+ * If the "key_ops" field is present, it MUST include "derive key" or
+ "derive bits" for the private key.
+
+ * If the "key_ops" field is present, it MUST be empty for the public
+ key.
+
+6.3.1.1. Security Considerations for ECDH
+
+ There is a method of checking that points provided from external
+ entities are valid. For the "EC2" key format, this can be done by
+ checking that the x and y values form a point on the curve. For the
+ "OKP" format, there is no simple way to perform point validation.
+
+ Consideration was given to requiring that the public keys of both
+ entities be provided as part of the key derivation process (as
+ recommended in Section 6.1 of [RFC7748]). This was not done, because
+ COSE is used in a store-and-forward format rather than in online key
+ exchange. In order for this to be a problem, either the receiver
+ public key has to be chosen maliciously or the sender has to be
+ malicious. In either case, all security evaporates anyway.
+
+ A proof of possession of the private key associated with the public
+ key is recommended when a key is moved from untrusted to trusted
+ (either by the end user or by the entity that is responsible for
+ making trust statements on keys).
+
+6.4. Key Agreement with Key Wrap
+
+ Key Agreement with Key Wrap is defined in Section 8.5.5 of [RFC9052].
+ Information about how to fill in the COSE_Recipient structure is
+ detailed there.
+
+6.4.1. ECDH with Key Wrap
+
+ These algorithms are defined in Table 16.
+
+ ECDH with Key Agreement is parameterized by the same header
+ parameters as for ECDH; see Section 6.3.1, with the following
+ modifications:
+
+ Key Wrap Algorithm: Any of the key wrap algorithms defined in
+ Section 6.2 are supported. The size of the key used for the key
+ wrap algorithm is fed into the KDF. The set of identifiers is
+ found in Table 16.
+
+ +=========+=====+=========+==================+========+=============+
+ |Name |Value| KDF | Ephemeral-Static |Key Wrap|Description |
+ +=========+=====+=========+==================+========+=============+
+ |ECDH-ES +|-29 | HKDF -- | yes |A128KW |ECDH ES w/ |
+ |A128KW | | SHA-256 | | |HKDF and AES |
+ | | | | | |Key Wrap w/ |
+ | | | | | |128-bit key |
+ +---------+-----+---------+------------------+--------+-------------+
+ |ECDH-ES +|-30 | HKDF -- | yes |A192KW |ECDH ES w/ |
+ |A192KW | | SHA-256 | | |HKDF and AES |
+ | | | | | |Key Wrap w/ |
+ | | | | | |192-bit key |
+ +---------+-----+---------+------------------+--------+-------------+
+ |ECDH-ES +|-31 | HKDF -- | yes |A256KW |ECDH ES w/ |
+ |A256KW | | SHA-256 | | |HKDF and AES |
+ | | | | | |Key Wrap w/ |
+ | | | | | |256-bit key |
+ +---------+-----+---------+------------------+--------+-------------+
+ |ECDH-SS +|-32 | HKDF -- | no |A128KW |ECDH SS w/ |
+ |A128KW | | SHA-256 | | |HKDF and AES |
+ | | | | | |Key Wrap w/ |
+ | | | | | |128-bit key |
+ +---------+-----+---------+------------------+--------+-------------+
+ |ECDH-SS +|-33 | HKDF -- | no |A192KW |ECDH SS w/ |
+ |A192KW | | SHA-256 | | |HKDF and AES |
+ | | | | | |Key Wrap w/ |
+ | | | | | |192-bit key |
+ +---------+-----+---------+------------------+--------+-------------+
+ |ECDH-SS +|-34 | HKDF -- | no |A256KW |ECDH SS w/ |
+ |A256KW | | SHA-256 | | |HKDF and AES |
+ | | | | | |Key Wrap w/ |
+ | | | | | |256-bit key |
+ +---------+-----+---------+------------------+--------+-------------+
+
+ Table 16: ECDH Algorithm Values with Key Wrap
+
+ When using a COSE key for this algorithm, the following checks are
+ made:
+
+ * The "kty" field MUST be present, and it MUST be "EC2" or "OKP".
+
+ * If the "alg" field is present, it MUST match the key agreement
+ algorithm being used.
+
+ * If the "key_ops" field is present, it MUST include "derive key" or
+ "derive bits" for the private key.
+
+ * If the "key_ops" field is present, it MUST be empty for the public
+ key.
+
+7. Key Object Parameters
+
+ The COSE_Key object defines a way to hold a single key object. It is
+ still required that the members of individual key types be defined.
+ This section of the document is where we define an initial set of
+ members for specific key types.
+
+ For each of the key types, we define both public and private members.
+ The public members are what is transmitted to others for their usage.
+ Private members allow individuals to archive keys. However, there
+ are some circumstances in which private keys may be distributed to
+ entities in a protocol. Examples include: entities that have poor
+ random number generation, centralized key creation for multicast-type
+ operations, and protocols in which a shared secret is used as a
+ bearer token for authorization purposes.
+
+ Key types are identified by the "kty" member of the COSE_Key object.
+ In this document, we define four values for the member:
+
+ +===========+=======+==========================+
+ | Name | Value | Description |
+ +===========+=======+==========================+
+ | OKP | 1 | Octet Key Pair |
+ +-----------+-------+--------------------------+
+ | EC2 | 2 | Elliptic Curve Keys w/ |
+ | | | x- and y-coordinate pair |
+ +-----------+-------+--------------------------+
+ | Symmetric | 4 | Symmetric Keys |
+ +-----------+-------+--------------------------+
+ | Reserved | 0 | This value is reserved |
+ +-----------+-------+--------------------------+
+
+ Table 17: Key Type Values
+
+7.1. Elliptic Curve Keys
+
+ Two different key structures are defined for elliptic curve keys.
+ One version uses both an x-coordinate and a y-coordinate, potentially
+ with point compression ("EC2"). This is the conventional elliptic
+ curve (EC) point representation that is used in [RFC5480]. The other
+ version uses only the x-coordinate, as the y-coordinate is either to
+ be recomputed or not needed for the key agreement operation ("OKP").
+
+ Applications MUST check that the curve and the key type are
+ consistent and reject a key if they are not.
+
+ +=========+=======+==========+=====================================+
+ | Name | Value | Key Type | Description |
+ +=========+=======+==========+=====================================+
+ | P-256 | 1 | EC2 | NIST P-256, also known as secp256r1 |
+ +---------+-------+----------+-------------------------------------+
+ | P-384 | 2 | EC2 | NIST P-384, also known as secp384r1 |
+ +---------+-------+----------+-------------------------------------+
+ | P-521 | 3 | EC2 | NIST P-521, also known as secp521r1 |
+ +---------+-------+----------+-------------------------------------+
+ | X25519 | 4 | OKP | X25519 for use w/ ECDH only |
+ +---------+-------+----------+-------------------------------------+
+ | X448 | 5 | OKP | X448 for use w/ ECDH only |
+ +---------+-------+----------+-------------------------------------+
+ | Ed25519 | 6 | OKP | Ed25519 for use w/ EdDSA only |
+ +---------+-------+----------+-------------------------------------+
+ | Ed448 | 7 | OKP | Ed448 for use w/ EdDSA only |
+ +---------+-------+----------+-------------------------------------+
+
+ Table 18: Elliptic Curves
+
+7.1.1. Double Coordinate Curves
+
+ Generally, protocols transmit elliptic-curve points as either the
+ x-coordinate and y-coordinate or the x-coordinate and a sign bit for
+ the y-coordinate. The latter encoding has not been recommended by
+ the IETF due to potential IPR issues. However, for operations in
+ constrained environments, the ability to shrink a message by not
+ sending the y-coordinate is potentially useful.
+
+ For EC keys with both coordinates, the "kty" member is set to 2
+ (EC2). The key parameters defined in this section are summarized in
+ Table 19. The members that are defined for this key type are:
+
+ crv: This contains an identifier of the curve to be used with the
+ key. The curves defined in this document for this key type can
+ be found in Table 18. Other curves may be registered in the
+ future, and private curves can be used as well.
+
+ x: This contains the x-coordinate for the EC point. The integer
+ is converted to a byte string as defined in [SEC1]. Leading-
+ zero octets MUST be preserved.
+
+ y: This contains either the sign bit or the value of the
+ y-coordinate for the EC point. When encoding the value y, the
+ integer is converted to a byte string (as defined in [SEC1])
+ and encoded as a CBOR bstr. Leading-zero octets MUST be
+ preserved. Compressed point encoding is also supported.
+ Compute the sign bit as laid out in the Elliptic-Curve-Point-
+ to-Octet-String Conversion function of [SEC1]. If the sign bit
+ is zero, then encode y as a CBOR false value; otherwise, encode
+ y as a CBOR true value. The encoding of the infinity point is
+ not supported.
+
+ d: This contains the private key.
+
+ For public keys, it is REQUIRED that "crv", "x", and "y" be present
+ in the structure. For private keys, it is REQUIRED that "crv" and
+ "d" be present in the structure. For private keys, it is RECOMMENDED
+ that "x" and "y" also be present, but they can be recomputed from the
+ required elements, and omitting them saves on space.
+
+ +======+======+=======+========+=================================+
+ | Key | Name | Label | CBOR | Description |
+ | Type | | | Type | |
+ +======+======+=======+========+=================================+
+ | 2 | crv | -1 | int / | EC identifier -- Taken from the |
+ | | | | tstr | "COSE Elliptic Curves" registry |
+ +------+------+-------+--------+---------------------------------+
+ | 2 | x | -2 | bstr | x-coordinate |
+ +------+------+-------+--------+---------------------------------+
+ | 2 | y | -3 | bstr / | y-coordinate |
+ | | | | bool | |
+ +------+------+-------+--------+---------------------------------+
+ | 2 | d | -4 | bstr | Private key |
+ +------+------+-------+--------+---------------------------------+
+
+ Table 19: EC Key Parameters
+
+7.2. Octet Key Pair
+
+ A new key type is defined for Octet Key Pairs (OKPs). Do not assume
+ that keys using this type are elliptic curves. This key type could
+ be used for other curve types (for example, mathematics based on
+ hyper-elliptic surfaces).
+
+ The key parameters defined in this section are summarized in
+ Table 20. The members that are defined for this key type are:
+
+ crv: This contains an identifier of the curve to be used with the
+ key. The curves defined in this document for this key type can
+ be found in Table 18. Other curves may be registered in the
+ future, and private curves can be used as well.
+
+ x: This contains the public key. The byte string contains the
+ public key as defined by the algorithm. (For X25519,
+ internally it is a little-endian integer.)
+
+ d: This contains the private key.
+
+ For public keys, it is REQUIRED that "crv" and "x" be present in the
+ structure. For private keys, it is REQUIRED that "crv" and "d" be
+ present in the structure. For private keys, it is RECOMMENDED that
+ "x" also be present, but it can be recomputed from the required
+ elements, and omitting it saves on space.
+
+ +======+==========+=======+=======+=================================+
+ | Name | Key | Label | Type | Description |
+ | | Type | | | |
+ +======+==========+=======+=======+=================================+
+ | crv | 1 | -1 | int / | EC identifier -- Taken from the |
+ | | | | tstr | "COSE Elliptic Curves" registry |
+ +------+----------+-------+-------+---------------------------------+
+ | x | 1 | -2 | bstr | Public Key |
+ +------+----------+-------+-------+---------------------------------+
+ | d | 1 | -4 | bstr | Private key |
+ +------+----------+-------+-------+---------------------------------+
+
+ Table 20: Octet Key Pair Parameters
+
+7.3. Symmetric Keys
+
+ Occasionally, it is required that a symmetric key be transported
+ between entities. This key structure allows for that to happen.
+
+ For symmetric keys, the "kty" member is set to 4 ("Symmetric"). The
+ member that is defined for this key type is:
+
+ k: This contains the value of the key.
+
+ This key structure does not have a form that contains only public
+ members. As it is expected that this key structure is going to be
+ transmitted, care must be taken that it is never transmitted
+ accidentally or insecurely. For symmetric keys, it is REQUIRED that
+ "k" be present in the structure.
+
+ +======+==========+=======+======+=============+
+ | Name | Key Type | Label | Type | Description |
+ +======+==========+=======+======+=============+
+ | k | 4 | -1 | bstr | Key Value |
+ +------+----------+-------+------+-------------+
+
+ Table 21: Symmetric Key Parameters
+
+8. COSE Capabilities
+
+ The capabilities of an algorithm or key type need to be specified in
+ some situations. This has a counterpart in the S/MIME
+ specifications, where SMIMECapabilities is defined in Section 2.5.2
+ of [RFC8551]. This document defines the same concept for COSE.
+
+ The algorithm identifier is not included in the capabilities data, as
+ it should be encoded elsewhere in the message. The key type
+ identifier is included in the capabilities data, as it is not
+ expected to be encoded elsewhere.
+
+ Two different types of capabilities are defined: capabilities for
+ algorithms and capabilities for key type. Once defined by
+ registration with IANA, the list of capabilities for an algorithm or
+ key type is immutable. If it is later found that a new capability is
+ needed for a key type or algorithm, it will require that a new code
+ point be assigned to deal with that. As a general rule, the
+ capabilities are going to map to algorithm-specific header parameters
+ or key parameters, but they do not need to do so. An example of this
+ is the HSS-LMS key type capabilities defined below, where the hash
+ algorithm used is included.
+
+ The capability structure is an array of values; the values included
+ in the structure are dependent on a specific algorithm or key type.
+ For algorithm capabilities, the first element should always be a key
+ type value if applicable, but the items that are specific to a key
+ (for example, a curve) should not be included in the algorithm
+ capabilities. This means that if one wishes to enumerate all of the
+ capabilities for a device that implements ECDH, it requires that all
+ of the combinations of algorithms and key pairs be specified. The
+ last example of Section 8.3 provides a case where this is done by
+ allowing for a cross product to be specified between an array of
+ algorithm capabilities and key type capabilities (see the ECDH-
+ ES+A25KW element). For a key, the first element should be the key
+ type value. While this means that the key type value will be
+ duplicated if both an algorithm and key capability are used, the key
+ type is needed in order to understand the rest of the values.
+
+8.1. Assignments for Existing Algorithms
+
+ For the current set of algorithms in the registry other than IV-
+ GENERATION (those in this document as well as those in [RFC8230],
+ [RFC8778], and [RFC9021]), the capabilities list is an array with one
+ element, the key type (from the "COSE Key Types" Registry). It is
+ expected that future registered algorithms could have zero, one, or
+ multiple elements.
+
+8.2. Assignments for Existing Key Types
+
+ There are a number of pre-existing key types; the following deals
+ with creating the capability definition for those structures:
+
+ * OKP, EC2: The list of capabilities is:
+
+ - The key type value. (1 for OKP or 2 for EC2.)
+
+ - One curve for that key type from the "COSE Elliptic Curves"
+ registry.
+
+ * RSA: The list of capabilities is:
+
+ - The key type value (3).
+
+ * Symmetric: The list of capabilities is:
+
+ - The key type value (4).
+
+ * HSS-LMS: The list of capabilities is:
+
+ - The key type value (5).
+
+ - Algorithm identifier for the underlying hash function from the
+ "COSE Algorithms" registry.
+
+ * WalnutDSA: The list of capabilities is:
+
+ - The key type value (6).
+
+ - The N value (group and matrix size) for the key, a uint.
+
+ - The q value (finite field order) for the key, a uint.
+
+8.3. Examples
+
+ Capabilities can be used in a key derivation process to make sure
+ that both sides are using the same parameters. The three examples
+ below show different ways that one might utilize parameters in
+ specifying an application protocol:
+
+ * Only an algorithm capability: This is useful if the protocol wants
+ to require a specific algorithm, such as ES256, but it is agnostic
+ about which curve is being used. This requires that the algorithm
+ identifier be specified in the protocol. See the first example.
+
+ * Only a key type capability: This is useful if the protocol wants
+ to require a specific key type and curve, such as P-256, but will
+ accept any algorithm using that curve (e.g., both ECDSA and ECDH).
+ See the second example.
+
+ * Both algorithm and key type capabilities: This is used if the
+ protocol needs to nail down all of the options surrounding an
+ algorithm -- e.g., EdDSA with the curve Ed25519. As with the
+ first example, the algorithm identifier needs to be specified in
+ the protocol. See the third example, which just concatenates the
+ two capabilities together.
+
+ Algorithm ES256
+
+ 0x8102 / [2 \ EC2 \ ] /
+
+ Key type EC2 with P-256 curve:
+
+ 0x820201 / [2 \ EC2 \, 1 \ P-256 \] /
+
+ ECDH-ES + A256KW with an X25519 curve:
+
+ 0x8101820104 / [1 \ OKP \],[1 \ OKP \, 4 \ X25519 \] /
+
+ The capabilities can also be used by an entity to advertise what it
+ is capable of doing. The decoded example below is one of many
+ encodings that could be used for that purpose. Each array element
+ includes three fields: the algorithm identifier, one or more
+ algorithm capabilities, and one or more key type capabilities.
+
+ [
+ [-8 / EdDSA /,
+ [1 / OKP key type /],
+ [
+ [1 / OKP /, 6 / Ed25519 / ],
+ [1 /OKP/, 7 /Ed448 /]
+ ]
+ ],
+ [-7 / ECDSA with SHA-256/,
+ [2 /EC2 key type/],
+ [
+ [2 /EC2/, 1 /P-256/],
+ [2 /EC2/, 3 /P-521/]
+ ]
+ ],
+ [ -31 / ECDH-ES+A256KW/,
+ [
+ [ 2 /EC2/],
+ [1 /OKP/ ]
+ ],
+ [
+ [2 /EC2/, 1 /P-256/],
+ [1 /OKP/, 4 / X25519/ ]
+ ]
+ ],
+ [ 1 / A128GCM /,
+ [ 4 / Symmetric / ],
+ [ 4 / Symmetric /]
+ ]
+ ]
+
+ Examining the above:
+
+ * The first element indicates that the entity supports EdDSA with
+ curves Ed25519 and Ed448.
+
+ * The second element indicates that the entity supports ECDSA with
+ SHA-256 with curves P-256 and P-521.
+
+ * The third element indicates that the entity supports Ephemeral-
+ Static ECDH using AES256 key wrap. The entity can support the
+ P-256 curve with an EC2 key type and the X25519 curve with an OKP
+ key type.
+
+ * The last element indicates that the entity supports AES-GCM of 128
+ bits for content encryption.
+
+ The entity does not advertise that it supports any MAC algorithms.
+
+9. CBOR Encoding Restrictions
+
+ This document limits the restrictions it imposes on how the CBOR
+ Encoder needs to work. The new encoding restrictions are aligned
+ with the Core Deterministic Encoding Requirements specified in
+ Section 4.2.1 of RFC 8949 [STD94]. It has been narrowed down to the
+ following restrictions:
+
+ * The restriction applies to the encoding of the COSE_KDF_Context.
+
+ * Encoding MUST be done using definite lengths, and the length of
+ the (encoded) argument MUST be the minimum possible length. This
+ means that the integer 1 is encoded as "0x01" and not "0x1801".
+
+ * Applications MUST NOT generate messages with the same label used
+ twice as a key in a single map. Applications MUST NOT parse and
+ process messages with the same label used twice as a key in a
+ single map. Applications can enforce the parse-and-process
+ requirement by using parsers that will fail the parse step or by
+ using parsers that will pass all keys to the application, and the
+ application can perform the check for duplicate keys.
+
+10. IANA Considerations
+
+ IANA has updated all COSE registries except for "COSE Header
+ Parameters" and "COSE Key Common Parameters" to point to this
+ document instead of [RFC8152].
+
+10.1. Changes to the "COSE Key Types" Registry
+
+ IANA has added a new column in the "COSE Key Types" registry. The
+ new column is labeled "Capabilities" and has been populated according
+ to the entries in Table 22.
+
+ +=======+===========+============================+
+ | Value | Name | Capabilities |
+ +=======+===========+============================+
+ | 1 | OKP | [kty(1), crv] |
+ +-------+-----------+----------------------------+
+ | 2 | EC2 | [kty(2), crv] |
+ +-------+-----------+----------------------------+
+ | 3 | RSA | [kty(3)] |
+ +-------+-----------+----------------------------+
+ | 4 | Symmetric | [kty(4)] |
+ +-------+-----------+----------------------------+
+ | 5 | HSS-LMS | [kty(5), hash algorithm] |
+ +-------+-----------+----------------------------+
+ | 6 | WalnutDSA | [kty(6), N value, q value] |
+ +-------+-----------+----------------------------+
+
+ Table 22: Key Type Capabilities
+
+10.2. Changes to the "COSE Algorithms" Registry
+
+ IANA has added a new column in the "COSE Algorithms" registry. The
+ new column is labeled "Capabilities" and has been populated with
+ "[kty]" for all current, nonprovisional registrations.
+
+ IANA has updated the Reference column in the "COSE Algorithms"
+ registry to include this document as a reference for all rows where
+ it was not already present.
+
+ IANA has added a new row to the "COSE Algorithms" registry.
+
+ +===============+=======+===============+===========+=============+
+ | Name | Value | Description | Reference | Recommended |
+ +===============+=======+===============+===========+=============+
+ | IV-GENERATION | 34 | For doing IV | RFC 9053 | No |
+ | | | generation | | |
+ | | | for symmetric | | |
+ | | | algorithms. | | |
+ +---------------+-------+---------------+-----------+-------------+
+
+ Table 23: New entry in the COSE Algorithms registry
+
+ The Capabilities column for this registration is to be empty.
+
+10.3. Changes to the "COSE Key Type Parameters" Registry
+
+ IANA has modified the description to "Public Key" for the line with
+ "Key Type" of 1 and the "Name" of "x". See Table 20, which has been
+ modified with this change.
+
+10.4. Expert Review Instructions
+
+ All of the IANA registries established by [RFC8152] are, at least in
+ part, defined as Expert Review [RFC8126]. This section gives some
+ general guidelines for what the experts should be looking for, but
+ they are being designated as experts for a reason, so they should be
+ given substantial latitude.
+
+ Expert reviewers should take the following into consideration:
+
+ * Point squatting should be discouraged. Reviewers are encouraged
+ to get sufficient information for registration requests to ensure
+ that the usage is not going to duplicate an existing registration
+ and that the code point is likely to be used in deployments. The
+ ranges tagged as private use are intended for testing purposes and
+ closed environments; code points in other ranges should not be
+ assigned for testing.
+
+ * Standards Track or BCP RFCs are required to register a code point
+ in the Standards Action range. Specifications should exist for
+ Specification Required ranges, but early assignment before an RFC
+ is available is considered to be permissible. Specifications are
+ needed for the first-come, first-served range if the points are
+ expected to be used outside of closed environments in an
+ interoperable way. When specifications are not provided, the
+ description provided needs to have sufficient information to
+ identify what the point is being used for.
+
+ * Experts should take into account the expected usage of fields when
+ approving code point assignment. The fact that the Standards
+ Action range is only available to Standards Track documents does
+ not mean that a Standards Track document cannot have points
+ assigned outside of that range. The length of the encoded value
+ should be weighed against how many code points of that length are
+ left and the size of device it will be used on.
+
+ * When algorithms are registered, vanity registrations should be
+ discouraged. One way to do this is to require registrations to
+ provide additional documentation on security analysis of the
+ algorithm. Another thing that should be considered is requesting
+ an opinion on the algorithm from the Crypto Forum Research Group
+ (CFRG). Algorithms are expected to meet the security requirements
+ of the community and the requirements of the message structures in
+ order to be suitable for registration.
+
+11. Security Considerations
+
+ There are a number of security considerations that need to be taken
+ into account by implementers of this specification. The security
+ considerations that are specific to an individual algorithm are
+ placed next to the description of the algorithm. While some
+ considerations have been highlighted here, additional considerations
+ may be found in the documents listed in the references.
+
+ Implementations need to protect the private key material for all
+ individuals. Some cases in this document need to be highlighted with
+ regard to this issue.
+
+ * Use of the same key for two different algorithms can leak
+ information about the key. It is therefore recommended that keys
+ be restricted to a single algorithm.
+
+ * Use of "direct" as a recipient algorithm combined with a second
+ recipient algorithm exposes the direct key to the second
+ recipient; Section 8.5 of [RFC9052] forbids combining "direct"
+ recipient algorithms with other modes.
+
+ * Several of the algorithms in this document have limits on the
+ number of times that a key can be used without leaking information
+ about the key.
+
+ The use of ECDH and direct plus KDF (with no key wrap) will not
+ directly lead to the private key being leaked; the one-way function
+ of the KDF will prevent that. There is, however, a different issue
+ that needs to be addressed. Having two recipients requires that the
+ CEK be shared between two recipients. The second recipient therefore
+ has a CEK that was derived from material that can be used for the
+ weak proof of origin. The second recipient could create a message
+ using the same CEK and send it to the first recipient; the first
+ recipient would, for either Static-Static ECDH or direct plus KDF,
+ make an assumption that the CEK could be used for proof of origin,
+ even though it is from the wrong entity. If the key wrap step is
+ added, then no proof of origin is implied and this is not an issue.
+
+ Although it has been mentioned before, it bears repeating that the
+ use of a single key for multiple algorithms has been demonstrated in
+ some cases to leak information about a key, providing the opportunity
+ for attackers to forge integrity tags or gain information about
+ encrypted content. Binding a key to a single algorithm prevents
+ these problems. Key creators and key consumers are strongly
+ encouraged to not only create new keys for each different algorithm,
+ but to include that selection of algorithm in any distribution of key
+ material and strictly enforce the matching of algorithms in the key
+ structure to algorithms in the message structure. In addition to
+ checking that algorithms are correct, the key form needs to be
+ checked as well. Do not use an "EC2" key where an "OKP" key is
+ expected.
+
+ Before using a key for transmission, or before acting on information
+ received, a trust decision on a key needs to be made. Is the data or
+ action something that the entity associated with the key has a right
+ to see or a right to request? A number of factors are associated
+ with this trust decision. Some highlighted here are:
+
+ * What are the permissions associated with the key owner?
+
+ * Is the cryptographic algorithm acceptable in the current context?
+
+ * Have the restrictions associated with the key, such as algorithm
+ or freshness, been checked, and are they correct?
+
+ * Is the request something that is reasonable, given the current
+ state of the application?
+
+ * Have any security considerations that are part of the message been
+ enforced (as specified by the application or "crit" header
+ parameter)?
+
+ There are a large number of algorithms presented in this document
+ that use nonce values. For all of the nonces defined in this
+ document, there is some type of restriction on the nonce being a
+ unique value for either a key or some other conditions. In all of
+ these cases, there is no known requirement on the nonce being both
+ unique and unpredictable; under these circumstances, it's reasonable
+ to use a counter for creation of the nonce. In cases where one wants
+ the pattern of the nonce to be unpredictable as well as unique, one
+ can use a key created for that purpose and encrypt the counter to
+ produce the nonce value.
+
+ One area that has been getting exposure is traffic analysis of
+ encrypted messages based on the length of the message. This
+ specification does not provide a uniform method for providing padding
+ as part of the message structure. An observer can distinguish
+ between two different messages (for example, "YES" and "NO") based on
+ the length for all of the content encryption algorithms that are
+ defined in this document. This means that it is up to the
+ applications to document how content padding is to be done in order
+ to prevent or discourage such analysis. (For example, the text
+ strings could be defined as "YES" and "NO ".)
+
+ The analysis done in [RFC9147] is based on the number of records that
+ are sent. This should map well to the number of messages sent when
+ using COSE, so that analysis should hold here as well, under the
+ assumption that the COSE messages are roughly the same size as DTLS
+ records. It needs to be noted that the limits are based on the
+ number of messages, but QUIC and DTLS are always pairwise-based
+ endpoints. In contrast, [OSCORE-GROUPCOMM] uses COSE in a group
+ communication scenario. Under these circumstances, it may be that no
+ one single entity will see all of the messages that are encrypted,
+ and therefore no single entity can trigger the rekey operation.
+
+12. References
+
+12.1. Normative References
+
+ [AES-GCM] Dworkin, M., "Recommendation for Block Cipher Modes of
+ Operation: Galois/Counter Mode (GCM) and GMAC", NIST
+ Special Publication 800-38D, DOI 10.6028/NIST.SP.800-38D,
+ November 2007, <https://csrc.nist.gov/publications/
+ nistpubs/800-38D/SP-800-38D.pdf>.
+
+ [DSS] National Institute of Standards and Technology, "Digital
+ Signature Standard (DSS)", FIPS PUB 186-4,
+ DOI 10.6028/NIST.FIPS.186-4, July 2013,
+ <https://nvlpubs.nist.gov/nistpubs/FIPS/
+ NIST.FIPS.186-4.pdf>.
+
+ [MAC] Menezes, A., van Oorschot, P., and S. Vanstone, "Handbook
+ of Applied Cryptography", CRC Press, Boca Raton, 1996,
+ <https://cacr.uwaterloo.ca/hac/>.
+
+ [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed-
+ Hashing for Message Authentication", RFC 2104,
+ DOI 10.17487/RFC2104, February 1997,
+ <https://www.rfc-editor.org/info/rfc2104>.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119,
+ DOI 10.17487/RFC2119, March 1997,
+ <https://www.rfc-editor.org/info/rfc2119>.
+
+ [RFC3394] Schaad, J. and R. Housley, "Advanced Encryption Standard
+ (AES) Key Wrap Algorithm", RFC 3394, DOI 10.17487/RFC3394,
+ September 2002, <https://www.rfc-editor.org/info/rfc3394>.
+
+ [RFC3610] Whiting, D., Housley, R., and N. Ferguson, "Counter with
+ CBC-MAC (CCM)", RFC 3610, DOI 10.17487/RFC3610, September
+ 2003, <https://www.rfc-editor.org/info/rfc3610>.
+
+ [RFC5869] Krawczyk, H. and P. Eronen, "HMAC-based Extract-and-Expand
+ Key Derivation Function (HKDF)", RFC 5869,
+ DOI 10.17487/RFC5869, May 2010,
+ <https://www.rfc-editor.org/info/rfc5869>.
+
+ [RFC6090] McGrew, D., Igoe, K., and M. Salter, "Fundamental Elliptic
+ Curve Cryptography Algorithms", RFC 6090,
+ DOI 10.17487/RFC6090, February 2011,
+ <https://www.rfc-editor.org/info/rfc6090>.
+
+ [RFC6979] Pornin, T., "Deterministic Usage of the Digital Signature
+ Algorithm (DSA) and Elliptic Curve Digital Signature
+ Algorithm (ECDSA)", RFC 6979, DOI 10.17487/RFC6979, August
+ 2013, <https://www.rfc-editor.org/info/rfc6979>.
+
+ [RFC7748] Langley, A., Hamburg, M., and S. Turner, "Elliptic Curves
+ for Security", RFC 7748, DOI 10.17487/RFC7748, January
+ 2016, <https://www.rfc-editor.org/info/rfc7748>.
+
+ [RFC8017] Moriarty, K., Ed., Kaliski, B., Jonsson, J., and A. Rusch,
+ "PKCS #1: RSA Cryptography Specifications Version 2.2",
+ RFC 8017, DOI 10.17487/RFC8017, November 2016,
+ <https://www.rfc-editor.org/info/rfc8017>.
+
+ [RFC8032] Josefsson, S. and I. Liusvaara, "Edwards-Curve Digital
+ Signature Algorithm (EdDSA)", RFC 8032,
+ DOI 10.17487/RFC8032, January 2017,
+ <https://www.rfc-editor.org/info/rfc8032>.
+
+ [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
+ 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
+ May 2017, <https://www.rfc-editor.org/info/rfc8174>.
+
+ [RFC8439] Nir, Y. and A. Langley, "ChaCha20 and Poly1305 for IETF
+ Protocols", RFC 8439, DOI 10.17487/RFC8439, June 2018,
+ <https://www.rfc-editor.org/info/rfc8439>.
+
+ [RFC9052] Schaad, J., "CBOR Object Signing and Encryption (COSE):
+ Structures and Process", STD 96, RFC 9052,
+ DOI 10.17487/RFC9052, August 2022,
+ <https://www.rfc-editor.org/info/rfc9052>.
+
+ [SEC1] Certicom Research, "SEC 1: Elliptic Curve Cryptography",
+ Standards for Efficient Cryptography, May 2009,
+ <https://www.secg.org/sec1-v2.pdf>.
+
+ [STD94] Bormann, C. and P. Hoffman, "Concise Binary Object
+ Representation (CBOR)", STD 94, RFC 8949, December 2020,
+ <https://www.rfc-editor.org/info/std94>.
+
+12.2. Informative References
+
+ [CFRG-DET-SIGS]
+ Mattsson, J. P., Thormarker, E., and S. Ruohomaa,
+ "Deterministic ECDSA and EdDSA Signatures with Additional
+ Randomness", Work in Progress, Internet-Draft, draft-
+ mattsson-cfrg-det-sigs-with-noise-04, 15 February 2022,
+ <https://datatracker.ietf.org/doc/html/draft-mattsson-
+ cfrg-det-sigs-with-noise-04>.
+
+ [COUNTERSIGN]
+ Schaad, J. and R. Housley, "CBOR Object Signing and
+ Encryption (COSE): Countersignatures", Work in Progress,
+ Internet-Draft, draft-ietf-cose-countersign-08, 22 August
+ 2022, <https://datatracker.ietf.org/doc/html/draft-ietf-
+ cose-countersign-08>.
+
+ [GitHub-Examples]
+ "GitHub Examples of COSE", commit 3221310, 3 June 2020,
+ <https://github.com/cose-wg/Examples>.
+
+ [HKDF] Krawczyk, H., "Cryptographic Extraction and Key
+ Derivation: The HKDF Scheme", 2010,
+ <https://eprint.iacr.org/2010/264.pdf>.
+
+ [OSCORE-GROUPCOMM]
+ Tiloca, M., Selander, G., Palombini, F., Mattsson, J. P.,
+ and J. Park, "Group OSCORE - Secure Group Communication
+ for CoAP", Work in Progress, Internet-Draft, draft-ietf-
+ core-oscore-groupcomm-14, 7 March 2022,
+ <https://datatracker.ietf.org/doc/html/draft-ietf-core-
+ oscore-groupcomm-14>.
+
+ [RFC4231] Nystrom, M., "Identifiers and Test Vectors for HMAC-SHA-
+ 224, HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512",
+ RFC 4231, DOI 10.17487/RFC4231, December 2005,
+ <https://www.rfc-editor.org/info/rfc4231>.
+
+ [RFC4493] Song, JH., Poovendran, R., Lee, J., and T. Iwata, "The
+ AES-CMAC Algorithm", RFC 4493, DOI 10.17487/RFC4493, June
+ 2006, <https://www.rfc-editor.org/info/rfc4493>.
+
+ [RFC5116] McGrew, D., "An Interface and Algorithms for Authenticated
+ Encryption", RFC 5116, DOI 10.17487/RFC5116, January 2008,
+ <https://www.rfc-editor.org/info/rfc5116>.
+
+ [RFC5480] Turner, S., Brown, D., Yiu, K., Housley, R., and T. Polk,
+ "Elliptic Curve Cryptography Subject Public Key
+ Information", RFC 5480, DOI 10.17487/RFC5480, March 2009,
+ <https://www.rfc-editor.org/info/rfc5480>.
+
+ [RFC6151] Turner, S. and L. Chen, "Updated Security Considerations
+ for the MD5 Message-Digest and the HMAC-MD5 Algorithms",
+ RFC 6151, DOI 10.17487/RFC6151, March 2011,
+ <https://www.rfc-editor.org/info/rfc6151>.
+
+ [RFC7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained
+ Application Protocol (CoAP)", RFC 7252,
+ DOI 10.17487/RFC7252, June 2014,
+ <https://www.rfc-editor.org/info/rfc7252>.
+
+ [RFC7518] Jones, M., "JSON Web Algorithms (JWA)", RFC 7518,
+ DOI 10.17487/RFC7518, May 2015,
+ <https://www.rfc-editor.org/info/rfc7518>.
+
+ [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for
+ Writing an IANA Considerations Section in RFCs", BCP 26,
+ RFC 8126, DOI 10.17487/RFC8126, June 2017,
+ <https://www.rfc-editor.org/info/rfc8126>.
+
+ [RFC8152] Schaad, J., "CBOR Object Signing and Encryption (COSE)",
+ RFC 8152, DOI 10.17487/RFC8152, July 2017,
+ <https://www.rfc-editor.org/info/rfc8152>.
+
+ [RFC8230] Jones, M., "Using RSA Algorithms with CBOR Object Signing
+ and Encryption (COSE) Messages", RFC 8230,
+ DOI 10.17487/RFC8230, September 2017,
+ <https://www.rfc-editor.org/info/rfc8230>.
+
+ [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol
+ Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018,
+ <https://www.rfc-editor.org/info/rfc8446>.
+
+ [RFC8551] Schaad, J., Ramsdell, B., and S. Turner, "Secure/
+ Multipurpose Internet Mail Extensions (S/MIME) Version 4.0
+ Message Specification", RFC 8551, DOI 10.17487/RFC8551,
+ April 2019, <https://www.rfc-editor.org/info/rfc8551>.
+
+ [RFC8610] Birkholz, H., Vigano, C., and C. Bormann, "Concise Data
+ Definition Language (CDDL): A Notational Convention to
+ Express Concise Binary Object Representation (CBOR) and
+ JSON Data Structures", RFC 8610, DOI 10.17487/RFC8610,
+ June 2019, <https://www.rfc-editor.org/info/rfc8610>.
+
+ [RFC8778] Housley, R., "Use of the HSS/LMS Hash-Based Signature
+ Algorithm with CBOR Object Signing and Encryption (COSE)",
+ RFC 8778, DOI 10.17487/RFC8778, April 2020,
+ <https://www.rfc-editor.org/info/rfc8778>.
+
+ [RFC9021] Atkins, D., "Use of the Walnut Digital Signature Algorithm
+ with CBOR Object Signing and Encryption (COSE)", RFC 9021,
+ DOI 10.17487/RFC9021, May 2021,
+ <https://www.rfc-editor.org/info/rfc9021>.
+
+ [RFC9147] Rescorla, E., Tschofenig, H., and N. Modadugu, "The
+ Datagram Transport Layer Security (DTLS) Protocol Version
+ 1.3", RFC 9147, DOI 10.17487/RFC9147, April 2022,
+ <https://www.rfc-editor.org/info/rfc9147>.
+
+ [ROBUST] Fischlin, M., Günther, F., and C. Janson, "Robust
+ Channels: Handling Unreliable Networks in the Record
+ Layers of QUIC and DTLS", February 2020,
+ <https://eprint.iacr.org/2020/718.pdf>.
+
+ [SP800-38D]
+ Dworkin, M., "Recommendation for Block Cipher Modes of
+ Operation: Galois/Counter Mode (GCM) and GMAC", NIST
+ Special Publication 800-38D, November 2007,
+ <https://nvlpubs.nist.gov/nistpubs/Legacy/SP/
+ nistspecialpublication800-38d.pdf>.
+
+ [SP800-56A]
+ Barker, E., Chen, L., Roginsky, A., Vassilev, A., and R.
+ Davis, "Recommendation for Pair-Wise Key Establishment
+ Schemes Using Discrete Logarithm Cryptography", NIST
+ Special Publication 800-56A, Revision 3,
+ DOI 10.6028/NIST.SP.800-56Ar3, April 2018,
+ <https://nvlpubs.nist.gov/nistpubs/SpecialPublications/
+ NIST.SP.800-56Ar2.pdf>.
+
+ [STD90] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data
+ Interchange Format", STD 90, RFC 8259, December 2017,
+ <https://www.rfc-editor.org/info/std90>.
+
+Acknowledgments
+
+ This document is a product of the COSE Working Group of the IETF.
+
+ The following individuals are to blame for getting me started on this
+ project in the first place: Richard Barnes, Matt Miller, and Martin
+ Thomson.
+
+ The initial draft version of the specification was based to some
+ degree on the outputs of the JOSE and S/MIME Working Groups.
+
+ The following individuals provided input into the final form of the
+ document: Carsten Bormann, John Bradley, Brian Campbell, Michael
+ B. Jones, Ilari Liusvaara, Francesca Palombini, Ludwig Seitz, and
+ Göran Selander.
+
+Author's Address
+
+ Jim Schaad
+ August Cellars