RFC 8103
Using ChaCha20-Poly1305 Authenticated Encryption in the Cryptographic Message Syntax (CMS)
RFC 8103: Using ChaCha20-Poly1305 Authenticated Encryption in the Cryptographic Message Syntax (CMS) π
Okay bestie, the header facts first π. This one is RFC 8103, written by R. Housley of Vigil Security π§βπ». It's a Standards Track document, which means it's the real deal, and it's dated February 2017 π . It comes from the Internet Engineering Task Force (IETF) πΈ and has ISSN 2070-1721. The header doesn't list anything it obsoletes or updates, so it's standing on its own β¨.
Abstract β¨
Okay so this doc explains how to use ChaCha20-Poly1305 Authenticated Encryption inside the Cryptographic Message Syntax (CMS) π. ChaCha20-Poly1305 is an authenticated encryption algorithm built from the ChaCha stream cipher and the Poly1305 authenticator. It's giving secure and efficient π .
Status of This Memo π§Ύ
This is an Internet Standards Track document π.
This one is a product of the IETF, so it basically represents the consensus of the whole IETF community π«Ά. It got public review and was approved for publication by the Internet Engineering Steering Group (IESG). For more on Internet Standards, check Section 2 of RFC 7841 π.
Info about the current status of this document, any errata, and how to send feedback is at http://www.rfc-editor.org/info/rfc8103 π¬.
Copyright Notice Β©οΈ
Copyright (c) 2017 IETF Trust and the persons identified as the document authors. All rights reserved π.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info), as they stand on the date this document was published. Please read these carefully, because they spell out your rights and restrictions for this document π§. Code Components extracted from this document must include Simplified BSD License text, as described in Section 4.e of the Trust Legal Provisions, and they come without warranty, as described in the Simplified BSD License β οΈ.
Table of Contents ποΈ
1. Introduction ....................................................2
1.1. The ChaCha20 and Poly1305 AEAD Construction ................3
1.2. ASN.1 ......................................................3
1.3. Terminology ................................................3
2. Key Management ..................................................4
3. Using the AEAD_CHACHA20_POLY1305 Algorithm with
AuthEnvelopedData ...............................................4
4. S/MIME Capabilities Attribute ...................................5
5. IANA Considerations .............................................6
6. Security Considerations .........................................6
7. References ......................................................7
7.1. Normative References .......................................7
7.2. Informative References .....................................8
Appendix A. ASN.1 Module ...........................................9
Acknowledgements ...................................................9
Author's Address ...................................................9
1. Introduction β¨
Okay so this doc is the rulebook for using ChaCha20-Poly1305 Authenticated Encryption with the Cryptographic Message Syntax (CMS) [CMS] authenticated-enveloped-data content type [AUTHENV] π.
ChaCha [CHACHA] is a stream cipher that D. J. Bernstein developed in 2008 π¦. It's a refinement of Salsa20, which is one of the ciphers in the eSTREAM portfolio [ESTREAM] π§.
ChaCha20 is the 20-round version of ChaCha. It needs a 256-bit key and a 96-bit nonce π. [FORIETF] gives a detailed algorithm description, examples, and test vectors for ChaCha20 π.
Poly1305 [POLY1305] is a Wegman-Carter, one-time authenticator that D. J. Bernstein designed πΈ. It makes a 16-byte authentication tag and needs a 256-bit key that gets used once. [FORIETF] also has the detailed algorithm description, examples, and test vectors for Poly1305 π.
ChaCha20 and Poly1305 were both designed to be fast in software. They can usually run with few resources and cheap operations, so they fit all kinds of systems π. They were also designed to keep information from leaking through side channels π.
1.1. The ChaCha20 and Poly1305 AEAD Construction
ChaCha20 and Poly1305 got combined into an Authenticated Encryption with Associated Data (AEAD) algorithm [AEAD] π. People often call this AEAD algorithm AEAD_CHACHA20_POLY1305, and [FORIETF] describes it π .
AEAD_CHACHA20_POLY1305 takes four inputs: a 256-bit key, a 96-bit nonce, a plaintext of any length, and additional authenticated data (AAD) of any length. As the name says, a nonce value cannot be used securely more than once with the same key π«π.
AEAD_CHACHA20_POLY1305 makes two outputs: ciphertext the same length as the plaintext, and a 128-bit authentication tag π.
Decryption with AEAD_CHACHA20_POLY1305 looks a lot like encryption, just flipped πͺ. The ciphertext and plaintext swap roles, so the ChaCha20 encryption function runs on the ciphertext to get the plaintext back. The Poly1305 function runs over the AAD and the ciphertext, not the plaintext. Then the resulting authentication tag gets bitwise compared to the received one. The message is authenticated if and only if the calculated and received tags match β .
1.2. ASN.1
CMS values get generated using ASN.1 [X680], which uses the Basic Encoding Rules (BER) and the Distinguished Encoding Rules (DER) [X690] π§©.
1.3. Terminology
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [STDWORDS] π.
2. Key Management π
Reusing an AEAD_CHACHA20_POLY1305 nonce value with the same key destroys the security guarantees π. It can be extremely hard to use a statically configured AEAD_CHACHA20_POLY1305 key and never repeat a nonce value π. That's why the CMS authenticated-enveloped-data content type supports four key management techniques that let a fresh AEAD_CHACHA20_POLY1305 key be used as the content-authenticated-encryption key for a single protected content π:
- Key Transport: the fresh content-authenticated-encryption key is encrypted in the recipient's public key.
- Key Agreement: the recipient's public key and the sender's private key are used to generate a pairwise symmetric key-encryption key, and then the fresh content-authenticated-encryption key is encrypted in the pairwise symmetric key.
- Symmetric Key-Encryption Keys: the fresh content-authenticated-encryption key is encrypted in a previously distributed symmetric key-encryption key.
- Passwords: the fresh content-authenticated-encryption key is encrypted in a key-encryption key that is derived from a password or other shared secret value.
Besides these four general techniques, CMS supports other key management techniques too. See Section 6.2.5 of [CMS] π. Since the properties of these other techniques are unknown, no statement can be made about whether they support fresh content-authenticated-encryption keys π€·ββοΈ. If one of these other key management techniques is supported, designers and implementers must do their own analysis. π§
3. Using the AEAD_CHACHA20_POLY1305 Algorithm with AuthEnvelopedData π
This section lays out the conventions that CMS implementations follow when they support the authenticated-enveloped-data content type and the AEAD_CHACHA20_POLY1305 algorithm π.
The AEAD_CHACHA20_POLY1305 algorithm identifier lives in the AuthEnvelopedData EncryptedContentInfo contentEncryptionAlgorithm field π.
The AEAD_CHACHA20_POLY1305 algorithm does three jobs: (1) it authenticates the attributes in the AuthEnvelopedData authAttrs field, if any are present, (2) it enciphers the content in the AuthEnvelopedData EncryptedContentInfo encryptedContent field, and (3) it provides the message authentication code (MAC) in the AuthEnvelopedData mac field π‘οΈ. The authenticated attributes get DER encoded to make the AAD input value for the AEAD_CHACHA20_POLY1305 algorithm. The ciphertext and the MAC are the two outputs of the algorithm. The MAC, which [FORIETF] calls the authentication tag, protects the integrity of both the AuthEnvelopedData authAttrs and the AuthEnvelopedData EncryptedContentInfo encryptedContent π.
Neither the plaintext content nor the optional AAD inputs need padding before the AEAD_CHACHA20_POLY1305 algorithm runs π.
There's one algorithm identifier for the AEAD_CHACHA20_POLY1305 algorithm πͺͺ:
id-alg-AEADChaCha20Poly1305 OBJECT IDENTIFIER ::=
{ iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
pkcs9(9) smime(16) alg(3) 18 }
The AlgorithmIdentifier parameters field MUST be present, and the parameters field MUST contain an AEADChaCha20Poly1305Nonce π―:
AEADChaCha20Poly1305Nonce ::= OCTET STRING (SIZE(12))
The AEADChaCha20Poly1305Nonce holds a 12-octet nonce π’. With CMS, the content-authenticated-encryption key is normally used for a single content π. Within the scope of any content-authenticated-encryption key, the nonce value MUST be unique. β¨ That is, the set of nonce values used with any given key MUST NOT contain any duplicate values π¨.
Part 1 of 2. Part 2 picks up with Section 4, the S/MIME Capabilities Attribute. π
6. Security Considerations πβ¨
Okay bestie, this is the serious part, so listen up ππ . CMS AuthEnvelopedData gives you every tool you need to avoid reusing the same nonce value under the same key. Check out Section 2 of this document for the details π. RFC 7539 [FORIETF] explains what happens when you repeat a nonce, and it is not cute π:
Consequences of repeating a nonce: If a nonce is repeated, then both the one-time Poly1305 key and the keystream are identical between the messages. This reveals the XOR of the plaintexts, because the XOR of the plaintexts is equal to the XOR of the ciphertexts.
So yeah, never reuse a nonce. Ever. π ββοΈ
Here's another thing to keep in mind π§. When you use AEAD_CHACHA20_POLY1305, the ciphertext is always the same size as the original plaintext. So if hiding how big your message is matters to you, you'll need some other mechanism working alongside AEAD_CHACHA20_POLY1305 to cover that π.
Now for the limits π. A single invocation of AEAD_CHACHA20_POLY1305 can handle 2^32-1 blocks of 64 octets each, and that comes from the size of the block counter field in the ChaCha20 block function. That works out to a total of 247,877,906,880 octets, which is very likely enough for any CMS content type π. The ciphertext length field in the authentication buffer can hold 2^64 octets, which is way more than anyone needs, but hey, go big or go home π.
The AEAD_CHACHA20_POLY1305 construction is a brand new combo of ChaCha20 and Poly1305 π§ͺ. You can read the security analysis of this composition in [PROCTER] π.
Last but definitely not least: implementations must randomly generate content-authenticated-encryption keys π. If you use a bad pseudorandom number generator (PRNG) to make your keys, you can end up with little or no security at all π. An attacker might be able to recreate the PRNG environment that produced your keys, then search through that small pile of possibilities instead of brute forcing the whole key space. Generating good random numbers is genuinely hard, so RFC 4086 [RANDOM] has some super important guidance on this, and you should absolutely read it π«Ά.
7. References π
7.1. Normative References
- [AUTHENV] Housley, R., "Cryptographic Message Syntax (CMS) Authenticated-Enveloped-Data Content Type", RFC 5083, DOI 10.17487/RFC5083, November 2007, <http://www.rfc-editor.org/info/rfc5083>.
- [CMS] Housley, R., "Cryptographic Message Syntax (CMS)", STD 70, RFC 5652, DOI 10.17487/RFC5652, September 2009, <http://www.rfc-editor.org/info/rfc5652>.
- [FORIETF] Nir, Y. and A. Langley, "ChaCha20 and Poly1305 for IETF Protocols", RFC 7539, DOI 10.17487/RFC7539, May 2015, <http://www.rfc-editor.org/info/rfc7539>.
- [MSG] Ramsdell, B. and S. Turner, "Secure/Multipurpose Internet Mail Extensions (S/MIME) Version 3.2 Message Specification", RFC 5751, DOI 10.17487/RFC5751, January 2010, <http://www.rfc-editor.org/info/rfc5751>.
- [STDWORDS] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <http://www.rfc-editor.org/info/rfc2119>.
- [X680] ITU-T, "Information technology - Abstract Syntax Notation One (ASN.1): Specification of basic notation", ITU-T Recommendation X.680, ISO/IEC 8824-1, August 2015, <https://www.itu.int/rec/T-REC-X.680/en>.
- [X690] ITU-T, "Information technology - ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)", ITU-T Recommendation X.690, ISO/IEC 8825-1, August 2015, <https://www.itu.int/rec/T-REC-X.690/en>.
7.2. Informative References
- [AEAD] McGrew, D., "An Interface and Algorithms for Authenticated Encryption", RFC 5116, DOI 10.17487/RFC5116, January 2008, <http://www.rfc-editor.org/info/rfc5116>.
- [CHACHA] Bernstein, D., "ChaCha, a variant of Salsa20", January 2008, <http://cr.yp.to/chacha/chacha-20080128.pdf>.
- [ESTREAM] Babbage, S., DeCanniere, C., Cantenaut, A., Cid, C., Gilbert, H., Johansson, T., Parker, M., Preneel, B., Rijmen, V., and M. Robshaw, "The eSTREAM Portfolio (rev. 1)", September 2008, <http://www.ecrypt.eu.org/stream/finallist.html>.
- [POLY1305] Bernstein, D., "The Poly1305-AES message-authentication code", March 2005, <http://cr.yp.to/mac/poly1305-20050329.pdf>.
- [PROCTER] Procter, G., "A Security Analysis of the Composition of ChaCha20 and Poly1305", August 2014, <http://eprint.iacr.org/2014/613.pdf>.
- [RANDOM] Eastlake 3rd, D., Schiller, J., and S. Crocker, "Randomness Requirements for Security", BCP 106, RFC 4086, DOI 10.17487/RFC4086, June 2005, <http://www.rfc-editor.org/info/rfc4086>.
Appendix A. ASN.1 Module π§©
Here's the ASN.1 module, copied exactly so your parser stays happy π:
CMS-AEADChaCha20Poly1305
{ iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
pkcs-9(9) smime(16) modules(0) 66 }
DEFINITIONS IMPLICIT TAGS ::= BEGIN
IMPORTS
CONTENT-ENCRYPTION
FROM AlgorithmInformation-2009
{ iso(1) identified-organization(3) dod(6) internet(1)
security(5) mechanisms(5) pkix(7) id-mod(0)
id-mod-algorithmInformation-02(58) };
-- EXPORTS All
AEADContentEncryptionAlgs CONTENT-ENCRYPTION ::=
{ cea-AEADChaCha20Poly1305, ... }
cea-AEADChaCha20Poly1305 CONTENT-ENCRYPTION ::= {
IDENTIFIER id-alg-AEADChaCha20Poly1305
PARAMS TYPE AEADChaCha20Poly1305Nonce ARE required
SMIME-CAPS { IDENTIFIED BY id-alg-AEADChaCha20Poly1305 } }
id-alg-AEADChaCha20Poly1305 OBJECT IDENTIFIER ::=
{ iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
pkcs9(9) smime(16) alg(3) 18 }
AEADChaCha20Poly1305Nonce ::= OCTET STRING (SIZE(12))
END
Acknowledgements π«Ά
Huge thanks to Jim Schaad, Daniel Migault, Stephen Farrell, Yoav Nir, and Niclas Comstedt for their review and insightful comments πΈ. You all are iconic π.
Author's Address ποΈ
Russell Housley
Vigil Security, LLC
918 Spring Knoll Drive
Herndon, VA 20170
United States of America
Email: housley@vigilsec.com
π¦ where this page comes from
- ietf: rfc8103 2017-02
- π girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms