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