summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc9580.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rfc/rfc9580.txt')
-rw-r--r--doc/rfc/rfc9580.txt9138
1 files changed, 9138 insertions, 0 deletions
diff --git a/doc/rfc/rfc9580.txt b/doc/rfc/rfc9580.txt
new file mode 100644
index 0000000..681e5c4
--- /dev/null
+++ b/doc/rfc/rfc9580.txt
@@ -0,0 +1,9138 @@
+
+
+
+
+Internet Engineering Task Force (IETF) P. Wouters, Ed.
+Request for Comments: 9580 Aiven
+Obsoletes: 4880, 5581, 6637 D. Huigens
+Category: Standards Track Proton AG
+ISSN: 2070-1721 J. Winter
+ Sequoia PGP
+ Y. Niibe
+ FSIJ
+ July 2024
+
+
+ OpenPGP
+
+Abstract
+
+ This document specifies the message formats used in OpenPGP. OpenPGP
+ provides encryption with public key or symmetric cryptographic
+ algorithms, digital signatures, compression, and key management.
+
+ This document is maintained in order to publish all necessary
+ information needed to develop interoperable applications based on the
+ OpenPGP format. It is not a step-by-step cookbook for writing an
+ application. It describes only the format and methods needed to
+ read, check, generate, and write conforming packets crossing any
+ network. It does not deal with storage and implementation questions.
+ It does, however, discuss implementation issues necessary to avoid
+ security flaws.
+
+ This document obsoletes RFCs 4880 ("OpenPGP Message Format"), 5581
+ ("The Camellia Cipher in OpenPGP"), and 6637 ("Elliptic Curve
+ Cryptography (ECC) in OpenPGP").
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 7841.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ https://www.rfc-editor.org/info/rfc9580.
+
+Copyright Notice
+
+ Copyright (c) 2024 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (https://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Revised BSD License text as described in Section 4.e of the
+ Trust Legal Provisions and are provided without warranty as described
+ in the Revised BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction
+ 1.1. Terms
+ 2. General Functions
+ 2.1. Confidentiality via Encryption
+ 2.2. Authentication via Digital Signature
+ 2.3. Compression
+ 2.4. Conversion to Base64
+ 2.5. Signature-Only Applications
+ 3. Data Element Formats
+ 3.1. Scalar Numbers
+ 3.2. Multiprecision Integers
+ 3.2.1. Using MPIs to Encode Other Data
+ 3.3. Key IDs and Fingerprints
+ 3.4. Text
+ 3.5. Time Fields
+ 3.6. Keyrings
+ 3.7. String-to-Key (S2K) Specifier
+ 3.7.1. S2K Specifier Types
+ 3.7.1.1. Simple S2K
+ 3.7.1.2. Salted S2K
+ 3.7.1.3. Iterated and Salted S2K
+ 3.7.1.4. Argon2
+ 3.7.2. S2K Usage
+ 3.7.2.1. Secret Key Encryption
+ 3.7.2.2. Symmetric Key Message Encryption
+ 4. Packet Syntax
+ 4.1. Overview
+ 4.2. Packet Headers
+ 4.2.1. OpenPGP Format Packet Lengths
+ 4.2.1.1. 1-Octet Lengths
+ 4.2.1.2. 2-Octet Lengths
+ 4.2.1.3. 5-Octet Lengths
+ 4.2.1.4. Partial Body Lengths
+ 4.2.2. Legacy Format Packet Lengths
+ 4.2.3. Packet Length Examples
+ 4.3. Packet Criticality
+ 5. Packet Types
+ 5.1. Public Key Encrypted Session Key Packet (Type ID 1)
+ 5.1.1. Version 3 Public Key Encrypted Session Key Packet
+ Format
+ 5.1.2. Version 6 Public Key Encrypted Session Key Packet
+ Format
+ 5.1.3. Algorithm-Specific Fields for RSA Encryption
+ 5.1.4. Algorithm-Specific Fields for Elgamal Encryption
+ 5.1.5. Algorithm-Specific Fields for ECDH Encryption
+ 5.1.6. Algorithm-Specific Fields for X25519 Encryption
+ 5.1.7. Algorithm-Specific Fields for X448 Encryption
+ 5.1.8. Notes on PKESK
+ 5.2. Signature Packet (Type ID 2)
+ 5.2.1. Signature Types
+ 5.2.1.1. Binary Signature (Type ID 0x00) of a Document
+ 5.2.1.2. Text Signature (Type ID 0x01) of a Canonical
+ Document
+ 5.2.1.3. Standalone Signature (Type ID 0x02)
+ 5.2.1.4. Generic Certification Signature (Type ID 0x10) of a
+ User ID and Public Key Packet
+ 5.2.1.5. Persona Certification Signature (Type ID 0x11) of a
+ User ID and Public Key Packet
+ 5.2.1.6. Casual Certification Signature (Type ID 0x12) of a
+ User ID and Public Key Packet
+ 5.2.1.7. Positive Certification Signature (Type ID 0x13) of
+ a User ID and Public Key Packet
+ 5.2.1.8. Subkey Binding Signature (Type ID 0x18)
+ 5.2.1.9. Primary Key Binding Signature (Type ID 0x19)
+ 5.2.1.10. Direct Key Signature (Type ID 0x1F)
+ 5.2.1.11. Key Revocation Signature (Type ID 0x20)
+ 5.2.1.12. Subkey Revocation Signature (Type ID 0x28)
+ 5.2.1.13. Certification Revocation Signature (Type ID 0x30)
+ 5.2.1.14. Timestamp Signature (Type ID 0x40)
+ 5.2.1.15. Third-Party Confirmation Signature (Type ID 0x50)
+ 5.2.1.16. Reserved (Type ID 0xFF)
+ 5.2.2. Version 3 Signature Packet Format
+ 5.2.3. Versions 4 and 6 Signature Packet Formats
+ 5.2.3.1. Algorithm-Specific Fields for RSA Signatures
+ 5.2.3.2. Algorithm-Specific Fields for DSA or ECDSA
+ Signatures
+ 5.2.3.3. Algorithm-Specific Fields for EdDSALegacy
+ Signatures (Deprecated)
+ 5.2.3.4. Algorithm-Specific Fields for Ed25519 Signatures
+ 5.2.3.5. Algorithm-Specific Fields for Ed448 Signatures
+ 5.2.3.6. Notes on Signatures
+ 5.2.3.7. Signature Subpacket Specification
+ 5.2.3.8. Signature Subpacket Types
+ 5.2.3.9. Notes on Subpackets
+ 5.2.3.10. Notes on Self-Signatures
+ 5.2.3.11. Signature Creation Time
+ 5.2.3.12. Issuer Key ID
+ 5.2.3.13. Key Expiration Time
+ 5.2.3.14. Preferred Symmetric Ciphers for v1 SEIPD
+ 5.2.3.15. Preferred AEAD Ciphersuites
+ 5.2.3.16. Preferred Hash Algorithms
+ 5.2.3.17. Preferred Compression Algorithms
+ 5.2.3.18. Signature Expiration Time
+ 5.2.3.19. Exportable Certification
+ 5.2.3.20. Revocable
+ 5.2.3.21. Trust Signature
+ 5.2.3.22. Regular Expression
+ 5.2.3.23. Revocation Key (Deprecated)
+ 5.2.3.24. Notation Data
+ 5.2.3.25. Key Server Preferences
+ 5.2.3.26. Preferred Key Server
+ 5.2.3.27. Primary User ID
+ 5.2.3.28. Policy URI
+ 5.2.3.29. Key Flags
+ 5.2.3.30. Signer's User ID
+ 5.2.3.31. Reason for Revocation
+ 5.2.3.32. Features
+ 5.2.3.33. Signature Target
+ 5.2.3.34. Embedded Signature
+ 5.2.3.35. Issuer Fingerprint
+ 5.2.3.36. Intended Recipient Fingerprint
+ 5.2.4. Computing Signatures
+ 5.2.4.1. Notes about Signature Computation
+ 5.2.5. Malformed and Unknown Signatures
+ 5.3. Symmetric Key Encrypted Session Key Packet (Type ID 3)
+ 5.3.1. Version 4 Symmetric Key Encrypted Session Key Packet
+ Format
+ 5.3.2. Version 6 Symmetric Key Encrypted Session Key Packet
+ Format
+ 5.4. One-Pass Signature Packet (Type ID 4)
+ 5.5. Key Material Packets
+ 5.5.1. Key Packet Variants
+ 5.5.1.1. Public Key Packet (Type ID 6)
+ 5.5.1.2. Public Subkey Packet (Type ID 14)
+ 5.5.1.3. Secret Key Packet (Type ID 5)
+ 5.5.1.4. Secret Subkey Packet (Type ID 7)
+ 5.5.2. Public Key Packet Formats
+ 5.5.2.1. Version 3 Public Keys
+ 5.5.2.2. Version 4 Public Keys
+ 5.5.2.3. Version 6 Public Keys
+ 5.5.3. Secret Key Packet Formats
+ 5.5.4. Key IDs and Fingerprints
+ 5.5.4.1. Version 3 Key ID and Fingerprint
+ 5.5.4.2. Version 4 Key ID and Fingerprint
+ 5.5.4.3. Version 6 Key ID and Fingerprint
+ 5.5.5. Algorithm-Specific Parts of Keys
+ 5.5.5.1. Algorithm-Specific Part for RSA Keys
+ 5.5.5.2. Algorithm-Specific Part for DSA Keys
+ 5.5.5.3. Algorithm-Specific Part for Elgamal Keys
+ 5.5.5.4. Algorithm-Specific Part for ECDSA Keys
+ 5.5.5.5. Algorithm-Specific Part for EdDSALegacy Keys
+ (Deprecated)
+ 5.5.5.6. Algorithm-Specific Part for ECDH Keys
+ 5.5.5.7. Algorithm-Specific Part for X25519 Keys
+ 5.5.5.8. Algorithm-Specific Part for X448 Keys
+ 5.5.5.9. Algorithm-Specific Part for Ed25519 Keys
+ 5.5.5.10. Algorithm-Specific Part for Ed448 Keys
+ 5.6. Compressed Data Packet (Type ID 8)
+ 5.7. Symmetrically Encrypted Data Packet (Type ID 9)
+ 5.8. Marker Packet (Type ID 10)
+ 5.9. Literal Data Packet (Type ID 11)
+ 5.9.1. Special Filename _CONSOLE (Deprecated)
+ 5.10. Trust Packet (Type ID 12)
+ 5.11. User ID Packet (Type ID 13)
+ 5.12. User Attribute Packet (Type ID 17)
+ 5.12.1. Image Attribute Subpacket
+ 5.13. Symmetrically Encrypted and Integrity Protected Data Packet
+ (Type ID 18)
+ 5.13.1. Version 1 Symmetrically Encrypted and Integrity
+ Protected Data Packet Format
+ 5.13.2. Version 2 Symmetrically Encrypted and Integrity
+ Protected Data Packet Format
+ 5.13.3. EAX Mode
+ 5.13.4. OCB Mode
+ 5.13.5. GCM Mode
+ 5.14. Padding Packet (Type ID 21)
+ 6. Base64 Conversions
+ 6.1. Optional Checksum
+ 6.1.1. An Implementation of the CRC24 in "C"
+ 6.2. Forming ASCII Armor
+ 6.2.1. Armor Header Line
+ 6.2.2. Armor Headers
+ 6.2.2.1. "Version" Armor Header
+ 6.2.2.2. "Comment" Armor Header
+ 6.2.2.3. "Hash" Armor Header
+ 6.2.2.4. "Charset" Armor Header
+ 6.2.3. Armor Tail Line
+ 7. Cleartext Signature Framework
+ 7.1. Cleartext Signed Message Structure
+ 7.2. Dash-Escaped Text
+ 7.3. Issues with the Cleartext Signature Framework
+ 8. Regular Expressions
+ 9. Constants
+ 9.1. Public Key Algorithms
+ 9.2. ECC Curves for OpenPGP
+ 9.2.1. Curve-Specific Wire Formats
+ 9.3. Symmetric Key Algorithms
+ 9.4. Compression Algorithms
+ 9.5. Hash Algorithms
+ 9.6. AEAD Algorithms
+ 10. Packet Sequence Composition
+ 10.1. Transferable Public Keys
+ 10.1.1. OpenPGP Version 6 Certificate Structure
+ 10.1.2. OpenPGP Version 6 Revocation Certificate
+ 10.1.3. OpenPGP Version 4 Certificate Structure
+ 10.1.4. OpenPGP Version 3 Key Structure
+ 10.1.5. Common Requirements
+ 10.2. Transferable Secret Keys
+ 10.3. OpenPGP Messages
+ 10.3.1. Unwrapping Encrypted and Compressed Messages
+ 10.3.2. Additional Constraints on Packet Sequences
+ 10.3.2.1. Packet Versions in Encrypted Messages
+ 10.3.2.2. Packet Versions in Signatures
+ 10.4. Detached Signatures
+ 11. Elliptic Curve Cryptography
+ 11.1. ECC Curves
+ 11.2. EC Point Wire Formats
+ 11.2.1. SEC1 EC Point Wire Format
+ 11.2.2. Prefixed Native EC Point Wire Format
+ 11.2.3. Notes on EC Point Wire Formats
+ 11.3. EC Scalar Wire Formats
+ 11.3.1. EC Octet String Wire Format
+ 11.3.2. EC Prefixed Octet String Wire Format
+ 11.4. Key Derivation Function
+ 11.5. ECDH Algorithm
+ 11.5.1. ECDH Parameters
+ 12. Notes on Algorithms
+ 12.1. PKCS#1 Encoding in OpenPGP
+ 12.1.1. EME-PKCS1-v1_5-ENCODE
+ 12.1.2. EME-PKCS1-v1_5-DECODE
+ 12.1.3. EMSA-PKCS1-v1_5
+ 12.2. Symmetric Algorithm Preferences
+ 12.2.1. Plaintext
+ 12.3. Other Algorithm Preferences
+ 12.3.1. Compression Preferences
+ 12.3.1.1. Uncompressed
+ 12.3.2. Hash Algorithm Preferences
+ 12.4. RSA
+ 12.5. DSA
+ 12.6. Elgamal
+ 12.7. EdDSA
+ 12.8. Reserved Algorithm IDs
+ 12.9. CFB Mode
+ 12.10. Private or Experimental Parameters
+ 12.11. Meta Considerations for Expansion
+ 13. Security Considerations
+ 13.1. SHA-1 Collision Detection
+ 13.2. Advantages of Salted Signatures
+ 13.3. Elliptic Curve Side Channels
+ 13.4. Risks of a Quick Check Oracle
+ 13.5. Avoiding Leaks from PKCS#1 Errors
+ 13.6. Fingerprint Usability
+ 13.7. Avoiding Ciphertext Malleability
+ 13.8. Secure Use of the v2 SEIPD Session-Key-Reuse Feature
+ 13.9. Escrowed Revocation Signatures
+ 13.10. Random Number Generation and Seeding
+ 13.11. Traffic Analysis
+ 13.12. Surreptitious Forwarding
+ 13.13. Hashed vs. Unhashed Subpackets
+ 13.14. Malicious Compressed Data
+ 14. Implementation Considerations
+ 14.1. Constrained Legacy Fingerprint Storage for Version 6 Keys
+ 15. IANA Considerations
+ 15.1. Renamed Protocol Group
+ 15.2. Renamed and Updated Registries
+ 15.3. Removed Registry
+ 15.4. Added Registries
+ 15.5. Registration Policies
+ 15.5.1. Registries That Use RFC Required
+ 15.6. Designated Experts
+ 15.6.1. Key and Signature Versions
+ 15.6.2. Encryption Versions
+ 15.6.3. Algorithms
+ 15.6.3.1. Elliptic Curve Algorithms
+ 15.6.3.2. Symmetric Key Algorithms
+ 15.6.3.3. Hash Algorithms
+ 16. References
+ 16.1. Normative References
+ 16.2. Informative References
+ Appendix A. Test Vectors
+ A.1. Sample Version 4 Ed25519Legacy Key
+ A.2. Sample Version 4 Ed25519Legacy Signature
+ A.3. Sample Version 6 Certificate (Transferable Public Key)
+ A.3.1. Hashed Data Stream for Signature Verification
+ A.4. Sample Version 6 Secret Key (Transferable Secret Key)
+ A.5. Sample Locked Version 6 Secret Key (Transferable Secret
+ Key)
+ A.5.1. Intermediate Data for Locked Primary Key
+ A.5.2. Intermediate Data for Locked Subkey
+ A.6. Sample Cleartext Signed Message
+ A.7. Sample Inline-Signed Message
+ A.8. Sample X25519-AEAD-OCB Encryption and Decryption
+ A.8.1. Sample Version 6 Public Key Encrypted Session Key
+ Packet
+ A.8.2. X25519 Encryption/Decryption of the Session Key
+ A.8.3. Sample v2 SEIPD Packet
+ A.8.4. Decryption of Data
+ A.8.5. Complete X25519-AEAD-OCB Encrypted Packet Sequence
+ A.9. Sample AEAD-EAX Encryption and Decryption
+ A.9.1. Sample Version 6 Symmetric Key Encrypted Session Key
+ Packet
+ A.9.2. Starting AEAD-EAX Decryption of the Session Key
+ A.9.3. Sample v2 SEIPD Packet
+ A.9.4. Decryption of Data
+ A.9.5. Complete AEAD-EAX Encrypted Packet Sequence
+ A.10. Sample AEAD-OCB Encryption and Decryption
+ A.10.1. Sample Version 6 Symmetric Key Encrypted Session Key
+ Packet
+ A.10.2. Starting AEAD-OCB Decryption of the Session Key
+ A.10.3. Sample v2 SEIPD Packet
+ A.10.4. Decryption of Data
+ A.10.5. Complete AEAD-OCB Encrypted Packet Sequence
+ A.11. Sample AEAD-GCM Encryption and Decryption
+ A.11.1. Sample Version 6 Symmetric Key Encrypted Session Key
+ Packet
+ A.11.2. Starting AEAD-GCM Decryption of the Session Key
+ A.11.3. Sample v2 SEIPD Packet
+ A.11.4. Decryption of Data
+ A.11.5. Complete AEAD-GCM Encrypted Packet Sequence
+ A.12. Sample Messages Encrypted Using Argon2
+ A.12.1. V4 SKESK Using Argon2 with AES-128
+ A.12.2. V4 SKESK Using Argon2 with AES-192
+ A.12.3. V4 SKESK Using Argon2 with AES-256
+ Appendix B. Upgrade Guidance (Adapting Implementations from RFCs
+ 4880 and 6637)
+ B.1. Terminology Changes
+ Appendix C. Errata Addressed by This Document
+ Acknowledgements
+ Authors' Addresses
+
+1. Introduction
+
+ This document provides information on the message-exchange packet
+ formats used by OpenPGP to provide encryption, decryption, signing,
+ and key management functions. It is a revision of [RFC4880]
+ ("OpenPGP Message Format"), which is a revision of [RFC2440], which
+ itself replaces [RFC1991] ("PGP Message Exchange Formats").
+
+ This document obsoletes [RFC4880] (OpenPGP), [RFC5581] (Camellia in
+ OpenPGP), and [RFC6637] (Elliptic Curves in OpenPGP). At the time of
+ writing, this document incorporates all outstanding verified errata,
+ which are listed in Appendix C.
+
+ Software that has already implemented those previous specifications
+ may want to review Appendix B for pointers to what has changed.
+
+1.1. Terms
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
+ capitals, as shown here.
+
+ The key words "Private Use", "Specification Required", and "RFC
+ Required" that appear in this document when used to describe
+ namespace allocation are to be interpreted as described in [RFC8126].
+
+ Some terminology used in this document has been improved from
+ previous versions of the OpenPGP specification. See Appendix B.1 for
+ more details.
+
+2. General Functions
+
+ OpenPGP provides data confidentiality and integrity for messages and
+ data files by using public key and/or symmetric encryption and
+ digital signatures. It provides formats for encoding and
+ transferring encrypted and/or signed messages. In addition, OpenPGP
+ provides functionality for encoding and transferring keys and
+ certificates, though key storage and management are beyond the scope
+ of this document.
+
+2.1. Confidentiality via Encryption
+
+ OpenPGP combines symmetric key encryption and (optionally) public key
+ encryption to provide confidentiality. When using public keys, first
+ the object is encrypted using a symmetric key encryption algorithm.
+ Each symmetric key is used only once, for a single object. A new
+ "session key" is generated as a random number for each object
+ (sometimes referred to as a "session"). Since it is used only once,
+ the session key is bound to the message and transmitted with it. To
+ protect the key, it is encrypted with the receiver's public key. The
+ sequence is as follows:
+
+ 1. The sender creates a message.
+
+ 2. The sending OpenPGP implementation generates a random session key
+ for this message.
+
+ 3. The session key is encrypted using each recipient's public key.
+ These "encrypted session keys" start the message.
+
+ 4. The sending OpenPGP implementation optionally compresses the
+ message and then encrypts it using a message key derived from the
+ session key. The encrypted message forms the remainder of the
+ OpenPGP Message.
+
+ 5. The receiving OpenPGP implementation decrypts the session key
+ using the recipient's private key.
+
+ 6. The receiving OpenPGP implementation decrypts the message using
+ the message key derived from the session key. If the message was
+ compressed, it will be decompressed.
+
+ When using symmetric key encryption, a similar process as described
+ above is used, but the session key is encrypted with a symmetric
+ algorithm derived from a shared secret.
+
+ Both digital signature and confidentiality services may be applied to
+ the same message. First, a signature is generated for the message
+ and attached to the message. Then, the message plus signature is
+ encrypted using a symmetric message key derived from the session key.
+ Finally, the session key is encrypted using public key encryption and
+ prefixed to the encrypted block.
+
+2.2. Authentication via Digital Signature
+
+ The digital signature uses a cryptographic hash function and a public
+ key algorithm capable of signing. The sequence is as follows:
+
+ 1. The sender creates a message.
+
+ 2. The sending implementation generates a hash digest of the
+ message.
+
+ 3. The sending implementation generates a signature from the hash
+ digest using the sender's private key.
+
+ 4. The signature is attached to or transmitted alongside the
+ message.
+
+ 5. The receiving implementation obtains a copy of the message and
+ the message signature.
+
+ 6. The receiving implementation generates a new hash digest for the
+ received message and verifies it using the message's signature.
+ If the verification is successful, the message is accepted as
+ authentic.
+
+2.3. Compression
+
+ An OpenPGP implementation MAY support the compression of data. Many
+ existing OpenPGP Messages are compressed. Implementers, such as
+ those working on constrained implementations that do not want to
+ support compression, might want to consider at least implementing
+ decompression.
+
+2.4. Conversion to Base64
+
+ OpenPGP's underlying representation for encrypted messages,
+ signatures, keys, and certificates is a stream of arbitrary octets.
+ Some systems only permit the use of blocks consisting of 7-bit,
+ printable text. For transporting OpenPGP's raw binary octets through
+ channels that are not safe to transport raw binary data, a printable
+ encoding of these binary octets is defined. The raw 8-bit binary
+ octet stream can be converted to a stream of printable ASCII
+ characters using base64 encoding in a format called "ASCII Armor"
+ (see Section 6).
+
+ Implementations SHOULD support base64 conversions.
+
+2.5. Signature-Only Applications
+
+ OpenPGP is designed for applications that use both encryption and
+ signatures, but there are a number of use cases that only require a
+ signature-only implementation. Although this specification requires
+ both encryption and signatures, it is reasonable for there to be
+ subset implementations that are non-conformant only in that they omit
+ encryption support.
+
+3. Data Element Formats
+
+ This section describes the data elements used by OpenPGP.
+
+3.1. Scalar Numbers
+
+ Scalar numbers are unsigned and always stored in big-endian format.
+ Using n[k] to refer to the kth octet being interpreted, the value of
+ a 2-octet scalar is ((n[0] << 8) + n[1]). The value of a 4-octet
+ scalar is ((n[0] << 24) + (n[1] << 16) + (n[2] << 8) + n[3]).
+
+3.2. Multiprecision Integers
+
+ Multiprecision Integers (MPIs) are unsigned integers used to hold
+ large integers such as the ones used in cryptographic calculations.
+
+ An MPI consists of two pieces: a 2-octet scalar that is the length of
+ the MPI in bits, followed by a string of octets that contain the
+ actual integer.
+
+ These octets form a big-endian number; a big-endian number can be
+ made into an MPI by prefixing it with the appropriate length.
+
+ Examples:
+
+ (Note that all numbers in the octet strings identified by square
+ brackets are in hexadecimal.)
+
+ The string of octets [00 00] forms an MPI with the value 0.
+
+ The string of octets [00 01 01] forms an MPI with the value 1.
+
+ The string [00 09 01 FF] forms an MPI with the value 511.
+
+ Additional rules:
+
+ * The size of an MPI is ((MPI.length + 7) / 8) + 2 octets.
+
+ * The length field of an MPI describes the length starting from its
+ most significant non-zero bit. Thus, the MPI [00 02 01] is not
+ formed correctly. It should be [00 01 01]. When parsing an MPI
+ in a version 6 Key, Signature, or Public Key Encrypted Session Key
+ (PKESK) packet, the implementation MUST check that the encoded
+ length matches the length starting from the most significant non-
+ zero bit; if it doesn't match, reject the packet as malformed.
+
+ * Unused bits of an MPI MUST be zero.
+
+3.2.1. Using MPIs to Encode Other Data
+
+ Note that in some places, MPIs are used to encode non-integer data,
+ such as an elliptic curve (EC) point (see Section 11.2) or an octet
+ string of known, fixed length (see Section 11.3). The wire
+ representation is the same: 2 octets of length in bits counted from
+ the first non-zero bit, followed by the smallest series of octets
+ that can represent the value while stripping off any leading zero
+ octets.
+
+3.3. Key IDs and Fingerprints
+
+ A Key ID is an 8-octet scalar that identifies a key. Implementations
+ SHOULD NOT assume that Key IDs are unique. A fingerprint is more
+ likely to be unique than a Key ID. The fingerprint and Key ID of a
+ key are calculated differently according to the version of the key.
+
+ Section 5.5.4 describes how Key IDs and Fingerprints are formed.
+
+3.4. Text
+
+ Unless otherwise specified, the character set for text is the UTF-8
+ [RFC3629] encoding of Unicode [ISO10646].
+
+3.5. Time Fields
+
+ A time field is an unsigned 4-octet number containing the number of
+ seconds elapsed since midnight, 1 January 1970 UTC.
+
+3.6. Keyrings
+
+ A keyring is a collection of one or more keys in a file or database.
+ Typically, a keyring is simply a sequential list of keys, but it may
+ be any suitable database. It is beyond the scope of this
+ specification to discuss the details of keyrings or other databases.
+
+3.7. String-to-Key (S2K) Specifier
+
+ A string-to-key (S2K) Specifier is used to convert a passphrase
+ string into a symmetric key encryption/decryption key. Passphrases
+ requiring use of S2K conversion are currently used in two places: to
+ encrypt the secret part of private keys and for symmetrically
+ encrypted messages.
+
+3.7.1. S2K Specifier Types
+
+ There are four types of S2K Specifiers currently specified and some
+ reserved values:
+
+ +=========+==============+===============+==============+===========+
+ | ID | S2K Type | S2K Field | Generate? | Reference |
+ | | | Size | | |
+ | | | (Octets) | | |
+ +=========+==============+===============+==============+===========+
+ | 0 | Simple S2K | 2 | No | Section |
+ | | | | | 3.7.1.1 |
+ +---------+--------------+---------------+--------------+-----------+
+ | 1 | Salted S2K | 10 | Only when | Section |
+ | | | | string is | 3.7.1.2 |
+ | | | | high entropy | |
+ +---------+--------------+---------------+--------------+-----------+
+ | 2 | Reserved | - | No | |
+ | | value | | | |
+ +---------+--------------+---------------+--------------+-----------+
+ | 3 | Iterated and | 11 | Yes | Section |
+ | | Salted S2K | | | 3.7.1.3 |
+ +---------+--------------+---------------+--------------+-----------+
+ | 4 | Argon2 | 20 | Yes | Section |
+ | | | | | 3.7.1.4 |
+ +---------+--------------+---------------+--------------+-----------+
+ | 100-110 | Private or | - | As | |
+ | | Experimental | | appropriate | |
+ | | Use | | | |
+ +---------+--------------+---------------+--------------+-----------+
+
+ Table 1: OpenPGP String-to-Key (S2K) Types Registry
+
+ The S2K Specifier Types are described in the subsections below. If
+ "Yes" is not present in the "Generate?" column, the S2K entry is used
+ only for reading in backward-compatibility mode and SHOULD NOT be
+ used to generate new output.
+
+3.7.1.1. Simple S2K
+
+ Simple S2K directly hashes the string to produce the key data. This
+ hashing is done as shown below.
+
+ Octet 0: 0x00
+ Octet 1: hash algorithm
+
+ Simple S2K hashes the passphrase to produce the session key. The
+ manner in which this is done depends on the size of the session key
+ (which depends on the cipher the session key will be used with) and
+ the size of the hash algorithm's output. If the hash size is greater
+ than the session key size, the high-order (leftmost) octets of the
+ hash are used as the key.
+
+ If the hash size is less than the key size, multiple instances of the
+ hash context are created -- enough to produce the required key data.
+ These instances are preloaded with 0, 1, 2, ... octets of zeros (that
+ is, the first instance has no preloading, the second gets preloaded
+ with 1 octet of zero, the third is preloaded with 2 octets of zeros,
+ and so forth).
+
+ As the data is hashed, it is given independently to each hash
+ context. Since the contexts have been initialized differently, they
+ will each produce a different hash output. Once the passphrase is
+ hashed, the output data from the multiple hashes is concatenated,
+ first hash leftmost, to produce the key data, and any excess octets
+ on the right are discarded.
+
+3.7.1.2. Salted S2K
+
+ Salted S2K includes a "salt" value in the S2K Specifier -- some
+ arbitrary data -- that gets hashed along with the passphrase string
+ to help prevent dictionary attacks.
+
+ Octet 0: 0x01
+ Octet 1: hash algorithm
+ Octets 2-9: 8-octet salt value
+
+ Salted S2K is exactly like Simple S2K, except that the input to the
+ hash function(s) consists of the 8 octets of salt from the S2K
+ Specifier, followed by the passphrase.
+
+3.7.1.3. Iterated and Salted S2K
+
+ Iterated and Salted S2K includes both a salt and an octet count. The
+ salt is combined with the passphrase, and the resulting value is
+ repeated and then hashed. This further increases the amount of work
+ an attacker must do to try dictionary attacks.
+
+ Octet 0: 0x03
+ Octet 1: hash algorithm
+ Octets 2-9: 8-octet salt value
+ Octet 10: count; a 1-octet coded value
+
+ The count is coded into a 1-octet number using the following formula:
+
+ #define EXPBIAS 6
+ count = ((Int32)16 + (c & 15)) << ((c >> 4) + EXPBIAS);
+
+ The above formula is described in [C99], where "Int32" is a type for
+ a 32-bit integer, and the variable "c" is the coded count, octet 10.
+
+ Iterated and Salted S2K hashes the passphrase and salt data multiple
+ times. The total number of octets to be hashed is specified in the
+ encoded count in the S2K Specifier. Note that the resulting count
+ value is an octet count of how many octets will be hashed, not an
+ iteration count.
+
+ Initially, one or more hash contexts are set up the same as the other
+ S2K algorithms, depending on how many octets of key data are needed.
+ Then the salt, followed by the passphrase data, is repeatedly
+ processed as input to each hash context until the number of octets
+ specified by the octet count has been hashed. The input is truncated
+ to the octet count, except if the octet count is less than the
+ initial size of the salt plus passphrase. That is, at least one copy
+ of the full salt plus passphrase will be provided as input to each
+ hash context regardless of the octet count. After the hashing is
+ done, the key data is produced from the hash digest(s), which is the
+ same way it is produced for the other S2K algorithms.
+
+3.7.1.4. Argon2
+
+ This S2K method hashes the passphrase using Argon2, as specified in
+ [RFC9106]. This provides memory hardness, further protecting the
+ passphrase against brute-force attacks.
+
+ Octet 0: 0x04
+ Octets 1-16: 16-octet salt value
+ Octet 17: 1-octet number of passes t
+ Octet 18: 1-octet degree of parallelism p
+ Octet 19: 1-octet encoded_m, specifying the exponent of
+ the memory size
+
+ The salt SHOULD be unique for each passphrase.
+
+ The number of passes t and the degree of parallelism p MUST be non-
+ zero.
+
+ The memory size m is 2^(encoded_m) kibibytes (KiB) of RAM. The
+ encoded memory size MUST be a value from 3+ceil(log_2(p)) to 31, such
+ that the decoded memory size m is a value from 8*p to 2^31. Note
+ that memory-hardness size is indicated in KiB, not octets.
+
+ Argon2 is invoked with the passphrase as P, the salt as S, the values
+ of t, p, and m as described above, the required key size as the tag
+ length T, 0x13 as the version v, and Argon2id as the type.
+
+ For the recommended values of t, p, and m, see Section 4 of
+ [RFC9106]. If the recommended value of m for a given application is
+ not a power of 2, it is RECOMMENDED to round up to the next power of
+ 2 if the resulting performance would be acceptable; otherwise, round
+ down (keeping in mind that m must be at least 8*p).
+
+ As an example, with the first recommended option (t=1, p=4, m=2^21),
+ the full S2K Specifier would be:
+
+ 04 XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
+ XX 01 04 15
+
+ where XX represents a random octet of salt.
+
+3.7.2. S2K Usage
+
+ Simple S2K and Salted S2K Specifiers can be brute-forced when used
+ with a low-entropy string, such as those typically provided by users.
+ In addition, the usage of Simple S2K can lead to key and
+ initialization vector (IV) reuse (see Section 5.3). Therefore, when
+ generating an S2K Specifier, an implementation MUST NOT use Simple
+ S2K. Furthermore, an implementation SHOULD NOT generate a Salted S2K
+ unless the implementation knows that the input string is high entropy
+ (for example, it generated the string itself using a known good
+ source of randomness).
+
+ It is RECOMMENDED that implementations use Argon2. If Argon2 is not
+ available, Iterated and Salted S2K MAY be used if care is taken to
+ use a high octet count and a strong passphrase. However, this method
+ does not provide memory hardness, unlike Argon2.
+
+3.7.2.1. Secret Key Encryption
+
+ The first octet following the public key material in a Secret Key
+ packet (Section 5.5.3) indicates whether and how the secret key
+ material is passphrase protected. This first octet is known as the
+ "S2K usage octet".
+
+ If the S2K usage octet is zero, the secret key data is unprotected.
+ If it is non-zero, it describes how to use a passphrase to unlock the
+ secret key.
+
+ Implementations predating [RFC2440] indicated a protected key by
+ storing a Symmetric Cipher Algorithm ID (see Section 9.3) in the S2K
+ usage octet. In this case, the MD5 hash function was always used to
+ convert the passphrase to a key for the specified cipher algorithm.
+
+ Later implementations indicate a protected secret key by storing one
+ of the special values 253 (AEAD), 254 (CFB), or 255 (MalleableCFB) in
+ the S2K usage octet. The S2K usage octet is then followed
+ immediately by a set of fields that describe how to convert a
+ passphrase to a symmetric key that can unlock the secret material,
+ plus other parameters relevant to the type of encryption used.
+
+ The wire format fields also differ based on the version of the
+ enclosing OpenPGP packet. The table below, indexed by the S2K usage
+ octet, summarizes the specifics described in Section 5.5.3.
+
+ In the table below, check(x) means the "2-octet checksum", which is
+ the sum of all octets in x mod 65536. The info and packetprefix
+ parameters are described in detail in Section 5.5.3. Note that the
+ "Generate?" column header has been shortened to "Gen?" here.
+
+ +=========+============+============+==========================+====+
+ |S2K Usage|Shorthand |Encryption |Encryption |Gen?|
+ |Octet | |Parameter | | |
+ | | |Fields | | |
+ +=========+============+============+==========================+====+
+ |0 |Unprotected |- |*v3 or v4 keys:* |Yes |
+ | | | |[cleartext secrets || | |
+ | | | |check(secrets)] | |
+ | | | |*v6 keys:* [cleartext | |
+ | | | |secrets] | |
+ +---------+------------+------------+--------------------------+----+
+ |Known |LegacyCFB |IV |CFB(MD5(passphrase), |No |
+ |symmetric| | |secrets || check(secrets))| |
+ |cipher | | | | |
+ |algo ID | | | | |
+ |(see | | | | |
+ |Section | | | | |
+ |9.3) | | | | |
+ +---------+------------+------------+--------------------------+----+
+ |253 |AEAD |params- |AEAD(HKDF(S2K(passphrase),|Yes |
+ | | |length |info), secrets, | |
+ | | |(*v6-only*),|packetprefix) | |
+ | | |cipher-algo,| | |
+ | | |AEAD-mode, | | |
+ | | |S2K- | | |
+ | | |specifier- | | |
+ | | |length | | |
+ | | |(*v6-only*),| | |
+ | | |S2K- | | |
+ | | |specifier, | | |
+ | | |nonce | | |
+ +---------+------------+------------+--------------------------+----+
+ |254 |CFB |params- |CFB(S2K(passphrase), |Yes |
+ | | |length |secrets || SHA1(secrets)) | |
+ | | |(*v6-only*),| | |
+ | | |cipher-algo,| | |
+ | | |S2K- | | |
+ | | |specifier- | | |
+ | | |length | | |
+ | | |(*v6-only*),| | |
+ | | |S2K- | | |
+ | | |specifier, | | |
+ | | |IV | | |
+ +---------+------------+------------+--------------------------+----+
+ |255 |MalleableCFB|cipher-algo,|CFB(S2K(passphrase), |No |
+ | | |S2K- |secrets || check(secrets))| |
+ | | |specifier, | | |
+ | | |IV | | |
+ +---------+------------+------------+--------------------------+----+
+
+ Table 2: OpenPGP Secret Key Encryption (S2K Usage Octet) Registry
+
+ When emitting a secret key (with or without passphrase protection),
+ an implementation MUST only produce data from a row with "Generate?"
+ marked as "Yes". Each row with "Generate?" marked as "No" is
+ described for backward compatibility (for reading version 4 and
+ earlier keys only) and MUST NOT be used to generate new output.
+ Version 6 secret keys using these formats MUST be rejected.
+
+ Note that compared to a version 4 secret key, the parameters of a
+ passphrase-protected version 6 secret key are stored with an
+ additional pair of length counts, each of which is 1 octet wide.
+
+ Argon2 is only used with Authenticated Encryption with Associated
+ Data (AEAD) (S2K usage octet 253). An implementation MUST NOT create
+ and MUST reject as malformed any Secret Key packet where the S2K
+ usage octet is not AEAD (253) and the S2K Specifier Type is Argon2.
+
+3.7.2.2. Symmetric Key Message Encryption
+
+ OpenPGP can create a Symmetric Key Encrypted Session Key (SKESK)
+ packet at the front of a message. This is used to allow S2K
+ Specifiers to be used for the passphrase conversion or to create
+ messages with a mix of SKESK packets and PKESK packets. This allows
+ a message to be decrypted with either a passphrase or a public key
+ pair.
+
+ Implementations predating [RFC2440] always used the International
+ Data Encryption Algorithm (IDEA) with Simple S2K conversion when
+ encrypting a message with a symmetric algorithm; see Section 5.7.
+ IDEA MUST NOT be generated but MAY be consumed for backward
+ compatibility.
+
+4. Packet Syntax
+
+ This section describes the packets used by OpenPGP.
+
+4.1. Overview
+
+ An OpenPGP Message is constructed from a number of records that are
+ typically called packets. A packet is a chunk of data that has a
+ Type ID specifying its meaning. An OpenPGP Message, keyring,
+ certificate, detached signature, and so forth consists of a number of
+ packets. Some of those packets may contain other OpenPGP packets
+ (for example, a compressed data packet, when uncompressed, contains
+ OpenPGP packets).
+
+ Each packet consists of a packet header, followed by the packet body.
+ The packet header is of variable length.
+
+ When handling a stream of packets, the length information in each
+ packet header is the canonical source of packet boundaries. An
+ implementation handling a packet stream that wants to find the next
+ packet MUST look for it at the precise offset indicated in the
+ previous packet header.
+
+ Additionally, some packets contain internal length indicators (for
+ example, a subfield within the packet). In the event that a subfield
+ length indicator within a packet implies inclusion of octets outside
+ the range indicated in the packet header, a parser MUST abort without
+ writing outside the indicated range and MUST treat the packet as
+ malformed and unusable.
+
+ An implementation MUST NOT interpret octets outside the range
+ indicated in the packet header as part of the contents of the packet.
+
+4.2. Packet Headers
+
+ The first octet of the packet denotes the format of the rest of the
+ header, and it encodes the Packet Type ID, indicating the type of the
+ packet (see Section 5). The remainder of the packet header is the
+ length of the packet.
+
+ There are two packet formats: 1) the (current) OpenPGP packet format
+ specified by this document and its predecessors [RFC4880] and
+ [RFC2440] and 2) the Legacy packet format as used by implementations
+ predating any IETF specification of OpenPGP.
+
+ Note that the most significant bit is the leftmost bit, called "bit
+ 7". A mask for this bit is 0x80 in hexadecimal.
+
+ +---------------+
+ Encoded Packet Type ID: |7 6 5 4 3 2 1 0|
+ +---------------+
+ OpenPGP format:
+ Bit 7 -- always one
+ Bit 6 -- always one
+ Bits 5 to 0 -- Packet Type ID
+
+ Legacy format:
+ Bit 7 -- always one
+ Bit 6 -- always zero
+ Bits 5 to 2 -- Packet Type ID
+ Bits 1 to 0 -- length-type
+
+ Bit 6 of the first octet of the packet header indicates whether the
+ packet is encoded in the OpenPGP or Legacy packet format. The Legacy
+ packet format MAY be used when consuming packets to facilitate
+ interoperability and accessing archived data. The Legacy packet
+ format SHOULD NOT be used to generate new data, unless the recipient
+ is known to only support the Legacy packet format. This latter case
+ is extremely unlikely, as the Legacy packet format was obsoleted by
+ [RFC2440] in 1998.
+
+ An implementation that consumes and redistributes pre-existing
+ OpenPGP data (such as Transferable Public Keys) may encounter packets
+ framed with the Legacy packet format. Such an implementation MAY
+ either redistribute these packets in their Legacy format or transform
+ them to the current OpenPGP packet format before redistribution.
+
+ Note that Legacy format headers only have 4 bits for the Packet Type
+ ID and hence can only encode Packet Type IDs less than 16, whereas
+ the OpenPGP format headers can encode IDs as great as 63.
+
+4.2.1. OpenPGP Format Packet Lengths
+
+ OpenPGP format packets have four possible ways of encoding length:
+
+ 1. A 1-octet Body Length header encodes packet lengths of up to 191
+ octets.
+
+ 2. A 2-octet Body Length header encodes packet lengths of 192 to
+ 8383 octets.
+
+ 3. A 5-octet Body Length header encodes packet lengths of up to
+ 4,294,967,295 (0xFFFFFFFF) octets in length. (This actually
+ encodes a 4-octet scalar number.)
+
+ 4. When the length of the packet body is not known in advance by the
+ issuer, Partial Body Length headers encode a packet of
+ indeterminate length, effectively making it a stream.
+
+4.2.1.1. 1-Octet Lengths
+
+ A 1-octet Body Length header encodes a length of 0 to 191 octets.
+ This type of length header is recognized because the 1-octet value is
+ less than 192. The body length is equal to:
+
+ bodyLen = 1st_octet;
+
+4.2.1.2. 2-Octet Lengths
+
+ A 2-octet Body Length header encodes a length of 192 to 8383 octets.
+ It is recognized because its first octet is in the range 192 to 223.
+ The body length is equal to:
+
+ bodyLen = ((1st_octet - 192) << 8) + (2nd_octet) + 192
+
+4.2.1.3. 5-Octet Lengths
+
+ A 5-octet Body Length header consists of a single octet holding the
+ value 255, followed by a 4-octet scalar. The body length is equal
+ to:
+
+ bodyLen = (2nd_octet << 24) | (3rd_octet << 16) |
+ (4th_octet << 8) | 5th_octet
+
+ This basic set of 1-octet, 2-octet, and 5-octet lengths is also used
+ internally to some packets.
+
+4.2.1.4. Partial Body Lengths
+
+ A Partial Body Length header is 1 octet long and encodes the length
+ of only part of the data packet. This length is a power of 2, from 1
+ to 1,073,741,824 (2 to the 30th power). It is recognized by its
+ 1-octet value that is greater than or equal to 224, and less than
+ 255. The Partial Body Length is equal to:
+
+ partialBodyLen = 1 << (1st_octet & 0x1F);
+
+ Each Partial Body Length header is followed by a portion of the
+ packet body data; the Partial Body Length header specifies this
+ portion's length. Another length header (1-octet, 2-octet, 5-octet,
+ or partial) follows that portion. The last length header in the
+ packet MUST NOT be a Partial Body Length header. Partial Body Length
+ headers may only be used for the non-final parts of the packet.
+
+ Note also that the last Body Length header can be a zero-length
+ header.
+
+ An implementation MAY use Partial Body Lengths for data packets,
+ whether they are literal, compressed, or encrypted. The first
+ partial length MUST be at least 512 octets long. Partial Body
+ Lengths MUST NOT be used for any other packet types.
+
+4.2.2. Legacy Format Packet Lengths
+
+ A zero in bit 6 of the first octet of the packet indicates a Legacy
+ packet format. Bits 1 and 0 of the first octet of a Legacy packet
+ are the "length-type" field. The meaning of length-type in Legacy
+ format packets is as follows:
+
+ 0 The packet has a 1-octet length. The header is 2 octets long.
+
+ 1 The packet has a 2-octet length. The header is 3 octets long.
+
+ 2 The packet has a 4-octet length. The header is 5 octets long.
+
+ 3 The packet is of indeterminate length. The header is 1 octet
+ long, and the implementation must determine how long the packet
+ is. If the packet is in a file, it means that the packet extends
+ until the end of the file. The OpenPGP format headers have a
+ mechanism for precisely encoding data of indeterminate length. An
+ implementation MUST NOT generate a Legacy format packet with
+ indeterminate length. An implementation MAY interpret an
+ indeterminate length Legacy format packet in order to deal with
+ historic data or data generated by a legacy system that predates
+ support for [RFC2440].
+
+4.2.3. Packet Length Examples
+
+ These examples show ways that OpenPGP format packets might encode the
+ packet body lengths.
+
+ * A packet body with length 100 may have its length encoded in one
+ octet: 0x64. This is followed by 100 octets of data.
+
+ * A packet body with length 1723 may have its length encoded in two
+ octets: 0xC5, 0xFB. This header is followed by the 1723 octets of
+ data.
+
+ * A packet body with length 100000 may have its length encoded in
+ five octets: 0xFF, 0x00, 0x01, 0x86, 0xA0.
+
+ It might also be encoded in the following octet stream:
+
+ * 0xEF, first 32768 octets of data;
+
+ * 0xE1, next 2 octets of data;
+
+ * 0xE0, next 1 octet of data;
+
+ * 0xF0, next 65536 octets of data; and
+
+ * 0xC5, 0xDD, last 1693 octets of data.
+
+ This is just one possible encoding, and many variations are possible
+ on the size of the Partial Body Length headers, as long as a regular
+ Body Length header encodes the last portion of the data.
+
+ Please note that in all of these explanations, the total length of
+ the packet is the length of the header(s) plus the length of the
+ body.
+
+4.3. Packet Criticality
+
+ The Packet Type ID space is partitioned into critical packets and
+ non-critical packets. If an implementation encounters a critical
+ packet where the packet type is unknown in a packet sequence, it MUST
+ reject the whole packet sequence (see Section 10). On the other
+ hand, an unknown non-critical packet MUST be ignored.
+
+ Packets with Type IDs from 0 to 39 are critical. Packets with Type
+ IDs from 40 to 63 are non-critical.
+
+5. Packet Types
+
+ The defined packet types are as follows:
+
+ +=======+==========+=====================+===========+===========+
+ | ID | Critical | Packet Type | Shorthand | Reference |
+ | | | Description | | |
+ +=======+==========+=====================+===========+===========+
+ | 0 | Yes | Reserved - this | | |
+ | | | Packet Type ID MUST | | |
+ | | | NOT be used | | |
+ +-------+----------+---------------------+-----------+-----------+
+ | 1 | Yes | Public Key | PKESK | Section |
+ | | | Encrypted Session | | 5.1 |
+ | | | Key Packet | | |
+ +-------+----------+---------------------+-----------+-----------+
+ | 2 | Yes | Signature Packet | SIG | Section |
+ | | | | | 5.2 |
+ +-------+----------+---------------------+-----------+-----------+
+ | 3 | Yes | Symmetric Key | SKESK | Section |
+ | | | Encrypted Session | | 5.3 |
+ | | | Key Packet | | |
+ +-------+----------+---------------------+-----------+-----------+
+ | 4 | Yes | One-Pass Signature | OPS | Section |
+ | | | Packet | | 5.4 |
+ +-------+----------+---------------------+-----------+-----------+
+ | 5 | Yes | Secret Key Packet | SECKEY | Section |
+ | | | | | 5.5.1.3 |
+ +-------+----------+---------------------+-----------+-----------+
+ | 6 | Yes | Public Key Packet | PUBKEY | Section |
+ | | | | | 5.5.1.1 |
+ +-------+----------+---------------------+-----------+-----------+
+ | 7 | Yes | Secret Subkey | SECSUBKEY | Section |
+ | | | Packet | | 5.5.1.4 |
+ +-------+----------+---------------------+-----------+-----------+
+ | 8 | Yes | Compressed Data | COMP | Section |
+ | | | Packet | | 5.6 |
+ +-------+----------+---------------------+-----------+-----------+
+ | 9 | Yes | Symmetrically | SED | Section |
+ | | | Encrypted Data | | 5.7 |
+ | | | Packet | | |
+ +-------+----------+---------------------+-----------+-----------+
+ | 10 | Yes | Marker Packet | MARKER | Section |
+ | | | | | 5.8 |
+ +-------+----------+---------------------+-----------+-----------+
+ | 11 | Yes | Literal Data Packet | LIT | Section |
+ | | | | | 5.9 |
+ +-------+----------+---------------------+-----------+-----------+
+ | 12 | Yes | Trust Packet | TRUST | Section |
+ | | | | | 5.10 |
+ +-------+----------+---------------------+-----------+-----------+
+ | 13 | Yes | User ID Packet | UID | Section |
+ | | | | | 5.11 |
+ +-------+----------+---------------------+-----------+-----------+
+ | 14 | Yes | Public Subkey | PUBSUBKEY | Section |
+ | | | Packet | | 5.5.1.2 |
+ +-------+----------+---------------------+-----------+-----------+
+ | 17 | Yes | User Attribute | UAT | Section |
+ | | | Packet | | 5.12 |
+ +-------+----------+---------------------+-----------+-----------+
+ | 18 | Yes | Symmetrically | SEIPD | Section |
+ | | | Encrypted and | | 5.13 |
+ | | | Integrity Protected | | |
+ | | | Data Packet | | |
+ +-------+----------+---------------------+-----------+-----------+
+ | 19 | Yes | Reserved (formerly | | Section |
+ | | | Modification | | 5.13.1 |
+ | | | Detection Code | | |
+ | | | Packet) | | |
+ +-------+----------+---------------------+-----------+-----------+
+ | 20 | Yes | Reserved | | |
+ +-------+----------+---------------------+-----------+-----------+
+ | 21 | Yes | Padding Packet | PADDING | Section |
+ | | | | | 5.14 |
+ +-------+----------+---------------------+-----------+-----------+
+ | 22-39 | Yes | Unassigned Critical | | |
+ | | | Packets | | |
+ +-------+----------+---------------------+-----------+-----------+
+ | 40-59 | No | Unassigned Non- | | |
+ | | | Critical Packets | | |
+ +-------+----------+---------------------+-----------+-----------+
+ | 60-63 | No | Private or | | |
+ | | | Experimental Use | | |
+ +-------+----------+---------------------+-----------+-----------+
+
+ Table 3: OpenPGP Packet Types Registry
+
+ The labels in the "Shorthand" column are used for compact reference
+ elsewhere in this document, and they may also be used by
+ implementations that provide debugging or inspection affordances for
+ streams of OpenPGP packets.
+
+5.1. Public Key Encrypted Session Key Packet (Type ID 1)
+
+ Zero or more PKESK packets and/or SKESK packets (Section 5.3) precede
+ an encryption container (that is, a Symmetrically Encrypted and
+ Integrity Protected Data (SEIPD) packet or -- for historic data -- a
+ Symmetrically Encrypted Data (SED) packet), which holds an Encrypted
+ Message. The message is encrypted with the session key, and the
+ session key is itself encrypted and stored in the Encrypted Session
+ Key packet(s). The encryption container is preceded by one Public
+ Key Encrypted Session Key packet for each OpenPGP Key to which the
+ message is encrypted. The recipient of the message finds a session
+ key that is encrypted to their public key, decrypts the session key,
+ and then uses the session key to decrypt the message.
+
+ The body of this packet starts with a 1-octet number giving the
+ version number of the packet type. The currently defined versions
+ are 3 and 6. The remainder of the packet depends on the version.
+
+ The versions differ in how they identify the recipient key and in
+ what they encode. The version of the PKESK packet must align with
+ the version of the SEIPD packet (see Section 10.3.2.1). Any new
+ version of the PKESK packet should be registered in the registry
+ established in Section 10.3.2.1.
+
+5.1.1. Version 3 Public Key Encrypted Session Key Packet Format
+
+ A version 3 PKESK packet precedes a v1 SEIPD packet (see
+ Section 5.13.1). In historic data, it is sometimes found preceding a
+ deprecated SED packet; see Section 5.7. A v3 PKESK packet MUST NOT
+ precede a v2 SEIPD packet (see Section 10.3.2.1).
+
+ The v3 PKESK packet consists of:
+
+ * A 1-octet version number with value 3.
+
+ * An 8-octet number that gives the Key ID of the public key to which
+ the session key is encrypted. If the session key is encrypted to
+ a subkey, then the Key ID of this subkey is used here instead of
+ the Key ID of the primary key. The Key ID may also be all zeros,
+ for an "anonymous recipient" (see Section 5.1.8).
+
+ * A 1-octet number giving the public key algorithm used.
+
+ * A series of values comprising the encrypted session key. This is
+ algorithm specific and described below.
+
+ The public key encryption algorithm (described in subsequent
+ sections) is passed two values:
+
+ * The session key.
+
+ * The 1-octet algorithm identifier that specifies the symmetric key
+ encryption algorithm used to encrypt the v1 SEIPD packet described
+ in the following section.
+
+5.1.2. Version 6 Public Key Encrypted Session Key Packet Format
+
+ A v6 PKESK packet precedes a v2 SEIPD packet (see Section 5.13.2). A
+ v6 PKESK packet MUST NOT precede a v1 SEIPD packet or a deprecated
+ SED packet (see Section 10.3.2.1).
+
+ The v6 PKESK packet consists of the following fields:
+
+ * A 1-octet version number with value 6.
+
+ * A 1-octet size of the following two fields. This size may be
+ zero, if the key version number field and the fingerprint field
+ are omitted for an "anonymous recipient" (see Section 5.1.8).
+
+ * A 1-octet key version number.
+
+ * The fingerprint of the public key or subkey to which the session
+ key is encrypted. Note that the length N of the fingerprint for a
+ version 4 key is 20 octets; for a version 6 key, N is 32.
+
+ * A 1-octet number giving the public key algorithm used.
+
+ * A series of values comprising the encrypted session key. This is
+ algorithm specific and described below.
+
+ The session key is encrypted according to the public key algorithm
+ used, as described below. No symmetric key encryption algorithm
+ identifier is passed to the public key algorithm for a v6 PKESK
+ packet, as it is included in the v2 SEIPD packet.
+
+5.1.3. Algorithm-Specific Fields for RSA Encryption
+
+ * MPI of RSA-encrypted value m^e mod n.
+
+ To produce the value "m" in the above formula, first concatenate the
+ following values:
+
+ * The 1-octet algorithm identifier, if it was passed (in the case of
+ a v3 PKESK packet).
+
+ * The session key.
+
+ * A 2-octet checksum of the session key, equal to the sum of the
+ session key octets, modulo 65536.
+
+ Then, the above values are encoded using the PKCS#1 block encoding
+ EME-PKCS1-v1_5, as described in Step 2 in Section 7.2.1 of [RFC8017]
+ (see also Section 12.1.1). When decoding "m" during decryption, an
+ implementation should follow Step 3 in Section 7.2.2 of [RFC8017]
+ (see also Section 12.1.2).
+
+ Note that when an implementation forms several PKESK packets with one
+ session key, forming a message that can be decrypted by several keys,
+ the implementation MUST make a new PKCS#1 encoding for each key.
+ This defends against attacks such as those discussed in [HASTAD].
+
+5.1.4. Algorithm-Specific Fields for Elgamal Encryption
+
+ * MPI of Elgamal (Diffie-Hellman) value g^k mod p.
+
+ * MPI of Elgamal (Diffie-Hellman) value m * y^k mod p.
+
+ To produce the value "m" in the above formula, first concatenate the
+ following values:
+
+ * The 1-octet algorithm identifier, if it was passed (in the case of
+ a v3 PKESK packet).
+
+ * The session key.
+
+ * A 2-octet checksum of the session key, equal to the sum of the
+ session key octets, modulo 65536.
+
+ Then, the above values are encoded using the PKCS#1 block encoding
+ EME-PKCS1-v1_5, as described in Step 2 in Section 7.2.1 of [RFC8017]
+ (see also Section 12.1.1). When decoding "m" during decryption, an
+ implementation should follow Step 3 in Section 7.2.2 of [RFC8017]
+ (see also Section 12.1.2).
+
+ Note that when an implementation forms several PKESK packets with one
+ session key, forming a message that can be decrypted by several keys,
+ the implementation MUST make a new PKCS#1 encoding for each key.
+ This defends against attacks such as those discussed in [HASTAD].
+
+ An implementation MUST NOT generate ElGamal v6 PKESK packets.
+
+5.1.5. Algorithm-Specific Fields for ECDH Encryption
+
+ * MPI of an EC point representing an ephemeral public key in the
+ point format associated with the curve as specified in
+ Section 9.2.
+
+ * A 1-octet size, followed by a symmetric key encoded using the
+ method described in Section 11.5.
+
+5.1.6. Algorithm-Specific Fields for X25519 Encryption
+
+ * 32 octets representing an ephemeral X25519 public key.
+
+ * A 1-octet size of the following fields.
+
+ * The 1-octet algorithm identifier, if it was passed (in the case of
+ a v3 PKESK packet).
+
+ * The encrypted session key.
+
+ See Section 6.1 of [RFC7748] for more details on the computation of
+ the ephemeral public key and the shared secret. The HMAC-based Key
+ Derivation Function (HKDF) [RFC5869] is then used with SHA256
+ [RFC6234] and an info parameter of "OpenPGP X25519" and no salt. The
+ input of HKDF is the concatenation of the following three values:
+
+ * 32 octets of the ephemeral X25519 public key from this packet.
+
+ * 32 octets of the recipient public key material.
+
+ * 32 octets of the shared secret.
+
+ The key produced from HKDF is used to encrypt the session key with
+ AES-128 key wrap, as defined in [RFC3394].
+
+ Note that unlike Elliptic Curve Diffie-Hellman (ECDH), no checksum or
+ padding are appended to the session key before key wrapping.
+ Finally, note that unlike the other public key algorithms, in the
+ case of a v3 PKESK packet, the symmetric algorithm ID is not
+ encrypted. Instead, it is prepended to the encrypted session key in
+ plaintext. In this case, the symmetric algorithm used MUST be AES-
+ 128, AES-192, or AES-256 (algorithm IDs 7, 8, or 9, respectively).
+
+5.1.7. Algorithm-Specific Fields for X448 Encryption
+
+ * 56 octets representing an ephemeral X448 public key.
+
+ * A 1-octet size of the following fields.
+
+ * The 1-octet algorithm identifier, if it was passed (in the case of
+ a v3 PKESK packet).
+
+ * The encrypted session key.
+
+ See Section 6.2 of [RFC7748] for more details on the computation of
+ the ephemeral public key and the shared secret. HKDF [RFC5869] is
+ then used with SHA512 [RFC6234] and an info parameter of "OpenPGP
+ X448" and no salt. The input of HKDF is the concatenation of the
+ following three values:
+
+ * 56 octets of the ephemeral X448 public key from this packet.
+
+ * 56 octets of the recipient public key material.
+
+ * 56 octets of the shared secret.
+
+ The key produced from HKDF is used to encrypt the session key with
+ AES-256 key wrap, as defined in [RFC3394].
+
+ Note that unlike ECDH, no checksum or padding are appended to the
+ session key before key wrapping. Finally, note that unlike the other
+ public key algorithms, in the case of a v3 PKESK packet, the
+ symmetric algorithm ID is not encrypted. Instead, it is prepended to
+ the encrypted session key in plaintext. In this case, the symmetric
+ algorithm used MUST be AES-128, AES-192, or AES-256 (algorithm ID 7,
+ 8, or 9).
+
+5.1.8. Notes on PKESK
+
+ An implementation MAY accept or use a Key ID of all zeros, or an
+ omitted key fingerprint, to hide the intended decryption key. In
+ this case, the receiving implementation would try all available
+ private keys, checking for a valid decrypted session key. This
+ format helps reduce traffic analysis of messages.
+
+5.2. Signature Packet (Type ID 2)
+
+ A Signature packet describes a binding between some public key and
+ some data. The most common signatures are a signature of a file or a
+ block of text and a signature that is a certification of a User ID.
+
+ Three versions of Signature packets are defined. Version 3 provides
+ basic signature information, while versions 4 and 6 provide an
+ expandable format with subpackets that can specify more information
+ about the signature.
+
+ For historical reasons, versions 1, 2, and 5 of the Signature packet
+ are unspecified. Any new Signature packet version should be
+ registered in the registry established in Section 10.3.2.2.
+
+ An implementation MUST generate a version 6 signature when signing
+ with a version 6 key. An implementation MUST generate a version 4
+ signature when signing with a version 4 key. Implementations MUST
+ NOT create version 3 signatures; they MAY accept version 3
+ signatures. See Section 10.3.2.2 for more details about packet
+ version correspondence between keys and signatures.
+
+5.2.1. Signature Types
+
+ There are a number of possible meanings for a signature, which are
+ indicated by the Signature Type ID in any given signature. Please
+ note that the vagueness of these meanings is not a flaw but rather a
+ feature of the system. Because OpenPGP places final authority for
+ validity upon the receiver of a signature, it may be that one
+ signer's casual act might be more rigorous than some other
+ authority's positive act. See Section 5.2.4 for detailed information
+ on how to compute and verify signatures of each type.
+
+ +======+====================================+==================+
+ | ID | Name | Reference |
+ +======+====================================+==================+
+ | 0x00 | Binary Signature | Section 5.2.1.1 |
+ +------+------------------------------------+------------------+
+ | 0x01 | Text Signature | Section 5.2.1.2 |
+ +------+------------------------------------+------------------+
+ | 0x02 | Standalone Signature | Section 5.2.1.3 |
+ +------+------------------------------------+------------------+
+ | 0x10 | Generic Certification Signature | Section 5.2.1.4 |
+ +------+------------------------------------+------------------+
+ | 0x11 | Persona Certification Signature | Section 5.2.1.5 |
+ +------+------------------------------------+------------------+
+ | 0x12 | Casual Certification Signature | Section 5.2.1.6 |
+ +------+------------------------------------+------------------+
+ | 0x13 | Positive Certification Signature | Section 5.2.1.7 |
+ +------+------------------------------------+------------------+
+ | 0x18 | Subkey Binding Signature | Section 5.2.1.8 |
+ +------+------------------------------------+------------------+
+ | 0x19 | Primary Key Binding Signature | Section 5.2.1.9 |
+ +------+------------------------------------+------------------+
+ | 0x1F | Direct Key Signature | Section 5.2.1.10 |
+ +------+------------------------------------+------------------+
+ | 0x20 | Key Revocation Signature | Section 5.2.1.11 |
+ +------+------------------------------------+------------------+
+ | 0x28 | Subkey Revocation Signature | Section 5.2.1.12 |
+ +------+------------------------------------+------------------+
+ | 0x30 | Certification Revocation Signature | Section 5.2.1.13 |
+ +------+------------------------------------+------------------+
+ | 0x40 | Timestamp Signature | Section 5.2.1.14 |
+ +------+------------------------------------+------------------+
+ | 0x50 | Third-Party Confirmation Signature | Section 5.2.1.15 |
+ +------+------------------------------------+------------------+
+ | 0xFF | Reserved | Section 5.2.1.16 |
+ +------+------------------------------------+------------------+
+
+ Table 4: OpenPGP Signature Types Registry
+
+ The meanings of each signature type are described in the subsections
+ below.
+
+5.2.1.1. Binary Signature (Type ID 0x00) of a Document
+
+ This means the signer owns it, created it, or certifies that it has
+ not been modified.
+
+5.2.1.2. Text Signature (Type ID 0x01) of a Canonical Document
+
+ This means the signer owns it, created it, or certifies that it has
+ not been modified. The signature is calculated over the text data
+ with its line endings converted to <CR><LF>.
+
+5.2.1.3. Standalone Signature (Type ID 0x02)
+
+ This signature is a signature of only its own subpacket contents. It
+ is calculated identically to a signature over a zero-length binary
+ document. Version 3 Standalone signatures MUST NOT be generated and
+ MUST be ignored.
+
+5.2.1.4. Generic Certification Signature (Type ID 0x10) of a User ID
+ and Public Key Packet
+
+ The issuer of this certification does not make any particular
+ assertion as to how well the certifier has checked that the owner of
+ the key is in fact the person described by the User ID.
+
+5.2.1.5. Persona Certification Signature (Type ID 0x11) of a User ID
+ and Public Key Packet
+
+ The issuer of this certification has not done any verification of the
+ claim that the owner of this key is the User ID specified.
+
+5.2.1.6. Casual Certification Signature (Type ID 0x12) of a User ID and
+ Public Key Packet
+
+ The issuer of this certification has done some casual verification of
+ the claim of identity.
+
+5.2.1.7. Positive Certification Signature (Type ID 0x13) of a User ID
+ and Public Key Packet
+
+ The issuer of this certification has done substantial verification of
+ the claim of identity.
+
+ Most OpenPGP implementations make their "key signatures" as generic
+ (Type ID 0x10) certifications. Some implementations can issue
+ 0x11-0x13 certifications, but few differentiate between the types.
+
+5.2.1.8. Subkey Binding Signature (Type ID 0x18)
+
+ This signature is a statement by the top-level signing key,
+ indicating that it owns the subkey. This signature is calculated
+ directly on the primary key and subkey, and not on any User ID or
+ other packets. A signature that binds a signing subkey MUST have an
+ Embedded Signature subpacket in this binding signature that contains
+ a 0x19 signature made by the signing subkey on the primary key and
+ subkey.
+
+5.2.1.9. Primary Key Binding Signature (Type ID 0x19)
+
+ This signature is a statement by a signing subkey, indicating that it
+ is owned by the primary key. This signature is calculated the same
+ way as a Subkey Binding signature (Type ID 0x18): directly on the
+ primary key and subkey, and not on any User ID or other packets.
+
+5.2.1.10. Direct Key Signature (Type ID 0x1F)
+
+ This signature is calculated directly on a key. It binds the
+ information in the Signature subpackets to the key and is appropriate
+ to be used for subpackets that provide information about the key,
+ such as the Key Flags subpacket or the (deprecated) Revocation Key
+ subpacket. It is also appropriate for statements that non-self
+ certifiers want to make about the key itself rather than the binding
+ between a key and a name.
+
+5.2.1.11. Key Revocation Signature (Type ID 0x20)
+
+ This signature is calculated directly on the key being revoked. A
+ revoked key is not to be used. Only Revocation Signatures by the key
+ being revoked, or by a (deprecated) Revocation Key, should be
+ considered valid Revocation Signatures.
+
+5.2.1.12. Subkey Revocation Signature (Type ID 0x28)
+
+ This signature is calculated directly on the primary key and the
+ subkey being revoked. A revoked subkey is not to be used. Only
+ Revocation Signatures by the top-level signature key that is bound to
+ this subkey, or by a (deprecated) Revocation Key, should be
+ considered valid Revocation Signatures.
+
+5.2.1.13. Certification Revocation Signature (Type ID 0x30)
+
+ This signature revokes an earlier User ID certification signature
+ (Type IDs 0x10 through 0x13) or Direct Key signature (Type ID 0x1F).
+ It should be issued by the same key that issued the revoked signature
+ or by a (deprecated) Revocation Key. The signature is computed over
+ the same data as the certification that it revokes, and it should
+ have a later creation date than that certification.
+
+5.2.1.14. Timestamp Signature (Type ID 0x40)
+
+ This signature is only meaningful for the timestamp contained in it.
+
+5.2.1.15. Third-Party Confirmation Signature (Type ID 0x50)
+
+ This signature is a signature over another OpenPGP Signature packet.
+ It is analogous to a notary seal on the signed data. A Third-Party
+ Confirmation signature SHOULD include a Signature Target subpacket
+ that identifies the confirmed signature.
+
+5.2.1.16. Reserved (Type ID 0xFF)
+
+ An implementation MUST NOT create any signature with this type and
+ MUST NOT validate any signature made with this type. See
+ Section 5.2.4.1 for more details.
+
+5.2.2. Version 3 Signature Packet Format
+
+ The body of a version 3 Signature packet contains:
+
+ * A 1-octet version number with value 3.
+
+ * A 1-octet length of the following hashed material; it MUST be 5:
+
+ - A 1-octet Signature Type ID.
+
+ - A 4-octet creation time.
+
+ * An 8-octet Key ID of the signer.
+
+ * A 1-octet public key algorithm.
+
+ * A 1-octet hash algorithm.
+
+ * A 2-octet field holding left 16 bits of the signed hash value.
+
+ * One or more MPIs comprising the signature. This portion is
+ algorithm specific, as described below.
+
+ The concatenation of the data to be signed, the signature type, and
+ the creation time from the Signature packet (5 additional octets) is
+ hashed. The resulting hash value is used in the signature algorithm.
+ The high 16 bits (first two octets) of the hash are included in the
+ Signature packet to provide a way to reject some invalid signatures
+ without performing a signature verification.
+
+ Algorithm-specific fields for RSA signatures:
+
+ * MPI of RSA signature value m^d mod n.
+
+ Algorithm-specific fields for DSA signatures:
+
+ * MPI of DSA value r.
+
+ * MPI of DSA value s.
+
+ The signature calculation is based on a hash of the signed data, as
+ described above. The details of the calculation are different for
+ DSA signatures than for RSA signatures; see Sections 5.2.3.1 and
+ 5.2.3.2.
+
+5.2.3. Versions 4 and 6 Signature Packet Formats
+
+ The body of a version 4 or version 6 Signature packet contains:
+
+ * A 1-octet version number. This is 4 for version 4 signatures and
+ 6 for version 6 signatures.
+
+ * A 1-octet Signature Type ID.
+
+ * A 1-octet public key algorithm.
+
+ * A 1-octet hash algorithm.
+
+ * A scalar octet count for the hashed subpacket data that follows
+ this field. For a version 4 signature, this is a 2-octet field.
+ For a version 6 signature, this is a 4-octet field. Note that
+ this is the length in octets of all of the hashed subpackets; an
+ implementation's pointer incremented by this number will skip over
+ the hashed subpackets.
+
+ * A hashed subpacket data set (zero or more subpackets).
+
+ * A scalar octet count for the unhashed subpacket data that follows
+ this field. For a version 4 signature, this is a 2-octet field.
+ For a version 6 signature, this is a 4-octet field. Note that
+ this is the length in octets of all of the unhashed subpackets; an
+ implementation's pointer incremented by this number will skip over
+ the unhashed subpackets.
+
+ * An unhashed subpacket data set (zero or more subpackets).
+
+ * A 2-octet field holding the left 16 bits of the signed hash value.
+
+ * Only for version 6 signatures, a variable-length field containing:
+
+ - A 1-octet salt size. The value MUST match the value defined
+ for the hash algorithm as specified in Table 23.
+
+ - The salt, which is a random value of the specified size.
+
+ * One or more MPIs comprising the signature. This portion is
+ algorithm specific.
+
+5.2.3.1. Algorithm-Specific Fields for RSA Signatures
+
+ * MPI of RSA signature value m^d mod n.
+
+ With RSA signatures, the hash value is encoded using PKCS#1 encoding
+ type EMSA-PKCS1-v1_5, as described in Section 9.2 of [RFC8017] (see
+ also Section 12.1.3). This requires inserting the hash value as an
+ octet string into an ASN.1 structure. The object identifier (OID)
+ for the hash algorithm itself is also included in the structure; see
+ the OIDs in Table 24.
+
+5.2.3.2. Algorithm-Specific Fields for DSA or ECDSA Signatures
+
+ * MPI of DSA or ECDSA value r.
+
+ * MPI of DSA or ECDSA value s.
+
+ A version 3 signature MUST NOT be created and MUST NOT be used with
+ the Elliptic Curve Digital Signature Algorithm (ECDSA).
+
+ A DSA signature MUST use a hash algorithm with a digest size of at
+ least the number of bits of q, the group generated by the DSA key's
+ generator value.
+
+ If the output size of the chosen hash is larger than the number of
+ bits of q, the hash result is truncated to fit by taking the number
+ of leftmost bits equal to the number of bits of q. This (possibly
+ truncated) hash function result is treated as a number and used
+ directly in the DSA signature algorithm.
+
+ An ECDSA signature MUST use a hash algorithm with a digest size of at
+ least the curve's "fsize" value (see Section 9.2), except in the case
+ of NIST P-521, for which at least a 512-bit hash algorithm MUST be
+ used.
+
+5.2.3.3. Algorithm-Specific Fields for EdDSALegacy Signatures
+ (Deprecated)
+
+ * Two MPI-encoded values, whose contents and formatting depend on
+ the choice of curve used (see Section 9.2.1).
+
+ A version 3 signature MUST NOT be created and MUST NOT be used with
+ EdDSALegacy.
+
+ An EdDSALegacy signature MUST use a hash algorithm with a digest size
+ of at least the curve's "fsize" value (see Section 9.2). A verifying
+ implementation MUST reject any EdDSALegacy signature that uses a hash
+ algorithm with a smaller digest size.
+
+5.2.3.3.1. Algorithm-Specific Fields for Ed25519Legacy Signatures
+ (Deprecated)
+
+ The two MPIs for Ed25519Legacy represent the octet strings R and S of
+ the Edwards-curve Digital Signature Algorithm (EdDSA) described in
+ [RFC8032].
+
+ * MPI of an EC point R, represented as a (non-prefixed) native
+ (little-endian) octet string up to 32 octets.
+
+ * MPI of EdDSA value S, also in (non-prefixed) native (little-
+ endian) format with a length up to 32 octets.
+
+ Ed25519Legacy MUST NOT be used in Signature packets version 6 or
+ above.
+
+5.2.3.4. Algorithm-Specific Fields for Ed25519 Signatures
+
+ * 64 octets of the native signature.
+
+ For more details, see Section 12.7.
+
+ A version 3 signature MUST NOT be created and MUST NOT be used with
+ Ed25519.
+
+ An Ed25519 signature MUST use a hash algorithm with a digest size of
+ at least 256 bits. A verifying implementation MUST reject any
+ Ed25519 signature that uses a hash algorithm with a smaller digest
+ size.
+
+5.2.3.5. Algorithm-Specific Fields for Ed448 Signatures
+
+ * 114 octets of the native signature.
+
+ For more details, see Section 12.7.
+
+ A version 3 signature MUST NOT be created and MUST NOT be used with
+ Ed448.
+
+ An Ed448 signature MUST use a hash algorithm with a digest size of at
+ least 512 bits. A verifying implementation MUST reject any Ed448
+ signature that uses a hash algorithm with a smaller digest size.
+
+5.2.3.6. Notes on Signatures
+
+ The concatenation of the data being signed, the signature data from
+ the version number through the hashed subpacket data (inclusive), and
+ (for signature versions later than 3) a 6-octet trailer (see
+ Section 5.2.4) is hashed. The resulting hash value is what is
+ signed. The high 16 bits (first two octets) of the hash are included
+ in the Signature packet to provide a way to reject some invalid
+ signatures without performing a signature verification. When
+ verifying a version 6 signature, an implementation MUST reject the
+ signature if these octets do not match the first two octets of the
+ computed hash.
+
+ There are two fields consisting of Signature subpackets. The first
+ field is hashed with the rest of the signature data, while the second
+ is not hashed into the signature. The second set of subpackets (the
+ "unhashed section") is not cryptographically protected by the
+ signature and should include only advisory information. See
+ Section 13.13 for more information.
+
+ The differences between a version 4 and version 6 signature are two-
+ fold: first, a version 6 signature increases the width of the fields
+ that indicate the size of the hashed and unhashed subpackets, making
+ it possible to include significantly more data in subpackets.
+ Second, the hash is salted with random data (see Section 13.2).
+
+ The algorithms for converting the hash function result to a signature
+ are described in Section 5.2.4.
+
+5.2.3.7. Signature Subpacket Specification
+
+ A subpacket data set consists of zero or more Signature subpackets.
+ In Signature packets, the subpacket data set is preceded by a 2-octet
+ (for version 4 signatures) or 4-octet (for version 6 signatures)
+ scalar count of the length in octets of all the subpackets. A
+ pointer incremented by this number will skip over the subpacket data
+ set.
+
+ Each subpacket consists of a subpacket header and a body. The header
+ consists of:
+
+ * The encoded subpacket length (1, 2, or 5 octets).
+
+ * The encoded Subpacket Type ID (1 octet).
+
+ * The subpacket-specific data.
+
+ The subpacket length field covers the encoded Subpacket Type ID and
+ the subpacket-specific data, and it does not include the subpacket
+ length field itself. It is encoded similarly to a 1-octet, 2-octet,
+ or 5-octet OpenPGP format packet header. The encoded subpacket
+ length can be decoded as follows:
+
+ if the 1st octet < 192, then
+ lengthOfLength = 1
+ subpacketLen = 1st_octet
+
+ if the 1st octet >= 192 and < 255, then
+ lengthOfLength = 2
+ subpacketLen = ((1st_octet - 192) << 8) + (2nd_octet) + 192
+
+ if the 1st octet = 255, then
+ lengthOfLength = 5
+ subpacket length = [4-octet scalar starting at 2nd_octet]
+
+ Bit 7 of the encoded Subpacket Type ID is the "critical" bit. If
+ set, it denotes that the subpacket is one that is critical for the
+ evaluator of the signature to recognize. If a subpacket is
+ encountered that is marked critical but is unknown to the evaluating
+ implementation, the evaluator SHOULD consider the signature to be in
+ error.
+
+ An implementation SHOULD ignore any non-critical subpacket of a type
+ that it does not recognize.
+
+ An evaluator may "recognize" a subpacket but not implement it. The
+ purpose of the critical bit is to allow the signer to tell an
+ evaluator that it would prefer a new, unknown feature to generate an
+ error rather than being ignored.
+
+ The other bits of the encoded Subpacket Type ID (i.e., bits 6-0)
+ contain the Subpacket Type ID.
+
+ The following signature subpackets are defined:
+
+ +=========+===========================+==================+
+ | ID | Description | Reference |
+ +=========+===========================+==================+
+ | 0 | Reserved | |
+ +---------+---------------------------+------------------+
+ | 1 | Reserved | |
+ +---------+---------------------------+------------------+
+ | 2 | Signature Creation Time | Section 5.2.3.11 |
+ +---------+---------------------------+------------------+
+ | 3 | Signature Expiration Time | Section 5.2.3.18 |
+ +---------+---------------------------+------------------+
+ | 4 | Exportable Certification | Section 5.2.3.19 |
+ +---------+---------------------------+------------------+
+ | 5 | Trust Signature | Section 5.2.3.21 |
+ +---------+---------------------------+------------------+
+ | 6 | Regular Expression | Section 5.2.3.22 |
+ +---------+---------------------------+------------------+
+ | 7 | Revocable | Section 5.2.3.20 |
+ +---------+---------------------------+------------------+
+ | 8 | Reserved | |
+ +---------+---------------------------+------------------+
+ | 9 | Key Expiration Time | Section 5.2.3.13 |
+ +---------+---------------------------+------------------+
+ | 10 | Placeholder for backward | |
+ | | compatibility | |
+ +---------+---------------------------+------------------+
+ | 11 | Preferred Symmetric | Section 5.2.3.14 |
+ | | Ciphers for v1 SEIPD | |
+ +---------+---------------------------+------------------+
+ | 12 | Revocation Key | Section 5.2.3.23 |
+ | | (deprecated) | |
+ +---------+---------------------------+------------------+
+ | 13-15 | Reserved | |
+ +---------+---------------------------+------------------+
+ | 16 | Issuer Key ID | Section 5.2.3.12 |
+ +---------+---------------------------+------------------+
+ | 17-19 | Reserved | |
+ +---------+---------------------------+------------------+
+ | 20 | Notation Data | Section 5.2.3.24 |
+ +---------+---------------------------+------------------+
+ | 21 | Preferred Hash Algorithms | Section 5.2.3.16 |
+ +---------+---------------------------+------------------+
+ | 22 | Preferred Compression | Section 5.2.3.17 |
+ | | Algorithms | |
+ +---------+---------------------------+------------------+
+ | 23 | Key Server Preferences | Section 5.2.3.25 |
+ +---------+---------------------------+------------------+
+ | 24 | Preferred Key Server | Section 5.2.3.26 |
+ +---------+---------------------------+------------------+
+ | 25 | Primary User ID | Section 5.2.3.27 |
+ +---------+---------------------------+------------------+
+ | 26 | Policy URI | Section 5.2.3.28 |
+ +---------+---------------------------+------------------+
+ | 27 | Key Flags | Section 5.2.3.29 |
+ +---------+---------------------------+------------------+
+ | 28 | Signer's User ID | Section 5.2.3.30 |
+ +---------+---------------------------+------------------+
+ | 29 | Reason for Revocation | Section 5.2.3.31 |
+ +---------+---------------------------+------------------+
+ | 30 | Features | Section 5.2.3.32 |
+ +---------+---------------------------+------------------+
+ | 31 | Signature Target | Section 5.2.3.33 |
+ +---------+---------------------------+------------------+
+ | 32 | Embedded Signature | Section 5.2.3.34 |
+ +---------+---------------------------+------------------+
+ | 33 | Issuer Fingerprint | Section 5.2.3.35 |
+ +---------+---------------------------+------------------+
+ | 34 | Reserved | |
+ +---------+---------------------------+------------------+
+ | 35 | Intended Recipient | Section 5.2.3.36 |
+ | | Fingerprint | |
+ +---------+---------------------------+------------------+
+ | 37 | Reserved (Attested | |
+ | | Certifications) | |
+ +---------+---------------------------+------------------+
+ | 38 | Reserved (Key Block) | |
+ +---------+---------------------------+------------------+
+ | 39 | Preferred AEAD | Section 5.2.3.15 |
+ | | Ciphersuites | |
+ +---------+---------------------------+------------------+
+ | 100-110 | Private or Experimental | |
+ | | Use | |
+ +---------+---------------------------+------------------+
+
+ Table 5: OpenPGP Signature Subpacket Types Registry
+
+ Implementations SHOULD implement the four preferred algorithm
+ subpackets (11, 21, 22, and 39), as well as the "Features" (30) and
+ "Reason for Revocation" (29) subpackets. To avoid surreptitious
+ forwarding (see Section 13.12), implementations SHOULD also implement
+ the "Intended Recipients Fingerprint" (35) subpacket. Note that if
+ an implementation chooses not to implement some of the preferences
+ subpackets, it MUST default to the mandatory-to-implement algorithms
+ to ensure interoperability. An encrypting implementation that does
+ not implement the "Features" (30) subpacket SHOULD select the type of
+ encrypted data format based on the versions of the recipient keys or
+ external inference (see Section 13.7 for more details).
+
+5.2.3.8. Signature Subpacket Types
+
+ A number of subpackets are currently defined for OpenPGP signatures.
+ Some subpackets apply to the signature itself and some are attributes
+ of the key. Subpackets that are found on a self-signature are placed
+ on a certification made by the key itself. Note that a key may have
+ more than one User ID and thus may have more than one self-signature
+ and differing subpackets.
+
+ A subpacket may be found in either the hashed or the unhashed
+ subpacket sections of a signature. If a subpacket is not hashed,
+ then the information in it cannot be considered definitive because it
+ is not covered by the cryptographic signature. See Section 13.13 for
+ more discussion about hashed and unhashed subpackets.
+
+5.2.3.9. Notes on Subpackets
+
+ It is certainly possible for a signature to contain conflicting
+ information in subpackets. For example, a signature may contain
+ multiple copies of a preference or multiple expiration times. In
+ most cases, an implementation SHOULD use the last subpacket in the
+ hashed section of the signature, but it MAY use any conflict
+ resolution scheme that makes more sense. Please note that conflict
+ resolution is intentionally left to the implementer; most conflicts
+ are simply syntax errors, and the ambiguous language here allows a
+ receiver to be generous in what they accept, while putting pressure
+ on a creator to be stingy in what they generate.
+
+ Some apparent conflicts may actually make sense. For example,
+ suppose a keyholder has a version 3 key and a version 4 key that
+ share the same RSA key material. Either of these keys can verify a
+ signature created by the other, and it may be reasonable for a
+ signature to contain an Issuer Key ID subpacket (Section 5.2.3.12)
+ for each key, as a way of explicitly tying those keys to the
+ signature.
+
+5.2.3.10. Notes on Self-Signatures
+
+ A self-signature is a binding signature made by the key to which the
+ signature refers. There are three types of self-signatures: the
+ certification signatures (Type IDs 0x10-0x13), the Direct Key
+ signature (Type ID 0x1F), and the Subkey Binding signature (Type ID
+ 0x18). A cryptographically valid self-signature should be accepted
+ from any primary key, regardless of what Key Flags (Section 5.2.3.29)
+ apply to the primary key. In particular, a primary key does not need
+ to have 0x01 set in the first octet of the Key Flags order to make a
+ valid self-signature.
+
+ For certification self-signatures, each User ID MAY have a self-
+ signature and thus different subpackets in those self-signatures.
+ For Subkey Binding signatures, each subkey MUST have a self-
+ signature. Subpackets that appear in a certification self-signature
+ apply to the User ID, and subpackets that appear in the subkey self-
+ signature apply to the subkey. Lastly, subpackets on the Direct Key
+ signature apply to the entire key.
+
+ An implementation should interpret a self-signature's preference
+ subpackets as narrowly as possible. For example, suppose a key has
+ two user names, Alice and Bob. Suppose that Alice prefers the AEAD
+ ciphersuite AES-256 with OCB, and Bob prefers Camellia-256 with GCM.
+ If the implementation locates this key via Alice's name, then the
+ preferred AEAD ciphersuite is AES-256 with OCB; if the implementation
+ locates the key via Bob's name, then the preferred algorithm is
+ Camellia-256 with GCM. If the key is located by Key ID, the
+ algorithm of the Primary User ID of the key provides the preferred
+ AEAD ciphersuite.
+
+ Revoking a self-signature or allowing it to expire has a semantic
+ meaning that varies with the signature type. Revoking the self-
+ signature on a User ID effectively retires that user name. The self-
+ signature is a statement, "My name X is tied to my signing key K",
+ and it is corroborated by other users' certifications. If another
+ user revokes their certification, they are effectively saying that
+ they no longer believe that name and that key are tied together.
+ Similarly, if the users themselves revoke their self-signature, then
+ the users no longer go by that name, no longer have that email
+ address, etc. Revoking a binding signature effectively retires that
+ subkey. Revoking a Direct Key signature cancels that signature.
+ Please see Section 5.2.3.31 for more relevant details.
+
+ Since a self-signature contains important information about the key's
+ use, an implementation SHOULD allow the user to rewrite the self-
+ signature and important information in it, such as preferences and
+ key expiration.
+
+ When an implementation imports a secret key, it SHOULD verify that
+ the key's internal self-signatures do not advertise features or
+ algorithms that the implementation doesn't support. If an
+ implementation observes such a mismatch, it SHOULD warn the user and
+ offer to create new self-signatures that advertise the actual set of
+ features and algorithms supported by the implementation.
+
+ An implementation that encounters multiple self-signatures on the
+ same object MUST select the most recent valid self-signature and
+ ignore all other self-signatures.
+
+ By convention, a version 4 key stores information about the primary
+ Public Key (key flags, key expiration, etc.) and the Transferable
+ Public Key as a whole (features, algorithm preferences, etc.) in a
+ User ID self-signature of type 0x10 or 0x13. To use a version 4 key,
+ some implementations require at least one User ID with a valid self-
+ signature to be present. For this reason, it is RECOMMENDED to
+ include at least one User ID with a self-signature in version 4 keys.
+
+ For version 6 keys, it is RECOMMENDED to store information about the
+ primary Public Key as well as the Transferable Public Key as a whole
+ (key flags, key expiration, features, algorithm preferences, etc.) in
+ a Direct Key signature (Type ID 0x1F) over the Public Key, instead of
+ placing that information in a User ID self-signature. An
+ implementation MUST ensure that a valid Direct Key signature is
+ present before using a version 6 key. This prevents certain attacks
+ where an adversary strips a self-signature specifying a Key
+ Expiration Time or certain preferences.
+
+ An implementation SHOULD NOT require a User ID self-signature to be
+ present in order to consume or use a key, unless the particular use
+ is contingent on the keyholder identifying themselves with the
+ textual label in the User ID. For example, when refreshing a key to
+ learn about changes in expiration, advertised features, algorithm
+ preferences, revocation, subkey rotation, and so forth, there is no
+ need to require a User ID self-signature. On the other hand, when
+ verifying a signature over an email message, an implementation MAY
+ choose to only accept a signature from a key that has a valid self-
+ signature over a User ID that matches the message's From: header, as
+ a way to avoid a signature transplant attack.
+
+5.2.3.11. Signature Creation Time
+
+ (4-octet time field)
+
+ The time the signature was made.
+
+ This subpacket MUST be present in the hashed area.
+
+ When generating this subpacket, it SHOULD be marked as critical.
+
+5.2.3.12. Issuer Key ID
+
+ (8-octet Key ID)
+
+ The OpenPGP Key ID of the key issuing the signature. If the version
+ of that key is greater than 4, this subpacket MUST NOT be included in
+ the signature. For these keys, consider the Issuer Fingerprint
+ subpacket (Section 5.2.3.35) instead.
+
+ Note: in previous versions of this specification, this subpacket was
+ simply known as the "Issuer" subpacket.
+
+5.2.3.13. Key Expiration Time
+
+ (4-octet time field)
+
+ The validity period of the key. This is the number of seconds after
+ the key creation time that the key expires. For a direct or
+ certification self-signature, the key creation time is that of the
+ primary key. For a Subkey Binding signature, the key creation time
+ is that of the subkey. If this is not present or has a value of
+ zero, the key never expires. This is found only on a self-signature.
+
+ When an implementation generates this subpacket, it SHOULD be marked
+ as critical.
+
+5.2.3.14. Preferred Symmetric Ciphers for v1 SEIPD
+
+ (array of 1-octet values)
+
+ A series of Symmetric Cipher Algorithm IDs indicating how the
+ keyholder prefers to receive the version 1 Symmetrically Encrypted
+ and Integrity Protected Data packet (Section 5.13.1). The subpacket
+ body is an ordered list of octets with the most preferred listed
+ first. It is assumed that only the algorithms listed are supported
+ by the recipient's implementation. Algorithm IDs are defined in
+ Section 9.3. This is only found on a self-signature.
+
+ When generating a v2 SEIPD packet, this preference list is not
+ relevant. See Section 5.2.3.15 instead.
+
+5.2.3.15. Preferred AEAD Ciphersuites
+
+ (array of pairs of octets indicating Symmetric Cipher and AEAD
+ algorithms)
+
+ A series of paired algorithm IDs indicating how the keyholder prefers
+ to receive the version 2 Symmetrically Encrypted and Integrity
+ Protected Data packet (Section 5.13.2). Each pair of octets
+ indicates a combination of a symmetric cipher and an AEAD mode that
+ the keyholder prefers to use. The Symmetric Cipher Algorithm ID
+ precedes the AEAD algorithm ID in each pair. The subpacket body is
+ an ordered list of pairs of octets with the most preferred algorithm
+ combination listed first.
+
+ It is assumed that only the combinations of algorithms listed are
+ supported by the recipient's implementation, with the exception of
+ the mandatory-to-implement combination of AES-128 and OCB. If
+ AES-128 and OCB are not found in the subpacket, it is implicitly
+ listed at the end.
+
+ AEAD algorithm IDs are listed in Section 9.6. Symmetric Cipher
+ Algorithm IDs are listed in Section 9.3.
+
+ For example, a subpacket containing the six octets
+
+ 09 02 09 03 13 02
+
+ indicates that the keyholder prefers to receive v2 SEIPD using
+ AES-256 with OCB, then AES-256 with GCM, then Camellia-256 with OCB,
+ and finally the implicit AES-128 with OCB.
+
+ Note that support for the version 2 Symmetrically Encrypted and
+ Integrity Protected Data packet (Section 5.13.2) in general is
+ indicated by a Features Flag (Section 5.2.3.32).
+
+ This subpacket is only found on a self-signature.
+
+ When generating a v1 SEIPD packet, this preference list is not
+ relevant. See Section 5.2.3.14 instead.
+
+5.2.3.16. Preferred Hash Algorithms
+
+ (array of 1-octet values)
+
+ Message digest algorithm IDs that indicate which algorithms the
+ keyholder prefers to receive. Like the Preferred AEAD Ciphersuites,
+ the list is ordered. Algorithm IDs are defined in Section 9.5. This
+ is only found on a self-signature.
+
+5.2.3.17. Preferred Compression Algorithms
+
+ (array of 1-octet values)
+
+ Compression algorithm IDs that indicate which algorithms the
+ keyholder prefers to use. Like the Preferred AEAD Ciphersuites, the
+ list is ordered. Algorithm IDs are defined in Section 9.4. A zero,
+ or the absence of this subpacket, denotes that uncompressed data is
+ preferred; the keyholder's implementation might have no compression
+ support available. This is only found on a self-signature.
+
+5.2.3.18. Signature Expiration Time
+
+ (4-octet time field)
+
+ The validity period of the signature. This is the number of seconds
+ after the Signature Creation Time that the signature expires. If
+ this is not present or has a value of zero, it never expires.
+
+ When an implementation generates this subpacket, it SHOULD be marked
+ as critical.
+
+5.2.3.19. Exportable Certification
+
+ (1 octet of exportability, 0 for not, 1 for exportable)
+
+ This subpacket denotes whether a certification signature is
+ "exportable"; it is intended for use by users other than the
+ signature's issuer. The packet body contains a Boolean flag
+ indicating whether the signature is exportable. If this packet is
+ not present, the certification is exportable; it is equivalent to a
+ flag containing a 1.
+
+ Non-exportable, or "local", certifications are signatures made by a
+ user to mark a key as valid within that user's implementation only.
+
+ Thus, when an implementation prepares a user's copy of a key for
+ transport to another user (this is the process of "exporting" the
+ key), any local certification signatures are deleted from the key.
+
+ The receiver of a transported key "imports" it and likewise trims any
+ local certifications. In normal operation, there won't be any local
+ certifications, assuming the import is performed on an exported key.
+ However, there are instances where this can reasonably happen. For
+ example, if an implementation allows keys to be imported from a key
+ database in addition to an exported key, then this situation can
+ arise.
+
+ Some implementations do not represent the interest of a single user
+ (for example, a key server). Such implementations always trim local
+ certifications from any key they handle.
+
+ When an implementation generates this subpacket and denotes the
+ signature as non-exportable, the subpacket MUST be marked as
+ critical.
+
+5.2.3.20. Revocable
+
+ (1 octet of revocability, 0 for not, 1 for revocable)
+
+ A Signature's revocability status. The packet body contains a
+ Boolean flag indicating whether the signature is revocable.
+ Signatures that are not revocable ignore any later Revocation
+ Signatures. They represent the signer's commitment that its
+ signature cannot be revoked for the life of its key. If this packet
+ is not present, the signature is revocable.
+
+5.2.3.21. Trust Signature
+
+ (1 octet "level" (depth), 1 octet of trust amount)
+
+ The signer asserts that the key is not only valid but also
+ trustworthy at the specified level. Level 0 has the same meaning as
+ an ordinary validity signature. Level 1 means that the signed key is
+ asserted to be a valid trusted introducer, with the 2nd octet of the
+ body specifying the degree of trust. Level 2 means that the signed
+ key is asserted to be trusted to issue level 1 Trust Signatures; that
+ is, the signed key is a "meta introducer". Generally, a level n
+ Trust Signature asserts that a key is trusted to issue level n-1
+ Trust Signatures. The trust amount is in a range from 0-255,
+ interpreted such that values less than 120 indicate partial trust and
+ values of 120 or greater indicate complete trust. Implementations
+ SHOULD emit values of 60 for partial trust and 120 for complete
+ trust.
+
+5.2.3.22. Regular Expression
+
+ (null-terminated UTF-8 encoded Regular Expression)
+
+ Used in conjunction with Trust Signature packets (of level > 0) to
+ limit the scope of trust that is extended. Only signatures by the
+ target key on User IDs that match the Regular Expression in the body
+ of this packet have trust extended by the Trust Signature subpacket.
+ The Regular Expression uses the same syntax as Henry Spencer's
+ "almost public domain" Regular Expression [REGEX] package. A
+ description of the syntax is found in Section 8. The Regular
+ Expression matches (or does not match) a sequence of UTF-8-encoded
+ Unicode characters from User IDs. The expression itself is also
+ written with UTF-8 characters.
+
+ For historical reasons, this subpacket includes a null character (an
+ octet with value zero) after the Regular Expression. When an
+ implementation parses a Regular Expression subpacket, it MUST remove
+ this octet; if it is not present, it MUST reject the subpacket (i.e.,
+ ignore the subpacket if it's non-critical and reject the signature if
+ it's critical). When an implementation generates a Regular
+ Expression subpacket, it MUST include the null terminator.
+
+ When generating this subpacket, it SHOULD be marked as critical.
+
+5.2.3.23. Revocation Key (Deprecated)
+
+ (1 octet of class, 1 octet of public key algorithm ID, 20 octets of
+ version 4 fingerprint)
+
+ This mechanism is deprecated. Applications MUST NOT generate such a
+ subpacket.
+
+ An application that wants the functionality of delegating revocation
+ can use an escrowed Revocation Signature. See Section 13.9 for more
+ details.
+
+ The remainder of this section describes how some implementations
+ attempt to interpret this deprecated subpacket.
+
+ This packet was intended to authorize the specified key to issue
+ Revocation Signatures for this key. The class octet must have bit
+ 0x80 set. If bit 0x40 is set, it means the revocation information is
+ sensitive. Other bits are for future expansion to other kinds of
+ authorizations. This is only found on a Direct Key self-signature
+ (Type ID 0x1F). The use on other types of self-signatures is
+ unspecified.
+
+ If the "sensitive" flag is set, the keyholder feels this subpacket
+ contains private trust information that describes a real-world
+ sensitive relationship. If this flag is set, implementations SHOULD
+ NOT export this signature to other users except in cases where the
+ data needs to be available, i.e., when the signature is being sent to
+ the designated revoker or when it is accompanied by a Revocation
+ Signature from that revoker. Note that it may be appropriate to
+ isolate this subpacket within a separate signature so that it is not
+ combined with other subpackets that need to be exported.
+
+5.2.3.24. Notation Data
+
+ (4 octets of flags, 2 octets of name length (M), 2 octets of value
+ length (N), M octets of name data, N octets of value data)
+
+ This subpacket describes a "notation" on the signature that the
+ issuer wishes to make. The notation has a name and a value, each of
+ which are strings of octets. There may be more than one notation in
+ a signature. Notations can be used for any extension the issuer of
+ the signature cares to make. The "flags" field holds 4 octets of
+ flags.
+
+ All undefined flags MUST be zero. Defined flags are as follows:
+
+ +=======================+================+================+
+ | Flag Position | Shorthand | Description |
+ +=======================+================+================+
+ | 0x80000000 (first bit | human-readable | Notation value |
+ | of the first octet) | | is UTF-8 text |
+ +-----------------------+----------------+----------------+
+
+ Table 6: OpenPGP Signature Notation Data Subpacket
+ Notation Flags Registry
+
+ Notation names are arbitrary strings encoded in UTF-8. They reside
+ in two namespaces: the IETF namespace and the user namespace.
+
+ The IETF namespace is registered with IANA. These names MUST NOT
+ contain the "@" character (0x40). This is a tag for the user
+ namespace.
+
+ +===============+===========+================+
+ | Notation Name | Data Type | Allowed Values |
+ +===============+===========+================+
+ | No registrations at this time. |
+ +============================================+
+
+ Table 7: OpenPGP Signature Notation Data
+ Subpacket Types Registry
+
+ This registry is initially empty.
+
+ Names in the user namespace consist of a UTF-8 string tag followed by
+ "@", followed by a DNS domain name. Note that the tag MUST NOT
+ contain an "@" character. For example, the "sample" tag used by
+ Example Corporation could be "sample@example.com".
+
+ Names in a user space are owned and controlled by the owners of that
+ domain. Obviously, it's bad form to create a new name in a DNS space
+ that you don't own.
+
+ Since the user namespace is in the form of an email address,
+ implementers MAY wish to arrange for that address to reach a person
+ who can be consulted about the use of the named tag. Note that due
+ to UTF-8 encoding, not all valid user space name tags are valid email
+ addresses.
+
+ If there is a critical notation, the criticality applies to that
+ specific notation and not to notations in general.
+
+5.2.3.25. Key Server Preferences
+
+ (N octets of flags)
+
+ This is a list of 1-bit flags that indicates preferences that the
+ keyholder has about how the key is handled on a key server. All
+ undefined flags MUST be zero.
+
+ +=========+===========+===========================================+
+ | Flag | Shorthand | Definition |
+ +=========+===========+===========================================+
+ | 0x80... | No-modify | The keyholder requests that this key only |
+ | | | be modified or updated by the keyholder |
+ | | | or an administrator of the key server. |
+ +---------+-----------+-------------------------------------------+
+
+ Table 8: OpenPGP Key Server Preference Flags Registry
+
+ This is found only on a self-signature.
+
+5.2.3.26. Preferred Key Server
+
+ (String)
+
+ This is a URI of a key server that the keyholder prefers be used for
+ updates. Note that keys with multiple User IDs can have a Preferred
+ Key Server for each User ID. Note also that since this is a URI, the
+ key server can actually be a copy of the key retrieved by https, ftp,
+ http, etc.
+
+5.2.3.27. Primary User ID
+
+ (1 octet, Boolean)
+
+ This is a flag in a User ID's self-signature that states whether this
+ User ID is the main User ID for this key. It is reasonable for an
+ implementation to resolve ambiguities in preferences, for example, by
+ referring to the Primary User ID. If this flag is absent, its value
+ is zero. If more than one User ID in a key is marked as primary, the
+ implementation may resolve the ambiguity in any way it sees fit, but
+ it is RECOMMENDED that priority be given to the User ID with the most
+ recent self-signature.
+
+ When appearing on a self-signature on a User ID packet, this
+ subpacket applies only to User ID packets. When appearing on a self-
+ signature on a User Attribute packet, this subpacket applies only to
+ User Attribute packets. That is, there are two different and
+ independent "primaries" -- one for User IDs and one for User
+ Attributes.
+
+5.2.3.28. Policy URI
+
+ (String)
+
+ This subpacket contains a URI of a document that describes the policy
+ under which the signature was issued.
+
+5.2.3.29. Key Flags
+
+ (N octets of flags)
+
+ This subpacket contains a list of binary flags that hold information
+ about a key. It is a string of octets, and an implementation MUST
+ NOT assume a fixed size, so that it can grow over time. If a list is
+ shorter than an implementation expects, the unstated flags are
+ considered to be zero. The defined flags are as follows:
+
+ +===========+======================================================+
+ | Flag | Definition |
+ +===========+======================================================+
+ | 0x01... | This key may be used to make User ID certifications |
+ | | (Signature Type IDs 0x10-0x13) or Direct Key |
+ | | signatures (Signature Type ID 0x1F) over other keys. |
+ +-----------+------------------------------------------------------+
+ | 0x02... | This key may be used to sign data. |
+ +-----------+------------------------------------------------------+
+ | 0x04... | This key may be used to encrypt communications. |
+ +-----------+------------------------------------------------------+
+ | 0x08... | This key may be used to encrypt storage. |
+ +-----------+------------------------------------------------------+
+ | 0x10... | The private component of this key may have been |
+ | | split by a secret-sharing mechanism. |
+ +-----------+------------------------------------------------------+
+ | 0x20... | This key may be used for authentication. |
+ +-----------+------------------------------------------------------+
+ | 0x80... | The private component of this key may be in the |
+ | | possession of more than one person. |
+ +-----------+------------------------------------------------------+
+ | 0x0004... | Reserved (ADSK) |
+ +-----------+------------------------------------------------------+
+ | 0x0008... | Reserved (timestamping) |
+ +-----------+------------------------------------------------------+
+
+ Table 9: OpenPGP Key Flags Registry
+
+ Usage notes:
+
+ The flags in this packet may appear in self-signatures or in
+ certification signatures. They mean different things depending on
+ who is making the statement. For example, a certification signature
+ that has the "sign data" flag is stating that the certification is
+ for that use. On the other hand, the "communications encryption"
+ flag in a self-signature is stating a preference that a given key be
+ used for communications. However, note that determining what is
+ "communications" and what is "storage" is a thorny issue. This
+ decision is left wholly up to the implementation; the authors of this
+ document do not claim any special wisdom on the issue and realize
+ that accepted opinion may change.
+
+ The "split key" (0x10) and "group key" (0x80) flags are placed on a
+ self-signature only; they are meaningless on a certification
+ signature. They SHOULD be placed only on a Direct Key signature
+ (Type ID 0x1F) or a Subkey Binding signature (Type ID 0x18), one that
+ refers to the key the flag applies to.
+
+ When an implementation generates this subpacket, it SHOULD be marked
+ as critical.
+
+5.2.3.30. Signer's User ID
+
+ (String)
+
+ This subpacket allows a keyholder to state which User ID is
+ responsible for the signing. Many keyholders use a single key for
+ different purposes, such as business communications as well as
+ personal communications. This subpacket allows such a keyholder to
+ state which of their roles is making a signature.
+
+ This subpacket is not appropriate to use to refer to a User Attribute
+ packet.
+
+5.2.3.31. Reason for Revocation
+
+ (1 octet of revocation code, N octets of reason string)
+
+ This subpacket is used only in Key Revocation and Certification
+ Revocation signatures. It describes the reason why the key or
+ certification was revoked.
+
+ The first octet contains a machine-readable code that denotes the
+ reason for the revocation:
+
+ +=========+========================================+
+ | Code | Reason |
+ +=========+========================================+
+ | 0 | No reason specified (Key Revocation or |
+ | | Certification Revocation signatures) |
+ +---------+----------------------------------------+
+ | 1 | Key is superseded (Key Revocation |
+ | | signatures) |
+ +---------+----------------------------------------+
+ | 2 | Key material has been compromised (Key |
+ | | Revocation signatures) |
+ +---------+----------------------------------------+
+ | 3 | Key is retired and no longer used (Key |
+ | | Revocation signatures) |
+ +---------+----------------------------------------+
+ | 32 | User ID information is no longer valid |
+ | | (Certification Revocation signatures) |
+ +---------+----------------------------------------+
+ | 100-110 | Private Use |
+ +---------+----------------------------------------+
+
+ Table 10: OpenPGP Reason for Revocation
+ (Revocation Octet) Registry
+
+ Following the revocation code is a string of octets that gives
+ information about the Reason for Revocation in human-readable form
+ (UTF-8). The string may be null (of zero length). The length of the
+ subpacket is the length of the reason string plus one. An
+ implementation SHOULD implement this subpacket, include it in all
+ Revocation Signatures, and interpret revocations appropriately.
+ There are important semantic differences between the reasons, and
+ there are thus important reasons for revoking signatures.
+
+ If a key has been revoked because of a compromise, all signatures
+ created by that key are suspect. However, if it was merely
+ superseded or retired, old signatures are still valid. If the
+ revoked signature is the self-signature for certifying a User ID, a
+ revocation denotes that that user name is no longer in use. Such a
+ signature revocation SHOULD include a Reason for Revocation subpacket
+ containing code 32.
+
+ Note that any certification may be revoked, including a certification
+ on some other person's key. There are many good reasons for revoking
+ a certification signature, such as the case where the keyholder
+ leaves the employ of a business with an email address. A revoked
+ certification is no longer a part of validity calculations.
+
+5.2.3.32. Features
+
+ (N octets of flags)
+
+ The Features subpacket denotes which advanced OpenPGP features a
+ user's implementation supports. This is so that as features are
+ added to OpenPGP that cannot be backward compatible, a user can state
+ that they can use that feature. The flags are single bits that
+ indicate that a given feature is supported.
+
+ This subpacket is similar to a preferences subpacket and only appears
+ in a self-signature.
+
+ An implementation SHOULD NOT use a feature listed when sending to a
+ user who does not state that they can use it, unless the
+ implementation can infer support for the feature from another
+ implementation-dependent mechanism.
+
+ Defined features are as follows:
+
+ First octet:
+
+ +=========+=====================================+===========+
+ | Feature | Definition | Reference |
+ +=========+=====================================+===========+
+ | 0x01... | Version 1 Symmetrically Encrypted | Section |
+ | | and Integrity Protected Data packet | 5.13.1 |
+ +---------+-------------------------------------+-----------+
+ | 0x02... | Reserved | |
+ +---------+-------------------------------------+-----------+
+ | 0x04... | Reserved | |
+ +---------+-------------------------------------+-----------+
+ | 0x08... | Version 2 Symmetrically Encrypted | Section |
+ | | and Integrity Protected Data packet | 5.13.2 |
+ +---------+-------------------------------------+-----------+
+
+ Table 11: OpenPGP Features Flags Registry
+
+ If an implementation implements any of the defined features, it
+ SHOULD implement the Features subpacket, too.
+
+ See Section 13.7 for details about how to use the Features subpacket
+ when generating encryption data.
+
+5.2.3.33. Signature Target
+
+ (1 octet public key algorithm, 1 octet hash algorithm, N octets hash)
+
+ This subpacket identifies a specific target signature to which a
+ signature refers. For Revocation Signatures, this subpacket provides
+ explicit designation of which signature is being revoked. For a
+ Third-Party Confirmation or Timestamp signature, this designates what
+ signature is signed. All arguments are an identifier of that target
+ signature.
+
+ The N octets of hash data MUST be the size of the signature's hash.
+ For example, a target signature with a SHA-1 hash MUST have 20 octets
+ of hash data.
+
+5.2.3.34. Embedded Signature
+
+ (1 Signature packet body)
+
+ This subpacket contains a complete Signature packet body as specified
+ in Section 5.2. It is useful when one signature needs to refer to,
+ or be incorporated in, another signature.
+
+5.2.3.35. Issuer Fingerprint
+
+ (1 octet key version number, N octets of fingerprint)
+
+ The OpenPGP Key fingerprint of the key issuing the signature. This
+ subpacket SHOULD be included in all signatures. If the version of
+ the issuing key is 4 and an Issuer Key ID subpacket
+ (Section 5.2.3.12) is also included in the signature, the Key ID of
+ the Issuer Key ID subpacket MUST match the low 64 bits of the
+ fingerprint.
+
+ Note that the length N of the fingerprint for a version 4 key is 20
+ octets; for a version 6 key, N is 32. Since the version of the
+ signature is bound to the version of the key, the version octet here
+ MUST match the version of the signature. If the version octet does
+ not match the signature version, the receiving implementation MUST
+ treat it as a malformed signature (see Section 5.2.5).
+
+5.2.3.36. Intended Recipient Fingerprint
+
+ (1 octet key version number, N octets of fingerprint)
+
+ The OpenPGP Key fingerprint of the intended recipient primary key.
+ If one or more subpackets of this type are included in a signature,
+ it SHOULD be considered valid only in an encrypted context, where the
+ key it was encrypted to is one of the indicated primary keys or one
+ of their subkeys. This can be used to prevent forwarding a signature
+ outside of its intended, encrypted context (see Section 13.12).
+
+ Note that the length N of the fingerprint for a version 4 key is 20
+ octets; for a version 6 key, N is 32.
+
+ An implementation SHOULD generate this subpacket when creating a
+ signed and encrypted message.
+
+ When generating this subpacket in a version 6 signature, it SHOULD be
+ marked as critical.
+
+5.2.4. Computing Signatures
+
+ All signatures are formed by producing a hash over the signature data
+ and then using the resulting hash in the signature algorithm.
+
+ When creating or verifying a version 6 signature, the salt is fed
+ into the hash context before any other data.
+
+ For binary document signatures (Type ID 0x00), the document data is
+ hashed directly. For text document signatures (Type ID 0x01), the
+ implementation MUST first canonicalize the document by converting
+ line endings to <CR><LF> and encoding it in UTF-8 (see [RFC3629]).
+ The resulting UTF-8 byte stream is hashed.
+
+ When a version 4 signature is made over a key, the hash data starts
+ with the octet 0x99, followed by a 2-octet length of the key,
+ followed by the body of the key packet. When a version 6 signature
+ is made over a key, the hash data starts with the salt and then octet
+ 0x9B, followed by a 4-octet length of the key, followed by the body
+ of the key packet.
+
+ A Subkey Binding signature (Type ID 0x18) or Primary Key Binding
+ signature (Type ID 0x19) then hashes the subkey using the same format
+ as the main key (also using 0x99 or 0x9B as the first octet).
+ Primary Key Revocation signatures (Type ID 0x20) hash only the key
+ being revoked. A Subkey Revocation signature (Type ID 0x28) first
+ hashes the primary key and then the subkey being revoked.
+
+ A Certification signature (Type IDs 0x10 through 0x13) hashes the
+ User ID that is bound to the key into the hash context after the
+ above data. A version 3 certification hashes the contents of the
+ User ID or User Attribute packet without the packet header. A
+ version 4 or version 6 certification hashes the constant 0xB4 for
+ User ID certifications or the constant 0xD1 for User Attribute
+ certifications, followed by a 4-octet number giving the length of the
+ User ID or User Attribute data, followed by the User ID or User
+ Attribute data.
+
+ A Third-Party Confirmation signature (Type ID 0x50) hashes the salt
+ (version 6 signatures only), followed by the octet 0x88, followed by
+ the 4-octet length of the signature, and then the body of the
+ Signature packet. (Note that this is a Legacy packet header for a
+ Signature packet with the length-of-length field set to zero.) The
+ unhashed subpacket data of the Signature packet being hashed is not
+ included in the hash, and the unhashed subpacket data length value is
+ set to zero.
+
+ Once the data body is hashed, then a trailer is hashed. This trailer
+ depends on the version of the signature.
+
+ * A version 3 signature hashes five octets of the packet body,
+ starting from the signature type field. This data is the
+ signature type, followed by the 4-octet Signature Creation Time.
+
+ * A version 4 or version 6 signature hashes the packet body starting
+ from its first field, the version number, through the end of the
+ hashed subpacket data and a final extra trailer. Thus, the hashed
+ fields are:
+
+ - an octet indicating the signature version (0x04 for version 4,
+ and 0x06 for version 6),
+
+ - the signature type,
+
+ - the public key algorithm,
+
+ - the hash algorithm,
+
+ - the hashed subpacket length,
+
+ - the hashed subpacket body,
+
+ - a second version octet (0x04 for version 4, and 0x06 for
+ version 6),
+
+ - a single octet 0xFF, and
+
+ - a number representing the length (in octets) of the hashed data
+ from the Signature packet through the hashed subpacket body.
+ This a 4-octet big-endian unsigned integer of the length modulo
+ 2^32.
+
+ After all this has been hashed in a single hash context, the
+ resulting hash field is used in the signature algorithm, and its
+ first two octets are placed in the Signature packet, as described in
+ Section 5.2.3.
+
+ For worked examples of the data hashed during a signature, see
+ Appendix A.3.1.
+
+5.2.4.1. Notes about Signature Computation
+
+ The data actually hashed by OpenPGP varies depending on the signature
+ version, in order to ensure that a signature made using one version
+ cannot be repurposed as a signature with a different version over
+ subtly different data. The hashed data streams differ based on their
+ trailer, most critically in the fifth and sixth octets from the end
+ of the stream. In particular:
+
+ * A version 3 signature uses the fifth octet from the end to store
+ its Signature Type ID. This MUST NOT be Signature Type ID 0xFF.
+
+ * All signature versions later than version 3 always use a literal
+ 0xFF in the fifth octet from the end. For these later signature
+ versions, the sixth octet from the end (the octet before the 0xFF)
+ stores the signature version number.
+
+5.2.5. Malformed and Unknown Signatures
+
+ In some cases, a Signature packet (or its corresponding One-Pass
+ Signature packet; see Section 5.4) may be malformed or unknown. For
+ example, it might encounter any of the following problems (this is
+ not an exhaustive list):
+
+ * An unknown signature type
+
+ * An unknown signature version
+
+ * An unsupported signature version
+
+ * An unknown "critical" subpacket (see Section 5.2.3.7) in the
+ hashed area
+
+ * A subpacket with a length that diverges from the expected length
+
+ * A hashed subpacket area with length that exceeds the length of the
+ Signature packet itself
+
+ * A hash algorithm known to be weak (e.g., MD5)
+
+ * A mismatch between the expected salt length of the hash algorithm
+ and the actual salt length
+
+ * A mismatch between the One-Pass Signature version and the
+ Signature version (see Section 10.3.2.2)
+
+ * A signature with a version other than 6, made by a version 6 key
+
+ When an implementation encounters such a malformed or unknown
+ signature, it MUST ignore the signature for validation purposes. It
+ MUST NOT indicate a successful signature validation for such a
+ signature. At the same time, it MUST NOT halt processing on the
+ packet stream or reject other signatures in the same packet stream
+ just because an unknown or invalid signature exists.
+
+ This requirement is necessary for forward compatibility. Producing
+ an output that indicates that no successful signatures were found is
+ preferable to aborting processing entirely.
+
+5.3. Symmetric Key Encrypted Session Key Packet (Type ID 3)
+
+ The Symmetric Key Encrypted Session Key (SKESK) packet holds the
+ symmetric key encryption of a session key used to encrypt a message.
+ Zero or more Public Key Encrypted Session Key packets (Section 5.1)
+ and/or Symmetric Key Encrypted Session Key packets precede an
+ encryption container (that is, a Symmetrically Encrypted and
+ Integrity Protected Data packet or -- for historic data -- a
+ Symmetrically Encrypted Data packet) that holds an Encrypted Message.
+ The message is encrypted with a session key, and the session key is
+ itself encrypted and stored in the Encrypted Session Key packet(s).
+
+ If the encryption container is preceded by one or more Symmetric Key
+ Encrypted Session Key packets, each specifies a passphrase that may
+ be used to decrypt the message. This allows a message to be
+ encrypted to a number of public keys, and also to one or more
+ passphrases.
+
+ The body of this packet starts with a 1-octet number giving the
+ version number of the packet type. The currently defined versions
+ are 4 and 6. The remainder of the packet depends on the version.
+
+ The versions differ in how they encrypt the session key with the
+ passphrase and in what they encode. The version of the SKESK packet
+ must align with the version of the SEIPD packet (see
+ Section 10.3.2.1). Any new version of the SKESK packet should be
+ registered in the registry established in Section 10.3.2.1.
+
+5.3.1. Version 4 Symmetric Key Encrypted Session Key Packet Format
+
+ A v4 SKESK packet precedes a v1 SEIPD (see Section 5.13.1). In
+ historic data, it is sometimes found preceding a deprecated SED
+ packet (see Section 5.7). A v4 SKESK packet MUST NOT precede a v2
+ SEIPD packet (see Section 10.3.2.1).
+
+ A version 4 Symmetric Key Encrypted Session Key packet consists of:
+
+ * A 1-octet version number with value 4.
+
+ * A 1-octet number describing the symmetric algorithm used.
+
+ * An S2K Specifier. The length of the S2K Specifier depends on its
+ type (see Section 3.7.1).
+
+ * Optionally, the encrypted session key itself, which is decrypted
+ with the S2K object.
+
+ If the encrypted session key is not present (which can be detected on
+ the basis of packet length and S2K Specifier size), then the S2K
+ algorithm applied to the passphrase produces the session key for
+ decrypting the message, using the Symmetric Cipher Algorithm ID from
+ the Symmetric Key Encrypted Session Key packet.
+
+ If the encrypted session key is present, the result of applying the
+ S2K algorithm to the passphrase is used to decrypt just that
+ encrypted session key field, using CFB mode with an IV of all zeros.
+ The decryption result consists of a 1-octet algorithm identifier that
+ specifies the symmetric key encryption algorithm used to encrypt the
+ following encryption container, followed by the session key octets
+ themselves.
+
+ Note: because an all-zero IV is used for this decryption, the S2K
+ Specifier MUST use a salt value, a Salted S2K, an Iterated and Salted
+ S2K, or Argon2. The salt value will ensure that the decryption key
+ is not repeated even if the passphrase is reused.
+
+5.3.2. Version 6 Symmetric Key Encrypted Session Key Packet Format
+
+ A v6 SKESK packet precedes a v2 SEIPD packet (see Section 5.13.2). A
+ v6 SKESK packet MUST NOT precede a v1 SEIPD packet or a deprecated
+ Symmetrically Encrypted Data packet (see Section 10.3.2.1).
+
+ A version 6 Symmetric Key Encrypted Session Key packet consists of:
+
+ * A 1-octet version number with value 6.
+
+ * A 1-octet scalar octet count for the 5 fields following this
+ octet.
+
+ * A 1-octet Symmetric Cipher Algorithm ID (from Table 21).
+
+ * A 1-octet AEAD algorithm identifier (from Table 25).
+
+ * A 1-octet scalar octet count of the following field.
+
+ * An S2K Specifier. The length of the S2K Specifier depends on its
+ type (see Section 3.7.1).
+
+ * A starting IV of the size specified by the AEAD algorithm.
+
+ * The encrypted session key itself.
+
+ * An authentication tag for the AEAD mode.
+
+ A key-encryption key (KEK) is derived using HKDF [RFC5869] with
+ SHA256 [RFC6234] as the hash algorithm. The Initial Keying Material
+ (IKM) for HKDF is the key derived from S2K. No salt is used. The
+ info parameter is comprised of the Packet Type ID in OpenPGP format
+ encoding (bits 7 and 6 are set, and bits 5-0 carry the Packet Type
+ ID), the packet version, and the cipher-algo and AEAD-mode used to
+ encrypt the key material.
+
+ Then, the session key is encrypted using the resulting key, with the
+ AEAD algorithm specified for the version 2 Symmetrically Encrypted
+ and Integrity Protected Data packet. Note that no chunks are used
+ and that there is only one authentication tag. The Packet Type ID
+ encoded in OpenPGP format (bits 7 and 6 are set, and bits 5-0 carry
+ the Packet Type ID), the packet version number, the cipher algorithm
+ ID, and the AEAD algorithm ID are given as additional data. For
+ example, the additional data used with AES-128 with OCB consists of
+ the octets 0xC3, 0x06, 0x07, and 0x02.
+
+5.4. One-Pass Signature Packet (Type ID 4)
+
+ The One-Pass Signature packet precedes the signed data and contains
+ enough information to allow the receiver to begin calculating any
+ hashes needed to verify the signature. It allows the Signature
+ packet to be placed at the end of the message so that the signer can
+ compute the entire signed message in one pass.
+
+ The body of this packet consists of:
+
+ * A 1-octet version number. The currently defined versions are 3
+ and 6. Any new One-Pass Signature packet version should be
+ registered in the registry established in Section 10.3.2.2.
+
+ * A 1-octet Signature Type ID. Signature types are described in
+ Section 5.2.1.
+
+ * A 1-octet number describing the hash algorithm used.
+
+ * A 1-octet number describing the public key algorithm used.
+
+ * Only for version 6 packets, a variable-length field containing:
+
+ - A 1-octet salt size. The value MUST match the value defined
+ for the hash algorithm as specified in Table 23.
+
+ - The salt; a random value of the specified size. The value MUST
+ match the salt field of the corresponding Signature packet.
+
+ * Only for v3 packets, an 8-octet number holding the Key ID of the
+ signing key.
+
+ * Only for version 6 packets, 32 octets of the fingerprint of the
+ signing key. Since a version 6 signature can only be made by a
+ version 6 key, the length of the fingerprint is fixed.
+
+ * A 1-octet number holding a flag showing whether the signature is
+ nested. A zero value indicates that the next packet is another
+ One-Pass Signature packet that describes another signature to be
+ applied to the same message data.
+
+ When generating a one-pass signature, the OPS packet version MUST
+ correspond to the version of the associated Signature packet, except
+ for the historical accident that version 4 keys use a version 3 One-
+ Pass Signature packet (there is no version 4 OPS). See
+ Section 10.3.2.2 for the full correspondence of versions between
+ Keys, Signatures, and One-Pass Signatures.
+
+ Note that if a message contains more than one one-pass signature,
+ then the Signature packets bracket the message; that is, the first
+ Signature packet after the message corresponds to the last One-Pass
+ Signature packet and the final Signature packet corresponds to the
+ first One-Pass Signature packet.
+
+5.5. Key Material Packets
+
+ A key material packet contains all the information about a public or
+ private key. There are four variants of this packet type: two major
+ versions (versions 4 and 6) and two strongly deprecated versions
+ (versions 2 and 3). Consequently, this section is complex.
+
+ For historical reasons, versions 1 and 5 of the key packets are
+ unspecified.
+
+5.5.1. Key Packet Variants
+
+5.5.1.1. Public Key Packet (Type ID 6)
+
+ A Public Key packet starts a series of packets that forms an OpenPGP
+ Key (sometimes called an OpenPGP certificate).
+
+5.5.1.2. Public Subkey Packet (Type ID 14)
+
+ A Public Subkey packet (Type ID 14) has exactly the same format as a
+ Public Key packet, but it denotes a subkey. One or more subkeys may
+ be associated with a top-level key. By convention, the top-level key
+ offers certification capability, but it does not provide encryption
+ services, while a dedicated subkey provides encryption (see
+ Section 10.1.5).
+
+5.5.1.3. Secret Key Packet (Type ID 5)
+
+ A Secret Key packet contains all the information that is found in a
+ Public Key packet, including the public key material, but it also
+ includes the secret key material after all the public key fields.
+
+5.5.1.4. Secret Subkey Packet (Type ID 7)
+
+ A Secret Subkey packet (Type ID 7) is the subkey analog of the Secret
+ Key packet and has exactly the same format.
+
+5.5.2. Public Key Packet Formats
+
+ There are four versions of key material packets. Versions 2 and 3
+ have been deprecated since 1998. Version 4 has been deprecated by
+ this document.
+
+ OpenPGP implementations SHOULD create keys with version 6 format.
+ Version 4 keys are deprecated; an implementation SHOULD NOT generate
+ a version 4 key but SHOULD accept it. Version 3 keys are deprecated;
+ an implementation MUST NOT generate a version 3 key but MAY accept
+ it. Version 2 keys are deprecated; an implementation MUST NOT
+ generate a version 2 key but MAY accept it.
+
+ Any new Key Version must be registered in the registry established in
+ Section 10.3.2.2.
+
+5.5.2.1. Version 3 Public Keys
+
+ Version 2 keys are identical to version 3 keys except for the version
+ number. A version 3 Public Key or Public Subkey packet contains:
+
+ * A 1-octet version number (3).
+
+ * A 4-octet number denoting the time that the key was created.
+
+ * A 2-octet number denoting the time in days that the key is valid.
+ If this number is zero, then it does not expire.
+
+ * A 1-octet number denoting the public key algorithm of the key.
+
+ * A series of multiprecision integers comprising the key material:
+
+ - MPI of RSA public modulus n.
+
+ - MPI of RSA public encryption exponent e.
+
+ Version 3 keys are deprecated. They contain three weaknesses.
+ First, it is relatively easy to construct a version 3 key that has
+ the same Key ID as any other key because the Key ID is simply the low
+ 64 bits of the public modulus. Second, because the fingerprint of a
+ version 3 key hashes the key material, but not its length, there is
+ an increased opportunity for fingerprint collisions. Third, there
+ are weaknesses in the MD5 hash algorithm that cause developers to
+ prefer other algorithms. See Section 5.5.4 for a fuller discussion
+ of Key IDs and fingerprints.
+
+5.5.2.2. Version 4 Public Keys
+
+ The version 4 format is similar to the version 3 format except for
+ the absence of a validity period. This has been moved to the
+ Signature packet. In addition, fingerprints of version 4 keys are
+ calculated differently from version 3 keys, as described in
+ Section 5.5.4.
+
+ A version 4 packet contains:
+
+ * A 1-octet version number (4).
+
+ * A 4-octet number denoting the time that the key was created.
+
+ * A 1-octet number denoting the public key algorithm of the key.
+
+ * A series of values comprising the key material. This is algorithm
+ specific and described in Section 5.5.5.
+
+5.5.2.3. Version 6 Public Keys
+
+ The version 6 format is similar to the version 4 format except for
+ the addition of a count for the key material. This count helps
+ parsing Secret Key packets (which are an extension of the Public Key
+ packet format) in the case of an unknown algorithm. In addition,
+ fingerprints of version 6 keys are calculated differently from
+ version 4 keys, as described in Section 5.5.4.
+
+ A version 6 packet contains:
+
+ * A 1-octet version number (6).
+
+ * A 4-octet number denoting the time that the key was created.
+
+ * A 1-octet number denoting the public key algorithm of the key.
+
+ * A 4-octet scalar octet count for the public key material specified
+ in the next field.
+
+ * A series of values comprising the public key material. This is
+ algorithm specific and described in Section 5.5.5.
+
+5.5.3. Secret Key Packet Formats
+
+ The Secret Key and Secret Subkey packets contain all the data of the
+ Public Key and Public Subkey packets, with additional algorithm-
+ specific secret key data appended, usually in encrypted form.
+
+ The packet contains:
+
+ * The fields of a Public Key or Public Subkey packet, as described
+ above.
+
+ * One octet (the "S2K usage octet") indicating whether and how the
+ secret key material is protected by a passphrase. Zero indicates
+ that the secret key data is not encrypted. 253 (AEAD), 254 (CFB),
+ or 255 (MalleableCFB) indicates that an S2K Specifier and other
+ parameters will follow. Any other value is a symmetric key
+ encryption algorithm identifier. A version 6 packet MUST NOT use
+ the value 255 (MalleableCFB).
+
+ * Only for a version 6 packet where the secret key material is
+ encrypted (that is, where the previous octet is not zero), a
+ 1-octet scalar octet count of the cumulative length of all the
+ following conditionally included S2K parameter fields.
+
+ * Conditionally included S2K parameter fields:
+
+ - If the S2K usage octet was 253, 254, or 255, a 1-octet
+ symmetric key encryption algorithm.
+
+ - If the S2K usage octet was 253 (AEAD), a 1-octet AEAD
+ algorithm.
+
+ - Only for a version 6 packet, and if the S2K usage octet was 253
+ or 254, a 1-octet count of the size of the one field following
+ this octet.
+
+ - If the S2K usage octet was 253, 254, or 255, an S2K Specifier.
+ The length of the S2K Specifier depends on its type (see
+ Section 3.7.1).
+
+ - If the S2K usage octet was 253 (AEAD), an IV of a size
+ specified by the AEAD algorithm (see Section 5.13.2), which is
+ used as the nonce for the AEAD algorithm.
+
+ - If the S2K usage octet was 254, 255, or a cipher algorithm ID
+ (that is, the secret data uses some form of CFB encryption), an
+ IV of the same length as the cipher's block size.
+
+ * Plain or encrypted multiprecision integers comprising the secret
+ key data. This is algorithm specific and described in
+ Section 5.5.5. If the S2K usage octet is 253 (AEAD), then an AEAD
+ authentication tag is at the end of that data. If the S2K usage
+ octet is 254 (CFB), a 20-octet SHA-1 hash of the plaintext of the
+ algorithm-specific portion is appended to plaintext and encrypted
+ with it. If the S2K usage octet is 255 (MalleableCFB) or another
+ non-zero value (that is, a symmetric key encryption algorithm
+ identifier), a 2-octet checksum of the plaintext of the algorithm-
+ specific portion (sum of all octets, mod 65536) is appended to
+ plaintext and encrypted with it. (This is deprecated and SHOULD
+ NOT be used; see below.)
+
+ * Only for a version 3 or 4 packet where the S2K usage octet is
+ zero, a 2-octet checksum of the algorithm-specific portion (sum of
+ all octets, mod 65536).
+
+ The details about storing algorithm-specific secrets above are
+ summarized in Table 2.
+
+ Note that the version 6 packet format adds two count values to help
+ parsing packets with unknown S2K or public key algorithms.
+
+ Secret MPI values can be encrypted using a passphrase. If an S2K
+ Specifier is given, it describes the algorithm for converting the
+ passphrase to a key; otherwise, a simple MD5 hash of the passphrase
+ is used. An implementation producing a passphrase-protected Secret
+ Key packet MUST use an S2K Specifier; the simple hash is for read-
+ only backward compatibility, though implementations MAY continue to
+ use existing private keys in the old format. The cipher for
+ encrypting the MPIs is specified in the Secret Key packet.
+
+ Encryption/decryption of the secret data is done using the key
+ created from the passphrase and the IV from the packet. If the S2K
+ usage octet is not 253, CFB mode is used. A different mode is used
+ with version 3 keys (which are only RSA) than with other key formats.
+ With version 3 keys, the MPI bit count prefix (that is, the first two
+ octets) is not encrypted. Only the MPI non-prefix data is encrypted.
+ Furthermore, the CFB state is resynchronized at the beginning of each
+ new MPI value so that the CFB block boundary is aligned with the
+ start of the MPI data.
+
+ With version 4 and version 6 keys, a simpler method is used. All
+ secret MPI values are encrypted, including the MPI bit count prefix.
+
+ If the S2K usage octet is 253, the KEK is derived using HKDF
+ [RFC5869] to provide key separation. SHA256 [RFC6234] is used as the
+ hash algorithm for HKDF. IKM for HKDF is the key derived from S2K.
+ No salt is used. The info parameter is comprised of the Packet Type
+ ID encoded in OpenPGP format (bits 7 and 6 are set, and bits 5-0
+ carry the Packet Type ID), the packet version, and the cipher-algo
+ and AEAD-mode used to encrypt the key material.
+
+ Then, the encrypted MPI values are encrypted as one combined
+ plaintext using one of the AEAD algorithms specified for the version
+ 2 Symmetrically Encrypted and Integrity Protected Data packet. Note
+ that no chunks are used and that there is only one authentication
+ tag. As additional data, the Packet Type ID in OpenPGP format
+ encoding (bits 7 and 6 are set, and bits 5-0 carry the Packet Type
+ ID), followed by the Public Key packet fields, starting with the
+ packet version number, are passed to the AEAD algorithm. For
+ example, the additional data used with a Secret Key packet of version
+ 4 consists of the octets 0xC5, 0x04, followed by four octets of
+ creation time, one octet denoting the public key algorithm, and the
+ algorithm-specific public key parameters. For a Secret Subkey
+ packet, the first octet would be 0xC7. For a version 6 key packet,
+ the second octet would be 0x06, and the 4-octet octet count of the
+ public key material would be included as well (see Section 5.5.2).
+
+ The 2-octet checksum that follows the algorithm-specific portion is
+ the algebraic sum, mod 65536, of the plaintext of all the algorithm-
+ specific octets (including the MPI prefix and data). With version 3
+ keys, the checksum is stored in the clear. With version 4 keys, the
+ checksum is encrypted like the algorithm-specific data. This value
+ is used to check that the passphrase was correct. However, this
+ checksum is deprecated, and an implementation SHOULD NOT use it;
+ instead, an implementation should use the SHA-1 hash denoted with a
+ usage octet of 254. The reason for this is that there are some
+ attacks that involve modifying the secret key undetected. If the S2K
+ usage octet is 253, no checksum or SHA-1 hash is used, but the
+ authentication tag of the AEAD algorithm follows.
+
+ When decrypting the secret key material using any of these schemes
+ (that is, where the usage octet is non-zero), the resulting cleartext
+ octet stream must be well formed. In particular, an implementation
+ MUST NOT interpret octets beyond the unwrapped cleartext octet stream
+ as part of any of the unwrapped MPI objects. Furthermore, an
+ implementation MUST reject any secret key material whose cleartext
+ length does not align with the lengths of the unwrapped MPI objects
+ as unusable.
+
+5.5.4. Key IDs and Fingerprints
+
+ Every OpenPGP Key has a fingerprint and a Key ID. The computation of
+ these values differs based on the key version. The fingerprint
+ length varies with the key version, but the Key ID (which is only
+ used in v3 PKESK packets; see Section 5.1.1) is always 64 bits. The
+ following registry represents the subsections below:
+
+ +=======+===================+===============+=============+=========+
+ |Key | Fingerprint | Fingerprint | Key ID |Reference|
+ |Version| | Length | | |
+ | | | (Bits) | | |
+ +=======+===================+===============+=============+=========+
+ |3 | MD5(MPIs without | 128 | low 64 bits |Section |
+ | | length octets) | | of RSA |5.5.4.1 |
+ | | | | modulus | |
+ +-------+-------------------+---------------+-------------+---------+
+ |4 | SHA1(normalized | 160 | last 64 |Section |
+ | | pubkey packet) | | bits of |5.5.4.2 |
+ | | | | fingerprint | |
+ +-------+-------------------+---------------+-------------+---------+
+ |6 | SHA256(normalized | 256 | first 64 |Section |
+ | | pubkey packet) | | bits of |5.5.4.3 |
+ | | | | fingerprint | |
+ +-------+-------------------+---------------+-------------+---------+
+
+ Table 12: OpenPGP Key IDs and Fingerprints Registry
+
+5.5.4.1. Version 3 Key ID and Fingerprint
+
+ For a version 3 key, the 8-octet Key ID consists of the low 64 bits
+ of the public modulus of the RSA key.
+
+ The fingerprint of a version 3 key is formed by hashing the body (but
+ not the 2-octet length) of the MPIs that form the key material
+ (public modulus n, followed by exponent e) with MD5. Note that both
+ version 3 keys and MD5 are deprecated.
+
+5.5.4.2. Version 4 Key ID and Fingerprint
+
+ A version 4 fingerprint is the 160-bit SHA-1 hash of the octet 0x99,
+ followed by the 2-octet packet length, followed by the entire Public
+ Key packet starting with the version field. The Key ID is the low-
+ order 64 bits of the fingerprint. Here are the fields of the hash
+ material, including an example of an Ed25519 key:
+
+ a.1) 0x99 (1 octet)
+
+ a.2) 2-octet, big-endian scalar octet count of (b)-(e)
+
+ b) version number = 4 (1 octet)
+
+ c) timestamp of key creation (4 octets)
+
+ d) algorithm (1 octet): 27 = Ed25519 (example)
+
+ e) algorithm-specific fields
+
+ Algorithm-specific fields for Ed25519 keys (example):
+
+ e.1) 32 octets representing the public key
+
+5.5.4.3. Version 6 Key ID and Fingerprint
+
+ A version 6 fingerprint is the 256-bit SHA2-256 hash of the octet
+ 0x9B, followed by the 4-octet packet length, followed by the entire
+ Public Key packet starting with the version field. The Key ID is the
+ high-order 64 bits of the fingerprint. Here are the fields of the
+ hash material, including an example of an Ed25519 key:
+
+ a.1) 0x9B (1 octet)
+
+ a.2) 4-octet scalar octet count of (b)-(f)
+
+ b) version number = 6 (1 octet)
+
+ c) timestamp of key creation (4 octets)
+
+ d) algorithm (1 octet): 27 = Ed25519 (example)
+
+ e) 4-octet scalar octet count for the key material specified in the
+ next field
+
+ f) algorithm-specific public key material
+
+ Algorithm-specific fields for Ed25519 keys (example):
+
+ f.1) 32 octets representing the public key
+
+ Note that it is possible for there to be collisions of Key IDs --
+ that is, two different keys with the same Key ID. Note that there is
+ a much smaller, but still non-zero, probability that two different
+ keys have the same fingerprint.
+
+ Also note that if version 3, version 4, and version 6 format keys
+ share the same RSA key material, they will have different Key IDs as
+ well as different fingerprints.
+
+ Finally, the Key ID and fingerprint of a subkey are calculated in the
+ same way as for a primary key, including the 0x99 (version 4 key) or
+ 0x9B (version 6 key) as the first octet (even though this is not a
+ valid Packet Type ID for a public subkey).
+
+5.5.5. Algorithm-Specific Parts of Keys
+
+ The public and secret key formats specify algorithm-specific parts of
+ a key. The following sections describe them in detail.
+
+5.5.5.1. Algorithm-Specific Part for RSA Keys
+
+ For RSA keys, the public key consists of this series of
+ multiprecision integers:
+
+ * MPI of RSA public modulus n,
+
+ * MPI of RSA public encryption exponent e.
+
+ The secret key consists of this series of multiprecision integers:
+
+ * MPI of RSA secret exponent d;
+
+ * MPI of RSA secret prime value p;
+
+ * MPI of RSA secret prime value q (p < q); and
+
+ * MPI of u, the multiplicative inverse of p, mod q.
+
+5.5.5.2. Algorithm-Specific Part for DSA Keys
+
+ For DSA keys, the public key consists of this series of
+ multiprecision integers:
+
+ * MPI of DSA prime p;
+
+ * MPI of DSA group order q (q is a prime divisor of p-1);
+
+ * MPI of DSA group generator g; and
+
+ * MPI of DSA public key value y (= g^x mod p where x is secret).
+
+ The secret key consists of this single multiprecision integer:
+
+ * MPI of DSA secret exponent x.
+
+5.5.5.3. Algorithm-Specific Part for Elgamal Keys
+
+ For Elgamal keys, the public key consists of this series of
+ multiprecision integers:
+
+ * MPI of Elgamal prime p;
+
+ * MPI of Elgamal group generator g; and
+
+ * MPI of Elgamal public key value y (= g^x mod p where x is secret).
+
+ The secret key consists of this single multiprecision integer:
+
+ * MPI of Elgamal secret exponent x.
+
+5.5.5.4. Algorithm-Specific Part for ECDSA Keys
+
+ For ECDSA keys, the public key consists of this series of values:
+
+ * A variable-length field containing a curve OID, which is formatted
+ as follows:
+
+ - A 1-octet size of the following field; values 0 and 0xFF are
+ reserved for future extensions.
+
+ - The octets representing a curve OID, as defined in Section 9.2.
+
+ * An MPI of an EC point representing a public key.
+
+ The secret key consists of this single multiprecision integer:
+
+ * An MPI of an integer representing the secret key, which is a
+ scalar of the public EC point.
+
+5.5.5.5. Algorithm-Specific Part for EdDSALegacy Keys (Deprecated)
+
+ For EdDSALegacy keys (deprecated), the public key consists of this
+ series of values:
+
+ * A variable-length field containing a curve OID, formatted as
+ follows:
+
+ - A 1-octet size of the following field; values 0 and 0xFF are
+ reserved for future extensions.
+
+ - The octets representing a curve OID, as defined in Section 9.2.
+
+ * An MPI of an EC point representing a public key Q in prefixed
+ native form (see Section 11.2.2).
+
+ The secret key consists of this single multiprecision integer:
+
+ * An MPI-encoded octet string representing the native form of the
+ secret key in the curve-specific format, as described in
+ Section 9.2.1.
+
+ Note that the native form for an EdDSA secret key is a fixed-width
+ sequence of unstructured random octets, with size corresponding to
+ the specific curve. That sequence of random octets is used with a
+ cryptographic digest to produce both a curve-specific secret scalar
+ and a prefix used when making a signature. See Section 5.1.5 of
+ [RFC8032] for more details about how to use the native octet strings
+ for Ed25519Legacy. The value stored in an OpenPGP EdDSALegacy Secret
+ Key packet is the original sequence of random octets.
+
+ Note that the only curve defined for use with EdDSALegacy is the
+ Ed25519Legacy OID.
+
+5.5.5.6. Algorithm-Specific Part for ECDH Keys
+
+ For ECDH keys, the public key consists of this series of values:
+
+ * A variable-length field containing a curve OID, which is formatted
+ as follows:
+
+ - A 1-octet size of the following field; values 0 and 0xFF are
+ reserved for future extensions.
+
+ - The octets representing a curve OID, as defined in Section 9.2.
+
+ * An MPI of an EC point representing a public key, in the point
+ format associated with the curve, as specified in Section 9.2.1.
+
+ * A variable-length field containing key derivation function (KDF)
+ parameters, which is formatted as follows:
+
+ - A 1-octet size of the following fields; values 0 and 0xFF are
+ reserved for future extensions.
+
+ - A 1-octet value 1, reserved for future extensions.
+
+ - A 1-octet hash function ID used with a KDF.
+
+ - A 1-octet algorithm ID for the symmetric algorithm that is used
+ to wrap the symmetric key for message encryption; see
+ Section 11.5 for details.
+
+ The secret key consists of this single multiprecision integer:
+
+ * An MPI representing the secret key, in the curve-specific format
+ described in Section 9.2.1.
+
+5.5.5.6.1. ECDH Secret Key Material
+
+ When curve NIST P-256, NIST P-384, NIST P-521, brainpoolP256r1,
+ brainpoolP384r1, or brainpoolP512r1 are used in ECDH, their secret
+ keys are represented as a simple integer in standard MPI form. Other
+ curves are presented on the wire differently (though still as a
+ single MPI), as described below and in Section 9.2.1.
+
+5.5.5.6.1.1. Curve25519Legacy ECDH Secret Key Material (Deprecated)
+
+ A Curve25519Legacy secret key is stored as a standard integer in big-
+ endian MPI form. Curve25519Legacy MUST NOT be used in key packets
+ version 6 or above. Note that this form is in reverse octet order
+ from the little-endian "native" form found in [RFC7748].
+
+ Note also that the integer for a Curve25519Legacy secret key for
+ OpenPGP MUST have the appropriate form; that is, it MUST be divisible
+ by 8, MUST be at least 2^254, and MUST be less than 2^255. The
+ length of this MPI in bits is by definition always 255, so the two
+ leading octets of the MPI will always be 00 FF, and reversing the
+ following 32 octets from the wire will produce the "native" form.
+
+ When generating a new Curve25519Legacy secret key from 32 fully
+ random octets, the following pseudocode produces the MPI wire format
+ (note the similarity to decodeScalar25519 as described in [RFC7748]):
+
+ def curve25519Legacy_MPI_from_random(octet_list):
+ octet_list[0] &= 248
+ octet_list[31] &= 127
+ octet_list[31] |= 64
+ mpi_header = [ 0x00, 0xFF ]
+ return mpi_header || reversed(octet_list)
+
+5.5.5.7. Algorithm-Specific Part for X25519 Keys
+
+ For X25519 keys, the public key consists of this single value:
+
+ * 32 octets of the native public key.
+
+ The secret key consists of this single value:
+
+ * 32 octets of the native secret key.
+
+ See Section 6.1 of [RFC7748] for more details about how to use the
+ native octet strings. The value stored in an OpenPGP X25519 Secret
+ Key packet is the original sequence of random octets. The value
+ stored in an OpenPGP X25519 Public Key packet is the value
+ X25519(secretKey, 9).
+
+5.5.5.8. Algorithm-Specific Part for X448 Keys
+
+ For X448 keys, the public key consists of this single value:
+
+ * 56 octets of the native public key.
+
+ The secret key consists of this single value:
+
+ * 56 octets of the native secret key.
+
+ See Section 6.2 of [RFC7748] for more details about how to use the
+ native octet strings. The value stored in an OpenPGP X448 Secret Key
+ packet is the original sequence of random octets. The value stored
+ in an OpenPGP X448 Public Key packet is the value X448(secretKey, 5).
+
+5.5.5.9. Algorithm-Specific Part for Ed25519 Keys
+
+ For Ed25519 keys, the public key consists of this single value:
+
+ * 32 octets of the native public key.
+
+ The secret key consists of this single value:
+
+ * 32 octets of the native secret key.
+
+ See Section 5.1.5 of [RFC8032] for more details about how to use the
+ native octet strings. The value stored in an OpenPGP Ed25519 Secret
+ Key packet is the original sequence of random octets.
+
+5.5.5.10. Algorithm-Specific Part for Ed448 Keys
+
+ For Ed448 keys, the public key consists of this single value:
+
+ * 57 octets of the native public key.
+
+ The secret key consists of this single value:
+
+ * 57 octets of the native secret key.
+
+ See Section 5.2.5 of [RFC8032] for more details about how to use the
+ native octet strings. The value stored in an OpenPGP Ed448 Secret
+ Key packet is the original sequence of random octets.
+
+5.6. Compressed Data Packet (Type ID 8)
+
+ The Compressed Data packet contains compressed data. Typically, this
+ packet is found as the contents of an encrypted packet, or following
+ a Signature or One-Pass Signature packet, and contains a Literal Data
+ packet.
+
+ The body of this packet consists of:
+
+ * One octet specifying the algorithm used to compress the packet.
+
+ * Compressed data, which makes up the remainder of the packet.
+
+ A Compressed Data packet's body contains data that is a compression
+ of a series of OpenPGP packets. See Section 10 for details on how
+ messages are formed.
+
+ A ZIP-compressed series of packets is compressed into raw DEFLATE
+ blocks [RFC1951].
+
+ A ZLIB-compressed series of packets is compressed with raw ZLIB-style
+ blocks [RFC1950].
+
+ A BZip2-compressed series of packets is compressed using the BZip2
+ [BZ2] algorithm.
+
+ An implementation that generates a Compressed Data packet MUST use
+ the OpenPGP format for packet framing (see Section 4.2.1). It MUST
+ NOT generate a Compressed Data packet with Legacy format
+ (Section 4.2.2).
+
+ An implementation that deals with either historic data or data
+ generated by legacy implementations predating support for [RFC2440]
+ MAY interpret Compressed Data packets that use the Legacy format for
+ packet framing.
+
+5.7. Symmetrically Encrypted Data Packet (Type ID 9)
+
+ The Symmetrically Encrypted Data packet contains data encrypted with
+ a symmetric key algorithm. When it has been decrypted, it contains
+ other packets (usually a Literal Data packet or compressed data
+ packet, but in theory, it could be another sequence of packets that
+ forms a valid OpenPGP Message).
+
+ This packet is obsolete. An implementation MUST NOT create this
+ packet. An implementation SHOULD reject such a packet and stop
+ processing the message. If an implementation chooses to process the
+ packet anyway, it MUST return a clear warning that a non-integrity-
+ protected packet has been processed.
+
+ This packet format is impossible to handle safely in general because
+ the ciphertext it provides is malleable. See Section 13.7 about
+ selecting a better OpenPGP encryption container that does not have
+ this flaw.
+
+ The body of this packet consists of:
+
+ * A random prefix, containing block-size random octets (for example,
+ 16 octets for a 128-bit block length) followed by a copy of the
+ last two octets, encrypted together using Cipher Feedback (CFB)
+ mode, with an IV of all zeros.
+
+ * Data encrypted using CFB mode, with the last block-size octets of
+ the first ciphertext as the IV.
+
+ The symmetric cipher used may be specified in a Public Key or
+ Symmetric Key Encrypted Session Key packet that precedes the
+ Symmetrically Encrypted Data packet. In that case, the cipher
+ algorithm ID is prefixed to the session key before it is encrypted.
+ If no packets of these types precede the encrypted data, the IDEA
+ algorithm is used with the session key calculated as the MD5 hash of
+ the passphrase, though this use is deprecated.
+
+ The data is encrypted in CFB mode (see Section 12.9). For the random
+ prefix, the IV is specified as all zeros. Instead of achieving
+ randomized encryption through an IV, a string of length equal to the
+ block size of the cipher plus two is encrypted for this purpose. The
+ first block-size octets (for example, 16 octets for a 128-bit block
+ length) are random, and the following two octets are copies of the
+ last two octets of the first block-size random octets. For example,
+ for a 16-octet block length, octet 17 is a copy of octet 15, and
+ octet 18 is a copy of octet 16. For a cipher of block length 8,
+ octet 9 is a copy of octet 7, and octet 10 is a copy of octet 8. (In
+ both of these examples, we consider the first octet to be numbered
+ 1.)
+
+ After encrypting these block-size-plus-two octets, a new CFB context
+ is created for the encryption of the data, with the last block-size
+ octets of the first ciphertext as the IV. (Alternatively and
+ equivalently, the CFB state is resynchronized: the last block-size
+ octets of ciphertext are passed through the cipher, and the block
+ boundary is reset.)
+
+ The repetition of two octets in the random prefix allows the receiver
+ to immediately check whether the session key is incorrect. See
+ Section 13.4 for hints on the proper use of this "quick check".
+
+5.8. Marker Packet (Type ID 10)
+
+ The body of the Marker packet consists of:
+
+ * The three octets 0x50, 0x47, 0x50 (which spell "PGP" in UTF-8).
+
+ Such a packet MUST be ignored when received.
+
+5.9. Literal Data Packet (Type ID 11)
+
+ A Literal Data packet contains the body of a message; that is, data
+ that is not to be further interpreted.
+
+ The body of this packet consists of:
+
+ * A 1-octet field that describes how the data is formatted.
+
+ If it is a b (0x62), then the Literal Data packet contains binary
+ data. If it is a u (0x75), then the Literal Data packet contains
+ UTF-8-encoded text data and thus may need line ends converted to
+ local form or other text mode changes.
+
+ Previous versions of the OpenPGP specification used t (0x74) to
+ indicate textual data but did not specify the character encoding.
+ Implementations SHOULD NOT emit this value. An implementation
+ that receives a Literal Data packet with this value in the format
+ field SHOULD interpret the packet data as UTF-8 encoded text,
+ unless reliable (not attacker-controlled) context indicates a
+ specific alternate text encoding. This mode is deprecated due to
+ its ambiguity.
+
+ Some implementations predating [RFC2440] also defined a value of l
+ as a "local" mode for machine-local conversions. [RFC1991]
+ incorrectly states that this local mode flag is 1 (ASCII numeral
+ one). Both of these local modes are deprecated.
+
+ * The file name as a string (1-octet length, followed by a file
+ name). This may be a zero-length string. Commonly, if the source
+ of the encrypted data is a file, it will be the name of the
+ encrypted file. An implementation MAY consider the file name in
+ the Literal Data packet to be a more authoritative name than the
+ actual file name.
+
+ * A 4-octet number that indicates a date associated with the literal
+ data. Commonly, the date might be the modification date of a
+ file, or the time the packet was created, or a zero that indicates
+ no specific time.
+
+ * The remainder of the packet is literal data.
+
+ Text data MUST be encoded with UTF-8 (see [RFC3629]) and stored
+ with <CR><LF> text endings (that is, network-normal line endings).
+ These should be converted to native line endings by the receiving
+ implementation.
+
+ Note that OpenPGP signatures do not include the formatting octet, the
+ file name, and the date field of the Literal Data packet in a
+ signature hash; therefore, those fields are not protected against
+ tampering in a signed document. A receiving implementation MUST NOT
+ treat those fields as though they were cryptographically secured by
+ the surrounding signature when either representing them to the user
+ or acting on them.
+
+ Due to their inherent malleability, an implementation that generates
+ a Literal Data packet SHOULD avoid storing any significant data in
+ these fields. If the implementation is certain that the data is
+ textual and is encoded with UTF-8 (for example, if it will follow
+ this Literal Data packet with a Signature packet of type 0x01 (see
+ Section 5.2.1), it MAY set the format octet to u. Otherwise, it MUST
+ set the format octet to b. It SHOULD set the filename to the empty
+ string (encoded as a single zero octet) and the timestamp to zero
+ (encoded as four zero octets).
+
+ An application that wishes to include such filesystem metadata within
+ a signature is advised to sign an encapsulated archive (for example,
+ [PAX]).
+
+ An implementation that generates a Literal Data packet MUST use the
+ OpenPGP format for packet framing (see Section 4.2.1). It MUST NOT
+ generate a Literal Data packet with Legacy format (Section 4.2.2).
+
+ An implementation that deals with either historic data or data
+ generated by an implementation that predates support for [RFC2440]
+ MAY interpret Literal Data packets that use the Legacy format for
+ packet framing.
+
+5.9.1. Special Filename _CONSOLE (Deprecated)
+
+ The Literal Data packet's filename field has a historical special
+ case for the special name _CONSOLE. When the filename field is
+ _CONSOLE, the message is considered to be "for your eyes only". This
+ advises that the message data is unusually sensitive, and the
+ receiving program should process it more carefully, perhaps avoiding
+ storing the received data to disk, for example.
+
+ An OpenPGP deployment that generates Literal Data packets MUST NOT
+ depend on this indicator being honored in any particular way. It
+ cannot be enforced, and the field itself is not covered by any
+ cryptographic signature.
+
+ It is NOT RECOMMENDED to use this special filename in a newly
+ generated Literal Data packet.
+
+5.10. Trust Packet (Type ID 12)
+
+ The Trust packet is used only within keyrings and is not normally
+ exported. Trust packets contain data that record the user's
+ specifications of which keyholders are trustworthy introducers, along
+ with other information that implementation uses for trust
+ information. The format of Trust packets is defined by a given
+ implementation.
+
+ Trust packets SHOULD NOT be emitted to output streams that are
+ transferred to other users, and they SHOULD be ignored on any input
+ other than local keyring files.
+
+5.11. User ID Packet (Type ID 13)
+
+ A User ID packet consists of UTF-8 text that is intended to represent
+ the name and email address of the keyholder. By convention, it
+ includes a mail name-addr as described in [RFC2822], but there are no
+ restrictions on its content. The packet length in the header
+ specifies the length of the User ID.
+
+5.12. User Attribute Packet (Type ID 17)
+
+ The User Attribute packet is a variation of the User ID packet. It
+ is capable of storing more types of data than the User ID packet,
+ which is limited to text. Like the User ID packet, a User Attribute
+ packet may be certified by the key owner ("self-signed") or any other
+ key owner who cares to certify it. Except as noted, a User Attribute
+ packet may be used anywhere that a User ID packet may be used.
+
+ While User Attribute packets are not a required part of the OpenPGP
+ specification, implementations SHOULD provide at least enough
+ compatibility to properly handle a certification signature on the
+ User Attribute packet. A simple way to do this is by treating the
+ User Attribute packet as a User ID packet with opaque contents, but
+ an implementation may use any method desired.
+
+ The User Attribute packet is made up of one or more attribute
+ subpackets. Each subpacket consists of a subpacket header and a
+ body. The header consists of:
+
+ * the subpacket length (1, 2, or 5 octets)
+
+ * the Subpacket Type ID (1 octet)
+
+ and is followed by the subpacket specific data.
+
+ The following table lists the currently known subpackets:
+
+ +=========+=============================+================+
+ | ID | Attribute Subpacket | Reference |
+ +=========+=============================+================+
+ | 0 | Reserved | |
+ +---------+-----------------------------+----------------+
+ | 1 | Image Attribute Subpacket | Section 5.12.1 |
+ +---------+-----------------------------+----------------+
+ | 100-110 | Private or Experimental Use | |
+ +---------+-----------------------------+----------------+
+
+ Table 13: OpenPGP User Attribute Subpacket Types Registry
+
+ An implementation SHOULD ignore any subpacket of a type that it does
+ not recognize.
+
+5.12.1. Image Attribute Subpacket
+
+ The Image Attribute subpacket is used to encode an image, presumably
+ (but not required to be) that of the key owner.
+
+ The Image Attribute subpacket begins with an image header. The first
+ two octets of the image header contain the length of the image
+ header. Note that unlike other multi-octet numerical values in this
+ document, due to a historical accident, this value is encoded as a
+ little-endian number. The image header length is followed by a
+ single octet for the image header version. The only currently
+ defined version of the image header is 1, which is a 16-octet image
+ header. The first three octets of a version 1 image header are thus
+ 0x10, 0x00, 0x01.
+
+ +=========+================+
+ | Version | Reference |
+ +=========+================+
+ | 1 | Section 5.12.1 |
+ +---------+----------------+
+
+ Table 14: OpenPGP Image
+ Attribute Versions
+ Registry
+
+ The fourth octet of a version 1 image header designates the encoding
+ format of the image. The only currently defined encoding format is
+ the value 1 to indicate JPEG. Image format IDs 100 through 110 are
+ reserved for Private or Experimental Use. The rest of the version 1
+ image header is made up of 12 reserved octets, all of which MUST be
+ set to 0.
+
+ +=========+=============================+
+ | ID | Encoding |
+ +=========+=============================+
+ | 0 | Reserved |
+ +---------+-----------------------------+
+ | 1 | JPEG [JFIF] |
+ +---------+-----------------------------+
+ | 100-110 | Private or Experimental Use |
+ +---------+-----------------------------+
+
+ Table 15: OpenPGP Image Attribute
+ Encoding Format Registry
+
+ The rest of the image subpacket contains the image itself. As the
+ only currently defined image type is JPEG, the image is encoded in
+ the JPEG File Interchange Format (JFIF), a standard file format for
+ JPEG images [JFIF].
+
+ An implementation MAY try to determine the type of an image by
+ examination of the image data if it is unable to handle a particular
+ version of the image header or if a specified encoding format value
+ is not recognized.
+
+5.13. Symmetrically Encrypted and Integrity Protected Data Packet (Type
+ ID 18)
+
+ The SEIPD packet contains integrity-protected and encrypted data.
+ When it has been decrypted, it will contain other packets forming an
+ OpenPGP Message (see Section 10.3).
+
+ The first octet of this packet is always used to indicate the version
+ number, but different versions contain ciphertext that is structured
+ differently. Version 1 of this packet contains data encrypted with a
+ symmetric key algorithm and is thus protected against modification by
+ the SHA-1 hash algorithm. This mechanism was introduced in [RFC4880]
+ and offers some protections against ciphertext malleability.
+
+ Version 2 of this packet contains data encrypted with an AEAD
+ construction. This offers a more cryptographically rigorous defense
+ against ciphertext malleability. See Section 13.7 for more details
+ on choosing between these formats.
+
+ Any new version of the SEIPD packet should be registered in the
+ registry established in Section 10.3.2.1.
+
+5.13.1. Version 1 Symmetrically Encrypted and Integrity Protected Data
+ Packet Format
+
+ A version 1 Symmetrically Encrypted and Integrity Protected Data
+ packet consists of:
+
+ * A 1-octet version number with value 1.
+
+ * Encrypted data -- the output of the selected symmetric key cipher
+ operating in CFB mode.
+
+ The symmetric cipher used MUST be specified in a Public Key or
+ Symmetric Key Encrypted Session Key packet that precedes the
+ Symmetrically Encrypted and Integrity Protected Data packet. In
+ either case, the cipher algorithm ID is prefixed to the session key
+ before it is encrypted.
+
+ The data is encrypted in CFB mode (see Section 12.9). The IV is
+ specified as all zeros. Instead of achieving randomized encryption
+ through an IV, OpenPGP prefixes an octet string to the data before it
+ is encrypted for this purpose. The length of the octet string equals
+ the block size of the cipher in octets, plus two. The first octets
+ in the group, of length equal to the block size of the cipher, are
+ random; the last two octets are each copies of their 2nd preceding
+ octet. For example, with a cipher whose block size is 128 bits or 16
+ octets, the prefix data will contain 16 random octets, then two more
+ octets, which are copies of the 15th and 16th octets, respectively.
+ Unlike the deprecated Symmetrically Encrypted Data packet
+ (Section 5.7), this prefix data is encrypted in the same CFB context,
+ and no special CFB resynchronization is done.
+
+ The repetition of 16 bits in the random data prefixed to the message
+ allows the receiver to immediately check whether the session key is
+ incorrect. See Section 13.4 for hints on the proper use of this
+ "quick check".
+
+ Two constant octets with the values 0xD3 and 0x14 are appended to the
+ plaintext. Then, the plaintext of the data to be encrypted is passed
+ through the SHA-1 hash function. The input to the hash function is
+ comprised of the prefix data described above and all of the
+ plaintext, including the trailing constant octets 0xD3, 0x14. The 20
+ octets of the SHA-1 hash are then appended to the plaintext (after
+ the constant octets 0xD3, 0x14) and encrypted along with the
+ plaintext using the same CFB context. This trailing checksum is
+ known as the Modification Detection Code (MDC).
+
+ During decryption, the plaintext data should be hashed with SHA-1,
+ including the prefix data as well as the trailing constant octets
+ 0xD3, 0x14, but excluding the last 20 octets containing the SHA-1
+ hash. The computed SHA-1 hash is then compared with the last 20
+ octets of plaintext. A mismatch of the hash indicates that the
+ message has been modified and MUST be treated as a security problem.
+ Any failure SHOULD be reported to the user.
+
+ NON-NORMATIVE EXPLANATION
+
+ The MDC system, as the integrity protection mechanism of the
+ version 1 Symmetrically Encrypted and Integrity Protected Data
+ packet is called, was created to provide an integrity mechanism
+ that is less strong than a signature, yet stronger than bare CFB
+ encryption.
+
+ CFB encryption has a limitation as damage to the ciphertext will
+ corrupt the affected cipher blocks and the block following.
+ Additionally, if data is removed from the end of a CFB-encrypted
+ block, that removal is undetectable. (Note also that CBC mode has
+ a similar limitation, but data removed from the front of the block
+ is undetectable.)
+
+ The obvious way to protect or authenticate an encrypted block is
+ to digitally sign it. However, many people do not wish to
+ habitually sign data for a large number of reasons that are beyond
+ the scope of this document. Suffice it to say that many people
+ consider properties such as deniability to be as valuable as
+ integrity.
+
+ OpenPGP addresses this desire to have more security than raw
+ encryption and yet preserve deniability with the MDC system. An
+ MDC is intentionally not a Message Authentication Code (MAC). Its
+ name was not selected by accident. It is analogous to a checksum.
+
+ Despite the fact that it is a relatively modest system, it has
+ proved itself in the real world. It is an effective defense to
+ several attacks that have surfaced since it has been created. It
+ has met its modest goals admirably.
+
+ Consequently, because it is a modest security system, it has
+ modest requirements on the hash function(s) it employs. It does
+ not rely on a hash function being collision-free; it relies on a
+ hash function being one-way. If a forger, Frank, wishes to send
+ Alice a (digitally) unsigned message that says, "I've always
+ secretly loved you, signed Bob", it is far easier for him to
+ construct a new message than it is to modify anything intercepted
+ from Bob. (Note also that if Bob wishes to communicate secretly
+ with Alice, but without authentication or identification and with
+ a threat model that includes forgers, he has a problem that
+ transcends mere cryptography.)
+
+ Note also that unlike nearly every other OpenPGP subsystem, there
+ are no parameters in the MDC system. It hard-defines SHA-1 as its
+ hash function. This is not an accident. It is an intentional
+ choice to avoid downgrade and cross-grade attacks while making a
+ simple, fast system. (A downgrade attack is an attack that would
+ replace SHA2-256 with SHA-1, for example. A cross-grade attack
+ would replace SHA-1 with another 160-bit hash, such as RIPEMD-160,
+ for example.)
+
+ However, no update will be needed because the MDC has been
+ replaced by the AEAD encryption described in this document.
+
+5.13.2. Version 2 Symmetrically Encrypted and Integrity Protected Data
+ Packet Format
+
+ A version 2 Symmetrically Encrypted and Integrity Protected Data
+ packet consists of:
+
+ * A 1-octet version number with value 2.
+
+ * A 1-octet cipher algorithm ID.
+
+ * A 1-octet AEAD algorithm identifier.
+
+ * A 1-octet chunk size.
+
+ * 32 octets of salt. The salt is used to derive the message key and
+ MUST be securely generated (see Section 13.10).
+
+ * Encrypted data; that is, the output of the selected symmetric key
+ cipher operating in the given AEAD mode.
+
+ * A final summary authentication tag for the AEAD mode.
+
+ The decrypted session key and the salt are used to derive an M-bit
+ message key and N-64 bits used as the IV, where M is the key size of
+ the symmetric algorithm and N is the nonce size of the AEAD
+ algorithm. M + N - 64 bits are derived using HKDF (see [RFC5869]).
+ The leftmost M bits are used as a symmetric algorithm key, and the
+ remaining N - 64 bits are used as an IV. HKDF is used with SHA256
+ [RFC6234] as hash algorithm. The session key is used as IKM and the
+ salt as salt. The Packet Type ID in OpenPGP format encoding (bits 7
+ and 6 are set, and bits 5-0 carry the Packet Type ID), version
+ number, cipher algorithm ID, AEAD algorithm ID, and chunk size octet
+ are used as info parameter.
+
+ The KDF mechanism provides key separation between cipher and AEAD
+ algorithms. Furthermore, an implementation can securely reply to a
+ message even if a recipient's certificate is unknown by reusing the
+ Encrypted Session Key packets and replying with a different salt that
+ yields a new, unique message key. See Section 13.8 for guidance on
+ how applications can securely implement this feature.
+
+ A v2 SEIPD packet consists of one or more chunks of data. The
+ plaintext of each chunk is of a size specified by the chunk size
+ octet using the method specified below.
+
+ The encrypted data consists of the encryption of each chunk of
+ plaintext, followed immediately by the relevant authentication tag.
+ If the last chunk of plaintext is smaller than the chunk size, the
+ ciphertext for that data may be shorter; nevertheless, it is followed
+ by a full authentication tag.
+
+ For each chunk, the AEAD construction is given the Packet Type ID
+ encoded in OpenPGP format (bits 7 and 6 are set, and bits 5-0 carry
+ the Packet Type ID), version number, cipher algorithm ID, AEAD
+ algorithm ID, and chunk size octet as additional data. For example,
+ the additional data of the first chunk using EAX and AES-128 with a
+ chunk size of 2^22 octets consists of the octets 0xD2, 0x02, 0x07,
+ 0x01, and 0x10.
+
+ After the final chunk, the AEAD algorithm is used to produce a final
+ authentication tag encrypting the empty string. This AEAD instance
+ is given the additional data specified above, plus an 8-octet, big-
+ endian value specifying the total number of plaintext octets
+ encrypted. This allows detection of a truncated ciphertext.
+
+ The chunk size octet specifies the size of chunks using the following
+ formula (in C [C99]), where c is the chunk size octet:
+
+ chunk_size = (uint32_t) 1 << (c + 6)
+
+ An implementation MUST accept chunk size octets with values from 0 to
+ 16. An implementation MUST NOT create data with a chunk size octet
+ value larger than 16 (4 MiB chunks).
+
+ The nonce for AEAD mode consists of two parts. Let N be the size of
+ the nonce. The leftmost N - 64 bits are the IV derived using HKDF.
+ The rightmost 64 bits are the chunk index as a big-endian value. The
+ index of the first chunk is zero.
+
+5.13.3. EAX Mode
+
+ The EAX AEAD algorithm used in this document is defined in [EAX].
+
+ The EAX algorithm can only use block ciphers with 16-octet blocks.
+ The nonce is 16 octets long. EAX authentication tags are 16 octets
+ long.
+
+5.13.4. OCB Mode
+
+ The OCB AEAD algorithm used in this document is defined in [RFC7253].
+
+ The OCB algorithm can only use block ciphers with 16-octet blocks.
+ The nonce is 15 octets long. OCB authentication tags are 16 octets
+ long.
+
+5.13.5. GCM Mode
+
+ The GCM AEAD algorithm used in this document is defined in
+ [SP800-38D].
+
+ The GCM algorithm can only use block ciphers with 16-octet blocks.
+ The nonce is 12 octets long. GCM authentication tags are 16 octets
+ long.
+
+5.14. Padding Packet (Type ID 21)
+
+ The Padding packet contains random data and can be used to defend
+ against traffic analysis (see Section 13.11) on v2 SEIPD messages
+ (see Section 5.13.2) and Transferable Public Keys (see Section 10.1).
+
+ Such a packet MUST be ignored when received.
+
+ Its contents SHOULD be random octets to make the length obfuscation
+ it provides more robust even when compressed.
+
+ An implementation adding padding to an OpenPGP stream SHOULD place
+ such a packet:
+
+ * At the end of a version 6 Transferable Public Key that is
+ transferred over an encrypted channel (see Section 10.1).
+
+ * As the last packet of an Optionally Padded Message within a
+ version 2 Symmetrically Encrypted and Integrity Protected Data
+ packet (see Section 10.3.1).
+
+ An implementation MUST be able to process Padding packets anywhere
+ else in an OpenPGP stream so that future revisions of this document
+ may specify further locations for padding.
+
+ Policy about how large to make such a packet to defend against
+ traffic analysis is beyond the scope of this document.
+
+6. Base64 Conversions
+
+ As stated in the introduction, OpenPGP's underlying representation
+ for objects is a stream of arbitrary octets, and some systems desire
+ these objects to be immune to damage caused by character set
+ translation, data conversions, etc.
+
+ In principle, any printable encoding scheme that met the requirements
+ of the unsafe channel would suffice, since it would not change the
+ underlying binary bit streams of the OpenPGP data structures. The
+ OpenPGP specification specifies one such printable encoding scheme to
+ ensure interoperability; see Section 6.2.
+
+ The encoding is composed of two parts: a base64 encoding of the
+ binary data and an optional checksum. The base64 encoding used is
+ described in Section 4 of [RFC4648], and it is wrapped into lines of
+ no more than 76 characters each.
+
+ When decoding base64, an OpenPGP implementation MUST ignore all
+ whitespace.
+
+6.1. Optional Checksum
+
+ The optional checksum is a 24-bit Cyclic Redundancy Check (CRC)
+ converted to four characters of base64 encoding by the same MIME
+ base64 transformation, preceded by an equal sign (=). The CRC is
+ computed by using the generator 0x864CFB and an initialization of
+ 0xB704CE. The accumulation is done on the data before it is
+ converted to base64 rather than on the converted data. A sample
+ implementation of this algorithm is in Section 6.1.1.
+
+ If present, the checksum with its leading equal sign MUST appear on
+ the next line after the base64-encoded data.
+
+ An implementation MUST NOT reject an OpenPGP object when the CRC24
+ footer is present, missing, malformed, or disagrees with the computed
+ CRC24 sum. When forming ASCII Armor, the CRC24 footer SHOULD NOT be
+ generated, unless interoperability with implementations that require
+ the CRC24 footer to be present is a concern.
+
+ The CRC24 footer MUST NOT be generated if it can be determined by the
+ context or by the OpenPGP object being encoded that the consuming
+ implementation accepts base64-encoded blocks without a CRC24 footer.
+ Notably:
+
+ * An ASCII-armored Encrypted Message packet sequence that ends in a
+ v2 SEIPD packet MUST NOT contain a CRC24 footer.
+
+ * An ASCII-armored sequence of Signature packets that only includes
+ version 6 Signature packets MUST NOT contain a CRC24 footer.
+
+ * An ASCII-armored Transferable Public Key packet sequence of a
+ version 6 key MUST NOT contain a CRC24 footer.
+
+ * An ASCII-armored keyring consisting of only version 6 keys MUST
+ NOT contain a CRC24 footer.
+
+ Rationale: Previous draft versions of this document stated that the
+ CRC24 footer is optional, but the text was ambiguous. In practice,
+ very few implementations require the CRC24 footer to be present.
+ Computing the CRC24 incurs a significant cost, while providing no
+ meaningful integrity protection. Therefore, generating it is now
+ discouraged.
+
+6.1.1. An Implementation of the CRC24 in "C"
+
+ The following code is written in [C99].
+
+ #define CRC24_INIT 0xB704CEL
+ #define CRC24_GENERATOR 0x864CFBL
+
+ typedef unsigned long crc24;
+ crc24 crc_octets(unsigned char *octets, size_t len)
+ {
+ crc24 crc = CRC24_INIT;
+ int i;
+ while (len--) {
+ crc ^= (*octets++) << 16;
+ for (i = 0; i < 8; i++) {
+ crc <<= 1;
+ if (crc & 0x1000000) {
+ crc &= 0XFFFFFF; /* Clear bit 25 to avoid overflow */
+ crc ^= CRC24_GENERATOR;
+ }
+ }
+ }
+ return crc & 0xFFFFFFL;
+ }
+
+6.2. Forming ASCII Armor
+
+ When OpenPGP encodes data into ASCII Armor, it puts specific headers
+ around the base64-encoded data, so OpenPGP can reconstruct the data
+ later. An OpenPGP implementation MAY use ASCII Armor to protect raw
+ binary data. OpenPGP informs the user what kind of data is encoded
+ in the ASCII Armor through the use of the headers.
+
+ Concatenating the following data creates ASCII Armor:
+
+ * An Armor Header Line, appropriate for the type of data
+
+ * Armor Headers
+
+ * A blank (zero length or containing only whitespace) line
+
+ * The ASCII-Armored data
+
+ * An optional Armor Checksum (discouraged; see Section 6.1)
+
+ * The Armor Tail, which depends on the Armor Header Line
+
+6.2.1. Armor Header Line
+
+ An Armor Header Line consists of the appropriate header line text
+ surrounded by five (5) dashes (-, 0x2D) on either side of the header
+ line text. The header line text is chosen based on the type of data
+ being encoded in Armor and how it is being encoded. Header line
+ texts include the following strings:
+
+ +===================+============================================+
+ | Armor Header | Use |
+ +===================+============================================+
+ | BEGIN PGP MESSAGE | Used for signed, encrypted, or compressed |
+ | | files. |
+ +-------------------+--------------------------------------------+
+ | BEGIN PGP PUBLIC | Used for armoring public keys. |
+ | KEY BLOCK | |
+ +-------------------+--------------------------------------------+
+ | BEGIN PGP PRIVATE | Used for armoring private keys. |
+ | KEY BLOCK | |
+ +-------------------+--------------------------------------------+
+ | BEGIN PGP | Used for detached signatures, OpenPGP/MIME |
+ | SIGNATURE | signatures, and cleartext signatures. |
+ +-------------------+--------------------------------------------+
+
+ Table 16: OpenPGP Armor Header Lines Registry
+
+ Note that all of these Armor Header Lines are to consist of a
+ complete line. Therefore, the header lines MUST start at the
+ beginning of a line and MUST NOT have text other than whitespace
+ following them on the same line.
+
+6.2.2. Armor Headers
+
+ The Armor Headers are pairs of strings that can give the user or the
+ receiving OpenPGP implementation some information about how to decode
+ or use the message. The Armor Headers are a part of the armor, not
+ the message, and hence are not protected by any signatures applied to
+ the message.
+
+ The format of an Armor Header is that of a key-value pair. A colon
+ (: 0x3A) and a single space (0x20) separate the key and value. An
+ OpenPGP implementation may consider improperly formatted Armor
+ Headers to be a corruption of the ASCII Armor, but it SHOULD make an
+ effort to recover. Unknown keys should be silently ignored, and an
+ OpenPGP implementation SHOULD continue to process the message.
+
+ Note that some transport methods are sensitive to line length. For
+ example, the SMTP protocol that transports email messages has a line
+ length limit of 998 characters (see Section 2.1.1 of [RFC5322]).
+
+ While there is a limit of 76 characters for the base64 data
+ (Section 6), there is no limit for the length of Armor Headers. Care
+ should be taken to ensure that the Armor Headers are short enough to
+ survive transport. One way to do this is to repeat an Armor Header
+ Key multiple times with different values for each so that no one line
+ is overly long.
+
+ Currently defined Armor Header Keys are as follows:
+
+ +=========+==============================+=================+
+ | Key | Summary | Reference |
+ +=========+==============================+=================+
+ | Version | Implementation information | Section 6.2.2.1 |
+ +---------+------------------------------+-----------------+
+ | Comment | Arbitrary text | Section 6.2.2.2 |
+ +---------+------------------------------+-----------------+
+ | Hash | Hash algorithms used in some | Section 6.2.2.3 |
+ | | v4 cleartext signed messages | |
+ +---------+------------------------------+-----------------+
+ | Charset | Character set | Section 6.2.2.4 |
+ +---------+------------------------------+-----------------+
+
+ Table 17: OpenPGP Armor Header Keys Registry
+
+6.2.2.1. "Version" Armor Header
+
+ The Armor Header Key Version describes the OpenPGP implementation and
+ version used to encode the message. To minimize metadata,
+ implementations SHOULD NOT emit this key and its corresponding value
+ except for debugging purposes with explicit user consent.
+
+6.2.2.2. "Comment" Armor Header
+
+ The Armor Header Key Comment supplies a user-defined comment.
+ OpenPGP defines all text to be in UTF-8. A comment may be any UTF-8
+ string. However, the whole point of armoring is to provide 7-bit
+ clean data. Consequently, if a comment has characters that are
+ outside the ASCII range of UTF-8, they may very well not survive
+ transport.
+
+6.2.2.3. "Hash" Armor Header
+
+ The Armor Header Key Hash is deprecated, but some older
+ implementations expect it in messages using the Cleartext Signature
+ Framework (Section 7). When present, this Armor Header Key contains
+ a comma-separated list of hash algorithms used in the signatures on
+ message, with digest names as specified in the "Text Name" column in
+ Table 23. These headers SHOULD NOT be emitted unless:
+
+ * the cleartext signed message contains a version 4 signature made
+ using a SHA2-based digest (SHA224, SHA256, SHA384, or SHA512), and
+
+ * the cleartext signed message might be verified by a legacy OpenPGP
+ implementation that requires this header.
+
+ A verifying application MUST decline to validate any signature in a
+ message with a non-conformant Hash header (that is, a Hash header
+ that contains anything other than a comma-separated list of hash
+ algorithms). When a conformant Hash header is present, a verifying
+ application MUST ignore its contents, deferring to the hash algorithm
+ indicated in the Embedded Signature.
+
+6.2.2.4. "Charset" Armor Header
+
+ The Armor Header Key Charset contains a description of the character
+ set that the plaintext is in (see [RFC2978]). Please note that
+ OpenPGP defines text to be in UTF-8. An implementation will get the
+ best results by translating into and out of UTF-8. However, there
+ are many instances where this is easier said than done. Also, there
+ are communities of users who have no need for UTF-8 because they are
+ all happy with a character set like ISO Latin-5 or a Japanese
+ character set. In such instances, an implementation MAY override the
+ UTF-8 default by using this header key. An implementation MAY
+ implement this key and any translations it cares to; an
+ implementation MAY ignore it and assume all text is UTF-8.
+
+6.2.3. Armor Tail Line
+
+ The Armor Tail Line is composed in the same manner as the Armor
+ Header Line, except the string "BEGIN" is replaced by the string
+ "END".
+
+7. Cleartext Signature Framework
+
+ It is desirable to be able to sign a textual octet stream without
+ ASCII armoring the stream itself, so the signed text is still
+ readable with any tool capable of rendering text. In order to bind a
+ signature to such a cleartext, the Cleartext Signature Framework is
+ used, which follows the same basic format and restrictions as the
+ ASCII armoring described in Section 6.2. (Note that this framework
+ is not intended to be reversible. [RFC3156] defines another way to
+ sign cleartext messages for environments that support MIME.)
+
+7.1. Cleartext Signed Message Structure
+
+ An OpenPGP cleartext signed message consists of:
+
+ * The cleartext header -----BEGIN PGP SIGNED MESSAGE----- on a
+ single line.
+
+ * One or more legacy Hash Armor Headers that MAY be included by some
+ implementations and MUST be ignored when well formed (see
+ Section 6.2.2.3).
+
+ * An empty line (not included in the message digest).
+
+ * The dash-escaped cleartext.
+
+ * A line ending separating the cleartext and following armored
+ signature (not included in the message digest).
+
+ * The ASCII-armored signature(s), including the -----BEGIN PGP
+ SIGNATURE----- Armor Header and Armor Tail Lines.
+
+ As with any other Text signature (Section 5.2.1.2), a cleartext
+ signature is calculated on the text using canonical <CR><LF> line
+ endings. As described above, the line ending before the -----BEGIN
+ PGP SIGNATURE----- Armor Header Line of the armored signature is not
+ considered part of the signed text.
+
+ Also, any trailing whitespace -- spaces (0x20) and tabs (0x09) -- at
+ the end of any line is removed before signing or verifying a
+ cleartext signed message.
+
+ Between the -----BEGIN PGP SIGNED MESSAGE----- line and the first
+ empty line, the only Armor Header permitted is a well-formed Hash
+ Armor Header (see Section 6.2.2.3). To reduce the risk of confusion
+ about what has been signed, a verifying implementation MUST decline
+ to validate any signature in a cleartext message if that message has
+ any other Armor Header present in this location.
+
+7.2. Dash-Escaped Text
+
+ The cleartext content of the message must also be dash-escaped.
+
+ Dash-escaped cleartext is the ordinary cleartext where every line
+ starting with a "-" (HYPHEN-MINUS, U+002D) is prefixed by the
+ sequence "-" (HYPHEN-MINUS, U+002D) and " " (SPACE, U+0020). This
+ prevents the parser from recognizing Armor Headers of the cleartext
+ itself. An implementation MAY dash-escape any line, SHOULD dash-
+ escape lines commencing in "From" followed by a space, and MUST dash-
+ escape any line commencing in a dash. The message digest is computed
+ using the cleartext itself, not the dash-escaped form.
+
+ When reversing dash-escaping, an implementation MUST strip the string
+ - if it occurs at the beginning of a line, and it SHOULD provide a
+ warning for - and any character other than a space at the beginning
+ of a line.
+
+7.3. Issues with the Cleartext Signature Framework
+
+ Since creating a cleartext signed message involves trimming trailing
+ whitespace on every line, the Cleartext Signature Framework will fail
+ to safely round-trip any textual stream that may include semantically
+ meaningful whitespace.
+
+ For example, the Unified Diff format [UNIFIED-DIFF] contains
+ semantically meaningful whitespace: an empty line of context will
+ consist of a line with a single " " (SPACE, U+0020) character, and
+ any line that has trailing whitespace added or removed will represent
+ such a change with semantically meaningful whitespace.
+
+ Furthermore, a Cleartext Signature Framework message that is very
+ large is unlikely to work well. In particular, it will be difficult
+ for any human reading the message to know which part is covered by
+ the signature because they can't understand the whole message at
+ once, especially in the case where an Armor Header line is placed
+ somewhere in the body. And, very large Cleartext Signature Framework
+ messages cannot be processed in a single pass, since the signature
+ salt and digest algorithms are only discovered at the end.
+
+ An implementation that knows it is working with a textual stream with
+ any of the above characteristics SHOULD NOT use the Cleartext
+ Signature Framework. Safe alternatives for a semantically meaningful
+ OpenPGP signature over such a file format are:
+
+ * A signed message, as described in Section 10.3.
+
+ * A detached signature, as described in Section 10.4.
+
+ Either of these alternatives may be ASCII-armored (see Section 6.2)
+ if they need to be transmitted across a text-only (or 7-bit clean)
+ channel.
+
+ Finally, when a Cleartext Signature Framework message is presented to
+ the user as is, an attacker can include additional text in the Hash
+ header, which may mislead the user into thinking it is part of the
+ signed text. The signature validation constraints described in
+ Sections 6.2.2.3 and 7.1 help to mitigate the risk of arbitrary or
+ misleading text in the Armor Headers.
+
+8. Regular Expressions
+
+ This section describes Regular Expressions.
+
+ Regular Expression: Zero or more branches, separated by |. It
+ matches anything that matches one of the branches.
+
+ Branch: Zero or more pieces, concatenated. It matches a match for
+ the first, followed by a match for the second, etc.
+
+ Piece: An atom possibly followed by *, +, or ?. An atom followed by
+ * matches a sequence of 0 or more matches of the atom. An atom
+ followed by + matches a sequence of 1 or more matches of the atom.
+ An atom followed by ? matches a match of the atom or the null
+ string.
+
+ Atom: A Regular Expression in parentheses (matching a match for the
+ Regular Expression), a range (see below), a . (matching any single
+ Unicode character), a ^ (matching the null string at the beginning
+ of the input string), a $ (matching the null string at the end of
+ the input string), a \ followed by a single Unicode character
+ (matching that character), or a single Unicode character with no
+ other significance (matching that character).
+
+ Range: A sequence of characters enclosed in []. It normally matches
+ any single character from the sequence. If the sequence begins
+ with ^, it matches any single Unicode character not from the rest
+ of the sequence. If two characters in the sequence are separated
+ by -, this is shorthand for the full list of Unicode characters
+ between them in codepoint order (for example, [0-9] matches any
+ decimal digit). To include a literal ] in the sequence, make it
+ the first character (following a possible ^). To include a
+ literal -, make it the first or last character.
+
+9. Constants
+
+ This section describes the constants used in OpenPGP.
+
+ Note that these tables are not exhaustive lists; an implementation
+ MAY implement an algorithm that is not on these lists, as long as the
+ algorithm IDs are chosen from the Private or Experimental Use
+ algorithm range.
+
+ See Section 12 for more discussion of the algorithms.
+
+9.1. Public Key Algorithms
+
+ +===+==============+=========+============+===========+=============+
+ | ID| Algorithm |Public | Secret Key | Signature | PKESK |
+ | | |Key | Format | Format | Format |
+ | | |Format | | | |
+ +===+==============+=========+============+===========+=============+
+ | 0| Reserved | | | | |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 1| RSA (Encrypt |MPI(n), | MPI(d), | MPI(m^d | MPI(m^e |
+ | | or Sign) |MPI(e) | MPI(p), | mod n) | mod n) |
+ | | [FIPS186] |[Section | MPI(q), | [Section | [Section |
+ | | |5.5.5.1] | MPI(u) | 5.2.3.1] | 5.1.3] |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 2| RSA Encrypt- |MPI(n), | MPI(d), | N/A | MPI(m^e |
+ | | Only |MPI(e) | MPI(p), | | mod n) |
+ | | [FIPS186] |[Section | MPI(q), | | [Section |
+ | | |5.5.5.1] | MPI(u) | | 5.1.3] |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 3| RSA Sign- |MPI(n), | MPI(d), | MPI(m^d | N/A |
+ | | Only |MPI(e) | MPI(p), | mod n) | |
+ | | [FIPS186] |[Section | MPI(q), | [Section | |
+ | | |5.5.5.1] | MPI(u) | 5.2.3.1] | |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 16| Elgamal |MPI(p), | MPI(x) | N/A | MPI(g^k |
+ | | (Encrypt- |MPI(g), | | | mod p), |
+ | | Only) |MPI(y) | | | MPI(m * |
+ | | [ELGAMAL] |[Section | | | y^k mod |
+ | | |5.5.5.3] | | | p) |
+ | | | | | | [Section |
+ | | | | | | 5.1.4] |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 17| DSA (Digital |MPI(p), | MPI(x) | MPI(r), | N/A |
+ | | Signature |MPI(q), | | MPI(s) | |
+ | | Algorithm) |MPI(g), | | [Section | |
+ | | [FIPS186] |MPI(y) | | 5.2.3.2] | |
+ | | |[Section | | | |
+ | | |5.5.5.2] | | | |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 18| ECDH public |OID, | MPI(value | N/A | MPI(point |
+ | | key |MPI(point| in curve- | | in curve- |
+ | | algorithm |in curve-| specific | | specific |
+ | | |specific | format) | | point |
+ | | |point | [Section | | format), |
+ | | |format), | 9.2.1] | | size |
+ | | |KDFParams| | | octet, |
+ | | |[Sections| | | encoded |
+ | | |9.2.1 and| | | key |
+ | | |5.5.5.6] | | | [Sections |
+ | | | | | | 9.2.1, |
+ | | | | | | 5.1.5, |
+ | | | | | | and 11.5] |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 19| ECDSA public |OID, | MPI(value) | MPI(r), | N/A |
+ | | key |MPI(point| | MPI(s) | |
+ | | algorithm |in SEC1 | | [Section | |
+ | | [FIPS186] |format) | | 5.2.3.2] | |
+ | | |[Section | | | |
+ | | |5.5.5.4] | | | |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 20| Reserved | | | | |
+ | | (formerly | | | | |
+ | | Elgamal | | | | |
+ | | Encrypt or | | | | |
+ | | Sign) | | | | |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 21| Reserved for | | | | |
+ | | Diffie- | | | | |
+ | | Hellman | | | | |
+ | | (X9.42, as | | | | |
+ | | defined for | | | | |
+ | | IETF-S/MIME) | | | | |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 22| EdDSALegacy |OID, | MPI(value | MPI, MPI | N/A |
+ | | (deprecated) |MPI(point| in curve- | [Sections | |
+ | | |in | specific | 9.2.1 and | |
+ | | |prefixed | format) | 5.2.3.3] | |
+ | | |native | [Section | | |
+ | | |format) | 9.2.1] | | |
+ | | |[Sections| | | |
+ | | |11.2.2 | | | |
+ | | |and | | | |
+ | | |5.5.5.5] | | | |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 23| Reserved | | | | |
+ | | (AEDH) | | | | |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 24| Reserved | | | | |
+ | | (AEDSA) | | | | |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 25| X25519 |32 octets| 32 octets | N/A | 32 |
+ | | |[Section | | | octets, |
+ | | |5.5.5.7] | | | size |
+ | | | | | | octet, |
+ | | | | | | encoded |
+ | | | | | | key |
+ | | | | | | [Section |
+ | | | | | | 5.1.6] |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 26| X448 |56 octets| 56 octets | N/A | 56 |
+ | | |[Section | | | octets, |
+ | | |5.5.5.8] | | | size |
+ | | | | | | octet, |
+ | | | | | | encoded |
+ | | | | | | key |
+ | | | | | | [Section |
+ | | | | | | 5.1.7] |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 27| Ed25519 |32 octets| 32 octets | 64 octets | |
+ | | |[Section | | [Section | |
+ | | |5.5.5.9] | | 5.2.3.4] | |
+ +---+--------------+---------+------------+-----------+-------------+
+ | 28| Ed448 |57 octets| 57 octets | 114 | |
+ | | |[Section | | octets | |
+ | | |5.5.5.10]| | [Section | |
+ | | | | | 5.2.3.5] | |
+ +---+--------------+---------+------------+-----------+-------------+
+ |100| Private or | | | | |
+ | to| Experimental | | | | |
+ |110| Use | | | | |
+ +---+--------------+---------+------------+-----------+-------------+
+
+ Table 18: OpenPGP Public Key Algorithms Registry
+
+ Implementations MUST implement Ed25519 (27) for signatures and X25519
+ (25) for encryption. Implementations SHOULD implement Ed448 (28) and
+ X448 (26).
+
+ RSA (1) keys are deprecated and SHOULD NOT be generated but may be
+ interpreted. RSA Encrypt-Only (2) and RSA Sign-Only (3) are
+ deprecated and MUST NOT be generated (see Section 12.4). Elgamal
+ (16) keys are deprecated and MUST NOT be generated (see
+ Section 12.6). DSA (17) keys are deprecated and MUST NOT be
+ generated (see Section 12.5). For notes on Elgamal Encrypt or Sign
+ (20) and X9.42 (21), see Section 12.8. Implementations MAY implement
+ any other algorithm.
+
+ Note that an implementation conforming to the previous version of
+ this specification [RFC4880] has only DSA (17) and Elgamal (16) as
+ the algorithms that MUST be implemented.
+
+ A compatible specification of ECDSA is given in [RFC6090] (as "KT-I
+ Signatures") and in [SEC1]; ECDH is defined in Section 11.5 of this
+ document.
+
+9.2. ECC Curves for OpenPGP
+
+ The parameter curve OID is an array of octets that defines a named
+ curve.
+
+ The table below specifies the exact sequence of octets for each named
+ curve referenced in this document. It also specifies which public
+ key algorithms the curve can be used with, as well as the size of
+ expected elements in octets. Note that there is a break in
+ "EdDSALegacy" for display purposes only.
+
+ +======================+===+========+================+======+=======+
+ |ASN.1 Object |OID| Curve |Curve Name |Usage |Field |
+ |Identifier |Len| OID | | |Size |
+ | | | Octets | | |(fsize)|
+ +======================+===+========+================+======+=======+
+ |1.2.840.10045.3.1.7 |8 | 2A 86 |NIST P-256 |ECDSA,|32 |
+ | | | 48 CE | |ECDH | |
+ | | | 3D 03 | | | |
+ | | | 01 07 | | | |
+ +----------------------+---+--------+----------------+------+-------+
+ |1.3.132.0.34 |5 | 2B 81 |NIST P-384 |ECDSA,|48 |
+ | | | 04 00 | |ECDH | |
+ | | | 22 | | | |
+ +----------------------+---+--------+----------------+------+-------+
+ |1.3.132.0.35 |5 | 2B 81 |NIST P-521 |ECDSA,|66 |
+ | | | 04 00 | |ECDH | |
+ | | | 23 | | | |
+ +----------------------+---+--------+----------------+------+-------+
+ |1.3.36.3.3.2.8.1.1.7 |9 | 2B 24 |brainpoolP256r1 |ECDSA,|32 |
+ | | | 03 03 | |ECDH | |
+ | | | 02 08 | | | |
+ | | | 01 01 | | | |
+ | | | 07 | | | |
+ +----------------------+---+--------+----------------+------+-------+
+ |1.3.36.3.3.2.8.1.1.11 |9 | 2B 24 |brainpoolP384r1 |ECDSA,|48 |
+ | | | 03 03 | |ECDH | |
+ | | | 02 08 | | | |
+ | | | 01 01 | | | |
+ | | | 0B | | | |
+ +----------------------+---+--------+----------------+------+-------+
+ |1.3.36.3.3.2.8.1.1.13 |9 | 2B 24 |brainpoolP512r1 |ECDSA,|64 |
+ | | | 03 03 | |ECDH | |
+ | | | 02 08 | | | |
+ | | | 01 01 | | | |
+ | | | 0D | | | |
+ +----------------------+---+--------+----------------+------+-------+
+ |1.3.6.1.4.1.11591.15.1|9 | 2B 06 |Ed25519Legacy |EdDSA |32 |
+ | | | 01 04 | |Legacy| |
+ | | | 01 DA | | | |
+ | | | 47 0F | | | |
+ | | | 01 | | | |
+ +----------------------+---+--------+----------------+------+-------+
+ |1.3.6.1.4.1.3029.1.5.1|10 | 2B 06 |Curve25519Legacy|ECDH |32 |
+ | | | 01 04 | | | |
+ | | | 01 97 | | | |
+ | | | 55 01 | | | |
+ | | | 05 01 | | | |
+ +----------------------+---+--------+----------------+------+-------+
+
+ Table 19: OpenPGP ECC Curve OIDs and Usage Registry
+
+ The "Field Size (fsize)" column represents the field size of the
+ group in number of octets, rounded up, such that x or y coordinates
+ for a point on the curve or native point representations for the
+ curve can be represented in that many octets. The curves specified
+ here, and scalars such as the base point order and the private key,
+ can be represented in fsize octets. However, note that curves exist
+ outside this specification where the representation of scalars
+ requires an additional octet.
+
+ The sequence of octets in the third column is the result of applying
+ the Distinguished Encoding Rules (DER) to the ASN.1 Object Identifier
+ with subsequent truncation. The truncation removes the two fields of
+ encoded Object Identifier. The first omitted field is 1 octet
+ representing the Object Identifier tag, and the second omitted field
+ is the length of the Object Identifier body. For example, the
+ complete ASN.1 DER encoding for the NIST P-256 curve OID is "06 08 2A
+ 86 48 CE 3D 03 01 07", from which the first entry in the table above
+ is constructed by omitting the first two octets. Only the truncated
+ sequence of octets is the valid representation of a curve OID.
+
+ The deprecated OIDs for Ed25519Legacy and Curve25519Legacy are used
+ only in version 4 keys and signatures. Implementations MAY implement
+ these variants for compatibility with existing version 4 key material
+ and signatures. Implementations MUST NOT accept or generate version
+ 6 key material using the deprecated OIDs.
+
+9.2.1. Curve-Specific Wire Formats
+
+ Some elliptic curve public key algorithms use different conventions
+ for specific fields depending on the curve in use. Each field is
+ always formatted as an MPI, but with a curve-specific framing. This
+ table summarizes those distinctions.
+
+ +================+========+============+=======+=========+==========+
+ |Curve |ECDH |ECDH Secret |EdDSA |EdDSA |EdDSA |
+ | |Point |Key MPI |Secret |Signature|Signature |
+ | |Format | |Key MPI|first MPI|second |
+ | | | | | |MPI |
+ +================+========+============+=======+=========+==========+
+ |NIST P-256 |SEC1 |integer |N/A |N/A |N/A |
+ +----------------+--------+------------+-------+---------+----------+
+ |NIST P-384 |SEC1 |integer |N/A |N/A |N/A |
+ +----------------+--------+------------+-------+---------+----------+
+ |NIST P-521 |SEC1 |integer |N/A |N/A |N/A |
+ +----------------+--------+------------+-------+---------+----------+
+ |brainpoolP256r1 |SEC1 |integer |N/A |N/A |N/A |
+ +----------------+--------+------------+-------+---------+----------+
+ |brainpoolP384r1 |SEC1 |integer |N/A |N/A |N/A |
+ +----------------+--------+------------+-------+---------+----------+
+ |brainpoolP512r1 |SEC1 |integer |N/A |N/A |N/A |
+ +----------------+--------+------------+-------+---------+----------+
+ |Ed25519Legacy |N/A |N/A |32 |32 octets|32 octets |
+ | | | |octets |of R |of S |
+ | | | |of | | |
+ | | | |secret | | |
+ +----------------+--------+------------+-------+---------+----------+
+ |Curve25519Legacy|prefixed|integer |N/A |N/A |N/A |
+ | |native |(Section | | | |
+ | | |5.5.5.6.1.1)| | | |
+ +----------------+--------+------------+-------+---------+----------+
+
+ Table 20: OpenPGP ECC Curve-Specific Wire Formats Registry
+
+ For the native octet-string forms of Ed25519Legacy values, see
+ [RFC8032]. For the native octet-string forms of Curve25519Legacy
+ secret scalars and points, see [RFC7748].
+
+9.3. Symmetric Key Algorithms
+
+ +=========+============================================+
+ | ID | Algorithm |
+ +=========+============================================+
+ | 0 | Plaintext or unencrypted data |
+ +---------+--------------------------------------------+
+ | 1 | IDEA [IDEA] |
+ +---------+--------------------------------------------+
+ | 2 | TripleDES (or DES-EDE) [SP800-67] with |
+ | | 168-bit key derived from 192 |
+ +---------+--------------------------------------------+
+ | 3 | CAST5 with 128-bit key [RFC2144] |
+ +---------+--------------------------------------------+
+ | 4 | Blowfish with 128-bit key, 16 rounds |
+ | | [BLOWFISH] |
+ +---------+--------------------------------------------+
+ | 5 | Reserved |
+ +---------+--------------------------------------------+
+ | 6 | Reserved |
+ +---------+--------------------------------------------+
+ | 7 | AES with 128-bit key [AES] |
+ +---------+--------------------------------------------+
+ | 8 | AES with 192-bit key |
+ +---------+--------------------------------------------+
+ | 9 | AES with 256-bit key |
+ +---------+--------------------------------------------+
+ | 10 | Twofish with 256-bit key [TWOFISH] |
+ +---------+--------------------------------------------+
+ | 11 | Camellia with 128-bit key [RFC3713] |
+ +---------+--------------------------------------------+
+ | 12 | Camellia with 192-bit key |
+ +---------+--------------------------------------------+
+ | 13 | Camellia with 256-bit key |
+ +---------+--------------------------------------------+
+ | 100-110 | Private or Experimental Use |
+ +---------+--------------------------------------------+
+ | 253-255 | Reserved to avoid collision with Secret |
+ | | Key Encryption (Table 2 and Section 5.5.3) |
+ +---------+--------------------------------------------+
+
+ Table 21: OpenPGP Symmetric Key Algorithms Registry
+
+ Implementations MUST implement AES-128. Implementations SHOULD
+ implement AES-256. Implementations MUST NOT encrypt data with IDEA,
+ TripleDES, or CAST5. Implementations MAY decrypt data that uses
+ IDEA, TripleDES, or CAST5 for the sake of reading older messages or
+ new messages from implementations predating support for [RFC2440].
+ An Implementation that decrypts data using IDEA, TripleDES, or CAST5
+ SHOULD generate a deprecation warning about the symmetric algorithm,
+ indicating that message confidentiality is suspect. Implementations
+ MAY implement any other algorithm.
+
+9.4. Compression Algorithms
+
+ +=========+=============================+
+ | ID | Algorithm |
+ +=========+=============================+
+ | 0 | Uncompressed |
+ +---------+-----------------------------+
+ | 1 | ZIP [RFC1951] |
+ +---------+-----------------------------+
+ | 2 | ZLIB [RFC1950] |
+ +---------+-----------------------------+
+ | 3 | BZip2 [BZ2] |
+ +---------+-----------------------------+
+ | 100-110 | Private or Experimental Use |
+ +---------+-----------------------------+
+
+ Table 22: OpenPGP Compression
+ Algorithms Registry
+
+ Implementations MUST implement uncompressed data. Implementations
+ SHOULD implement ZLIB. For interoperability reasons, implementations
+ SHOULD be able to decompress using ZIP. Implementations MAY
+ implement any other algorithm.
+
+9.5. Hash Algorithms
+
+ +=========+==================+=============+========================+
+ | ID | Algorithm | Text Name | V6 Signature |
+ | | | | Salt Size |
+ +=========+==================+=============+========================+
+ | 0 | Reserved | | |
+ +---------+------------------+-------------+------------------------+
+ | 1 | MD5 [RFC1321] | "MD5" | N/A |
+ +---------+------------------+-------------+------------------------+
+ | 2 | SHA-1 [FIPS180] | "SHA1" | N/A |
+ +---------+------------------+-------------+------------------------+
+ | 3 | RIPEMD-160 | "RIPEMD160" | N/A |
+ | | [RIPEMD-160] | | |
+ +---------+------------------+-------------+------------------------+
+ | 4 | Reserved | | |
+ +---------+------------------+-------------+------------------------+
+ | 5 | Reserved | | |
+ +---------+------------------+-------------+------------------------+
+ | 6 | Reserved | | |
+ +---------+------------------+-------------+------------------------+
+ | 7 | Reserved | | |
+ +---------+------------------+-------------+------------------------+
+ | 8 | SHA2-256 | "SHA256" | 16 |
+ | | [FIPS180] | | |
+ +---------+------------------+-------------+------------------------+
+ | 9 | SHA2-384 | "SHA384" | 24 |
+ | | [FIPS180] | | |
+ +---------+------------------+-------------+------------------------+
+ | 10 | SHA2-512 | "SHA512" | 32 |
+ | | [FIPS180] | | |
+ +---------+------------------+-------------+------------------------+
+ | 11 | SHA2-224 | "SHA224" | 16 |
+ | | [FIPS180] | | |
+ +---------+------------------+-------------+------------------------+
+ | 12 | SHA3-256 | "SHA3-256" | 16 |
+ | | [FIPS202] | | |
+ +---------+------------------+-------------+------------------------+
+ | 13 | Reserved | | |
+ +---------+------------------+-------------+------------------------+
+ | 14 | SHA3-512 | "SHA3-512" | 32 |
+ | | [FIPS202] | | |
+ +---------+------------------+-------------+------------------------+
+ | 100-110 | Private or | | |
+ | | Experimental Use | | |
+ +---------+------------------+-------------+------------------------+
+
+ Table 23: OpenPGP Hash Algorithms Registry
+
+ +============+=========================+=========================+
+ | Hash | OID | Full Hash Prefix |
+ | Algorithm | | |
+ +============+=========================+=========================+
+ | MD5 | 1.2.840.113549.2.5 | 0x30, 0x20, 0x30, 0x0C, |
+ | | | 0x06, 0x08, 0x2A, 0x86, |
+ | | | 0x48, 0x86, 0xF7, 0x0D, |
+ | | | 0x02, 0x05, 0x05, 0x00, |
+ | | | 0x04, 0x10 |
+ +------------+-------------------------+-------------------------+
+ | SHA-1 | 1.3.14.3.2.26 | 0x30, 0x21, 0x30, 0x09, |
+ | | | 0x06, 0x05, 0x2B, 0x0E, |
+ | | | 0x03, 0x02, 0x1A, 0x05, |
+ | | | 0x00, 0x04, 0x14 |
+ +------------+-------------------------+-------------------------+
+ | RIPEMD-160 | 1.3.36.3.2.1 | 0x30, 0x21, 0x30, 0x09, |
+ | | | 0x06, 0x05, 0x2B, 0x24, |
+ | | | 0x03, 0x02, 0x01, 0x05, |
+ | | | 0x00, 0x04, 0x14 |
+ +------------+-------------------------+-------------------------+
+ | SHA2-256 | 2.16.840.1.101.3.4.2.1 | 0x30, 0x31, 0x30, 0x0D, |
+ | | | 0x06, 0x09, 0x60, 0x86, |
+ | | | 0x48, 0x01, 0x65, 0x03, |
+ | | | 0x04, 0x02, 0x01, 0x05, |
+ | | | 0x00, 0x04, 0x20 |
+ +------------+-------------------------+-------------------------+
+ | SHA2-384 | 2.16.840.1.101.3.4.2.2 | 0x30, 0x41, 0x30, 0x0D, |
+ | | | 0x06, 0x09, 0x60, 0x86, |
+ | | | 0x48, 0x01, 0x65, 0x03, |
+ | | | 0x04, 0x02, 0x02, 0x05, |
+ | | | 0x00, 0x04, 0x30 |
+ +------------+-------------------------+-------------------------+
+ | SHA2-512 | 2.16.840.1.101.3.4.2.3 | 0x30, 0x51, 0x30, 0x0D, |
+ | | | 0x06, 0x09, 0x60, 0x86, |
+ | | | 0x48, 0x01, 0x65, 0x03, |
+ | | | 0x04, 0x02, 0x03, 0x05, |
+ | | | 0x00, 0x04, 0x40 |
+ +------------+-------------------------+-------------------------+
+ | SHA2-224 | 2.16.840.1.101.3.4.2.4 | 0x30, 0x2D, 0x30, 0x0D, |
+ | | | 0x06, 0x09, 0x60, 0x86, |
+ | | | 0x48, 0x01, 0x65, 0x03, |
+ | | | 0x04, 0x02, 0x04, 0x05, |
+ | | | 0x00, 0x04, 0x1C |
+ +------------+-------------------------+-------------------------+
+ | SHA3-256 | 2.16.840.1.101.3.4.2.8 | 0x30, 0x31, 0x30, 0x0D, |
+ | | | 0x06, 0x09, 0x60, 0x86, |
+ | | | 0x48, 0x01, 0x65, 0x03, |
+ | | | 0x04, 0x02, 0x08, 0x05, |
+ | | | 0x00, 0x04, 0x20 |
+ +------------+-------------------------+-------------------------+
+ | SHA3-512 | 2.16.840.1.101.3.4.2.10 | 0x30, 0x51, 0x30, 0x0D, |
+ | | | 0x06, 0x09, 0x60, 0x86, |
+ | | | 0x48, 0x01, 0x65, 0x03, |
+ | | | 0x04, 0x02, 0x0a, 0x05, |
+ | | | 0x00, 0x04, 0x40 |
+ +------------+-------------------------+-------------------------+
+
+ Table 24: OpenPGP Hash Algorithm Identifiers for RSA
+ Signatures' Use of EMSA-PKCS1-v1_5 Padding Registry
+
+ Implementations MUST implement SHA2-256. Implementations SHOULD
+ implement SHA2-384 and SHA2-512. Implementations MAY implement other
+ algorithms. Implementations SHOULD NOT create messages that require
+ the use of SHA-1, with the exception of computing version 4 key
+ fingerprints for purposes of the MDC in version 1 Symmetrically
+ Encrypted and Integrity Protected Data packets. Implementations MUST
+ NOT generate signatures with MD5, SHA-1, or RIPEMD-160.
+ Implementations MUST NOT use MD5, SHA-1, or RIPEMD-160 as a hash
+ function in an ECDH KDF. Implementations MUST NOT generate packets
+ using MD5, SHA-1, or RIPEMD-160 as a hash function in an S2K KDF.
+ Implementations MUST NOT decrypt a secret using MD5, SHA-1, or
+ RIPEMD-160 as a hash function in an S2K KDF in a version 6 (or later)
+ packet. Implementations MUST NOT validate any recent signature that
+ depends on MD5, SHA-1, or RIPEMD-160. Implementations SHOULD NOT
+ validate any old signature that depends on MD5, SHA-1, or RIPEMD-160
+ unless the signature's creation date predates known weakness of the
+ algorithm used, and the implementation is confident that the message
+ has been in the secure custody of the user the whole time.
+
+9.6. AEAD Algorithms
+
+ +=========+==================+==============+====================+
+ | ID | Name | Nonce Length | Authentication Tag |
+ | | | (Octets) | Length (Octets) |
+ +=========+==================+==============+====================+
+ | 0 | Reserved | | |
+ +---------+------------------+--------------+--------------------+
+ | 1 | EAX [EAX] | 16 | 16 |
+ +---------+------------------+--------------+--------------------+
+ | 2 | OCB [RFC7253] | 15 | 16 |
+ +---------+------------------+--------------+--------------------+
+ | 3 | GCM [SP800-38D] | 12 | 16 |
+ +---------+------------------+--------------+--------------------+
+ | 100-110 | Private or | | |
+ | | Experimental Use | | |
+ +---------+------------------+--------------+--------------------+
+
+ Table 25: OpenPGP AEAD Algorithms Registry
+
+ Implementations MUST implement OCB. Implementations MAY implement
+ EAX, GCM, and other algorithms.
+
+10. Packet Sequence Composition
+
+ OpenPGP packets are assembled into sequences in order to create
+ messages and to transfer keys. Not all possible packet sequences are
+ meaningful and correct. This section describes the rules for how
+ packets should be placed into sequences.
+
+ There are three distinct sequences of packets:
+
+ * Transferable Public Keys (Section 10.1) and their close
+ counterpart, Transferable Secret Keys (Section 10.2)
+
+ * OpenPGP Messages (Section 10.3)
+
+ * Detached Signatures (Section 10.4)
+
+ Each sequence has an explicit grammar of what packet types (Table 3)
+ can appear in what place. The presence of an unknown critical
+ packet, or a known but unexpected packet, is a critical error,
+ invalidating the entire sequence (see Section 4.3). On the other
+ hand, unknown non-critical packets can appear anywhere within any
+ sequence. This provides a structured way to introduce new packets
+ into OpenPGP, while making sure that certain packets will be handled
+ strictly.
+
+ An implementation may "recognize" a packet but not implement it. The
+ purpose of Packet Criticality is to allow the producer to tell the
+ consumer whether it would prefer a new, unknown packet to generate an
+ error or be ignored.
+
+ Note that previous versions of this document did not have a concept
+ of Packet Criticality and did not give clear guidance on what to do
+ when unknown packets are encountered. Therefore, implementations of
+ the previous versions may reject unknown non-critical packets or
+ accept unknown critical packets.
+
+ When generating a sequence of OpenPGP packets according to one of the
+ three grammars, an implementation MUST NOT inject a critical packet
+ of a type that does not adhere to the grammar.
+
+ When consuming a sequence of OpenPGP packets, if an implementation
+ encounters a critical packet of an inappropriate type according to
+ the relevant grammar, the implementation MUST reject the sequence
+ with an error.
+
+10.1. Transferable Public Keys
+
+ OpenPGP users may transfer public keys. This section describes the
+ structure of public keys in transit to ensure interoperability. An
+ OpenPGP Transferable Public Key is also known as an OpenPGP
+ certificate, in order to distinguish it from both its constituent
+ Public Key packets (Sections 5.5.1.1 and 5.5.1.2) and the underlying
+ cryptographic key material.
+
+10.1.1. OpenPGP Version 6 Certificate Structure
+
+ The format of an OpenPGP version 6 certificate is as follows.
+ Entries in square brackets are optional and ellipses indicate
+ repetition.
+
+ Primary Key
+ [Revocation Signature...]
+ Direct Key Signature...
+ [User ID or User Attribute
+ [Certification Revocation Signature...]
+ [Certification Signature...]]...
+ [Subkey [Subkey Revocation Signature...]
+ Subkey Binding Signature...]...
+ [Padding]
+
+ In addition to these rules, a Marker packet (Section 5.8) can appear
+ anywhere in the sequence.
+
+ Note that a version 6 key uses a self-signed Direct Key signature to
+ store algorithm preferences.
+
+ Every subkey for a version 6 primary key MUST be a version 6 subkey.
+ Every subkey MUST have at least one Subkey Binding signature. Every
+ Subkey Binding signature MUST be a self-signature (that is, made by
+ the version 6 primary key). Like all other signatures, every self-
+ signature made by a version 6 key MUST be a version 6 signature.
+
+10.1.2. OpenPGP Version 6 Revocation Certificate
+
+ When a primary version 6 Public Key is revoked, it is sometimes
+ distributed with only the Revocation Signature:
+
+ Primary Key
+ Revocation Signature
+
+ In this case, the Direct Key signature is no longer necessary, since
+ the primary key itself has been marked as unusable.
+
+10.1.3. OpenPGP Version 4 Certificate Structure
+
+ The format of an OpenPGP version 4 key is as follows.
+
+ Primary Key
+ [Revocation Signature]
+ [Direct Key Signature...]
+ [User ID or User Attribute [Signature...]]...
+ [Subkey [Subkey Revocation Signature...]
+ Subkey Binding Signature...]...
+
+ In addition to these rules, a Marker packet (Section 5.8) can appear
+ anywhere in the sequence.
+
+ A subkey always has at least one Subkey Binding signature after it
+ that is issued using the primary key to tie the two keys together.
+ These binding signatures may be in either version 3 or version 4
+ format, but they SHOULD be in version 4 format. Subkeys that can
+ issue signatures MUST have a version 4 binding signature due to the
+ REQUIRED embedded Primary Key Binding signature.
+
+ Every subkey for a version 4 primary key MUST be a version 4 subkey.
+
+ When a primary version 4 Public Key is revoked, the Revocation
+ Signature is sometimes distributed by itself, without the primary key
+ packet it applies to. This is referred to as a "revocation
+ certificate". Instead, a version 6 revocation certificate MUST
+ include the primary key packet, as described in Section 10.1.2.
+
+10.1.4. OpenPGP Version 3 Key Structure
+
+ The format of an OpenPGP version 3 key is as follows.
+
+ RSA Public Key
+ [Revocation Signature]
+ User ID [Signature...]
+ [User ID [Signature...]]...
+
+ In addition to these rules, a Marker packet (Section 5.8) can appear
+ anywhere in the sequence.
+
+ Each signature certifies the RSA public key and the preceding User
+ ID. The RSA public key can have many User IDs, and each User ID can
+ have many signatures. Version 3 keys are deprecated.
+ Implementations MUST NOT generate new version 3 keys but MAY continue
+ to use existing ones.
+
+ Version 3 keys MUST NOT have subkeys.
+
+10.1.5. Common Requirements
+
+ The Public Key packet occurs first.
+
+ The primary key MUST be an algorithm capable of making signatures
+ (that is, not an encryption-only algorithm). This is because the
+ primary key needs to be able to create self-signatures (see
+ Section 5.2.3.10). The subkeys may be keys of any type. For
+ example, there may be a single-key RSA key, an Ed25519 primary key
+ with an RSA encryption subkey, an Ed25519 primary key with an X25519
+ subkey, etc.
+
+ Each of the following User ID packets provides the identity of the
+ owner of this public key. If there are multiple User ID packets,
+ this corresponds to multiple means of identifying the same unique
+ individual user; for example, a user may have more than one email
+ address and construct a User ID for each one. A Transferable Public
+ Key SHOULD include at least one User ID packet unless storage
+ requirements prohibit this.
+
+ Immediately following each User ID packet, there are zero or more
+ Signature packets. Each Signature packet is calculated on the
+ immediately preceding User ID packet and the initial Public Key
+ packet. The signature serves to certify the corresponding public key
+ and User ID. In effect, the signer is testifying to the belief that
+ this public key belongs to the user identified by this User ID.
+
+ Within the same section as the User ID packets, there are zero or
+ more User Attribute packets. Like the User ID packets, a User
+ Attribute packet is followed by zero or more Signature packets
+ calculated on the immediately preceding User Attribute packet and the
+ initial Public Key packet.
+
+ User Attribute packets and User ID packets may be freely intermixed
+ in this section, as long as the signatures that follow them are
+ maintained on the proper User Attribute or User ID packet.
+
+ After the sequence of User ID packets and Attribute packets and their
+ associated signatures, zero or more Subkey packets follow, each with
+ their own signatures. In general, subkeys are provided in cases
+ where the top-level public key is a certification-only key. However,
+ any version 4 or version 6 key may have subkeys, and the subkeys may
+ be encryption keys, signing keys, authentication keys, etc. It is
+ good practice to use separate subkeys for every operation (i.e.,
+ signature-only, encryption-only, authentication-only keys, etc.).
+
+ Each Subkey packet MUST be followed by one Signature packet, which
+ should be a Subkey Binding signature issued by the top-level key.
+ For subkeys that can issue signatures, the Subkey Binding signature
+ MUST contain an Embedded Signature subpacket with a Primary Key
+ Binding signature (Type ID 0x19) issued by the subkey on the top-
+ level key.
+
+ Subkey and Key packets may each be followed by a Revocation Signature
+ packet to indicate that the key is revoked. Revocation Signatures
+ are only accepted if they are issued by the key itself or by a key
+ that is authorized to issue revocations via a Revocation Key
+ subpacket in a self-signature by the top-level key.
+
+ The optional trailing Padding packet is a mechanism to defend against
+ traffic analysis (see Section 13.11). For maximum interoperability,
+ if the Public Key packet is a version 4 key, the optional Padding
+ packet SHOULD NOT be present unless the recipient has indicated that
+ they are capable of ignoring it successfully. An implementation that
+ is capable of receiving a Transferable Public Key with a version 6
+ Public Key primary key MUST be able to accept (and ignore) the
+ trailing optional Padding packet.
+
+ Transferable Public Key packet sequences may be concatenated to allow
+ transferring multiple public keys in one operation (see Section 3.6).
+
+10.2. Transferable Secret Keys
+
+ OpenPGP users may transfer secret keys. The format of a Transferable
+ Secret Key is the same as a Transferable Public Key except that
+ Secret Key and Secret Subkey packets can be used in addition to the
+ Public Key and Public Subkey packets. If a single Secret Key or
+ Secret Subkey packet is included in a packet sequence, it is a
+ Transferable Secret Key and should be handled and marked as such (see
+ Section 6.2.1). An implementation SHOULD include self-signatures on
+ any User IDs and subkeys, as this allows for a complete public key to
+ be automatically extracted from the Transferable Secret Key. An
+ implementation MAY choose to omit the self-signatures, especially if
+ a Transferable Public Key accompanies the Transferable Secret Key.
+
+10.3. OpenPGP Messages
+
+ An OpenPGP Message is a packet or sequence of packets that adheres to
+ the following grammatical rules (a comma (,) represents sequential
+ composition, and a vertical bar (|) separates alternatives):
+
+ OpenPGP Message: Encrypted Message | Signed Message | Compressed
+ Message | Literal Message.
+
+ Compressed Message: Compressed Data Packet.
+
+ Literal Message: Literal Data Packet.
+
+ ESK: Public Key Encrypted Session Key Packet | Symmetric Key
+ Encrypted Session Key Packet.
+
+ ESK Sequence: ESK | ESK Sequence, ESK.
+
+ Encrypted Data: Symmetrically Encrypted Data Packet | Symmetrically
+ Encrypted and Integrity Protected Data Packet.
+
+ Encrypted Message: Encrypted Data | ESK Sequence, Encrypted Data.
+
+ One-Pass Signed Message: One-Pass Signature Packet, OpenPGP Message,
+ Corresponding Signature Packet.
+
+ Signed Message: Signature Packet, OpenPGP Message | One-Pass Signed
+ Message.
+
+ Optionally Padded Message: OpenPGP Message | OpenPGP Message,
+ Padding Packet.
+
+ In addition to these rules, a Marker packet (Section 5.8) can appear
+ anywhere in the sequence.
+
+10.3.1. Unwrapping Encrypted and Compressed Messages
+
+ In addition to the above grammar, certain messages can be "unwrapped"
+ to yield new messages. In particular:
+
+ * Decrypting a version 2 Symmetrically Encrypted and Integrity
+ Protected Data packet MUST yield a valid Optionally Padded
+ Message.
+
+ * Decrypting a version 1 Symmetrically Encrypted and Integrity
+ Protected Data packet or -- for historic data -- a Symmetrically
+ Encrypted Data packet MUST yield a valid OpenPGP Message.
+
+ * Decompressing a Compressed Data packet MUST also yield a valid
+ OpenPGP Message.
+
+ When any unwrapping is performed, the resulting stream of octets is
+ parsed into a series of OpenPGP packets like any other stream of
+ octets. The packet boundaries found in the series of octets are
+ expected to align with the length of the unwrapped octet stream. An
+ implementation MUST NOT interpret octets beyond the boundaries of the
+ unwrapped octet stream as part of any OpenPGP packet. If an
+ implementation encounters a packet whose header length indicates that
+ it would extend beyond the boundaries of the unwrapped octet stream,
+ the implementation MUST reject that packet as malformed and unusable.
+
+10.3.2. Additional Constraints on Packet Sequences
+
+ Note that some subtle combinations that are formally acceptable by
+ this grammar are nonetheless unacceptable.
+
+10.3.2.1. Packet Versions in Encrypted Messages
+
+ As noted above, an Encrypted Message is a sequence of zero or more
+ PKESK packets (Section 5.1) and SKESK packets (Section 5.3), followed
+ by an SEIPD (Section 5.13) payload. In some historic data, the
+ payload may be a deprecated SED packet (Section 5.7) instead of
+ SEIPD, though implementations MUST NOT generate SED packets (see
+ Section 13.7). The versions of the preceding ESK packets within an
+ Encrypted Message MUST align with the version of the payload SEIPD
+ packet, as described in this section.
+
+ v3 PKESK and v4 SKESK packets both contain the Symmetric Cipher
+ Algorithm ID and the session key for the subsequent SEIPD packet in
+ their cleartext. Since a v1 SEIPD does not contain a symmetric
+ algorithm ID, all ESK packets preceding a v1 SEIPD payload MUST be
+ either v3 PKESK or v4 SKESK.
+
+ On the other hand, the cleartext of the v6 ESK packets (either PKESK
+ or SKESK) do not contain a Symmetric Cipher Algorithm ID, so they
+ cannot be used in combination with a v1 SEIPD payload. The payload
+ following any v6 PKESK or v6 SKESK packet MUST be a v2 SEIPD.
+
+ Additionally, to avoid potentially conflicting cipher algorithm IDs,
+ and for simplicity, implementations MUST NOT precede a v2 SEIPD
+ payload with either v3 PKESK or v4 SKESK packets.
+
+ The versions of packets found in an Encrypted Message are summarized
+ in the following table. An implementation MUST only generate an
+ Encrypted Message using packet versions that match a row with "Yes"
+ in the "Generate?" column. Other rows are provided for the purpose
+ of historic interoperability. A conforming implementation MUST only
+ generate an Encrypted Message using packets whose versions correspond
+ to a single row.
+
+ +==============+=====================+==================+===========+
+ | Version of | Version of | Version of | Generate? |
+ | Encrypted | Preceding Symmetric | Preceding | |
+ | Data Payload | Key ESK (If Any) | Public Key | |
+ | | | ESK (If Any) | |
+ +==============+=====================+==================+===========+
+ | SED (Section | - | v2 PKESK | No |
+ | 5.7) | | [RFC2440] | |
+ +--------------+---------------------+------------------+-----------+
+ | SED (Section | v4 SKESK | v3 PKESK | No |
+ | 5.7) | (Section 5.3.1) | (Section | |
+ | | | 5.1.1) | |
+ +--------------+---------------------+------------------+-----------+
+ | v1 SEIPD | v4 SKESK | v3 PKESK | Yes |
+ | (Section | (Section 5.3.1) | (Section | |
+ | 5.13.1) | | 5.1.1) | |
+ +--------------+---------------------+------------------+-----------+
+ | v2 SEIPD | v6 SKESK | v6 PKESK | Yes |
+ | (Section | (Section 5.3.2) | (Section | |
+ | 5.13.2) | | 5.1.2) | |
+ +--------------+---------------------+------------------+-----------+
+
+ Table 26: OpenPGP Encrypted Message Packet Versions Registry
+
+ An implementation processing an Encrypted Message MUST discard any
+ preceding ESK packet with a version that does not align with the
+ version of the payload.
+
+10.3.2.2. Packet Versions in Signatures
+
+ OpenPGP Key packets and Signature packets are also versioned. The
+ version of a Signature typically matches the version of the signing
+ key. When a version 6 key produces a Signature packet, it MUST
+ produce a version 6 Signature packet, regardless of the Signature
+ packet type. When a message is signed or verified using the one-pass
+ construction, the version of the One-Pass Signature packet
+ (Section 5.4) should also be aligned to the other versions.
+
+ Some legacy implementations have produced unaligned signature
+ versions for older key material, which are also described in the
+ table below for the purpose of historic interoperability. A
+ conforming implementation MUST only generate Signature packets with
+ version numbers matching rows with "Yes" in the "Generate?" column.
+
+ +=====================+================+============+===========+
+ | Signing Key Version | Signature | OPS Packet | Generate? |
+ | | Packet Version | Version | |
+ +=====================+================+============+===========+
+ | 3 (Section 5.5.2.1) | 3 (Section | 3 (Section | No |
+ | | 5.2.2) | 5.4) | |
+ +---------------------+----------------+------------+-----------+
+ | 4 (Section 5.5.2.2) | 3 (Section | 3 (Section | No |
+ | | 5.2.2) | 5.4) | |
+ +---------------------+----------------+------------+-----------+
+ | 4 (Section 5.5.2.2) | 4 (Section | 3 (Section | Yes |
+ | | 5.2.3) | 5.4) | |
+ +---------------------+----------------+------------+-----------+
+ | 6 (Section 5.5.2.3) | 6 (Section | 6 (Section | Yes |
+ | | 5.2.3) | 5.4) | |
+ +---------------------+----------------+------------+-----------+
+
+ Table 27: OpenPGP Key and Signature Versions Registry
+
+ Note, however, that a version mismatch between these packets does not
+ invalidate the packet sequence as a whole; it merely invalidates the
+ signature, as a signature with an unknown version SHOULD be discarded
+ (see Section 5.2.5).
+
+10.4. Detached Signatures
+
+ Some OpenPGP applications use so-called "detached signatures". For
+ example, a program bundle may contain a file, and with it a second
+ file that is a detached signature of the first file. These detached
+ signatures are simply one or more Signature packets stored separately
+ from the data for which they are a signature.
+
+ In addition, a Marker packet (Section 5.8) and a Padding packet
+ (Section 5.14) can appear anywhere in the sequence.
+
+11. Elliptic Curve Cryptography
+
+ This section describes algorithms and parameters used with Elliptic
+ Curve Cryptography (ECC) keys. A thorough introduction to ECC can be
+ found in [KOBLITZ]. Refer to [FIPS186], Appendix B.4, for the
+ methods to generate a uniformly distributed ECC private key.
+
+ None of the ECC methods described in this document are allowed with
+ deprecated version 3 keys.
+
+11.1. ECC Curves
+
+ This document references three named prime field curves defined in
+ [FIPS186] as "Curve P-256", "Curve P-384", and "Curve P-521" and
+ three named prime field curves defined in [RFC5639] as
+ "brainpoolP256r1", "brainpoolP384r1", and "brainpoolP512r1". All six
+ curves can be used with ECDSA and ECDH public key algorithms. They
+ are referenced using a sequence of octets, referred to as the curve
+ OID. Section 9.2 describes in detail how this sequence of octets is
+ formed.
+
+ Separate algorithms are also defined for the use of X25519 and X448
+ [RFC7748] and Ed25519 and Ed448 [RFC8032]. Additionally, legacy OIDs
+ are defined for "Curve25519Legacy" (for encryption using the ECDH
+ algorithm) and "Ed25519Legacy" (for signing using the EdDSALegacy
+ algorithm).
+
+11.2. EC Point Wire Formats
+
+ A point on an elliptic curve will always be represented on the wire
+ as an MPI. Each curve uses a specific point format for the data
+ within the MPI itself. Each format uses a designated prefix octet to
+ ensure that the high octet has at least 1 bit set to make the MPI a
+ constant size.
+
+ +=================+================+================+
+ | Name | Wire Format | Reference |
+ +=================+================+================+
+ | SEC1 | 0x04 || x || y | Section 11.2.1 |
+ +-----------------+----------------+----------------+
+ | Prefixed native | 0x40 || native | Section 11.2.2 |
+ +-----------------+----------------+----------------+
+
+ Table 28: OpenPGP Elliptic Curve Point Wire
+ Formats Registry
+
+11.2.1. SEC1 EC Point Wire Format
+
+ For a SEC1-encoded (uncompressed) point, the content of the MPI is:
+
+ B = 04 || x || y
+
+ where x and y are coordinates of the point P = (x, y), and each is
+ encoded in the big-endian format and zero-padded to the adjusted
+ underlying field size. The adjusted underlying field size is the
+ underlying field size rounded up to the nearest 8-bit boundary, as
+ noted in the "fsize" column in Section 9.2. This encoding is
+ compatible with the definition given in [SEC1].
+
+11.2.2. Prefixed Native EC Point Wire Format
+
+ For a custom compressed point, the content of the MPI is:
+
+ B = 40 || p
+
+ where p is the public key of the point encoded using the rules
+ defined for the specified curve. This format is used for ECDH keys
+ based on curves expressed in Montgomery form and for points when
+ using EdDSA.
+
+11.2.3. Notes on EC Point Wire Formats
+
+ Given the above definitions, the exact size of the MPI payload for an
+ encoded point is 515 bits for both NIST P-256 and brainpoolP256r1,
+ 771 for both NIST P-384 and brainpoolP384r1, 1059 for NIST P-521,
+ 1027 for brainpoolP512r1, and 263 for both Curve25519Legacy and
+ Ed25519Legacy. For example, the length of an EdDSALegacy public key
+ for the curve Ed25519Legacy is 263 bits: 7 bits to represent the 0x40
+ prefix octet and 32 octets for the native value of the public key.
+
+ Even though the zero point (also called the "point at infinity") may
+ occur as a result of arithmetic operations on points of an elliptic
+ curve, it SHALL NOT appear in data structures defined in this
+ document.
+
+ Each particular curve uses a designated wire format for the point
+ found in its public key or ECDH data structure. An implementation
+ MUST NOT use a different wire format for a point other than the wire
+ format associated with the curve.
+
+11.3. EC Scalar Wire Formats
+
+ Some non-curve values in elliptic curve cryptography (for example,
+ secret keys and signature components) are not points on a curve, but
+ they are also encoded on the wire in OpenPGP as an MPI.
+
+ Because of different patterns of deployment, some curves treat these
+ values as opaque bit strings with the high bit set, while others are
+ treated as actual integers, encoded in the standard OpenPGP big-
+ endian form. The choice of encoding is specific to the public key
+ algorithm in use.
+
+ +==========+===========================================+===========+
+ | Type | Description | Reference |
+ +==========+===========================================+===========+
+ | integer | An integer encoded in big-endian format | Section |
+ | | as a standard OpenPGP MPI | 3.2 |
+ +----------+-------------------------------------------+-----------+
+ | octet | An octet string of fixed length that may | Section |
+ | string | be shorter on the wire due to leading | 11.3.1 |
+ | | zeros being stripped by the MPI encoding | |
+ | | and may need to be zero-padded before use | |
+ +----------+-------------------------------------------+-----------+
+ | prefixed | An octet string of fixed length N, | Section |
+ | N octets | prefixed with octet 0x40 to ensure no | 11.3.2 |
+ | | leading zero octet | |
+ +----------+-------------------------------------------+-----------+
+
+ Table 29: OpenPGP Elliptic Curve Scalar Encodings Registry
+
+11.3.1. EC Octet String Wire Format
+
+ Some opaque strings of octets are represented on the wire as an MPI
+ by simply stripping the leading zeros and counting the remaining
+ bits. These strings are of known, fixed length. They are
+ represented in this document as MPI(N octets of X), where N is the
+ expected length in octets of the octet string.
+
+ For example, a 5-octet opaque string (MPI(5 octets of X)) where X has
+ the value 00 02 EE 19 00 would be represented on the wire as an MPI
+ like so: 00 1A 02 EE 19 00.
+
+ To encode X to the wire format, set the MPI's 2-octet bit counter to
+ the value of the highest set bit (bit 26, or 0x001A), and do not
+ transfer the leading all-zero octet to the wire.
+
+ To reverse the process, an implementation can take the following
+ steps, if it knows that X has an expected length of, for example, 5
+ octets:
+
+ * Ensure that the MPI's 2-octet bit count is less than or equal to
+ 40 (5 octets of 8 bits)
+
+ * Allocate 5 octets, setting all to zero initially
+
+ * Copy the MPI data octets (without the two count octets) into the
+ lower octets of the allocated space
+
+11.3.2. EC Prefixed Octet String Wire Format
+
+ Another way to ensure that a fixed-length bytes string is encoded
+ simply to the wire while remaining in MPI format is to prefix the
+ byte string with a dedicated non-zero octet. This specification uses
+ 0x40 as the prefix octet. This is represented in this specification
+ as MPI(prefixed N octets of X), where N is the known byte string
+ length.
+
+ For example, a 5-octet opaque string using MPI(prefixed 5 octets of
+ X) where X has the value 00 02 EE 19 00 would be written to the wire
+ form as: 00 2F 40 00 02 EE 19 00.
+
+ To encode the string, prefix it with the octet 0x40 (whose 7th bit is
+ set), and then set the MPI's 2-octet bit counter to 47 (0x002F -- 7
+ bits for the prefix octet and 40 bits for the string).
+
+ To decode the string from the wire, an implementation that knows that
+ the variable is formed in this way can:
+
+ * ensure that the first three octets of the MPI (the 2-bit count
+ octets plus the prefix octet) are 00 2F 40, and
+
+ * use the remainder of the MPI directly off the wire.
+
+ Note that this is a similar approach to that used in the EC point
+ encodings found in Section 11.2.2.
+
+11.4. Key Derivation Function
+
+ A key derivation function (KDF) is necessary to implement EC
+ encryption. The Concatenation Key Derivation Function (Approved
+ Alternative 1) [SP800-56A] with the KDF hash function that is
+ SHA2-256 [FIPS180] or stronger is REQUIRED.
+
+ For convenience, the synopsis of the encoding method is given below
+ with significant simplifications attributable to the restricted
+ choice of hash functions in this document. However, [SP800-56A] is
+ the normative source of the definition.
+
+ // Implements KDF( X, oBits, Param );
+ // Input: point X = (x,y)
+ // oBits - the desired size of output
+ // hBits - the size of output of hash function Hash
+ // Param - octets representing the parameters
+ // Assumes that oBits <= hBits
+ // Convert the point X to the octet string:
+ // ZB' = 04 || x || y
+ // and extract the x portion from ZB'
+ ZB = x;
+ MB = Hash ( 00 || 00 || 00 || 01 || ZB || Param );
+ return oBits leftmost bits of MB.
+
+ Note that ZB in the KDF description above is the compact
+ representation of X as defined in Section 4.2 of [RFC6090].
+
+11.5. ECDH Algorithm
+
+ This section describes the One-Pass Diffie-Hellman method, which is a
+ combination of the ECC Diffie-Hellman method that establishes a
+ shared secret and the key derivation method that processes the shared
+ secret into a derived key. Additionally, this section describes a
+ key wrapping method that uses the derived key to protect a session
+ key used to encrypt a message.
+
+ The One-Pass Diffie-Hellman method C(1, 1, ECC CDH) [SP800-56A] MUST
+ be implemented with the following restrictions: the ECC Cofactor
+ Diffie-Hellman (CDH) primitive employed by this method is modified to
+ always assume the cofactor is 1, the KDF specified in Section 11.4 is
+ used, and the KDF parameters specified below are used.
+
+ The KDF parameters are encoded as a concatenation of the following 5
+ variable-length and fixed-length fields, which are compatible with
+ the definition of the OtherInfo bit string [SP800-56A]:
+
+ * A variable-length field containing a curve OID, which is formatted
+ as follows:
+
+ - A 1-octet size of the following field.
+
+ - The octets representing a curve OID, as defined in Section 9.2.
+
+ * A 1-octet public key algorithm ID, as defined in Section 9.1.
+
+ * A variable-length field containing KDF parameters, which are
+ identical to the corresponding field in the ECDH public key and
+ formatted as follows:
+
+ - A 1-octet size of the following fields; values 0 and 0xFF are
+ reserved for future extensions.
+
+ - A 1-octet value 0x01, reserved for future extensions.
+
+ - A 1-octet hash function ID used with the KDF.
+
+ - A 1-octet algorithm ID for the symmetric algorithm that is used
+ to wrap the symmetric key for message encryption; see
+ Section 11.5 for details.
+
+ * 20 octets representing the UTF-8 encoding of the string "Anonymous
+ Sender" padded at the end with spaces (0x20) to 20 octets, which
+ is the octet sequence 41 6E 6F 6E 79 6D 6F 75 73 20 53 65 6E 64 65
+ 72 20 20 20 20.
+
+ * A variable-length field containing the fingerprint of the
+ recipient encryption subkey identifying the key material that is
+ needed for decryption. For version 4 keys, this field is 20
+ octets. For version 6 keys, this field is 32 octets.
+
+ The size in octets of the KDF parameters sequence, as defined above,
+ for encrypting to a version 4 key is 54 for curve NIST P-256; 51 for
+ curves NIST P-384 and NIST P-521; 55 for curves brainpoolP256r1,
+ brainpoolP384r1, and brainpoolP512r1; or 56 for Curve25519Legacy.
+ For encrypting to a version 6 key, the size of the sequence is 66 for
+ curve NIST P-256; 63 for curves NIST P-384 and NIST P-521; or 67 for
+ curves brainpoolP256r1, brainpoolP384r1, and brainpoolP512r1.
+
+ The key wrapping method is described in [RFC3394]. The KDF produces
+ a symmetric key that is used as a KEK as specified in [RFC3394].
+ Refer to Section 11.5.1 for the details regarding the choice of the
+ KEK algorithm, which SHOULD be one of the three AES algorithms. Key
+ wrapping and unwrapping is performed with the default initial value
+ of [RFC3394].
+
+ To produce the input to the key wrapping method, first concatenate
+ the following values:
+
+ * The 1-octet algorithm identifier, if it was passed (in the case of
+ a v3 PKESK packet).
+
+ * The session key.
+
+ * A 2-octet checksum of the session key, equal to the sum of the
+ session key octets, modulo 65536.
+
+ Then, the above values are padded to an 8-octet granularity using the
+ method described in [RFC8018].
+
+ For example, in a version 3 Public Key Encrypted Session Key packet,
+ an AES-256 session key is encoded as follows, forming a 40-octet
+ sequence:
+
+ 09 k0 k1 ... k31 s0 s1 05 05 05 05 05
+
+ The octets k0 to k31 above denote the session key, and the octets s0
+ and s1 denote the checksum of the session key octets. This encoding
+ allows the sender to obfuscate the size of the symmetric encryption
+ key used to encrypt the data. For example, assuming that an AES
+ algorithm is used for the session key, the sender MAY use 21, 13, and
+ 5 octets of padding for AES-128, AES-192, and AES-256, respectively,
+ to provide the same number of octets, 40 total, as an input to the
+ key wrapping method.
+
+ In a version 6 Public Key Encrypted Session Key packet, the symmetric
+ algorithm is not included, as described in Section 5.1. For example,
+ an AES-256 session key would be composed as follows:
+
+ k0 k1 ... k31 s0 s1 06 06 06 06 06 06
+
+ The octets k0 to k31 above again denote the session key, and the
+ octets s0 and s1 denote the checksum. In this case, assuming that an
+ AES algorithm is used for the session key, the sender MAY use 22, 14,
+ and 6 octets of padding for AES-128, AES-192, and AES-256,
+ respectively, to provide the same number of octets, 40 total, as an
+ input to the key wrapping method.
+
+ The output of the method consists of two fields. The first field is
+ the MPI containing the ephemeral key used to establish the shared
+ secret. The second field is composed of the following two subfields:
+
+ * One octet encoding the size in octets of the result of the key
+ wrapping method; the value 255 is reserved for future extensions.
+
+ * Up to 254 octets representing the result of the key wrapping
+ method, applied to the 8-octet padded session key, as described
+ above.
+
+ Note that for session key sizes 128, 192, and 256 bits, the size of
+ the result of the key wrapping method is, respectively, 32, 40, and
+ 48 octets, unless size obfuscation is used.
+
+ For convenience, the synopsis of the encoding method is given below;
+ however, this section, [SP800-56A], and [RFC3394] are the normative
+ sources of the definition.
+
+ * Obtain the authenticated recipient public key R
+
+ * Generate an ephemeral, single-use key pair {v, V=vG}
+
+ * Compute the shared point S = vR
+
+ * m = symm_alg_ID || session key || checksum || pkcs5_padding
+
+ * curve_OID_len = (octet)len(curve_OID)
+
+ * Param = curve_OID_len || curve_OID || public_key_alg_ID || 03 ||
+ 01 || KDF_hash_ID || KEK_alg_ID for AESKeyWrap || 41 6E 6F 6E 79
+ 6D 6F 75 73 20 53 65 6E 64 65 72 20 20 20 20 ||
+ recipient_fingerprint
+
+ * Z_len = the key size for the KEK_alg_ID used with AESKeyWrap
+
+ * Compute Z = KDF( S, Z_len, Param )
+
+ * Compute C = AESKeyWrap( Z, m ) (per [RFC3394])
+
+ * Wipe the memory that contained S, v, and Z to avoid leaking
+ ephemeral secrets
+
+ * VB = convert point V to the octet string
+
+ * Output (MPI(VB) || len(C) || C)
+
+ The decryption is the inverse of the method given. Note that the
+ recipient with key pair (r,R) obtains the shared secret by
+ calculating:
+
+ S = rV = rvG
+
+11.5.1. ECDH Parameters
+
+ ECDH keys have a hash algorithm parameter for key derivation and a
+ symmetric algorithm for key encapsulation.
+
+ For version 6 keys, the following algorithms MUST be used depending
+ on the curve. An implementation MUST NOT generate a version 6 ECDH
+ key over any listed curve that uses different KDF or KEK parameters.
+ An implementation MUST NOT encrypt any message to a version 6 ECDH
+ key over a listed curve that announces a different KDF or KEK
+ parameter.
+
+ For version 4 keys, the following algorithms SHOULD be used depending
+ on the curve. An implementation SHOULD only use an AES algorithm as
+ a KEK algorithm.
+
+ +==================+================+=====================+
+ | Curve | Hash Algorithm | Symmetric Algorithm |
+ +==================+================+=====================+
+ | NIST P-256 | SHA2-256 | AES-128 |
+ +------------------+----------------+---------------------+
+ | NIST P-384 | SHA2-384 | AES-192 |
+ +------------------+----------------+---------------------+
+ | NIST P-521 | SHA2-512 | AES-256 |
+ +------------------+----------------+---------------------+
+ | brainpoolP256r1 | SHA2-256 | AES-128 |
+ +------------------+----------------+---------------------+
+ | brainpoolP384r1 | SHA2-384 | AES-192 |
+ +------------------+----------------+---------------------+
+ | brainpoolP512r1 | SHA2-512 | AES-256 |
+ +------------------+----------------+---------------------+
+ | Curve25519Legacy | SHA2-256 | AES-128 |
+ +------------------+----------------+---------------------+
+
+ Table 30: OpenPGP ECDH KDF and KEK Parameters Registry
+
+12. Notes on Algorithms
+
+12.1. PKCS#1 Encoding in OpenPGP
+
+ This specification makes use of the PKCS#1 functions EME-PKCS1-v1_5
+ and EMSA-PKCS1-v1_5. However, the calling conventions of these
+ functions have changed in the past. To avoid potential confusion and
+ interoperability problems, we are including local copies in this
+ document, adapted from those in PKCS#1 v2.1 [RFC8017]. [RFC8017]
+ should be treated as the ultimate authority on PKCS#1 for OpenPGP.
+ Nonetheless, we believe that there is value in having a self-
+ contained document that avoids problems in the future with needed
+ changes in the conventions.
+
+12.1.1. EME-PKCS1-v1_5-ENCODE
+
+ Input:
+
+ k = key modulus length in octets.
+
+ M = message to be encoded; an octet string of length mLen, where
+ mLen <= k - 11.
+
+ Output:
+
+ EM = encoded message; an octet string of length k.
+
+ Error: "message too long".
+
+ 1. Length checking: If mLen > k - 11, output "message too long" and
+ stop.
+
+ 2. Generate an octet string PS of length k - mLen - 3 consisting of
+ pseudorandomly generated non-zero octets. The length of PS will
+ be at least 8 octets.
+
+ 3. Concatenate PS, the message M, and other padding to form an
+ encoded message EM of length k octets as
+
+ EM = 0x00 || 0x02 || PS || 0x00 || M.
+
+ 4. Output EM.
+
+12.1.2. EME-PKCS1-v1_5-DECODE
+
+ Input:
+
+ EM = encoded message; an octet string.
+
+ Output:
+
+ M = decoded message; an octet string.
+
+ Error: "decryption error".
+
+ To decode an EME-PKCS1_v1_5 message, separate the encoded message EM
+ into an octet string PS consisting of non-zero octets and a message M
+ as follows
+
+ EM = 0x00 || 0x02 || PS || 0x00 || M.
+
+ If the first octet of EM does not have hexadecimal value 0x00, the
+ second octet of EM does not have hexadecimal value 0x02, there is no
+ octet with hexadecimal value 0x00 to separate PS from M, or the
+ length of PS is less than 8 octets, output "decryption error" and
+ stop. See also Section 13.5 regarding differences in reporting
+ between a decryption error and a padding error.
+
+12.1.3. EMSA-PKCS1-v1_5
+
+ This encoding method is deterministic and only has an encoding
+ operation.
+
+ Input:
+
+ Hash = hash function to be used.
+
+ M = message to be encoded.
+
+ emLen = intended length of the encoded message in octets, at least
+ tLen + 11, where tLen is the octet length of the DER encoding T of
+ a certain value computed during the encoding operation.
+
+ Output:
+
+ EM = encoded message; an octet string of length emLen.
+
+ Errors: "message too long"; "intended encoded message length too
+ short".
+
+ Steps:
+
+ 1. Apply the hash function to the message M to produce hash value H:
+
+ H = Hash(M).
+
+ If the hash function outputs "message too long," output "message
+ too long" and stop.
+
+ 2. Let T be the Full Hash Prefix from Table 24 for the given hash
+ function, concatenated with the hash digest H (representing an
+ ASN.1 DER value for the hash function used and the hash digest).
+ Let tLen be the length in octets of T.
+
+ 3. If emLen < tLen + 11, output "intended encoded message length too
+ short" and stop.
+
+ 4. Generate an octet string PS consisting of emLen - tLen - 3 octets
+ with hexadecimal value 0xFF. The length of PS will be at least 8
+ octets.
+
+ 5. Concatenate PS, the hash prefix T, and other padding to form the
+ encoded message EM as
+
+ EM = 0x00 || 0x01 || PS || 0x00 || T.
+
+ 6. Output EM.
+
+12.2. Symmetric Algorithm Preferences
+
+ The symmetric algorithm preference is an ordered list of algorithms
+ that the keyholder accepts. Since it is found on a self-signature,
+ it is possible that a keyholder may have multiple, different
+ preferences. For example, Alice may have AES-128 only specified for
+ "alice@work.com" but Camellia-256, Twofish, and AES-128 specified for
+ "alice@home.org". Note that it is also possible for preferences to
+ be in a subkey's binding signature.
+
+ Since AES-128 is the algorithm that MUST be implemented, if it is not
+ explicitly in the list, it is tacitly at the end. However, it is
+ good form to place it there explicitly. Note also that if an
+ implementation does not implement the preference, then it is
+ implicitly an AES-128-only implementation. Furthermore, note that
+ implementations conforming to the previous version of this
+ specification [RFC4880] have TripleDES as the only algorithm that
+ MUST be implemented.
+
+ An implementation MUST NOT use a symmetric algorithm that is not in
+ the recipient's preference list. When encrypting to more than one
+ recipient, the implementation finds a suitable algorithm by taking
+ the intersection of the preferences of the recipients. Note that
+ since the AES-128 algorithm MUST be implemented, the intersection is
+ guaranteed to be non-empty.
+
+ If an implementation can decrypt a message that a keyholder doesn't
+ have in their preferences, the implementation SHOULD decrypt the
+ message anyway, but it MUST warn the keyholder. For example, suppose
+ that Alice (above) has an implementation that implements all
+ algorithms in this specification. Nonetheless, she prefers subsets
+ for work or home. If she is sent a message encrypted with IDEA,
+ which is not in her preferences, the implementation warns her that
+ someone sent an IDEA-encrypted message, but it would ideally decrypt
+ it anyway.
+
+12.2.1. Plaintext
+
+ Algorithm 0, "plaintext", may only be used to denote secret keys that
+ are stored in the clear. An implementation MUST NOT use algorithm 0
+ as the indicated symmetric cipher for an encrypted data packet
+ (Sections 5.7 or 5.13); it can use a Literal Data packet
+ (Section 5.9) to encode unencrypted literal data.
+
+12.3. Other Algorithm Preferences
+
+ Other algorithm preferences work similarly to the symmetric algorithm
+ preference in that they specify which algorithms the keyholder
+ accepts. There are two interesting cases in which further comments
+ are needed: the compression preferences and the hash preferences.
+
+12.3.1. Compression Preferences
+
+ Like the algorithm preferences, an implementation MUST NOT use an
+ algorithm that is not in the preference vector. If Uncompressed (0)
+ is not explicitly in the list, it is tacitly at the end. That is,
+ uncompressed messages may always be sent.
+
+ Note that earlier implementations may assume that the absence of
+ compression preferences means that [ZIP(1), Uncompressed(0)] are
+ preferred, and default to ZIP compression. Therefore, an
+ implementation that prefers uncompressed data SHOULD explicitly state
+ this in the Preferred Compression Algorithms.
+
+12.3.1.1. Uncompressed
+
+ Algorithm 0, "uncompressed", may only be used to denote a preference
+ for uncompressed data. An implementation MUST NOT use algorithm 0 as
+ the indicated compression algorithm in a Compressed Data packet
+ (Section 5.6); it can use a Literal Data packet (Section 5.9) to
+ encode uncompressed literal data.
+
+12.3.2. Hash Algorithm Preferences
+
+ Typically, the signer chooses which hash algorithm to use, rather
+ than the verifier, because a signer rarely knows who is going to be
+ verifying the signature. This preference allows a protocol based
+ upon digital signatures ease in negotiation.
+
+ Thus, if Alice is authenticating herself to Bob with a signature, it
+ makes sense for her to use a hash algorithm that Bob's implementation
+ uses. This preference allows Bob to state which algorithms Alice may
+ use in his key.
+
+ Since SHA2-256 is the hash algorithm that MUST be implemented, if it
+ is not explicitly in the list, it is tacitly at the end. However, it
+ is good form to place it there explicitly.
+
+12.4. RSA
+
+ The PKCS1-v1_5 padding scheme, used by the RSA algorithms defined in
+ this document, is no longer recommended, and its use is deprecated by
+ [SP800-131A]. Therefore, an implementation SHOULD NOT generate RSA
+ keys.
+
+ There are algorithm types for RSA Sign-Only and RSA Encrypt-Only
+ keys. These types are deprecated in favor of the Key Flags signature
+ subpacket. An implementation MUST NOT create such a key, but it MAY
+ interpret it.
+
+ An implementation MUST NOT generate RSA keys of a size less than 3072
+ bits. An implementation SHOULD NOT encrypt, sign, or verify using
+ RSA keys of a size less than 3072 bits. An implementation MUST NOT
+ encrypt, sign, or verify using RSA keys of a size less than 2048
+ bits. An implementation that decrypts a message using an RSA secret
+ key of a size less than 3072 bits SHOULD generate a deprecation
+ warning that the key is too weak for modern use.
+
+12.5. DSA
+
+ DSA is no longer recommended. It has also been deprecated in
+ [FIPS186]. Therefore, an implementation MUST NOT generate DSA keys.
+
+ An implementation MUST NOT sign or verify using DSA keys.
+
+12.6. Elgamal
+
+ The PKCS1-v1_5 padding scheme, used by the Elgamal algorithm defined
+ in this document, is no longer recommended, and its use is deprecated
+ by [SP800-131A]. Therefore, an implementation MUST NOT generate
+ Elgamal keys.
+
+ An implementation MUST NOT encrypt using Elgamal keys. An
+ implementation that decrypts a message using an Elgamal secret key
+ SHOULD generate a deprecation warning that the key is too weak for
+ modern use.
+
+12.7. EdDSA
+
+ Although the EdDSA algorithm allows arbitrary data as input, its use
+ with OpenPGP requires that a digest of the message be used as input
+ (pre-hashed). See Section 5.2.4 for details. Truncation of the
+ resulting digest is never applied; the resulting digest value is used
+ verbatim as input to the EdDSA algorithm.
+
+ For clarity: while [RFC8032] describes different variants of EdDSA,
+ OpenPGP uses the "pure" variant (PureEdDSA). The hashing that
+ happens with OpenPGP is done as part of the standard OpenPGP
+ signature process, and that hash itself is fed as the input message
+ to the PureEdDSA algorithm.
+
+ As specified in [RFC8032], Ed448 also expects a "context string". In
+ OpenPGP, Ed448 is used with the empty string as a context string.
+
+12.8. Reserved Algorithm IDs
+
+ A number of algorithm IDs have been reserved for algorithms that
+ would be useful to use in an OpenPGP implementation, yet there are
+ issues that prevent an implementer from actually implementing the
+ algorithm. These are marked as reserved in Section 9.1.
+
+ The reserved public key algorithm X9.42 (21) does not have the
+ necessary parameters, parameter order, or semantics defined. The
+ same is currently true for reserved public key algorithms AEDH (23)
+ and AEDSA (24).
+
+ Previous versions of the OpenPGP specification permitted Elgamal
+ [ELGAMAL] signatures with a public key algorithm ID of 20. These are
+ no longer permitted. An implementation MUST NOT generate such keys.
+ An implementation MUST NOT generate Elgamal signatures; see
+ [BLEICHENBACHER].
+
+12.9. CFB Mode
+
+ The Cipher Feedback (CFB) mode used in this document is defined in
+ Section 6.3 of [SP800-38A].
+
+ The CFB segment size s is equal to the block size of the cipher
+ (i.e., n-bit CFB mode, where n is the block size used).
+
+12.10. Private or Experimental Parameters
+
+ S2K Specifiers, Signature Subpacket Type IDs, User Attribute
+ Subpacket Type IDs, image format IDs, and the various algorithm IDs
+ described in Section 9 all reserve the range 100 to 110 for Private
+ and Experimental Use. Packet Type IDs reserve the range 60 to 63 for
+ Private and Experimental Use. These are intentionally managed by the
+ Private Use and Experimental Use policies, as described in [RFC8126].
+
+ However, implementations need to be careful with these and promote
+ them to full IANA-managed parameters when they grow beyond the
+ original, limited system.
+
+12.11. Meta Considerations for Expansion
+
+ If OpenPGP is extended in a way that is not backward compatible,
+ meaning that old implementations will not gracefully handle their
+ absence of a new feature, the extension proposal can be declared in
+ the keyholder's self-signature as part of the Features signature
+ subpacket.
+
+ We cannot state definitively what extensions will not be forward
+ compatible, but typically new algorithms are forward compatible,
+ whereas new packets are not.
+
+ If an extension proposal does not update the Features system, it
+ SHOULD include an explanation of why this is unnecessary. If the
+ proposal contains neither an extension to the Features system nor an
+ explanation of why such an extension is unnecessary, the proposal
+ SHOULD be rejected.
+
+13. Security Considerations
+
+ * As with any technology involving cryptography, implementers should
+ check the current literature to determine if any algorithms used
+ here have been found to be vulnerable to an attack. If so,
+ implementers should consider disallowing such algorithms for new
+ data and warning the end user, or preventing use, when they are
+ trying to consume data protected by such algorithms that are now
+ vulnerable.
+
+ * This specification uses Public Key Cryptography technologies. It
+ is assumed that the private key portion of a public-private key
+ pair is controlled and secured by the proper party or parties.
+
+ * The MD5 and SHA-1 hash algorithms have been found to have
+ weaknesses, with collisions found in a number of cases. MD5 and
+ SHA-1 are deprecated for use in OpenPGP (see Section 9.5).
+
+ * Many security protocol designers think that it is a bad idea to
+ use a single key for both privacy (encryption) and integrity
+ (signatures). In fact, this was one of the motivating forces
+ behind the version 4 key format with separate signature and
+ encryption keys. Using a single key for encrypting and signing is
+ discouraged.
+
+ * The DSA algorithm will work with any hash, but it is sensitive to
+ the quality of the hash algorithm. Verifiers should be aware that
+ even if the signer used a strong hash, an attacker could have
+ modified the signature to use a weak one. Only signatures using
+ acceptably strong hash algorithms should be accepted as valid.
+
+ * As OpenPGP combines many different asymmetric, symmetric, and hash
+ algorithms, each with different measures of strength, care should
+ be taken to ensure that the weakest element of an OpenPGP Message
+ is still sufficiently strong for the purpose at hand. While
+ consensus about the strength of a given algorithm may evolve, NIST
+ Special Publication 800-57 [SP800-57] contains recommendations
+ (current at the time of this publication) about equivalent
+ security levels of different algorithms.
+
+ * There is a somewhat-related potential security problem in
+ signatures. If an attacker can find a message that hashes to the
+ same hash with a different algorithm, a bogus signature structure
+ can be constructed that evaluates correctly.
+
+ For example, suppose Alice DSA-signs message M using hash
+ algorithm H. Suppose that Mallet finds a message M' that has the
+ same hash value as M with H'. Mallet can then construct a
+ signature block that verifies as Alice's signature of M' with H'.
+ However, this would also constitute a weakness in either H or H',
+ or both. Should this ever occur, a revision will have to be made
+ to this document to revise the allowed hash algorithms.
+
+ * If you are building an authentication system, the recipient may
+ specify a preferred signing algorithm. However, the signer would
+ be foolish to use a weak algorithm simply because the recipient
+ requests it.
+
+ * Some of the encryption algorithms mentioned in this document have
+ been analyzed less than others. For example, although TWOFISH is
+ presently considered reasonably strong, it has been analyzed much
+ less than AES. Other algorithms may have other concerns
+ surrounding them.
+
+ * In late summer 2002, Jallad, Katz, and Schneier published an
+ interesting attack on previous versions of the OpenPGP
+ specification and some of its implementations [JKS02]. In this
+ attack, the attacker modifies a message and sends it to a user who
+ then returns the erroneously decrypted message to the attacker.
+ The attacker is thus using the user as a decryption oracle and can
+ often decrypt the message. This attack is a particular form of
+ ciphertext malleability. See Section 13.7 for information on how
+ to defend against such an attack using more recent versions of
+ OpenPGP.
+
+13.1. SHA-1 Collision Detection
+
+ As described in [SHAMBLES], the SHA-1 digest algorithm is not
+ collision resistant. However, an OpenPGP implementation cannot
+ completely discard the SHA-1 algorithm, because it is required for
+ implementing version 4 public keys. In particular, the version 4
+ fingerprint derivation uses SHA-1. So as long as an OpenPGP
+ implementation supports version 4 public keys, it will need to
+ implement SHA-1 in at least some scenarios.
+
+ To avoid the risk of uncertain breakage from a maliciously introduced
+ SHA-1 collision, an OpenPGP implementation MAY attempt to detect when
+ a hash input is likely from a known collision attack and then either
+ reject the hash input deliberately or modify the hash output. This
+ should convert an uncertain breakage (where it is unclear what the
+ effect of a collision will be) to an explicit breakage, which is more
+ desirable for a robust implementation.
+
+ [STEVENS2013] describes a method for detecting indicators of well-
+ known SHA-1 collision attacks. Some example C code implementing this
+ technique can be found at [SHA1CD].
+
+13.2. Advantages of Salted Signatures
+
+ Version 6 signatures include a salt that is hashed first, and it's
+ size depends on the hashing algorithm. This makes version 6 OpenPGP
+ signatures non-deterministic and protects against a broad class of
+ attacks that depend on creating a signature over a predictable
+ message. By selecting a new random salt for each signature made, the
+ signed hashes and the signatures are not predictable.
+
+ While the material to be signed could be attacker controlled, hashing
+ the salt first means that there is no attacker-controlled hashed
+ prefix. An example of this kind of attack is described in the paper
+ "SHA-1 is a Shambles" [SHAMBLES], which leverages a chosen prefix
+ collision attack against SHA-1. This means that an adversary
+ carrying out a chosen-message attack will not be able to control the
+ hash that is being signed and will need to break second-preimage
+ resistance instead of the simpler collision resistance to create two
+ messages having the same signature. The size of the salt is bound to
+ the hash function to match the expected collision-resistance level
+ and is at least 16 octets.
+
+ In some cases, an attacker may be able to induce a signature to be
+ made, even if they do not control the content of the message. In
+ some scenarios, a repeated signature over the exact same message may
+ risk leakage of part or all of the signing key; for example, see
+ discussion of hardware faults over EdDSA and deterministic ECDSA in
+ [PSSLR17]. Choosing a new random salt for each signature ensures
+ that no repeated signatures are produced, which mitigates this risk.
+
+13.3. Elliptic Curve Side Channels
+
+ Side-channel attacks are a concern when a compliant application's use
+ of the OpenPGP format can be modeled by a decryption or signing
+ oracle, for example, when an application is a network service
+ performing decryption to unauthenticated remote users. ECC scalar
+ multiplication operations used in ECDSA and ECDH are vulnerable to
+ side-channel attacks. Countermeasures can often be taken at the
+ higher protocol level, such as limiting the number of allowed
+ failures or time-blinding the operations associated with each network
+ interface. Mitigations at the scalar multiplication level seek to
+ eliminate any measurable distinction between the ECC point addition
+ and doubling operations.
+
+13.4. Risks of a Quick Check Oracle
+
+ In winter 2005, Serge Mister and Robert Zuccherato from Entrust
+ released a paper describing a way that the "quick check" in v1 SEIPD
+ and SED packets can be used as an oracle to decrypt two octets of
+ every cipher block [MZ05]. This check was intended for early
+ detection of session key decryption errors, particularly to detect a
+ wrong passphrase, since v4 SKESK packets do not include an integrity
+ check.
+
+ There is a danger when using the quick check if timing or error
+ information about the check can be exposed to an attacker,
+ particularly via an automated service that allows rapidly repeated
+ queries.
+
+ Disabling the quick check prevents the attack.
+
+ For very large encrypted data whose session key is protected by a
+ passphrase using a v4 SKESK, the quick check may be convenient to the
+ user by informing them early that they typed the wrong passphrase.
+ But the implementation should use the quick check with care. The
+ recommended approach for secure and early detection of decryption
+ failure is to encrypt data using v2 SEIPD. If the session key is
+ public key encrypted, the quick check is not useful as the public key
+ encryption of the session key should guarantee that it is the right
+ session key.
+
+ The quick check oracle attack is a particular type of attack that
+ exploits ciphertext malleability. For information about other
+ similar attacks, see Section 13.7.
+
+13.5. Avoiding Leaks from PKCS#1 Errors
+
+ The PKCS#1 padding (used in RSA-encrypted and ElGamal-encrypted
+ PKESK) has been found to be vulnerable to attacks in which a system
+ that allows distinguishing padding errors from other decryption
+ errors can act as a decryption and/or signing oracle that can leak
+ the session key or allow signing arbitrary data, respectively
+ [BLEICHENBACHER-PKCS1]. The number of queries required to carry out
+ an attack can range from thousands to millions, depending on how
+ strict and careful an implementation is in processing the padding.
+
+ To make the attack more difficult, an implementation SHOULD implement
+ strict, robust, and constant time padding checks.
+
+ To prevent the attack, in settings where the attacker does not have
+ access to timing information concerning message decryption, the
+ simplest solution is to report a single error code for all variants
+ of PKESK processing errors as well as SEIPD integrity errors (this
+ also includes session key parsing errors, such as on an invalid
+ cipher algorithm for v3 PKESK, or a session key size mismatch for v6
+ PKESK). If the attacker may have access to timing information, then
+ a constant time solution is also needed. This requires careful
+ design, especially for v3 PKESK, where session key size and cipher
+ information is typically not known in advance, as it is part of the
+ PKESK encrypted payload.
+
+13.6. Fingerprint Usability
+
+ This specification uses fingerprints in several places on the wire
+ (e.g., Sections 5.2.3.23, 5.2.3.35, and 5.2.3.36) and in processing
+ (e.g., in ECDH KDF Section 11.5). An implementation may also use the
+ fingerprint internally, for example, as an index to a keystore.
+
+ Additionally, some OpenPGP users have historically used manual
+ fingerprint comparison to verify the public key of a peer. For a
+ version 4 fingerprint, this has typically been done with the
+ fingerprint represented as 40 hexadecimal digits, often broken into
+ groups of four digits with whitespace between each group.
+
+ When a human is actively involved, the result of such a verification
+ is dubious. There is little evidence that most humans are good at
+ precise comparison of high-entropy data, particularly when that data
+ is represented in compact textual form like a hexadecimal
+ [USENIX-STUDY].
+
+ The version 6 fingerprint makes the challenge for a human verifier
+ even worse. At 256 bits (compared to version 4's 160-bit
+ fingerprint), a version 6 fingerprint is even harder for a human to
+ successfully compare.
+
+ An OpenPGP implementation should prioritize mechanical fingerprint
+ transfer and comparison where possible and SHOULD NOT promote manual
+ transfer or comparison of full fingerprints by a human unless there
+ is no other way to achieve the desired result.
+
+ While this subsection acknowledges existing practice for human-
+ representable version 4 fingerprints, this document does not attempt
+ to standardize any specific human-readable form of version 6
+ fingerprint for this discouraged use case.
+
+ NOTE: the topic of interoperable human-in-the-loop key verification
+ needs more work, which will be done in a separate document.
+
+13.7. Avoiding Ciphertext Malleability
+
+ If ciphertext can be modified by an attacker but still subsequently
+ decrypted to some new plaintext, it is considered "malleable". A
+ number of attacks can arise in any cryptosystem that uses malleable
+ encryption, so [RFC4880] and later versions of OpenPGP offer
+ mechanisms to defend against it. However, OpenPGP data may have been
+ created before these defense mechanisms were available. Because
+ OpenPGP implementations deal with historic stored data, they may
+ encounter malleable ciphertexts.
+
+ When an OpenPGP implementation discovers that it is decrypting data
+ that appears to be malleable, it MUST generate a clear error message
+ that indicates the integrity of the message is suspect, it SHOULD NOT
+ attempt to parse nor release decrypted data to the user, and it
+ SHOULD halt with an error. Parsing or releasing decrypted data
+ before having confirmed its integrity can leak the decrypted data
+ [EFAIL] [MRLG15].
+
+ In the case of AEAD encrypted data, if the authentication tag fails
+ to verify, the implementation MUST NOT attempt to parse nor release
+ decrypted data to the user, and it MUST halt with an error.
+
+ An implementation that encounters malleable ciphertext MAY choose to
+ release cleartext to the user if it is not encrypted using AEAD, it
+ is known to be dealing with historic archived legacy data, and the
+ user is aware of the risks.
+
+ In the case of AEAD encrypted messages, if the message is truncated,
+ i.e., the final zero-octet chunk and possibly (part of) some chunks
+ before it are missing, the implementation MAY choose to release
+ cleartext from the fully authenticated chunks before it to the user
+ if it is operating in a streaming fashion, but it MUST indicate a
+ clear error message as soon as the truncation is detected.
+
+ Any of the following OpenPGP data elements indicate that malleable
+ ciphertext is present:
+
+ * All Symmetrically Encrypted Data packets (Section 5.7).
+
+ * Within any encrypted container, any Compressed Data packet
+ (Section 5.6) where there is a decompression failure.
+
+ * Any version 1 Symmetrically Encrypted and Integrity Protected Data
+ packet (Section 5.13.1) where the internal Modification Detection
+ Code does not validate.
+
+ * Any version 2 Symmetrically Encrypted and Integrity Protected Data
+ packet (Section 5.13.2) where the authentication tag of any chunk
+ fails or where there is no final zero-octet chunk.
+
+ * Any Secret-Key packet with encrypted secret key material
+ (Section 3.7.2.1) where there is an integrity failure, based on
+ the value of the secret key protection octet:
+
+ - Value 253 (AEAD): where the AEAD authentication tag is invalid.
+
+ - Value 254 (CFB): where the SHA1 checksum is mismatched.
+
+ - Value 255 (MalleableCFB) or raw cipher algorithm: where the
+ trailing 2-octet checksum does not match.
+
+ To avoid these circumstances, an implementation that generates
+ OpenPGP encrypted data SHOULD select the encrypted container format
+ with the most robust protections that can be handled by the intended
+ recipients. In particular:
+
+ * The SED packet is deprecated and MUST NOT be generated.
+
+ * When encrypting to one or more public keys:
+
+ - If all recipient keys indicate support for a version 2
+ Symmetrically Encrypted and Integrity Protected Data packet in
+ their Features signature subpacket (Section 5.2.3.32), if all
+ recipient keys are version 6 keys without a Features signature
+ subpacket, or the implementation can otherwise infer that all
+ recipients support v2 SEIPD packets, the implementation SHOULD
+ encrypt using a v2 SEIPD packet.
+
+ - If one of the recipients does not support v2 SEIPD packets,
+ then the message generator MAY use a v1 SEIPD packet instead.
+
+ * Passphrase-protected secret key material in a version 6 Secret Key
+ or version 6 Secret Subkey packet SHOULD be protected with AEAD
+ encryption (S2K usage octet 253) unless it will be transferred to
+ an implementation that is known to not support AEAD. An
+ implementation should be aware that, in scenarios where an
+ attacker has write access to encrypted private keys, CFB-encrypted
+ keys (S2K usage octet 254 or 255) are vulnerable to corruption
+ attacks that can cause leakage of secret data when the secret key
+ is used [KOPENPGP] [KR02].
+
+ Implementers should implement AEAD (v2 SEIPD and S2K usage octet 253)
+ promptly and encourage its spread.
+
+ Users are RECOMMENDED to migrate to AEAD.
+
+13.8. Secure Use of the v2 SEIPD Session-Key-Reuse Feature
+
+ The salted key derivation of v2 SEIPD packets (Section 5.13.2) allows
+ the recipient of an encrypted message to reply to the sender and all
+ other recipients without needing their public keys but by using the
+ same v6 PKESK packets it received and a different random salt value.
+ This ensures a secure mechanism on the cryptographic level that
+ enables the use of message encryption in cases where a sender does
+ not have a copy of an encryption-capable certificate for one or more
+ participants in the conversation and thus can enhance the overall
+ security of an application. However, care must be taken when using
+ this mechanism not to create security vulnerabilities, such as the
+ following:
+
+ * Replying to only a subset of the original recipients and the
+ original sender by use of the session-key-reuse feature would mean
+ that the remaining recipients (including the sender) of the
+ original message could read the encrypted reply message, too.
+
+ * Adding a further recipient to the reply that is encrypted using
+ the session-key-reuse feature gives that further recipient also
+ cryptographic access to the original message that is being replied
+ to (and potentially to a longer history of previous messages).
+
+ * A modification of the list of recipients addressed in the above
+ points also needs to be safeguarded when a message is initially
+ composed as a reply with session-key reuse but then is stored
+ (e.g., as a draft) and later reopened for further editing and to
+ be finally sent.
+
+ * There is the potential threat that an attacker with network or
+ mailbox access, who is at the same time a recipient of the
+ original message, silently removes themselves from the message
+ before the victim's client receives it. The victim's client that
+ then uses the mechanism for replying with session-key reuse would
+ unknowingly compose an encrypted message that could be read by the
+ attacker. Implementations are encouraged to use the Intended
+ Recipient Fingerprint subpacket (Section 5.2.3.36) when composing
+ messages and checking the consistency of the set of recipients of
+ a message before replying to it with session-key reuse.
+
+ * When using the session-key-reuse feature in any higher-layer
+ protocol, care should be taken to ensure that there is no other
+ potentially interfering practice of session-key reuse established
+ in that protocol. Such interfering session-key reuse could, for
+ instance, be given -- if an initial message is already composed --
+ by reusing the session key of an existing encrypted file that may
+ have been shared among a group of users already. Using the
+ session-key-reuse feature to compose an encrypted reply to such a
+ message would unknowingly give this whole group of users
+ cryptographic access to the encrypted message.
+
+ * Generally, the use of the session-key-reuse feature should be
+ under the control of the user. Specifically, care should be taken
+ so that this feature is not silently used when the user assumes
+ that proper public key encryption is used. This can be the case,
+ for instance, when the public key of one of the recipients of the
+ reply is known but has expired. Special care should be taken to
+ ensure that users do not get caught in continued use of the
+ session-key reuse unknowingly but instead receive the chance to
+ switch to proper fresh public key encryption as soon as possible.
+
+ * Whenever possible, a client should prefer a fresh public key
+ encryption over the session-key reuse.
+
+ Even though this is not necessarily a security aspect, note that
+ initially composing an encrypted reply using the session-key-reuse
+ feature on one client and then storing it (e.g., as a draft) and
+ later reopening the stored unfinished reply with another client that
+ does not support the session-key-reuse feature may lead to
+ interoperability problems.
+
+ Avoiding the pitfalls described above requires context-specific
+ expertise. An implementation should only make use of the session-
+ key-reuse feature in any particular application layer when it can
+ follow reasonable documentation about how to deploy the feature
+ safely in the specific application. At the time of this writing,
+ there is no known documentation about safe reuse of OpenPGP session
+ keys for any specific context. An implementer that intends to make
+ use of this feature should publish their own proposed guidance for
+ others to review.
+
+13.9. Escrowed Revocation Signatures
+
+ A keyholder, Alice, may wish to designate a third party to be able to
+ revoke her own key.
+
+ The preferred way for Alice to do this is to produce a specific
+ Revocation Signature (Signature Type ID 0x20, 0x28, or 0x30) and
+ distribute it securely to a preferred revoker who can hold it in
+ escrow. The preferred revoker can then publish the escrowed
+ Revocation Signature at whatever time is deemed appropriate rather
+ than generating the Revocation Signature themselves.
+
+ There are multiple advantages of using an escrowed Revocation
+ Signature over the deprecated Revocation Key subpacket
+ (Section 5.2.3.23):
+
+ * The keyholder can constrain what types of revocation the preferred
+ revoker can issue, by only escrowing those specific signatures.
+
+ * There is no public/visible linkage between the keyholder and the
+ preferred revoker.
+
+ * Third parties can verify the revocation without needing to find
+ the key of the preferred revoker.
+
+ * The preferred revoker doesn't even need to have a public OpenPGP
+ Key if some other secure transport is possible between them and
+ the keyholder.
+
+ * Implementation support for enforcing a revocation from an
+ authorized Revocation Key subpacket is uneven and unreliable.
+
+ * If the fingerprint mechanism suffers a cryptanalytic flaw, the
+ escrowed Revocation Signature is not affected.
+
+ A Revocation Signature may also be split up into shares and
+ distributed among multiple parties, requiring some subset of those
+ parties to collaborate before the escrowed Revocation Signature is
+ recreated.
+
+13.10. Random Number Generation and Seeding
+
+ OpenPGP requires a cryptographically secure pseudorandom number
+ generator (CSPRNG). In most cases, the operating system provides an
+ appropriate facility such as a getrandom() syscall on Linux or BSD,
+ which should be used absent other (for example, performance)
+ concerns. It is RECOMMENDED to use an existing CSPRNG implementation
+ as opposed to crafting a new one. Many adequate cryptographic
+ libraries are already available under favorable license terms.
+ Should those prove unsatisfactory, [RFC4086] provides guidance on the
+ generation of random values.
+
+ OpenPGP uses random data with three different levels of visibility:
+
+ * In publicly visible fields such as nonces, IVs, public padding
+ material, or salts.
+
+ * In shared-secret values, such as session keys for encrypted data
+ or padding material within an encrypted packet.
+
+ * In entirely private data, such as asymmetric key generation.
+
+ With a properly functioning CSPRNG, this range of visibility does not
+ present a security problem, as it is not feasible to determine the
+ CSPRNG state from its output. However, with a broken CSPRNG, it may
+ be possible for an attacker to use visible output to determine the
+ CSPRNG internal state and thereby predict less-visible data like
+ keying material, as documented in [CHECKOWAY].
+
+ An implementation can provide extra security against this form of
+ attack by using separate CSPRNGs to generate random data with
+ different levels of visibility.
+
+13.11. Traffic Analysis
+
+ When sending OpenPGP data through the network, the size of the data
+ may leak information to an attacker. There are circumstances where
+ such a leak could be unacceptable from a security perspective.
+
+ For example, if possible cleartext messages for a given protocol are
+ known to be either yes (3 octets) or no (2 octets) and the messages
+ are sent within a Symmetrically Encrypted and Integrity Protected
+ Data packet, the length of the encrypted message will reveal the
+ contents of the cleartext.
+
+ In another example, sending an OpenPGP Transferable Public Key over
+ an encrypted network connection might reveal the length of the
+ certificate. Since the length of an OpenPGP certificate varies based
+ on the content, an external observer interested in metadata (e.g.,
+ which individual is trying to contact another individual) may be able
+ to guess the identity of the certificate sent, if its length is
+ unique.
+
+ In both cases, an implementation can adjust the size of the compound
+ structure by including a Padding packet (see Section 5.14).
+
+13.12. Surreptitious Forwarding
+
+ When an attacker obtains a signature for some text, e.g., by
+ receiving a signed message, they may be able to use that signature
+ maliciously by sending a message purporting to come from the original
+ sender, with the same body and signature, to a different recipient.
+ To prevent this, an implementation SHOULD implement the Intended
+ Recipient Fingerprint subpacket (Section 5.2.3.36).
+
+13.13. Hashed vs. Unhashed Subpackets
+
+ Each OpenPGP signature can have subpackets in two different sections.
+ The first set of subpackets (the "hashed section") is covered by the
+ signature itself. The second set has no cryptographic protections
+ and is used for advisory material only, including locally stored
+ annotations about the signature.
+
+ For example, consider an implementation working with a specific
+ signature that happens to know that the signature was made by a
+ certain key, even though the signature contains no Issuer Fingerprint
+ subpacket (Section 5.2.3.35) in the hashed section. That
+ implementation MAY synthesize an Issuer Fingerprint subpacket and
+ store it in the unhashed section so that it will be able to recall
+ which key issued the signature in the future.
+
+ Some subpackets are only useful when they are in the hashed section,
+ and an implementation SHOULD ignore them when they are found with
+ unknown provenance in the unhashed section. For example, a Preferred
+ AEAD Ciphersuites subpacket (Section 5.2.3.15) in a Direct Key self-
+ signature indicates the preferences of the keyholder when encrypting
+ v2 SEIPD data to the key. An implementation that observes such a
+ subpacket found in the unhashed section would open itself to an
+ attack where the recipient's certificate is tampered with to
+ encourage the use of a specific cipher or mode of operation.
+
+13.14. Malicious Compressed Data
+
+ It is possible to form a compression quine that produces itself upon
+ decompression, leading to infinite regress in any implementation
+ willing to parse arbitrary numbers of layers of compression. This
+ could cause resource exhaustion, which itself could lead to
+ termination by the operating system. If the operating system creates
+ a "crash report", that report could contain confidential information.
+
+ An OpenPGP implementation SHOULD limit the number of layers of
+ compression it is willing to decompress in a single message.
+
+14. Implementation Considerations
+
+ This section is a collection of comments to help an implementer who
+ has a particular interest in backward compatibility. Often the
+ differences are small, but small differences are frequently more
+ vexing than large differences. Thus, this is a non-comprehensive
+ list of potential problems and gotchas for a developer who is trying
+ to achieve backward compatibility.
+
+ * There are many possible ways for two keys to have the same key
+ material but different fingerprints (and thus different Key IDs).
+ For example, since a version 4 fingerprint is constructed by
+ hashing the key creation time along with other things, two version
+ 4 keys created at different times yet with the same key material
+ will have different fingerprints.
+
+ * OpenPGP does not put limits on the size of public keys. However,
+ larger keys are not necessarily better keys. Larger keys take
+ more computation time to use, and this can quickly become
+ impractical. Different OpenPGP implementations may also use
+ different upper bounds for public key sizes, so care should be
+ taken when choosing sizes to maintain interoperability.
+
+ * ASCII Armor is an optional feature of OpenPGP. The OpenPGP
+ Working Group strives for a minimal set of mandatory-to-implement
+ features, and since there could be useful implementations that
+ only use binary object formats, this is not a "MUST" feature for
+ an implementation. For example, an implementation that is using
+ OpenPGP as a mechanism for file signatures may find ASCII Armor
+ unnecessary. OpenPGP permits an implementation to declare what
+ features it does and does not support, but ASCII Armor is not one
+ of these. Since most implementations allow binary and armored
+ objects to be used indiscriminately, an implementation that does
+ not implement ASCII Armor may find itself with compatibility
+ issues with general-purpose implementations. Moreover,
+ implementations of OpenPGP-MIME [RFC3156] already have a
+ requirement for ASCII Armor, so those implementations will
+ necessarily have support.
+
+ * What this document calls the "Legacy packet format"
+ (Section 4.2.2) is what older documents called the "old packet
+ format". It is the packet format used by implementations
+ predating [RFC2440]. The current "OpenPGP packet format"
+ (Section 4.2.1) was called the "new packet format" by older RFCs.
+ This is the format introduced in [RFC2440] and maintained through
+ [RFC4880] to this document.
+
+14.1. Constrained Legacy Fingerprint Storage for Version 6 Keys
+
+ Some OpenPGP implementations have fixed length constraints for key
+ fingerprint storage that will not fit all 32 octets of a version 6
+ fingerprint. For example, [OPENPGPCARD] reserves 20 octets for each
+ stored fingerprint.
+
+ An OpenPGP implementation MUST NOT attempt to map any part of a
+ version 6 fingerprint to such a constrained field unless the relevant
+ specification for the constrained environment has explicit guidance
+ for storing a version 6 fingerprint that distinguishes it from a
+ version 4 fingerprint. An implementation interacting with such a
+ constrained field SHOULD directly calculate the version 6 fingerprint
+ from public key material and associated metadata instead of relying
+ on the constrained field.
+
+15. IANA Considerations
+
+ This document obsoletes [RFC4880]. IANA has updated all registration
+ information that references [RFC4880] to reference this RFC instead.
+
+15.1. Renamed Protocol Group
+
+ IANA bundles a set of registries associated with a particular
+ protocol into a "protocol group". IANA has updated the name of the
+ "Pretty Good Privacy (PGP)" protocol group (i.e., the group of
+ registries described at <https://www.iana.org/assignments/pgp-
+ parameters>) to "OpenPGP". IANA has arranged a permanent redirect
+ from the existing URL to the new URL for the registries in this
+ protocol group. All further updates specified below are for
+ registries within this same OpenPGP protocol group.
+
+15.2. Renamed and Updated Registries
+
+ IANA has renamed the "PGP String-to-Key (S2K)" registry to "OpenPGP
+ String-to-Key (S2K) Types" and updated its contents as shown in
+ Table 1.
+
+ IANA has renamed the "PGP Packet Types/Tags" registry to "OpenPGP
+ Packet Types" and updated its contents as shown in Table 3.
+
+ IANA has renamed the "Signature Subpacket Types" registry to "OpenPGP
+ Signature Subpacket Types" and updated its contents as shown in
+ Table 5.
+
+ IANA has renamed the "Key Server Preference Extensions" registry to
+ "OpenPGP Key Server Preference Flags" and updated its contents as
+ shown in Table 8.
+
+ IANA has renamed the "Key Flags Extensions" registry to "OpenPGP Key
+ Flags" and updated its contents as shown in Table 9.
+
+ IANA has renamed the "Reason for Revocation Extensions" registry to
+ "OpenPGP Reason for Revocation (Revocation Octet)" and updated its
+ contents as shown in Table 10.
+
+ IANA has renamed the "Implementation Features" registry to "OpenPGP
+ Features Flags" and updated its contents as shown in Table 11.
+
+ IANA has renamed the "PGP User Attribute Types" registry to "OpenPGP
+ User Attribute Subpacket Types" and updated its contents as shown in
+ Table 13.
+
+ IANA has renamed the "Image Format Subpacket Types" registry to
+ "OpenPGP Image Attribute Encoding Format" and updated its contents as
+ shown in Table 15.
+
+ IANA has renamed the "Public Key Algorithms" registry to "OpenPGP
+ Public Key Algorithms" and updated its contents as shown in Table 18.
+
+ IANA has renamed the "Symmetric Key Algorithms" registry to "OpenPGP
+ Symmetric Key Algorithms" and updated its contents as shown in
+ Table 21.
+
+ IANA has renamed the "Compression Algorithms" registry to "OpenPGP
+ Compression Algorithms" and updated its contents as shown in
+ Table 22.
+
+ IANA has renamed the "Hash Algorithms" registry to "OpenPGP Hash
+ Algorithms" and updated its contents as shown in Table 23.
+
+15.3. Removed Registry
+
+ IANA has marked the empty "New Packet Versions" registry as OBSOLETE.
+
+ A tombstone note has been added to the OpenPGP protocol group with
+ the following content:
+
+ | Those wishing to use the removed "New Packet Versions" registry
+ | should instead register new versions of the relevant packets in
+ | the "OpenPGP Key and Signature Versions", "OpenPGP Key IDs and
+ | Fingerprints", and "OpenPGP Encrypted Message Packet Versions"
+ | registries.
+
+15.4. Added Registries
+
+ IANA has added the following registries in the OpenPGP protocol
+ group. Note that the initial contents of each registry is shown in
+ the corresponding table.
+
+ * "OpenPGP Secret Key Encryption (S2K Usage Octet)" (Table 2).
+
+ * "OpenPGP Signature Types" (Table 4).
+
+ * "OpenPGP Signature Notation Data Subpacket Notation Flags"
+ (Table 6).
+
+ * "OpenPGP Signature Notation Data Subpacket Types" (Table 7).
+
+ * "OpenPGP Key IDs and Fingerprints" (Table 12).
+
+ * "OpenPGP Image Attribute Versions" (Table 14).
+
+ * "OpenPGP Armor Header Lines" (Table 16).
+
+ * "OpenPGP Armor Header Keys" (Table 17).
+
+ * "OpenPGP ECC Curve OIDs and Usage" (Table 19).
+
+ * "OpenPGP ECC Curve-Specific Wire Formats" (Table 20).
+
+ * "OpenPGP Hash Algorithm Identifiers for RSA Signatures' Use of
+ EMSA-PKCS1-v1_5 Padding" (Table 24).
+
+ * "OpenPGP AEAD Algorithms" (Table 25).
+
+ * "OpenPGP Encrypted Message Packet Versions" (Table 26).
+
+ * "OpenPGP Key and Signature Versions" (Table 27).
+
+ * "OpenPGP Elliptic Curve Point Wire Formats" (Table 28).
+
+ * "OpenPGP Elliptic Curve Scalar Encodings" (Table 29).
+
+ * "OpenPGP ECDH KDF and KEK Parameters" (Table 30).
+
+15.5. Registration Policies
+
+ All registries within the OpenPGP protocol group, with the exception
+ of the registries listed in Section 15.5.1, use the Specification
+ Required registration policy; see Section 4.6 of [RFC8126]. This
+ policy means that review and approval by a designated expert is
+ required and that the IDs and their meanings must be documented in a
+ permanent and readily available public specification, in sufficient
+ detail, so that interoperability between independent implementations
+ is possible.
+
+15.5.1. Registries That Use RFC Required
+
+ The following registries use the RFC Required registration policy, as
+ described in Section 4.7 of [RFC8126]:
+
+ * "OpenPGP Packet Types" (Table 3).
+
+ * "OpenPGP Key IDs and Fingerprints" (Table 12).
+
+ * "OpenPGP Encrypted Message Packet Versions" (Table 26).
+
+ * "OpenPGP Key and Signature Versions" (Table 27).
+
+15.6. Designated Experts
+
+ The designated experts will determine whether the new registrations
+ retain the security properties that are expected by the base
+ implementation and whether these new registrations do not cause
+ interoperability issues with existing implementations, other than not
+ producing or consuming the IDs associated with these new
+ registrations. Registration proposals that fail to meet these
+ criteria could instead be proposed as new work items for the OpenPGP
+ Working Group or its successor.
+
+ The subsections below describe specific guidance for classes of
+ registry updates that a designated expert will consider.
+
+ The designated experts should also consider Section 12.11 when
+ reviewing proposed additions to the OpenPGP protocol group.
+
+15.6.1. Key and Signature Versions
+
+ When defining a new version of OpenPGP Keys or Signatures, the
+ "OpenPGP Key and Signature Versions" registry (Table 27) should be
+ updated. When a new version of OpenPGP Key is defined, the "OpenPGP
+ Key IDs and Fingerprints" registry (Table 12) should also be updated.
+
+15.6.2. Encryption Versions
+
+ When defining a new version of the Symmetrically Encrypted and
+ Integrity Protected Data packet (Section 5.13), Public Key Encrypted
+ Session Key packet (Section 5.1), and/or Symmetric Key Encrypted
+ Session Key packet (Section 5.3), the "OpenPGP Encrypted Message
+ Packet Versions" registry (Table 26) should be updated. When the
+ SEIPD is updated, consider also adding a corresponding flag to the
+ "OpenPGP Features Flags" registry (Table 11).
+
+15.6.3. Algorithms
+
+ Section 9 lists the cryptographic and compression algorithms that
+ OpenPGP uses. Adding new algorithms is usually simple; in some
+ cases, allocating an ID and pointing to a reference is only needed.
+ But some algorithm registries require some subtle additional details
+ when a new algorithm is introduced.
+
+15.6.3.1. Elliptic Curve Algorithms
+
+ To register a new elliptic curve for use with OpenPGP, its OID needs
+ to be registered in the "OpenPGP ECC Curve OIDs and Usage" registry
+ (Table 19), its wire format needs to be documented in the "OpenPGP
+ ECC Curve-Specific Wire Formats" registry (Table 20), and if used for
+ ECDH, its KDF and KEK parameters must be populated in the "OpenPGP
+ ECDH KDF and KEK Parameters" registry (Table 30). If the wire
+ format(s) used is not already defined in the "OpenPGP Elliptic Curve
+ Point Wire Formats" (Table 28) or "OpenPGP Elliptic Curve Scalar
+ Encodings" (Table 29) registries, they should be defined there as
+ well.
+
+15.6.3.2. Symmetric Key Algorithms
+
+ When registering a new symmetric cipher with a block size of 64 or
+ 128 bits and a key size that is a multiple of 64 bits, no new
+ considerations are needed.
+
+ If the new cipher has a different block size, there needs to be
+ additional documentation describing how to use the cipher in CFB
+ mode.
+
+ If the new cipher has an unusual key size, then padding needs to be
+ considered for X25519 and X448 key wrapping, which currently needs no
+ padding.
+
+15.6.3.3. Hash Algorithms
+
+ When registering a new hash algorithm in the "OpenPGP Hash
+ Algorithms" registry (Table 23), if the algorithm is also to be used
+ with RSA signing schemes, it must also have an entry in the "OpenPGP
+ Hash Algorithm Identifiers for RSA Signatures' Use of EMSA-PKCS1-v1_5
+ Padding" registry (Table 24).
+
+16. References
+
+16.1. Normative References
+
+ [AES] NIST, "Advanced Encryption Standard (AES)", Updated May
+ 2023, FIPS PUB 197, DOI 10.6028/NIST.FIPS.197-upd1,
+ November 2001, <https://nvlpubs.nist.gov/nistpubs/FIPS/
+ NIST.FIPS.197-upd1.pdf>.
+
+ [BLOWFISH] Schneier, B., "Description of a New Variable-Length Key,
+ 64-Bit Block Cipher (Blowfish)", Fast Software Encryption,
+ Cambridge Security Workshop Proceedings, pp. 191-204,
+ December 1993,
+ <https://www.schneier.com/academic/archives/1994/09/
+ description_of_a_new.html>.
+
+ [BZ2] bzip2, "bzip2 and libbzip2", 2010,
+ <https://sourceware.org/bzip2/>.
+
+ [EAX] Bellare, M., Rogaway, P., and D. Wagner, "A Conventional
+ Authenticated-Encryption Mode", April 2003,
+ <https://seclab.cs.ucdavis.edu/papers/eax.pdf>.
+
+ [ELGAMAL] Elgamal, T., "A Public Key Cryptosystem and a Signature
+ Scheme Based on Discrete Logarithms", IEEE Transactions on
+ Information Theory, Vol. 31, Issue 4, pp. 469-472,
+ DOI 10.1109/TIT.1985.1057074, July 1985,
+ <https://doi.org/10.1109/TIT.1985.1057074>.
+
+ [FIPS180] NIST, "Secure Hash Standard (SHS)", FIPS PUB 180-4,
+ DOI 10.6028/NIST.FIPS.180-4, August 2015,
+ <https://nvlpubs.nist.gov/nistpubs/fips/
+ nist.fips.180-4.pdf>.
+
+ [FIPS186] NIST, "Digital Signature Standard (DSS)", FIPS PUB 186-5,
+ DOI 10.6028/NIST.FIPS.186-5, February 2023,
+ <https://nvlpubs.nist.gov/nistpubs/FIPS/
+ NIST.FIPS.186-5.pdf>.
+
+ [FIPS202] NIST, "SHA-3 Standard: Permutation-Based Hash and
+ Extendable-Output Functions", FIPS PUB 202,
+ DOI 10.6028/NIST.FIPS.202, August 2015,
+ <https://nvlpubs.nist.gov/nistpubs/fips/
+ nist.fips.202.pdf>.
+
+ [IDEA] Lai, X. and J. L. Massey, "A Proposal for a New Block
+ Encryption Standard", Advances in Cryptology - EUROCRYPT
+ '90, Vol. 473, pp. 389-404, DOI 10.1007/3-540-46877-3_35,
+ January 1991, <https://link.springer.com/
+ chapter/10.1007/3-540-46877-3_35>.
+
+ [ISO10646] ISO, "Information technology - Universal coded character
+ set (UCS)", ISO/IEC 10646:2020, December 2020,
+ <https://www.iso.org/standard/76835.html>.
+
+ [JFIF] ITU-T, "Information technology - Digital compression and
+ coding of continuous-tone still images: JPEG File
+ Interchange Format (JFIF)", Recommendation ITU-T T.871,
+ May 2011, <https://www.itu.int/rec/T-REC-T.871-201105-I>.
+
+ [RFC1321] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321,
+ DOI 10.17487/RFC1321, April 1992,
+ <https://www.rfc-editor.org/info/rfc1321>.
+
+ [RFC1950] Deutsch, P. and J. Gailly, "ZLIB Compressed Data Format
+ Specification version 3.3", RFC 1950,
+ DOI 10.17487/RFC1950, May 1996,
+ <https://www.rfc-editor.org/info/rfc1950>.
+
+ [RFC1951] Deutsch, P., "DEFLATE Compressed Data Format Specification
+ version 1.3", RFC 1951, DOI 10.17487/RFC1951, May 1996,
+ <https://www.rfc-editor.org/info/rfc1951>.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119,
+ DOI 10.17487/RFC2119, March 1997,
+ <https://www.rfc-editor.org/info/rfc2119>.
+
+ [RFC2144] Adams, C., "The CAST-128 Encryption Algorithm", RFC 2144,
+ DOI 10.17487/RFC2144, May 1997,
+ <https://www.rfc-editor.org/info/rfc2144>.
+
+ [RFC2822] Resnick, P., Ed., "Internet Message Format", RFC 2822,
+ DOI 10.17487/RFC2822, April 2001,
+ <https://www.rfc-editor.org/info/rfc2822>.
+
+ [RFC3156] Elkins, M., Del Torto, D., Levien, R., and T. Roessler,
+ "MIME Security with OpenPGP", RFC 3156,
+ DOI 10.17487/RFC3156, August 2001,
+ <https://www.rfc-editor.org/info/rfc3156>.
+
+ [RFC3394] Schaad, J. and R. Housley, "Advanced Encryption Standard
+ (AES) Key Wrap Algorithm", RFC 3394, DOI 10.17487/RFC3394,
+ September 2002, <https://www.rfc-editor.org/info/rfc3394>.
+
+ [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO
+ 10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November
+ 2003, <https://www.rfc-editor.org/info/rfc3629>.
+
+ [RFC3713] Matsui, M., Nakajima, J., and S. Moriai, "A Description of
+ the Camellia Encryption Algorithm", RFC 3713,
+ DOI 10.17487/RFC3713, April 2004,
+ <https://www.rfc-editor.org/info/rfc3713>.
+
+ [RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker,
+ "Randomness Requirements for Security", BCP 106, RFC 4086,
+ DOI 10.17487/RFC4086, June 2005,
+ <https://www.rfc-editor.org/info/rfc4086>.
+
+ [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data
+ Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006,
+ <https://www.rfc-editor.org/info/rfc4648>.
+
+ [RFC5322] Resnick, P., Ed., "Internet Message Format", RFC 5322,
+ DOI 10.17487/RFC5322, October 2008,
+ <https://www.rfc-editor.org/info/rfc5322>.
+
+ [RFC6234] Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms
+ (SHA and SHA-based HMAC and HKDF)", RFC 6234,
+ DOI 10.17487/RFC6234, May 2011,
+ <https://www.rfc-editor.org/info/rfc6234>.
+
+ [RFC7253] Krovetz, T. and P. Rogaway, "The OCB Authenticated-
+ Encryption Algorithm", RFC 7253, DOI 10.17487/RFC7253, May
+ 2014, <https://www.rfc-editor.org/info/rfc7253>.
+
+ [RFC7748] Langley, A., Hamburg, M., and S. Turner, "Elliptic Curves
+ for Security", RFC 7748, DOI 10.17487/RFC7748, January
+ 2016, <https://www.rfc-editor.org/info/rfc7748>.
+
+ [RFC8017] Moriarty, K., Ed., Kaliski, B., Jonsson, J., and A. Rusch,
+ "PKCS #1: RSA Cryptography Specifications Version 2.2",
+ RFC 8017, DOI 10.17487/RFC8017, November 2016,
+ <https://www.rfc-editor.org/info/rfc8017>.
+
+ [RFC8018] Moriarty, K., Ed., Kaliski, B., and A. Rusch, "PKCS #5:
+ Password-Based Cryptography Specification Version 2.1",
+ RFC 8018, DOI 10.17487/RFC8018, January 2017,
+ <https://www.rfc-editor.org/info/rfc8018>.
+
+ [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>.
+
+ [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>.
+
+ [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
+ 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
+ May 2017, <https://www.rfc-editor.org/info/rfc8174>.
+
+ [RFC9106] Biryukov, A., Dinu, D., Khovratovich, D., and S.
+ Josefsson, "Argon2 Memory-Hard Function for Password
+ Hashing and Proof-of-Work Applications", RFC 9106,
+ DOI 10.17487/RFC9106, September 2021,
+ <https://www.rfc-editor.org/info/rfc9106>.
+
+ [RIPEMD-160]
+ ISO, "Information technology - Security techniques - Hash-
+ functions - Part 3: Dedicated hash-functions", ISO/
+ IEC 10118-3:1998, May 1998.
+
+ [SP800-38A]
+ NIST, "Recommendation for Block Cipher Modes of Operation:
+ Methods and Techniques", NIST Special Publication 800-38A,
+ DOI 10.6028/NIST.SP.800-38A, December 2001,
+ <https://nvlpubs.nist.gov/nistpubs/legacy/sp/
+ nistspecialpublication800-38a.pdf>.
+
+ [SP800-38D]
+ NIST, "Recommendation for Block Cipher Modes of Operation:
+ Galois/Counter Mode (GCM) and GMAC", NIST Special
+ Publication 800-38D, DOI 10.6028/NIST.SP.800-38D, November
+ 2007, <https://nvlpubs.nist.gov/nistpubs/legacy/sp/
+ nistspecialpublication800-38d.pdf>.
+
+ [SP800-56A]
+ NIST, "Recommendation for Pair-Wise Key Establishment
+ Schemes Using Discrete Logarithm Cryptography", NIST
+ Special Publication 800-56A Revision 3,
+ DOI 10.6028/NIST.SP.800-56Ar, April 2018,
+ <https://nvlpubs.nist.gov/nistpubs/SpecialPublications/
+ nist.sp.800-56Ar3.pdf>.
+
+ [SP800-67] NIST, "Recommendation for the Triple Data Encryption
+ Algorithm (TDEA) Block Cipher", NIST Special
+ Publication 800-67 Revision 2,
+ DOI 10.6028/NIST.SP.800-67r2, November 2017,
+ <https://nvlpubs.nist.gov/nistpubs/SpecialPublications/
+ NIST.SP.800-67r2.pdf>.
+
+ [TWOFISH] Schneier, B., Kelsey, J., Whiting, D., Wagner, D., Hall,
+ C., and N. Ferguson, "Twofish: A 128-Bit Block Cipher",
+ June 1998, <https://www.schneier.com/wp-
+ content/uploads/2016/02/paper-twofish-paper.pdf>.
+
+16.2. Informative References
+
+ [BLEICHENBACHER]
+ Bleichenbacher, D., "Generating ElGamal Signatures Without
+ Knowing the Secret Key", EUROCRYPT'96: International
+ Conference on the Theory and Applications of Cryptographic
+ Techniques Proceedings, Vol. 1070, pp. 10-18, May 1996.
+
+ [BLEICHENBACHER-PKCS1]
+ Bleichenbacher, D., "Chosen Ciphertext Attacks Against
+ Protocols Based on the RSA Encryption Standard PKCS #1",
+ CRYPTO '98: International Cryptology Conference
+ Proceedings, Vol. 1462, pp. 1-12, August 1998,
+ <http://archiv.infsec.ethz.ch/education/fs08/secsem/
+ Bleichenbacher98.pdf>.
+
+ [C99] ISO, "Information technology - Programming languages: C",
+ ISO/IEC 9899:2018, June 2018,
+ <https://www.iso.org/standard/74528.html>.
+
+ [CHECKOWAY]
+ Checkoway, S., Maskiewicz, J., Garman, C., Fried, J.,
+ Cohney, S., Green, M., Heninger, N., Weinmann, RP.,
+ Rescorla, E., and H. Shacham, "A Systematic Analysis of
+ the Juniper Dual EC Incident", Proceedings of the 2016 ACM
+ SIGSAC Conference on Computer and Communications Security,
+ DOI 10.1145/2976749.2978395, October 2016,
+ <https://doi.org/10.1145/2976749.2978395>.
+
+ [EFAIL] Poddebniak, D., Dresen, C., Müller, J., Ising, F.,
+ Schinzel, S., Friedberger, S., Somorovsky, J., and J.
+ Schwenk, "Efail: Breaking S/MIME and OpenPGP Email
+ Encryption using Exfiltration Channels", Proceedings of
+ the 27th USENIX Security Symposium, August 2018,
+ <https://www.usenix.org/system/files/conference/
+ usenixsecurity18/sec18-poddebniak.pdf>.
+
+ [Errata-2199]
+ RFC Errata, Erratum ID 2199, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2199>.
+
+ [Errata-2200]
+ RFC Errata, Erratum ID 2200, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2200>.
+
+ [Errata-2206]
+ RFC Errata, Erratum ID 2206, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2206>.
+
+ [Errata-2208]
+ RFC Errata, Erratum ID 2208, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2208>.
+
+ [Errata-2214]
+ RFC Errata, Erratum ID 2214, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2214>.
+
+ [Errata-2216]
+ RFC Errata, Erratum ID 2216, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2216>.
+
+ [Errata-2219]
+ RFC Errata, Erratum ID 2219, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2219>.
+
+ [Errata-2222]
+ RFC Errata, Erratum ID 2222, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2222>.
+
+ [Errata-2226]
+ RFC Errata, Erratum ID 2226, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2226>.
+
+ [Errata-2234]
+ RFC Errata, Erratum ID 2234, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2234>.
+
+ [Errata-2235]
+ RFC Errata, Erratum ID 2235, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2235>.
+
+ [Errata-2236]
+ RFC Errata, Erratum ID 2236, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2236>.
+
+ [Errata-2238]
+ RFC Errata, Erratum ID 2238, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2238>.
+
+ [Errata-2240]
+ RFC Errata, Erratum ID 2240, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2240>.
+
+ [Errata-2242]
+ RFC Errata, Erratum ID 2242, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2242>.
+
+ [Errata-2243]
+ RFC Errata, Erratum ID 2243, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2243>.
+
+ [Errata-2270]
+ RFC Errata, Erratum ID 2270, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2270>.
+
+ [Errata-2271]
+ RFC Errata, Erratum ID 2271, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid2271>.
+
+ [Errata-3298]
+ RFC Errata, Erratum ID 3298, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid3298>.
+
+ [Errata-5491]
+ RFC Errata, Erratum ID 5491, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid5491>.
+
+ [Errata-7545]
+ RFC Errata, Erratum ID 7545, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid7545>.
+
+ [Errata-7889]
+ RFC Errata, Erratum ID 7889, RFC 4880,
+ <https://www.rfc-editor.org/errata/eid7889>.
+
+ [HASTAD] Hastad, J., "Solving Simultaneous Modular Equations of Low
+ Degree", DOI 10.1137/0217019, April 1988,
+ <https://doi.org/10.1137/0217019>.
+
+ [JKS02] Jallad, K., Katz, J., and B. Schneier, "Implementation of
+ Chosen-Ciphertext Attacks against PGP and GnuPG",
+ DOI 0.1007/3-540-45811-5_7, September 2002,
+ <https://www.schneier.com/academic/archives/2002/01/
+ implementation_of_ch.html>.
+
+ [KOBLITZ] Koblitz, N., "A course in number theory and cryptography",
+ Chapter VI: Elliptic Curves, DOI 10.2307/3618498, 1997,
+ <https://doi.org/10.2307/3618498>.
+
+ [KOPENPGP] Bruseghini, L., Paterson, K. G., and D. Huigens, "Victory
+ by KO: Attacking OpenPGP Using Key Overwriting",
+ Proceedings of the ACM SIGSAC Conference on Computer and
+ Communications Security, pp. 411-423,
+ DOI 10.1145/3548606.3559363, November 2022,
+ <https://dl.acm.org/doi/10.1145/3548606.3559363>.
+
+ [KR02] Klíma, V. and T. Rosa, "Attack on Private Signature Keys
+ of the OpenPGP Format, PGP(TM) Programs and Other
+ Applications Compatible with OpenPGP", Cryptology ePrint
+ Archive, Paper 2002/076, March 2001,
+ <https://eprint.iacr.org/2002/076>.
+
+ [MRLG15] Maury, F., Reinhard, JR., Levillain, O., and H. Gilbert,
+ "Format Oracles on OpenPGP", Topics in Cryptology -- CT-
+ RSA 2015, Vol. 9048, pp. 220-236,
+ DOI 10.1007/978-3-319-16715-2_12, January 2015,
+ <https://doi.org/10.1007/978-3-319-16715-2_12>.
+
+ [MZ05] Mister, S. and R. Zuccherato, "An Attack on CFB Mode
+ Encryption As Used By OpenPGP", Cryptology ePrint Archive,
+ Paper 2005/033, February 2005,
+ <http://eprint.iacr.org/2005/033>.
+
+ [OPENPGPCARD]
+ Pietig, A., "Functional Specification of the OpenPGP
+ application on ISO Smart Card Operating Systems", Version
+ 3.4.1, March 2020, <https://gnupg.org/ftp/specs/OpenPGP-
+ smart-card-application-3.4.1.pdf>.
+
+ [PAX] The Open Group, "The Open Group Base Specifications", 'pax
+ - portable archive interchange', Issue 7, 2018 Edition,
+ IEEE Std 1003.1-2017, 2018,
+ <https://pubs.opengroup.org/onlinepubs/9699919799/
+ utilities/pax.html>.
+
+ [PSSLR17] Poddebniak, D., Somorovsky, J., Schinzel, S., Lochter, M.,
+ and P. Rösler, "Attacking Deterministic Signature Schemes
+ using Fault Attacks", Cryptology ePrint Archive, Paper
+ 2017/1014, October 2017,
+ <https://eprint.iacr.org/2017/1014>.
+
+ [REGEX] regex, "Henry Spencer's regular expression libraries",
+ <https://garyhouston.github.io/regex/>.
+
+ [RFC1991] Atkins, D., Stallings, W., and P. Zimmermann, "PGP Message
+ Exchange Formats", RFC 1991, DOI 10.17487/RFC1991, August
+ 1996, <https://www.rfc-editor.org/info/rfc1991>.
+
+ [RFC2440] Callas, J., Donnerhacke, L., Finney, H., and R. Thayer,
+ "OpenPGP Message Format", RFC 2440, DOI 10.17487/RFC2440,
+ November 1998, <https://www.rfc-editor.org/info/rfc2440>.
+
+ [RFC2978] Freed, N. and J. Postel, "IANA Charset Registration
+ Procedures", BCP 19, RFC 2978, DOI 10.17487/RFC2978,
+ October 2000, <https://www.rfc-editor.org/info/rfc2978>.
+
+ [RFC4880] Callas, J., Donnerhacke, L., Finney, H., Shaw, D., and R.
+ Thayer, "OpenPGP Message Format", RFC 4880,
+ DOI 10.17487/RFC4880, November 2007,
+ <https://www.rfc-editor.org/info/rfc4880>.
+
+ [RFC5581] Shaw, D., "The Camellia Cipher in OpenPGP", RFC 5581,
+ DOI 10.17487/RFC5581, June 2009,
+ <https://www.rfc-editor.org/info/rfc5581>.
+
+ [RFC5639] Lochter, M. and J. Merkle, "Elliptic Curve Cryptography
+ (ECC) Brainpool Standard Curves and Curve Generation",
+ RFC 5639, DOI 10.17487/RFC5639, March 2010,
+ <https://www.rfc-editor.org/info/rfc5639>.
+
+ [RFC5869] Krawczyk, H. and P. Eronen, "HMAC-based Extract-and-Expand
+ Key Derivation Function (HKDF)", RFC 5869,
+ DOI 10.17487/RFC5869, May 2010,
+ <https://www.rfc-editor.org/info/rfc5869>.
+
+ [RFC6090] McGrew, D., Igoe, K., and M. Salter, "Fundamental Elliptic
+ Curve Cryptography Algorithms", RFC 6090,
+ DOI 10.17487/RFC6090, February 2011,
+ <https://www.rfc-editor.org/info/rfc6090>.
+
+ [RFC6637] Jivsov, A., "Elliptic Curve Cryptography (ECC) in
+ OpenPGP", RFC 6637, DOI 10.17487/RFC6637, June 2012,
+ <https://www.rfc-editor.org/info/rfc6637>.
+
+ [SEC1] Standards for Efficient Cryptography Group, "SEC 1:
+ Elliptic Curve Cryptography", May 2009,
+ <https://www.secg.org/sec1-v2.pdf>.
+
+ [SHA1CD] "sha1collisiondetection", commit b4a7b0b, December 2020,
+ <https://github.com/cr-marcstevens/
+ sha1collisiondetection>.
+
+ [SHAMBLES] Leurent, G. and T. Peyrin, "Sha-1 is a shambles: first
+ chosen-prefix collision on sha-1 and application to the
+ PGP web of trust", August 2020,
+ <https://dl.acm.org/doi/abs/10.5555/3489212.3489316/>.
+
+ [SP800-131A]
+ NIST, "Transitioning the Use of Cryptographic Algorithms
+ and Key Lengths", NIST Special Publication 800-131A,
+ Revision 2, DOI 10.6028/NIST.SP.800-131Ar2, March 2019,
+ <https://nvlpubs.nist.gov/nistpubs/SpecialPublications/
+ NIST.SP.800-131Ar2.pdf>.
+
+ [SP800-57] NIST, "Recommendation for Key Management: Part 1 -
+ General", NIST Special Publication 800-57 Part 1, Revision
+ 5, DOI 10.6028/NIST.SP.800-57pt1r5, May 2020,
+ <https://nvlpubs.nist.gov/nistpubs/SpecialPublications/
+ NIST.SP.800-57pt1r5.pdf>.
+
+ [STEVENS2013]
+ Stevens, M., "Counter-cryptanalysis", Cryptology ePrint
+ Archive, Paper 2013/358, June 2013,
+ <https://eprint.iacr.org/2013/358>.
+
+ [UNIFIED-DIFF]
+ Free Software Foundation, "Comparing and Merging Files",
+ 'Detailed Description of Unified Format', Section 2.2.2.2,
+ January 2021,
+ <https://www.gnu.org/software/diffutils/manual/html_node/
+ Detailed-Unified.html>.
+
+ [USENIX-STUDY]
+ Dechand, S., Schürmann, D., Busse, K., Acar, Y., Fahl, S.,
+ and M. Smith, "An Empirical Study of Textual Key-
+ Fingerprint Representations", ISBN 978-1-931971-32-4,
+ August 2016,
+ <https://www.usenix.org/system/files/conference/
+ usenixsecurity16/sec16_paper_dechand.pdf>.
+
+Appendix A. Test Vectors
+
+ To help with the implementation of this specification, a set of non-
+ normative examples follow.
+
+A.1. Sample Version 4 Ed25519Legacy Key
+
+ The secret key used for this example is:
+
+ D: 1a8b1ff05ded48e18bf50166c664ab023ea70003d78d9e41f5758a91d850f8d2
+
+ Note that this is the raw secret key used as input to the EdDSA
+ signing operation. The key was created on 2014-08-19 14:28:27 and
+ thus the fingerprint of the OpenPGP Key is:
+
+ C959 BDBA FA32 A2F8 9A15 3B67 8CFD E121 9796 5A9A
+
+ The algorithm-specific input parameters without the MPI length
+ headers are:
+
+ oid: 2b06010401da470f01
+
+ q: 403f098994bdd916ed4053197934e4a87c80733a1280d62f8010992e43ee3b2406
+
+ The entire Public Key packet is thus:
+
+ 98 33 04 53 f3 5f 0b 16 09 2b 06 01 04 01 da 47
+ 0f 01 01 07 40 3f 09 89 94 bd d9 16 ed 40 53 19
+ 79 34 e4 a8 7c 80 73 3a 12 80 d6 2f 80 10 99 2e
+ 43 ee 3b 24 06
+
+ The same packet represented in ASCII-armored form is:
+
+ -----BEGIN PGP PUBLIC KEY BLOCK-----
+
+ xjMEU/NfCxYJKwYBBAHaRw8BAQdAPwmJlL3ZFu1AUxl5NOSofIBzOhKA1i+AEJku
+ Q+47JAY=
+ -----END PGP PUBLIC KEY BLOCK-----
+
+A.2. Sample Version 4 Ed25519Legacy Signature
+
+ The signature is created using the sample key over the input data
+ "OpenPGP" on 2015-09-16 12:24:53 UTC and thus the input to the hash
+ function is:
+
+ m: 4f70656e504750040016080006050255f95f9504ff0000000c
+
+ Using the SHA2-256 hash algorithm yields the digest:
+
+ d: f6220a3f757814f4c2176ffbb68b00249cd4ccdc059c4b34ad871f30b1740280
+
+ which is fed into the EdDSA signature function and yields the
+ following signature:
+
+ r: 56f90cca98e2102637bd983fdb16c131dfd27ed82bf4dde5606e0d756aed3366
+
+ s: d09c4fa11527f038e0f57f2201d82f2ea2c9033265fa6ceb489e854bae61b404
+
+ The entire Signature packet is thus:
+
+ 88 5e 04 00 16 08 00 06 05 02 55 f9 5f 95 00 0a
+ 09 10 8c fd e1 21 97 96 5a 9a f6 22 00 ff 56 f9
+ 0c ca 98 e2 10 26 37 bd 98 3f db 16 c1 31 df d2
+ 7e d8 2b f4 dd e5 60 6e 0d 75 6a ed 33 66 01 00
+ d0 9c 4f a1 15 27 f0 38 e0 f5 7f 22 01 d8 2f 2e
+ a2 c9 03 32 65 fa 6c eb 48 9e 85 4b ae 61 b4 04
+
+ The same packet represented in ASCII-armored form is:
+
+ -----BEGIN PGP SIGNATURE-----
+
+ iF4EABYIAAYFAlX5X5UACgkQjP3hIZeWWpr2IgD/VvkMypjiECY3vZg/2xbBMd/S
+ ftgr9N3lYG4NdWrtM2YBANCcT6EVJ/A44PV/IgHYLy6iyQMyZfps60iehUuuYbQE
+ -----END PGP SIGNATURE-----
+
+A.3. Sample Version 6 Certificate (Transferable Public Key)
+
+ Here is a Transferable Public Key consisting of:
+
+ * A version 6 Ed25519 Public Key packet
+
+ * A version 6 Direct Key self-signature
+
+ * A version 6 X25519 Public Subkey packet
+
+ * A version 6 Subkey Binding signature
+
+ The primary key has the following fingerprint:
+
+ CB186C4F0609A697E4D52DFA6C722B0C1F1E27C18A56708F6525EC27BAD9ACC9
+
+ The subkey has the following fingerprint:
+
+ 12C83F1E706F6308FE151A417743A1F033790E93E9978488D1DB378DA9930885
+
+ -----BEGIN PGP PUBLIC KEY BLOCK-----
+
+ xioGY4d/4xsAAAAg+U2nu0jWCmHlZ3BqZYfQMxmZu52JGggkLq2EVD34laPCsQYf
+ GwoAAABCBYJjh3/jAwsJBwUVCg4IDAIWAAKbAwIeCSIhBssYbE8GCaaX5NUt+mxy
+ KwwfHifBilZwj2Ul7Ce62azJBScJAgcCAAAAAK0oIBA+LX0ifsDm185Ecds2v8lw
+ gyU2kCcUmKfvBXbAf6rhRYWzuQOwEn7E/aLwIwRaLsdry0+VcallHhSu4RN6HWaE
+ QsiPlR4zxP/TP7mhfVEe7XWPxtnMUMtf15OyA51YBM4qBmOHf+MZAAAAIIaTJINn
+ +eUBXbki+PSAld2nhJh/LVmFsS+60WyvXkQ1wpsGGBsKAAAALAWCY4d/4wKbDCIh
+ BssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce62azJAAAAAAQBIKbpGG2dWTX8
+ j+VjFM21J0hqWlEg+bdiojWnKfA5AQpWUWtnNwDEM0g12vYxoWM8Y81W+bHBw805
+ I8kWVkXU6vFOi+HWvv/ira7ofJu16NnoUkhclkUrk0mXubZvyl4GBg==
+ -----END PGP PUBLIC KEY BLOCK-----
+
+ The corresponding Transferable Secret Key can be found in
+ Appendix A.4.
+
+A.3.1. Hashed Data Stream for Signature Verification
+
+ The Direct Key self-signature in the certificate in Appendix A.3 is
+ made over the following sequence of data:
+
+ 0x0000 10 3e 2d 7d 22 7e c0 e6
+ 0x0008 d7 ce 44 71 db 36 bf c9
+ 0x0010 70 83 25 36 90 27 14 98
+ 0x0018 a7 ef 05 76 c0 7f aa e1
+ 0x0020 9b 00 00 00 2a 06 63 87
+ 0x0028 7f e3 1b 00 00 00 20 f9
+ 0x0030 4d a7 bb 48 d6 0a 61 e5
+ 0x0038 67 70 6a 65 87 d0 33 19
+ 0x0040 99 bb 9d 89 1a 08 24 2e
+ 0x0048 ad 84 54 3d f8 95 a3 06
+ 0x0050 1f 1b 0a 00 00 00 42 05
+ 0x0058 82 63 87 7f e3 03 0b 09
+ 0x0060 07 05 15 0a 0e 08 0c 02
+ 0x0068 16 00 02 9b 03 02 1e 09
+ 0x0070 22 21 06 cb 18 6c 4f 06
+ 0x0078 09 a6 97 e4 d5 2d fa 6c
+ 0x0080 72 2b 0c 1f 1e 27 c1 8a
+ 0x0088 56 70 8f 65 25 ec 27 ba
+ 0x0090 d9 ac c9 05 27 09 02 07
+ 0x0098 02 06 ff 00 00 00 4a
+
+ The same data, broken out by octet and semantics, is:
+
+ 0x0000 10 3e 2d 7d 22 7e c0 e6 salt
+ 0x0008 d7 ce 44 71 db 36 bf c9
+ 0x0010 70 83 25 36 90 27 14 98
+ 0x0018 a7 ef 05 76 c0 7f aa e1
+ [ pubkey begins ]
+ 0x0020 9b key packet
+ 0x0021 00 00 00 2a pubkey length
+ 0x0025 06 pubkey version
+ 0x0026 63 87 creation time
+ 0x0028 7f e3 (2022-11-30T16:08:03Z)
+ 0x002a 1b key algo: Ed25519
+ 0x002b 00 00 00 20 key length
+ 0x002f f9 Ed25519 public key
+ 0x0030 4d a7 bb 48 d6 0a 61 e5
+ 0x0038 67 70 6a 65 87 d0 33 19
+ 0x0040 99 bb 9d 89 1a 08 24 2e
+ 0x0048 ad 84 54 3d f8 95 a3
+ [ trailer begins ]
+ 0x004f 06 sig version 6
+ 0x0050 1f sig type: Direct Key signature
+ 0x0051 1b sig algo: Ed25519
+ 0x0052 0a hash ago: SHA2-512
+ 0x0053 00 00 00 42 hashed subpackets length
+ 0x0057 05 subpkt length
+ 0x0058 82 critical subpkt: Sig Creation Time
+ 0x0059 63 87 7f e3 Signature Creation Time
+ 0x005d 03 subpkt length
+ 0x005e 0b subpkt type: Pref. v1 SEIPD Ciphers
+ 0x005f 09 Ciphers: [AES256 AES128]
+ 0x0060 07
+ 0x0061 05 subpkt length
+ 0x0062 15 subpkt type: Pref. Hash Algorithms
+ 0x0063 0a 0e Hashes: [SHA2-512 SHA3-512
+ 0x0065 08 0c SHA2-256 SHA3-256]
+ 0x0067 02 subpkt length
+ 0x0068 16 subpkt type: Pref. Compression
+ 0x0069 00 Compression: [none]
+ 0x006a 02 subpkt length
+ 0x006b 9b critical subpkt: Key Flags
+ 0x006c 03 Key Flags: {certify, sign}
+ 0x006d 02 subpkt length
+ 0x006e 1e subpkt type: Features
+ 0x006f 09 Features: {v1SEIPD, v2SEIPD}
+ 0x0070 22 subpkt length
+ 0x0071 21 subpkt type: Issuer Fingerprint
+ 0x0072 06 Fingerprint version 6
+ 0x0073 cb 18 6c 4f 06 Fingerprint
+ 0x0078 09 a6 97 e4 d5 2d fa 6c
+ 0x0080 72 2b 0c 1f 1e 27 c1 8a
+ 0x0088 56 70 8f 65 25 ec 27 ba
+ 0x0090 d9 ac c9
+ 0x0093 05 subpkt length
+ 0x0094 27 subpkt type: Pref. AEAD Ciphersuites
+ 0x0095 09 02 07 Ciphersuites:
+ 0x0098 02 [ AES256-OCB, AES128-OCB ]
+ 0x0099 06 sig version 6
+ 0x009a ff sentinel octet
+ 0x009b 00 00 00 4a trailer length
+
+ The Subkey Binding signature in Appendix A.3 is made over the
+ following sequence of data:
+
+ 0x0000 a6 e9 18 6d 9d 59 35 fc
+ 0x0008 8f e5 63 14 cd b5 27 48
+ 0x0010 6a 5a 51 20 f9 b7 62 a2
+ 0x0018 35 a7 29 f0 39 01 0a 56
+ 0x0020 9b 00 00 00 2a 06 63 87
+ 0x0028 7f e3 1b 00 00 00 20 f9
+ 0x0030 4d a7 bb 48 d6 0a 61 e5
+ 0x0038 67 70 6a 65 87 d0 33 19
+ 0x0040 99 bb 9d 89 1a 08 24 2e
+ 0x0048 ad 84 54 3d f8 95 a3 9b
+ 0x0050 00 00 00 2a 06 63 87 7f
+ 0x0058 e3 19 00 00 00 20 86 93
+ 0x0060 24 83 67 f9 e5 01 5d b9
+ 0x0068 22 f8 f4 80 95 dd a7 84
+ 0x0070 98 7f 2d 59 85 b1 2f ba
+ 0x0078 d1 6c af 5e 44 35 06 18
+ 0x0080 1b 0a 00 00 00 2c 05 82
+ 0x0088 63 87 7f e3 02 9b 0c 22
+ 0x0090 21 06 cb 18 6c 4f 06 09
+ 0x0098 a6 97 e4 d5 2d fa 6c 72
+ 0x00a0 2b 0c 1f 1e 27 c1 8a 56
+ 0x00a8 70 8f 65 25 ec 27 ba d9
+ 0x00b0 ac c9 06 ff 00 00 00 34
+
+ The same data, broken out by octet and semantics, is:
+
+ 0x0000 a6 e9 18 6d 9d 59 35 fc salt
+ 0x0008 8f e5 63 14 cd b5 27 48
+ 0x0010 6a 5a 51 20 f9 b7 62 a2
+ 0x0018 35 a7 29 f0 39 01 0a 56
+ [ primary pubkey begins ]
+ 0x0020 9b key packet
+ 0x0021 00 00 00 2a pubkey length
+ 0x0025 06 pubkey version
+ 0x0026 63 87 creation time
+ 0x0028 7f e3 (2022-11-30T16:08:03Z)
+ 0x002a 1b key algo: Ed25519
+ 0x002b 00 00 00 20 key length
+ 0x002f f9 Ed25519 public key
+ 0x0030 4d a7 bb 48 d6 0a 61 e5
+ 0x0038 67 70 6a 65 87 d0 33 19
+ 0x0040 99 bb 9d 89 1a 08 24 2e
+ 0x0048 ad 84 54 3d f8 95 a3
+ [ subkey pubkey begins ]
+ 0x004f 9b key packet
+ 0x0050 00 00 00 2a pubkey length
+ 0x0054 06 pubkey version
+ 0x0055 63 87 7f creation time (2022-11-30T16:08:03Z)
+ 0x0058 e3
+ 0x0059 19 key algo: X25519
+ 0x005a 00 00 00 20 key length
+ 0x005e 86 93 X25519 public key
+ 0x0060 24 83 67 f9 e5 01 5d b9
+ 0x0068 22 f8 f4 80 95 dd a7 84
+ 0x0070 98 7f 2d 59 85 b1 2f ba
+ 0x0078 d1 6c af 5e 44 35
+ [ trailer begins ]
+ 0x007e 06 sig version 6
+ 0x007f 18 sig type: Subkey Binding sig
+ 0x0080 1b sig algo Ed25519
+ 0x0081 0a hash algo: SHA2-512
+ 0x0082 00 00 00 2c hashed subpackets length
+ 0x0086 05 subpkt length
+ 0x0087 82 critical subpkt: Sig Creation Time
+ 0x0088 63 87 7f e3 Signature Creation Time
+ 0x008c 02 subpkt length
+ 0x008d 9b critical subpkt: Key Flags
+ 0x008e 0c Key Flags: {EncComms, EncStorage}
+ 0x008f 22 subpkt length
+ 0x0090 21 subpkt type: Issuer Fingerprint
+ 0x0091 06 Fingerprint version 6
+ 0x0092 cb 18 6c 4f 06 09 Fingerprint
+ 0x0098 a6 97 e4 d5 2d fa 6c 72
+ 0x00a0 2b 0c 1f 1e 27 c1 8a 56
+ 0x00a8 70 8f 65 25 ec 27 ba d9
+ 0x00b0 ac c9
+ 0x00b2 06 sig version 6
+ 0x00b3 ff sentinel octet
+ 0x00b4 00 00 00 34 trailer length
+
+A.4. Sample Version 6 Secret Key (Transferable Secret Key)
+
+ Here is a Transferable Secret Key consisting of:
+
+ * A version 6 Ed25519 Secret Key packet
+
+ * A version 6 Direct Key self-signature
+
+ * A version 6 X25519 Secret Subkey packet
+
+ * A version 6 Subkey Binding signature
+
+ -----BEGIN PGP PRIVATE KEY BLOCK-----
+
+ xUsGY4d/4xsAAAAg+U2nu0jWCmHlZ3BqZYfQMxmZu52JGggkLq2EVD34laMAGXKB
+ exK+cH6NX1hs5hNhIB00TrJmosgv3mg1ditlsLfCsQYfGwoAAABCBYJjh3/jAwsJ
+ BwUVCg4IDAIWAAKbAwIeCSIhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6
+ 2azJBScJAgcCAAAAAK0oIBA+LX0ifsDm185Ecds2v8lwgyU2kCcUmKfvBXbAf6rh
+ RYWzuQOwEn7E/aLwIwRaLsdry0+VcallHhSu4RN6HWaEQsiPlR4zxP/TP7mhfVEe
+ 7XWPxtnMUMtf15OyA51YBMdLBmOHf+MZAAAAIIaTJINn+eUBXbki+PSAld2nhJh/
+ LVmFsS+60WyvXkQ1AE1gCk95TUR3XFeibg/u/tVY6a//1q0NWC1X+yui3O24wpsG
+ GBsKAAAALAWCY4d/4wKbDCIhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6
+ 2azJAAAAAAQBIKbpGG2dWTX8j+VjFM21J0hqWlEg+bdiojWnKfA5AQpWUWtnNwDE
+ M0g12vYxoWM8Y81W+bHBw805I8kWVkXU6vFOi+HWvv/ira7ofJu16NnoUkhclkUr
+ k0mXubZvyl4GBg==
+ -----END PGP PRIVATE KEY BLOCK-----
+
+ The corresponding Transferable Public Key can be found in
+ Appendix A.3.
+
+A.5. Sample Locked Version 6 Secret Key (Transferable Secret Key)
+
+ Here is the same secret key as in Appendix A.4, but the secret key
+ material is locked with a passphrase using AEAD and Argon2.
+
+ The passphrase is the ASCII string:
+
+ correct horse battery staple
+
+ -----BEGIN PGP PRIVATE KEY BLOCK-----
+
+ xYIGY4d/4xsAAAAg+U2nu0jWCmHlZ3BqZYfQMxmZu52JGggkLq2EVD34laP9JgkC
+ FARdb9ccngltHraRe25uHuyuAQQVtKipJ0+r5jL4dacGWSAheCWPpITYiyfyIOPS
+ 3gIDyg8f7strd1OB4+LZsUhcIjOMpVHgmiY/IutJkulneoBYwrEGHxsKAAAAQgWC
+ Y4d/4wMLCQcFFQoOCAwCFgACmwMCHgkiIQbLGGxPBgmml+TVLfpscisMHx4nwYpW
+ cI9lJewnutmsyQUnCQIHAgAAAACtKCAQPi19In7A5tfORHHbNr/JcIMlNpAnFJin
+ 7wV2wH+q4UWFs7kDsBJ+xP2i8CMEWi7Ha8tPlXGpZR4UruETeh1mhELIj5UeM8T/
+ 0z+5oX1RHu11j8bZzFDLX9eTsgOdWATHggZjh3/jGQAAACCGkySDZ/nlAV25Ivj0
+ gJXdp4SYfy1ZhbEvutFsr15ENf0mCQIUBA5hhGgp2oaavg6mFUXcFMwBBBUuE8qf
+ 9Ock+xwusd+GAglBr5LVyr/lup3xxQvHXFSjjA2haXfoN6xUGRdDEHI6+uevKjVR
+ v5oAxgu7eJpaXNjCmwYYGwoAAAAsBYJjh3/jApsMIiEGyxhsTwYJppfk1S36bHIr
+ DB8eJ8GKVnCPZSXsJ7rZrMkAAAAABAEgpukYbZ1ZNfyP5WMUzbUnSGpaUSD5t2Ki
+ Nacp8DkBClZRa2c3AMQzSDXa9jGhYzxjzVb5scHDzTkjyRZWRdTq8U6L4da+/+Kt
+ ruh8m7Xo2ehSSFyWRSuTSZe5tm/KXgYG
+ -----END PGP PRIVATE KEY BLOCK-----
+
+A.5.1. Intermediate Data for Locked Primary Key
+
+ The S2K-derived material for the primary key is:
+
+ 832bd2662a5c2b251ee3fc82aec349a766ca539015880133002e5a21960b3bcf
+
+ After HKDF, the symmetric key used for AEAD encryption of the primary
+ key is:
+
+ 9e37cb26787f37e18db172795c4c297550d39ac82511d9af4c8706db6a77fd51
+
+ The additional data for AEAD for the primary key is:
+
+ c50663877fe31b00000020f94da7bb48d60a61e567706a6587d0331999bb9d89
+ 1a08242ead84543df895a3
+
+A.5.2. Intermediate Data for Locked Subkey
+
+ The S2K-derived key material for the subkey is:
+
+ f74a6ce873a089ef13a3da9ac059777bb22340d15eaa6c9dc0f8ef09035c67cd
+
+ After HKDF, the symmetric key used for AEAD encryption of the subkey
+ is:
+
+ 3c60cb63285f62f4c3de49835786f011cf6f4c069f61232cd7013ff5fd31e603
+
+ The additional data for AEAD for the subkey is:
+
+ c70663877fe319000000208693248367f9e5015db922f8f48095dda784987f2d
+ 5985b12fbad16caf5e4435
+
+A.6. Sample Cleartext Signed Message
+
+ Here is a signed message that uses the Cleartext Signature Framework
+ (Section 7). It can be verified with the certificate from
+ Appendix A.3.
+
+ Note that this message makes use of dash-escaping (Section 7.2) due
+ to its contents.
+
+ -----BEGIN PGP SIGNED MESSAGE-----
+
+ What we need from the grocery store:
+
+ - - tofu
+ - - vegetables
+ - - noodles
+
+ -----BEGIN PGP SIGNATURE-----
+
+ wpgGARsKAAAAKQWCY5ijYyIhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6
+ 2azJAAAAAGk2IHZJX1AhiJD39eLuPBgiUU9wUA9VHYblySHkBONKU/usJ9BvuAqo
+ /FvLFuGWMbKAdA+epq7V4HOtAPlBWmU8QOd6aud+aSunHQaaEJ+iTFjP2OMW0KBr
+ NK2ay45cX1IVAQ==
+ -----END PGP SIGNATURE-----
+
+ The Signature packet here is:
+
+ 0x0000 c2 packet type: Signature
+ 0x0001 98 packet length
+ 0x0002 06 sig version 6
+ 0x0003 01 sig type: Canonical Text
+ 0x0004 1b pubkey algorithm: Ed25519
+ 0x0005 0a hash algorithm used: SHA2-512
+ 0x0006 00 00 hashed subpackets length: 41
+ 0x0008 00 29
+ 0x000a 05 subpkt length
+ 0x000b 82 critical subpkt: Sig Creation Time
+ 0x000c 63 98 a3 63 (2022-12-13T16:08:03Z)
+ 0x0010 22 subpkt length
+ 0x0011 21 subpkt type: Issuer Fingerprint
+ 0x0012 06 Fingerprint version 6
+ 0x0013 cb 18 6c 4f 06 Fingerprint
+ 0x001a 09 a6 97 e4 d5 2d fa 6c
+ 0x0020 72 2b 0c 1f 1e 27 c1 8a
+ 0x0028 56 70 8f 65 25 ec 27 ba
+ 0x0030 d9 ac c9
+ 0x0033 00 00 00 00 unhashed subpackets length: 0
+ 0x0037 69 left 16 bits of signed hash
+ 0x0038 36
+ 0x0039 20 salt length
+ 0x003a 76 49 5f 50 21 88 salt
+ 0x0040 90 f7 f5 e2 ee 3c 18 22
+ 0x0048 51 4f 70 50 0f 55 1d 86
+ 0x0050 e5 c9 21 e4 04 e3 4a 53
+ 0x0058 fb ac
+ 0x005a 27 d0 6f b8 0a a8 Ed25519 signature
+ 0x0060 fc 5b cb 16 e1 96 31 b2
+ 0x0068 80 74 0f 9e a6 ae d5 e0
+ 0x0070 73 ad 00 f9 41 5a 65 3c
+ 0x0078 40 e7 7a 6a e7 7e 69 2b
+ 0x0080 a7 1d 06 9a 10 9f a2 4c
+ 0x0088 58 cf d8 e3 16 d0 a0 6b
+ 0x0090 34 ad 9a cb 8e 5c 5f 52
+ 0x0098 15 01
+
+ The signature is made over the following data:
+
+ 0x0000 76 49 5f 50 21 88 90 f7
+ 0x0008 f5 e2 ee 3c 18 22 51 4f
+ 0x0010 70 50 0f 55 1d 86 e5 c9
+ 0x0018 21 e4 04 e3 4a 53 fb ac
+ 0x0020 57 68 61 74 20 77 65 20
+ 0x0028 6e 65 65 64 20 66 72 6f
+ 0x0030 6d 20 74 68 65 20 67 72
+ 0x0038 6f 63 65 72 79 20 73 74
+ 0x0040 6f 72 65 3a 0d 0a 0d 0a
+ 0x0048 2d 20 74 6f 66 75 0d 0a
+ 0x0050 2d 20 76 65 67 65 74 61
+ 0x0058 62 6c 65 73 0d 0a 2d 20
+ 0x0060 6e 6f 6f 64 6c 65 73 0d
+ 0x0068 0a 06 01 1b 0a 00 00 00
+ 0x0070 29 05 82 63 98 a3 63 22
+ 0x0078 21 06 cb 18 6c 4f 06 09
+ 0x0080 a6 97 e4 d5 2d fa 6c 72
+ 0x0088 2b 0c 1f 1e 27 c1 8a 56
+ 0x0090 70 8f 65 25 ec 27 ba d9
+ 0x0098 ac c9 06 ff 00 00 00 31
+
+ The same data, broken out by octet and semantics, is:
+
+ 0x0000 76 49 5f 50 21 88 90 f7 salt
+ 0x0008 f5 e2 ee 3c 18 22 51 4f
+ 0x0010 70 50 0f 55 1d 86 e5 c9
+ 0x0018 21 e4 04 e3 4a 53 fb ac
+ [ message begins ]
+ 0x0020 57 68 61 74 20 77 65 20 canonicalized message
+ 0x0028 6e 65 65 64 20 66 72 6f
+ 0x0030 6d 20 74 68 65 20 67 72
+ 0x0038 6f 63 65 72 79 20 73 74
+ 0x0040 6f 72 65 3a 0d 0a 0d 0a
+ 0x0048 2d 20 74 6f 66 75 0d 0a
+ 0x0050 2d 20 76 65 67 65 74 61
+ 0x0058 62 6c 65 73 0d 0a 2d 20
+ 0x0060 6e 6f 6f 64 6c 65 73 0d
+ 0x0068 0a
+ [ trailer begins ]
+ 0x0069 06 sig version 6
+ 0x006a 01 sig type: Canonical Text
+ 0x006b 1b pubkey algorithm: Ed25519
+ 0x006c 0a hash algorithm: SHA2-512
+ 0x006d 00 00 00 hashed subpackets length
+ 0x0070 29
+ 0x0071 05 subpacket length
+ 0x0072 82 critical subpkt: Sig Creation Time
+ 0x0073 63 98 a3 63 (2022-12-13T16:08:03Z)
+ 0x0077 22 subpkt length
+ 0x0078 21 subpkt type: Issuer Fingerprint
+ 0x0079 06 Fingerprint version 6
+ 0x007a cb 18 6c 4f 06 09 Fingerprint
+ 0x0080 a6 97 e4 d5 2d fa 6c 72
+ 0x0088 2b 0c 1f 1e 27 c1 8a 56
+ 0x0090 70 8f 65 25 ec 27 ba d9
+ 0x0098 ac c9
+ 0x009a 06 sig version 6
+ 0x009b ff sentinel octet
+ 0x009c 00 00 00 31 trailer length
+
+ The calculated SHA2-512 hash digest over this data is:
+
+ 69365bf44a97af1f0844f1f6ab83fdf6b36f26692efaa621a8aac91c4e29ea07
+ e894cabc6e2f20eedfce6c03b89141a2cc7cbe245e6e7a5654addbec5000b89b
+
+A.7. Sample Inline-Signed Message
+
+ This is the same message and signature as in Appendix A.6 but as an
+ inline-signed message. The hashed data is exactly the same, and all
+ intermediate values and annotated hex dumps are also applicable.
+
+ -----BEGIN PGP MESSAGE-----
+
+ xEYGAQobIHZJX1AhiJD39eLuPBgiUU9wUA9VHYblySHkBONKU/usyxhsTwYJppfk
+ 1S36bHIrDB8eJ8GKVnCPZSXsJ7rZrMkBy0p1AAAAAABXaGF0IHdlIG5lZWQgZnJv
+ bSB0aGUgZ3JvY2VyeSBzdG9yZToKCi0gdG9mdQotIHZlZ2V0YWJsZXMKLSBub29k
+ bGVzCsKYBgEbCgAAACkFgmOYo2MiIQbLGGxPBgmml+TVLfpscisMHx4nwYpWcI9l
+ JewnutmsyQAAAABpNiB2SV9QIYiQ9/Xi7jwYIlFPcFAPVR2G5ckh5ATjSlP7rCfQ
+ b7gKqPxbyxbhljGygHQPnqau1eBzrQD5QVplPEDnemrnfmkrpx0GmhCfokxYz9jj
+ FtCgazStmsuOXF9SFQE=
+ -----END PGP MESSAGE-----
+
+A.8. Sample X25519-AEAD-OCB Encryption and Decryption
+
+ This example encrypts the cleartext string Hello, world! for the
+ sample cert (see Appendix A.3), using AES-128 with AEAD-OCB
+ encryption.
+
+A.8.1. Sample Version 6 Public Key Encrypted Session Key Packet
+
+ This packet contains the following series of octets:
+
+ 0x0000 c1 5d 06 21 06 12 c8 3f
+ 0x0008 1e 70 6f 63 08 fe 15 1a
+ 0x0010 41 77 43 a1 f0 33 79 0e
+ 0x0018 93 e9 97 84 88 d1 db 37
+ 0x0020 8d a9 93 08 85 19 87 cf
+ 0x0028 18 d5 f1 b5 3f 81 7c ce
+ 0x0030 5a 00 4c f3 93 cc 89 58
+ 0x0038 bd dc 06 5f 25 f8 4a f5
+ 0x0040 09 b1 7d d3 67 64 18 de
+ 0x0048 a3 55 43 79 56 61 79 01
+ 0x0050 e0 69 57 fb ca 8a 6a 47
+ 0x0058 a5 b5 15 3e 8d 3a b7
+
+ The same data, broken out by octet and semantics, is:
+
+ 0x0000 c1 packet type: PKESK
+ 0x0001 5d packet length
+ 0x0002 06 v6 PKESK
+ 0x0003 21 length of fingerprint
+ 0x0004 06 Key version 6
+ 0x0005 12 c8 3f Key fingerprint
+ 0x0008 1e 70 6f 63 08 fe 15 1a
+ 0x0010 41 77 43 a1 f0 33 79 0e
+ 0x0018 93 e9 97 84 88 d1 db 37
+ 0x0020 8d a9 93 08 85
+ 0x0025 19 algorithm: X25519
+ 0x0026 87 cf Ephemeral key
+ 0x0028 18 d5 f1 b5 3f 81 7c ce
+ 0x0030 5a 00 4c f3 93 cc 89 58
+ 0x0038 bd dc 06 5f 25 f8 4a f5
+ 0x0040 09 b1 7d d3 67 64
+ 0x0046 18 ESK length
+ 0x0047 de ESK
+ 0x0048 a3 55 43 79 56 61 79 01
+ 0x0050 e0 69 57 fb ca 8a 6a 47
+ 0x0058 a5 b5 15 3e 8d 3a b7
+
+A.8.2. X25519 Encryption/Decryption of the Session Key
+
+ Ephemeral key:
+
+ 87 cf 18 d5 f1 b5 3f 81 7c ce 5a 00 4c f3 93 cc
+ 89 58 bd dc 06 5f 25 f8 4a f5 09 b1 7d d3 67 64
+
+ This ephemeral key is derived from the following ephemeral secret key
+ material, which is never placed on the wire:
+
+ af 1e 43 c0 d1 23 ef e8 93 a7 d4 d3 90 f3 a7 61
+ e3 fa c3 3d fc 7f 3e da a8 30 c9 01 13 52 c7 79
+
+ Public key from the target certificate (see Appendix A.3):
+
+ 86 93 24 83 67 f9 e5 01 5d b9 22 f8 f4 80 95 dd
+ a7 84 98 7f 2d 59 85 b1 2f ba d1 6c af 5e 44 35
+
+ The corresponding long-lived X25519 private key material (see
+ Appendix A.4):
+
+ 4d 60 0a 4f 79 4d 44 77 5c 57 a2 6e 0f ee fe d5
+ 58 e9 af ff d6 ad 0d 58 2d 57 fb 2b a2 dc ed b8
+
+ Shared point:
+
+ 67 e3 0e 69 cd c7 ba b2 a2 68 0d 78 ac a4 6a 2f
+ 8b 6e 2a e4 4d 39 8b dc 6f 92 c5 ad 4a 49 25 14
+
+ HKDF output:
+
+ f6 6d ad cf f6 45 92 23 9b 25 45 39 b6 4f f6 07
+
+ Decrypted session key:
+
+ dd 70 8f 6f a1 ed 65 11 4d 68 d2 34 3e 7c 2f 1d
+
+A.8.3. Sample v2 SEIPD Packet
+
+ This packet contains the following series of octets:
+
+ 0x0000 d2 69 02 07 02 06 61 64
+ 0x0008 16 53 5b e0 b0 71 6d 60
+ 0x0010 e0 52 a5 6c 4c 40 7f 9e
+ 0x0018 b3 6b 0e fa fe 9a d0 a0
+ 0x0020 df 9b 03 3c 69 a2 1b a9
+ 0x0028 eb d2 c0 ec 95 bf 56 9d
+ 0x0030 25 c9 99 ee 4a 3d e1 70
+ 0x0038 58 f4 0d fa 8b 4c 68 2b
+ 0x0040 e3 fb bb d7 b2 7e b0 f5
+ 0x0048 9b b5 00 5f 80 c7 c6 f4
+ 0x0050 03 88 c3 0a d4 06 ab 05
+ 0x0058 13 dc d6 f9 fd 73 76 56
+ 0x0060 28 6e 11 77 d0 0f 88 8a
+ 0x0068 db 31 c4
+
+ The same data, broken out by octet and semantics, is:
+
+ 0x0000 d2 packet type: SEIPD
+ 0x0001 69 packet length
+ 0x0002 02 v2 SEIPD
+ 0x0003 07 cipher: AES128
+ 0x0004 02 AEAD mode: OCB
+ 0x0005 06 chunk size (2^12 octets)
+ 0x0006 61 64 salt
+ 0x0008 16 53 5b e0 b0 71 6d 60
+ 0x0010 e0 52 a5 6c 4c 40 7f 9e
+ 0x0018 b3 6b 0e fa fe 9a d0 a0
+ 0x0020 df 9b 03 3c 69 a2
+ 0x0026 1b a9 chunk #0 encrypted data
+ 0x0028 eb d2 c0 ec 95 bf 56 9d
+ 0x0030 25 c9 99 ee 4a 3d e1 70
+ 0x0038 58 f4 0d fa 8b 4c 68 2b
+ 0x0040 e3 fb bb d7 b2 7e b0 f5
+ 0x0048 9b b5 00
+ 0x004b 5f 80 c7 c6 f4 chunk #0 AEAD tag
+ 0x0050 03 88 c3 0a d4 06 ab 05
+ 0x0058 13 dc d6
+ 0x005b f9 fd 73 76 56 final AEAD tag (#1)
+ S0x0060 28 6e 11 77 d0 0f 88 8a
+ 0x0068 db 31 c4
+
+A.8.4. Decryption of Data
+
+ Starting AEAD-OCB decryption of data, using the session key.
+
+ HKDF info:
+
+ d2 02 07 02 06
+
+ HKDF output:
+
+ 45 12 f7 14 9d 86 33 41 52 7c 65 67 d5 bf fc 42
+ 5f af 32 50 21 2f f9
+
+ Message key:
+
+ 45 12 f7 14 9d 86 33 41 52 7c 65 67 d5 bf fc 42
+
+ Initialization vector:
+
+ 5f af 32 50 21 2f f9
+
+ Chunk #0:
+
+ Nonce:
+
+ 5f af 32 50 21 2f f9 00 00 00 00 00 00 00 00
+
+ Additional authenticated data:
+
+ d2 02 07 02 06
+
+ Encrypted data chunk:
+
+ 1b a9 eb d2 c0 ec 95 bf 56 9d 25 c9 99 ee 4a 3d
+ e1 70 58 f4 0d fa 8b 4c 68 2b e3 fb bb d7 b2 7e
+ b0 f5 9b b5 00 5f 80 c7 c6 f4 03 88 c3 0a d4 06
+ ab 05 13 dc d6
+
+ Decrypted chunk #0.
+
+ Literal Data packet with the string contents Hello, world!:
+
+ cb 13 62 00 00 00 00 00 48 65 6c 6c 6f 2c 20 77
+ 6f 72 6c 64 21
+
+ Padding packet:
+
+ d5 0e c5 a2 93 07 29 91 62 81 47 d7 2c 8f 86 b7
+
+ Authenticating final tag:
+
+ Final nonce:
+
+ 5f af 32 50 21 2f f9 00 00 00 00 00 00 00 01
+
+ Final additional authenticated data:
+
+ d2 02 07 02 06 00 00 00 00 00 00 00 25
+
+A.8.5. Complete X25519-AEAD-OCB Encrypted Packet Sequence
+
+ -----BEGIN PGP MESSAGE-----
+
+ wV0GIQYSyD8ecG9jCP4VGkF3Q6HwM3kOk+mXhIjR2zeNqZMIhRmHzxjV8bU/gXzO
+ WgBM85PMiVi93AZfJfhK9QmxfdNnZBjeo1VDeVZheQHgaVf7yopqR6W1FT6NOrfS
+ aQIHAgZhZBZTW+CwcW1g4FKlbExAf56zaw76/prQoN+bAzxpohup69LA7JW/Vp0l
+ yZnuSj3hcFj0DfqLTGgr4/u717J+sPWbtQBfgMfG9AOIwwrUBqsFE9zW+f1zdlYo
+ bhF30A+IitsxxA==
+ -----END PGP MESSAGE-----
+
+A.9. Sample AEAD-EAX Encryption and Decryption
+
+ This example encrypts the cleartext string Hello, world! with the
+ passphrase password, using AES-128 with AEAD-EAX encryption.
+
+A.9.1. Sample Version 6 Symmetric Key Encrypted Session Key Packet
+
+ This packet contains the following series of octets:
+
+ 0x0000 c3 40 06 1e 07 01 0b 03
+ 0x0008 08 a5 ae 57 9d 1f c5 d8
+ 0x0010 2b ff 69 22 4f 91 99 93
+ 0x0018 b3 50 6f a3 b5 9a 6a 73
+ 0x0020 cf f8 c5 ef c5 f4 1c 57
+ 0x0028 fb 54 e1 c2 26 81 5d 78
+ 0x0030 28 f5 f9 2c 45 4e b6 5e
+ 0x0038 be 00 ab 59 86 c6 8e 6e
+ 0x0040 7c 55
+
+ The same data, broken out by octet and semantics, is:
+
+ 0x0000 c3 packet type: SKESK
+ 0x0001 40 packet length
+ 0x0002 06 v6 SKESK
+ 0x0003 1e length through end of AEAD nonce
+ 0x0004 07 cipher: AES128
+ 0x0005 01 AEAD mode: EAX
+ 0x0006 0b length of S2K
+ 0x0007 03 S2K type: iterated+salted
+ 0x0008 08 S2K hash: SHA2-256
+ 0x0009 a5 ae 57 9d 1f c5 d8 S2K salt
+ 0x0010 2b
+ 0x0011 ff S2K iterations (65011712 octets)
+ 0x0012 69 22 4f 91 99 93 AEAD nonce
+ 0x0018 b3 50 6f a3 b5 9a 6a 73
+ 0x0020 cf f8
+ 0x0022 c5 ef c5 f4 1c 57 encrypted session key
+ 0x0028 fb 54 e1 c2 26 81 5d 78
+ 0x0030 28 f5
+ 0x0032 f9 2c 45 4e b6 5e AEAD tag
+ 0x0038 be 00 ab 59 86 c6 8e 6e
+ 0x0040 7c 55
+
+A.9.2. Starting AEAD-EAX Decryption of the Session Key
+
+ The derived key is:
+
+ 15 49 67 e5 90 aa 1f 92 3e 1c 0a c6 4c 88 f2 3d
+
+ HKDF info:
+
+ c3 06 07 01
+
+ HKDF output:
+
+ 2f ce 33 1f 39 dd 95 5c c4 1e 95 d8 70 c7 21 39
+
+ Authenticated Data:
+
+ c3 06 07 01
+
+ Nonce:
+
+ 69 22 4f 91 99 93 b3 50 6f a3 b5 9a 6a 73 cf f8
+
+ Decrypted session key:
+
+ 38 81 ba fe 98 54 12 45 9b 86 c3 6f 98 cb 9a 5e
+
+A.9.3. Sample v2 SEIPD Packet
+
+ This packet contains the following series of octets:
+
+ 0x0000 d2 69 02 07 01 06 9f f9
+ 0x0008 0e 3b 32 19 64 f3 a4 29
+ 0x0010 13 c8 dc c6 61 93 25 01
+ 0x0018 52 27 ef b7 ea ea a4 9f
+ 0x0020 04 c2 e6 74 17 5d 4a 3d
+ 0x0028 22 6e d6 af cb 9c a9 ac
+ 0x0030 12 2c 14 70 e1 1c 63 d4
+ 0x0038 c0 ab 24 1c 6a 93 8a d4
+ 0x0040 8b f9 9a 5a 99 b9 0b ba
+ 0x0048 83 25 de 61 04 75 40 25
+ 0x0050 8a b7 95 9a 95 ad 05 1d
+ 0x0058 da 96 eb 15 43 1d fe f5
+ 0x0060 f5 e2 25 5c a7 82 61 54
+ 0x0068 6e 33 9a
+
+ The same data, broken out by octet and semantics, is:
+
+ 0x0000 d2 packet type: SEIPD
+ 0x0001 69 packet length
+ 0x0002 02 v2 SEIPD
+ 0x0003 07 cipher: AES128
+ 0x0004 01 AEAD mode: EAX
+ 0x0005 06 chunk size (2^12 octets)
+ 0x0005 9f f9 salt
+ 0x0008 0e 3b 32 19 64 f3 a4 29
+ 0x0010 13 c8 dc c6 61 93 25 01
+ 0x0018 52 27 ef b7 ea ea a4 9f
+ 0x0020 04 c2 e6 74 17 5d
+ 0x0026 4a 3d chunk #0 encrypted data
+ 0x0028 22 6e d6 af cb 9c a9 ac
+ 0x0030 12 2c 14 70 e1 1c 63 d4
+ 0x0038 c0 ab 24 1c 6a 93 8a d4
+ 0x0040 8b f9 9a 5a 99 b9 0b ba
+ 0x0048 83 25 de
+ 0x004b 61 04 75 40 25 chunk #0 AEAD tag
+ 0x0050 8a b7 95 9a 95 ad 05 1d
+ 0x0058 da 96 eb
+ 0x005b 15 43 1d fe f5 final AEAD tag (#1)
+ 0x0060 f5 e2 25 5c a7 82 61 54
+ 0x0068 6e 33 9a
+
+A.9.4. Decryption of Data
+
+ Starting AEAD-EAX decryption of data, using the session key.
+
+ HKDF info:
+
+ d2 02 07 01 06
+
+ HKDF output:
+
+ b5 04 22 ac 1c 26 be 9d dd 83 1d 5b bb 36 b6 4f
+ 78 b8 33 f2 e9 4a 60 c0
+
+ Message key:
+
+ b5 04 22 ac 1c 26 be 9d dd 83 1d 5b bb 36 b6 4f
+
+ Initialization vector:
+
+ 78 b8 33 f2 e9 4a 60 c0
+
+ Chunk #0:
+
+ Nonce:
+
+ 78 b8 33 f2 e9 4a 60 c0 00 00 00 00 00 00 00 00
+
+ Additional authenticated data:
+
+ d2 02 07 01 06
+
+ Decrypted chunk #0.
+
+ Literal Data packet with the string contents Hello, world!:
+
+ cb 13 62 00 00 00 00 00 48 65 6c 6c 6f 2c 20 77
+ 6f 72 6c 64 21
+
+ Padding packet:
+
+ d5 0e ae 5b f0 cd 67 05 50 03 55 81 6c b0 c8 ff
+
+ Authenticating final tag:
+
+ Final nonce:
+
+ 78 b8 33 f2 e9 4a 60 c0 00 00 00 00 00 00 00 01
+
+ Final additional authenticated data:
+
+ d2 02 07 01 06 00 00 00 00 00 00 00 25
+
+A.9.5. Complete AEAD-EAX Encrypted Packet Sequence
+
+ -----BEGIN PGP MESSAGE-----
+
+ w0AGHgcBCwMIpa5XnR/F2Cv/aSJPkZmTs1Bvo7WaanPP+MXvxfQcV/tU4cImgV14
+ KPX5LEVOtl6+AKtZhsaObnxV0mkCBwEGn/kOOzIZZPOkKRPI3MZhkyUBUifvt+rq
+ pJ8EwuZ0F11KPSJu1q/LnKmsEiwUcOEcY9TAqyQcapOK1Iv5mlqZuQu6gyXeYQR1
+ QCWKt5Wala0FHdqW6xVDHf719eIlXKeCYVRuM5o=
+ -----END PGP MESSAGE-----
+
+A.10. Sample AEAD-OCB Encryption and Decryption
+
+ This example encrypts the cleartext string Hello, world! with the
+ passphrase password, using AES-128 with AEAD-OCB encryption.
+
+A.10.1. Sample Version 6 Symmetric Key Encrypted Session Key Packet
+
+ This packet contains the following series of octets:
+
+ 0x0000 c3 3f 06 1d 07 02 0b 03
+ 0x0008 08 56 a2 98 d2 f5 e3 64
+ 0x0010 53 ff cf cc 5c 11 66 4e
+ 0x0018 db 9d b4 25 90 d7 dc 46
+ 0x0020 b0 72 41 b6 12 c3 81 2c
+ 0x0028 ff fb ea 00 f2 34 7b 25
+ 0x0030 64 11 23 f8 87 ae 60 d4
+ 0x0038 fd 61 4e 08 37 d8 19 d3
+ 0x0040 6c
+
+ The same data, broken out by octet and semantics, is:
+
+ 0x0000 c3 packet type: SKESK
+ 0x0001 3f packet length
+ 0x0002 06 v6 SKESK
+ 0x0003 1d length through end of AEAD nonce
+ 0x0004 07 cipher: AES128
+ 0x0005 02 AEAD mode: OCB
+ 0x0006 0b length of S2K
+ 0x0007 03 S2K type: iterated+salted
+ 0x0008 08 S2K hash: SHA2-256
+ 0x0009 56 a2 98 d2 f5 e3 64 S2K salt
+ 0x0010 53
+ 0x0011 ff S2K iterations (65011712 octets)
+ 0x0012 cf cc 5c 11 66 4e AEAD nonce
+ 0x0018 db 9d b4 25 90 d7 dc 46
+ 0x0020 b0
+ 0x0021 72 41 b6 12 c3 81 2c encrypted session key
+ 0x0028 ff fb ea 00 f2 34 7b 25
+ 0x0030 64
+ 0x0031 11 23 f8 87 ae 60 d4 AEAD tag
+ 0x0038 fd 61 4e 08 37 d8 19 d3
+ 0x0040 6c
+
+A.10.2. Starting AEAD-OCB Decryption of the Session Key
+
+ The derived key is:
+
+ e8 0d e2 43 a3 62 d9 3b 9d c6 07 ed e9 6a 73 56
+
+ HKDF info:
+
+ c3 06 07 02
+
+ HKDF output:
+
+ 38 a9 b3 45 b5 68 0b b6 1b b6 5d 73 ee c7 ec d9
+
+ Authenticated Data:
+
+ c3 06 07 02
+
+ Nonce:
+
+ cf cc 5c 11 66 4e db 9d b4 25 90 d7 dc 46 b0
+
+ Decrypted session key:
+
+ 28 e7 9a b8 23 97 d3 c6 3d e2 4a c2 17 d7 b7 91
+
+A.10.3. Sample v2 SEIPD Packet
+
+ This packet contains the following series of octets:
+
+ 0x0000 d2 69 02 07 02 06 20 a6
+ 0x0008 61 f7 31 fc 9a 30 32 b5
+ 0x0010 62 33 26 02 7e 3a 5d 8d
+ 0x0018 b5 74 8e be ff 0b 0c 59
+ 0x0020 10 d0 9e cd d6 41 ff 9f
+ 0x0028 d3 85 62 75 80 35 bc 49
+ 0x0030 75 4c e1 bf 3f ff a7 da
+ 0x0038 d0 a3 b8 10 4f 51 33 cf
+ 0x0040 42 a4 10 0a 83 ee f4 ca
+ 0x0048 1b 48 01 a8 84 6b f4 2b
+ 0x0050 cd a7 c8 ce 9d 65 e2 12
+ 0x0058 f3 01 cb cd 98 fd ca de
+ 0x0060 69 4a 87 7a d4 24 73 23
+ 0x0068 f6 e8 57
+
+ The same data, broken out by octet and semantics, is:
+
+ 0x0000 d2 packet type: SEIPD
+ 0x0001 69 packet length
+ 0x0002 02 v2 SEIPD
+ 0x0003 07 cipher: AES128
+ 0x0004 02 AEAD mode: OCB
+ 0x0005 06 chunk size (2^12 octets)
+ 0x0006 20 a6 salt
+ 0x0008 61 f7 31 fc 9a 30 32 b5
+ 0x0010 62 33 26 02 7e 3a 5d 8d
+ 0x0018 b5 74 8e be ff 0b 0c 59
+ 0x0020 10 d0 9e cd d6 41
+ 0x0026 ff 9f chunk #0 encrypted data
+ 0x0028 d3 85 62 75 80 35 bc 49
+ 0x0030 75 4c e1 bf 3f ff a7 da
+ 0x0038 d0 a3 b8 10 4f 51 33 cf
+ 0x0040 42 a4 10 0a 83 ee f4 ca
+ 0x0048 1b 48 01
+ 0x004b a8 84 6b f4 2b chunk #0 authentication tag
+ 0x0050 cd a7 c8 ce 9d 65 e2 12
+ 0x0058 f3 01 cb
+ 0x005b cd 98 fd ca de final AEAD tag (#1)
+ 0x0060 69 4a 87 7a d4 24 73 23
+ 0x0068 f6 e8 57
+
+A.10.4. Decryption of Data
+
+ Starting AEAD-OCB decryption of data, using the session key.
+
+ HKDF info:
+
+ d2 02 07 02 06
+
+ HKDF output:
+
+ 71 66 2a 11 ee 5b 4e 08 14 4e 6d e8 83 a0 09 99
+ eb de 12 bb 57 0d cf
+
+ Message key:
+
+ 71 66 2a 11 ee 5b 4e 08 14 4e 6d e8 83 a0 09 99
+
+ Initialization vector:
+
+ eb de 12 bb 57 0d cf
+
+ Chunk #0:
+
+ Nonce:
+
+ eb de 12 bb 57 0d cf 00 00 00 00 00 00 00 00
+
+ Additional authenticated data:
+
+ d2 02 07 02 06
+
+ Decrypted chunk #0.
+
+ Literal Data packet with the string contents Hello, world!:
+
+ cb 13 62 00 00 00 00 00 48 65 6c 6c 6f 2c 20 77
+ 6f 72 6c 64 21
+
+ Padding packet:
+
+ d5 0e ae 6a a1 64 9b 56 aa 83 5b 26 13 90 2b d2
+
+ Authenticating final tag:
+
+ Final nonce:
+
+ eb de 12 bb 57 0d cf 00 00 00 00 00 00 00 01
+
+ Final additional authenticated data:
+
+ d2 02 07 02 06 00 00 00 00 00 00 00 25
+
+A.10.5. Complete AEAD-OCB Encrypted Packet Sequence
+
+ -----BEGIN PGP MESSAGE-----
+
+ wz8GHQcCCwMIVqKY0vXjZFP/z8xcEWZO2520JZDX3EawckG2EsOBLP/76gDyNHsl
+ ZBEj+IeuYNT9YU4IN9gZ02zSaQIHAgYgpmH3MfyaMDK1YjMmAn46XY21dI6+/wsM
+ WRDQns3WQf+f04VidYA1vEl1TOG/P/+n2tCjuBBPUTPPQqQQCoPu9MobSAGohGv0
+ K82nyM6dZeIS8wHLzZj9yt5pSod61CRzI/boVw==
+ -----END PGP MESSAGE-----
+
+A.11. Sample AEAD-GCM Encryption and Decryption
+
+ This example encrypts the cleartext string Hello, world! with the
+ passphrase password, using AES-128 with AEAD-GCM encryption.
+
+A.11.1. Sample Version 6 Symmetric Key Encrypted Session Key Packet
+
+ This packet contains the following series of octets:
+
+ 0x0000 c3 3c 06 1a 07 03 0b 03
+ 0x0008 08 e9 d3 97 85 b2 07 00
+ 0x0010 08 ff b4 2e 7c 48 3e f4
+ 0x0018 88 44 57 cb 37 26 b9 b3
+ 0x0020 db 9f f7 76 e5 f4 d9 a4
+ 0x0028 09 52 e2 44 72 98 85 1a
+ 0x0030 bf ff 75 26 df 2d d5 54
+ 0x0038 41 75 79 a7 79 9f
+
+ The same data, broken out by octet and semantics, is:
+
+ 0x0000 c3 packet type: SKESK
+ 0x0001 3c packet length
+ 0x0002 06 v6 SKESK
+ 0x0003 1a length through end of AEAD nonce
+ 0x0004 07 cipher: AES128
+ 0x0005 03 AEAD mode: GCM
+ 0x0006 0b length of S2K
+ 0x0007 03 S2K type: iterated+salted
+ 0x0008 08 S2K hash: SHA2-256
+ 0x0009 e9 d3 97 85 b2 07 00 S2K salt
+ 0x0010 08
+ 0x0011 ff S2K iterations (65011712 octets)
+ 0x0012 b4 2e 7c 48 3e f4 AEAD nonce
+ 0x0018 88 44 57 cb 37 26
+ 0x001e b9 b3 encrypted session key
+ 0x0020 db 9f f7 76 e5 f4 d9 a4
+ 0x0028 09 52 e2 44 72 98
+ 0x002e 85 1a AEAD tag
+ 0x0030 bf ff 75 26 df 2d d5 54
+ 0x0038 41 75 79 a7 79 9f
+
+A.11.2. Starting AEAD-GCM Decryption of the Session Key
+
+ The derived key is:
+
+ 25 02 81 71 5b ba 78 28 ef 71 ef 64 c4 78 47 53
+
+ HKDF info:
+
+ c3 06 07 03
+
+ HKDF output:
+
+ 7a 6f 9a b7 f9 9f 7e f8 db ef 84 1c 65 08 00 f5
+
+ Authenticated Data:
+
+ c3 06 07 03
+
+ Nonce:
+
+ b4 2e 7c 48 3e f4 88 44 57 cb 37 26
+
+ Decrypted session key:
+
+ 19 36 fc 85 68 98 02 74 bb 90 0d 83 19 36 0c 77
+
+A.11.3. Sample v2 SEIPD Packet
+
+ This packet contains the following series of octets, is:
+
+ 0x0000 d2 69 02 07 03 06 fc b9
+ 0x0008 44 90 bc b9 8b bd c9 d1
+ 0x0010 06 c6 09 02 66 94 0f 72
+ 0x0018 e8 9e dc 21 b5 59 6b 15
+ 0x0020 76 b1 01 ed 0f 9f fc 6f
+ 0x0028 c6 d6 5b bf d2 4d cd 07
+ 0x0030 90 96 6e 6d 1e 85 a3 00
+ 0x0038 53 78 4c b1 d8 b6 a0 69
+ 0x0040 9e f1 21 55 a7 b2 ad 62
+ 0x0048 58 53 1b 57 65 1f d7 77
+ 0x0050 79 12 fa 95 e3 5d 9b 40
+ 0x0058 21 6f 69 a4 c2 48 db 28
+ 0x0060 ff 43 31 f1 63 29 07 39
+ 0x0068 9e 6f f9
+
+ The same data, broken out by octet and semantics, is:
+
+ 0x0000 d2 packet type: SEIPD
+ 0x0001 69 packet length
+ 0x0002 02 v2 SEIPD
+ 0x0003 07 cipher: AES128
+ 0x0004 03 AEAD mode: GCM
+ 0x0005 06 chunk size (2^12 octets)
+ 0x0006 fc b9 salt
+ 0x0008 44 90 bc b9 8b bd c9 d1
+ 0x0010 06 c6 09 02 66 94 0f 72
+ 0x0018 e8 9e dc 21 b5 59 6b 15
+ 0x0020 76 b1 01 ed 0f 9f
+ 0x0026 fc 6f chunk #0 encrypted data
+ 0x0028 c6 d6 5b bf d2 4d cd 07
+ 0x0030 90 96 6e 6d 1e 85 a3 00
+ 0x0038 53 78 4c b1 d8 b6 a0 69
+ 0x0040 9e f1 21 55 a7 b2 ad 62
+ 0x0048 58 53 1b
+ 0x004b 57 65 1f d7 77 chunk #0 authentication tag
+ 0x0050 79 12 fa 95 e3 5d 9b 40
+ 0x0058 21 6f 69
+ 0x005b a4 c2 48 db 28 final AEAD tag (#1)
+ 0x0060 ff 43 31 f1 63 29 07 39
+ 0x0068 9e 6f f9
+
+A.11.4. Decryption of Data
+
+ Starting AEAD-GCM decryption of data, using the session key.
+
+ HKDF info:
+
+ d2 02 07 03 06
+
+ HKDF output:
+
+ ea 14 38 80 3c b8 a4 77 40 ce 9b 54 c3 38 77 8d
+ 4d 2b dc 2b
+
+ Message key:
+
+ ea 14 38 80 3c b8 a4 77 40 ce 9b 54 c3 38 77 8d
+
+ Initialization vector:
+
+ 4d 2b dc 2b
+
+ Chunk #0:
+
+ Nonce:
+
+ 4d 2b dc 2b 00 00 00 00 00 00 00 00
+
+ Additional authenticated data:
+
+ d2 02 07 03 06
+
+ Decrypted chunk #0.
+
+ Literal Data packet with the string contents Hello, world!:
+
+ cb 13 62 00 00 00 00 00 48 65 6c 6c 6f 2c 20 77
+ 6f 72 6c 64 21
+
+ Padding packet:
+
+ d5 0e 1c e2 26 9a 9e dd ef 81 03 21 72 b7 ed 7c
+
+ Authenticating final tag:
+
+ Final nonce:
+
+ 4d 2b dc 2b 00 00 00 00 00 00 00 01
+
+ Final additional authenticated data:
+
+ d2 02 07 03 06 00 00 00 00 00 00 00 25
+
+A.11.5. Complete AEAD-GCM Encrypted Packet Sequence
+
+ -----BEGIN PGP MESSAGE-----
+
+ wzwGGgcDCwMI6dOXhbIHAAj/tC58SD70iERXyzcmubPbn/d25fTZpAlS4kRymIUa
+ v/91Jt8t1VRBdXmneZ/SaQIHAwb8uUSQvLmLvcnRBsYJAmaUD3LontwhtVlrFXax
+ Ae0Pn/xvxtZbv9JNzQeQlm5tHoWjAFN4TLHYtqBpnvEhVaeyrWJYUxtXZR/Xd3kS
+ +pXjXZtAIW9ppMJI2yj/QzHxYykHOZ5v+Q==
+ -----END PGP MESSAGE-----
+
+A.12. Sample Messages Encrypted Using Argon2
+
+ These messages are the literal data Hello, world! encrypted using v1
+ SEIPD, with Argon2 and the passphrase "password", using different
+ session key sizes. In each example, the choice of symmetric cipher
+ is the same in both the v4 SKESK packet and v1 SEIPD packet. In all
+ cases, the Argon2 parameters are t = 1, p = 4, and m = 21.
+
+A.12.1. V4 SKESK Using Argon2 with AES-128
+
+ -----BEGIN PGP MESSAGE-----
+ Comment: Encrypted using AES with 128-bit key
+ Comment: Session key: 01FE16BBACFD1E7B78EF3B865187374F
+
+ wycEBwScUvg8J/leUNU1RA7N/zE2AQQVnlL8rSLPP5VlQsunlO+ECxHSPgGYGKY+
+ YJz4u6F+DDlDBOr5NRQXt/KJIf4m4mOlKyC/uqLbpnLJZMnTq3o79GxBTdIdOzhH
+ XfA3pqV4mTzF
+ -----END PGP MESSAGE-----
+
+A.12.2. V4 SKESK Using Argon2 with AES-192
+
+ -----BEGIN PGP MESSAGE-----
+ Comment: Encrypted using AES with 192-bit key
+ Comment: Session key: 27006DAE68E509022CE45A14E569E91001C2955...
+ Comment: Session key: ...AF8DFE194
+
+ wy8ECAThTKxHFTRZGKli3KNH4UP4AQQVhzLJ2va3FG8/pmpIPd/H/mdoVS5VBLLw
+ F9I+AdJ1Sw56PRYiKZjCvHg+2bnq02s33AJJoyBexBI4QKATFRkyez2gldJldRys
+ LVg77Mwwfgl2n/d572WciAM=
+ -----END PGP MESSAGE-----
+
+A.12.3. V4 SKESK Using Argon2 with AES-256
+
+ -----BEGIN PGP MESSAGE-----
+ Comment: Encrypted using AES with 256-bit key
+ Comment: Session key: BBEDA55B9AAE63DAC45D4F49D89DACF4AF37FEF...
+ Comment: Session key: ...C13BAB2F1F8E18FB74580D8B0
+
+ wzcECQS4eJUgIG/3mcaILEJFpmJ8AQQVnZ9l7KtagdClm9UaQ/Z6M/5roklSGpGu
+ 623YmaXezGj80j4B+Ku1sgTdJo87X1Wrup7l0wJypZls21Uwd67m9koF60eefH/K
+ 95D1usliXOEm8ayQJQmZrjf6K6v9PWwqMQ==
+ -----END PGP MESSAGE-----
+
+Appendix B. Upgrade Guidance (Adapting Implementations from RFCs 4880
+ and 6637)
+
+ This subsection offers a concise, non-normative summary of the
+ substantial additions to and departures from [RFC4880] and [RFC6637].
+ It is intended to help implementers who are augmenting an existing
+ implementation from those specifications to comply with this
+ specification. Cryptographic algorithms marked with "MTI" are
+ mandatory to implement.
+
+ * Public Key Signing Algorithms:
+
+ - Ed25519 (Sections 5.5.5.9 and 5.2.3.4) -- MTI
+
+ - Ed448 (Sections 5.5.5.10 and 5.2.3.5)
+
+ - EdDSALegacy with Ed25519Legacy (Sections 5.5.5.5 and 5.2.3.3)
+
+ - ECDSA with Brainpool curves (Section 9.2)
+
+ * Public Key Encryption Algorithms:
+
+ - X25519 (Sections 5.5.5.7 and 5.1.6) -- MTI
+
+ - X448 (Sections 5.5.5.8 and 5.1.7)
+
+ - ECDH with Curve25519Legacy (Section 9.2)
+
+ - ECDH with Brainpool curves (Section 9.2)
+
+ * AEAD Encryption:
+
+ - V2 SEIPD (Section 5.13.2)
+
+ - AEAD modes:
+
+ o OCB mode (Section 5.13.4) -- MTI
+
+ o EAX mode (Section 5.13.3)
+
+ o GCM mode (Section 5.13.5)
+
+ - V6 PKESK (Section 5.1.2)
+
+ - V6 SKESK (Section 5.3.2)
+
+ - Features signature subpacket: add flag for v2 SEIPD
+ (Section 5.2.3.32)
+
+ - Signature Subpacket: Preferred AEAD Ciphersuites
+ (Section 5.2.3.15)
+
+ - Secret key encryption: AEAD "S2K usage octet" (Sections 3.7.2
+ and 5.5.3)
+
+ * Version 6 Keys and Signatures:
+
+ - Version 6 Public Keys (Section 5.5.2.3)
+
+ - Version 6 Fingerprint and Key ID (Section 5.5.4.3)
+
+ - Version 6 Secret Keys (Section 5.5.3)
+
+ - Version 6 Signatures (Section 5.2.3)
+
+ - Version 6 One-Pass Signatures (Section 5.4)
+
+ * Certificate (Transferable Public Key) Structure:
+
+ - Preferences subpackets in Direct Key signatures
+ (Section 5.2.3.10)
+
+ - Self-verifying revocation certificate (Section 10.1.2)
+
+ - User ID is explicitly optional (Section 10.1.1)
+
+ * S2K: Argon2 (Section 3.7.1.4)
+
+ * Subpacket: Intended Recipient Fingerprint (Section 5.2.3.36)
+
+ * Digest Algorithms: SHA3-256 and SHA3-512 (Section 9.5)
+
+ * Packet: Padding (Section 5.14)
+
+ * Message Structure: Packet Criticality (Section 4.3)
+
+ * Deprecations:
+
+ - Public Key Algorithms:
+
+ o Avoid RSA weak keys (Section 12.4)
+
+ o Avoid DSA (Section 12.5)
+
+ o Avoid ElGamal (Sections 12.6 and 5.1.4)
+
+ o For Version 6 Keys: Avoid EdDSA25519Legacy and
+ Curve25519Legacy (Section 9.2)
+
+ - Digest Algorithms:
+
+ o Avoid MD5, SHA1, and RIPEMD160 (Section 9.5)
+
+ - Symmetric Key Algorithms:
+
+ o Avoid IDEA, TripleDES, and CAST5 (Section 9.3)
+
+ - S2K Specifier:
+
+ o Avoid Simple S2K (Section 3.7.1.1)
+
+ - Secret Key Protections (a.k.a. S2K Usage):
+
+ o Avoid MalleableCFB (Section 3.7.2.1)
+
+ - Packet Types:
+
+ o Avoid Symmetrically Encrypted Data (Sections 5.7 and 13.7)
+
+ - Literal Data Packet Metadata:
+
+ o Avoid Filename and Date fields (Section 5.9)
+
+ o Avoid Special _CONSOLE "filename" (Section 5.9.1)
+
+ - Packet Versions:
+
+ o Avoid Version 3 Public Keys (Section 5.5.2.1)
+
+ o Avoid Version 3 Signatures (Section 5.2)
+
+ - Signature Types:
+
+ o Avoid Reserved Signature Type ID 0xFF (Sections 5.2.1.16 and
+ 5.2.4.1)
+
+ - Signature Subpackets:
+
+ o For Version 6 Signatures: Avoid Issuer Key ID
+ (Section 5.2.3.12)
+
+ o Avoid Revocation Key (Section 5.2.3.23)
+
+ - ASCII Armor:
+
+ o Ignore; do not emit CRC (Section 6.1)
+
+ o Do not emit "Version" Armor Header (Section 6.2.2.1)
+
+ - Cleartext Signature Framework:
+
+ o Ignore; avoid emitting unnecessary Hash: headers
+ (Section 6.2.2.3)
+
+ o Reject Cleartext Signature Framework signatures with invalid
+ Hash: headers (Section 6.2.2.3) or any other Armor Header
+ (Section 7.1)
+
+B.1. Terminology Changes
+
+ Note that some of the words used in previous versions of the OpenPGP
+ specification have been improved in this document.
+
+ In previous versions, the following terms were used:
+
+ * "Radix-64" was used to refer to OpenPGP's ASCII Armor base64
+ encoding (Section 6).
+
+ * "Old packet format" was used to refer to the Legacy packet format
+ (Section 4.2.2) predating [RFC2440].
+
+ * "New packet format" was used to refer to the OpenPGP packet format
+ (Section 4.2.1) introduced in [RFC2440].
+
+ * "Certificate" was used ambiguously to mean multiple things. In
+ this document, it means "Transferable Public Key" exclusively.
+
+ * "Preferred Symmetric Algorithms" was the old name for the
+ "Preferred Symmetric Ciphers for v1 SEIPD" subpacket
+ (Section 5.2.3.14).
+
+ * "Modification Detection Code" or "MDC" was originally described as
+ a distinct packet (Packet Type ID 19), and its corresponding flag
+ in the Features signature subpacket (Section 5.2.3.32) was known
+ as "Modification Detection". It is now described as an intrinsic
+ part of v1 SEIPD (Section 5.13.1), and the same corresponding flag
+ is known as "Version 1 Symmetrically Encrypted and Integrity
+ Protected Data packet".
+
+ * "Packet Tag" was used to refer to the Packet Type ID (Section 5)
+ or sometimes to the encoded Packet Type ID (Section 4.2).
+
+Appendix C. Errata Addressed by This Document
+
+ The following verified errata have been incorporated or are otherwise
+ resolved by this document:
+
+ * [Errata-2199] - S2K hash/cipher octet correction
+
+ * [Errata-2200] - No implicit use of IDEA correction
+
+ * [Errata-2206] - PKESK acronym expansion
+
+ * [Errata-2208] - Signature key owner clarification
+
+ * [Errata-2214] - Signature hashing clarification
+
+ * [Errata-2216] - Self-signature applies to user ID correction
+
+ * [Errata-2219] - Session key encryption storage clarification
+
+ * [Errata-2222] - Simple hash MUST/MAY clarification
+
+ * [Errata-2226] - Native line endings SHOULD clarification
+
+ * [Errata-2234] - Radix-64/base64 clarification
+
+ * [Errata-2235] - ASCII/UTF-8 collation sequence clarification
+
+ * [Errata-2236] - Packet Composition is a sequence clarification
+
+ * [Errata-2238] - Subkey packets come after all User ID packets
+ clarification
+
+ * [Errata-2240] - Subkey removal clarification
+
+ * [Errata-2242] - mL/emLen variable correction
+
+ * [Errata-2243] - CFB mode initialization vector (IV) clarification
+
+ * [Errata-2270] - SHA-224 octet sequence correction
+
+ * [Errata-2271] - Radix-64 correction
+
+ * [Errata-3298] - Key Revocation signatures correction
+
+ * [Errata-5491] - C code fix for CRC24_POLY define
+
+ * [Errata-7545] - Armor Header colon hex fix
+
+ * [Errata-7889] - Signature/certification correction
+
+Acknowledgements
+
+ Thanks to the OpenPGP Design Team for working on this document and
+ preparing it for working group consumption: Stephen Farrell, Daniel
+ Kahn Gillmor, Daniel Huigens, Jeffrey Lau, Yutaka Niibe, Justus
+ Winter, and Paul Wouters.
+
+ Thanks to Werner Koch for the early work on rfc4880bis and Andrey
+ Jivsov for the work on [RFC6637].
+
+ This document also draws on much previous work from a number of other
+ authors including Derek Atkins, Charles Breed, Dave Del Torto, Marc
+ Dyksterhouse, Gail Haspert, Gene Hoffman, Paul Hoffman, Ben Laurie,
+ Raph Levien, Colin Plumb, Will Price, Daphne Shaw, William Stallings,
+ Mark Weaver, and Philip R. Zimmermann.
+
+Authors' Addresses
+
+ Paul Wouters (editor)
+ Aiven
+ Email: paul.wouters@aiven.io
+
+
+ Daniel Huigens
+ Proton AG
+ Email: d.huigens@protonmail.com
+
+
+ Justus Winter
+ Sequoia PGP
+ Email: justus@sequoia-pgp.org
+
+
+ Yutaka Niibe
+ FSIJ
+ Email: gniibe@fsij.org