blog.pgpkeys.eu

An occasional blog about OpenPGP keyservers and related issues

OpenPGP Reserved Code Points

There are quite a few code points in the IANA OpenPGP registries that are marked “Reserved” with little or no explanation. They all have references to RFC9580, which is the source of the registry data, but the RFC is not always forthcoming about the reasoning behind their reservation.

Some code points are reserved for future use and MAY presumably be un-reserved once a draft spec is finalised. Others are reserved to avoid incompatibility with deprecated or experimental features and MUST NOT be reused. Some have been reserved for speculative features that were never implemented, and so MAY be more appropriately classified as “unassigned”. It is not always clear which case is which, or under what conditions an un-reservation should be performed.

Analysis and Classification of Reserved Code Points

This blog attempts to reconstruct the rationale for each of the reserved code points. The primary sources for this analysis are mainly the various RFCs, but earlier draft versions are also referenced where necessary. All sources are referenced inline below.

In the below, we classify reserved code points as follows:

OpenPGP String-to-Key (S2K) Types

Registry

OpenPGP Packet Types

Registry

OpenPGP User Attribute Subpacket Types

Registry

OpenPGP Image Attribute Encoding Format

Registry

OpenPGP Signature Subpacket Types

Registry

OpenPGP Features Flags

Registry

OpenPGP Key Flags

Registry

OpenPGP Public Key Algorithms

Registry

See also section 12.8 of RFC9580.

OpenPGP Symmetric Key Algorithms

Registry

OpenPGP Hash Algorithms

Registry

Action: code point 15 SHOULD be reserved for SHA3-224.

OpenPGP Signature Types

Registry

OpenPGP AEAD Algorithms

Registry

Use of special code points

Several of the registries use zero to indicate a special code point “none”, and several others obviously reserve zero to prevent accidental interpretation as “none”. Zero is however used in the Signature Types registry as a non-special code point, and some other registries (Image Attribute Encoding Format, and the other Types registries) reserve zero without explanation, even though there is no obvious way to interpret it as “none” in context. This probably represents a general aversion to using zero as a non-special code point, and the Signature Types registry may be considered an outlier.

RFC1991 used 255 as an “experimental” code point in several registries, however RFC2440 subsequently moved the experimental ranges to their current locations. RFC9580 reserved 255 (0xFF) in the Signature Types registry to avoid a downgrade attack against the v3 signature packet encoding. 255 is otherwise is not considered special in any subsequent document, and is used as a non-special code point in the S2K Usage Octet registry.

Unassigned gaps in OpenPGP registries

There are a number of unassigned gaps in the registries that are not specifically marked as reserved, but which were presumably left unassigned intentionally:

Andrew Gallagher (29 January 2025)

(Edited 2025-02-01 to fix references and clarify 0xFF)