24 KiB
Advanced material: Signatures on components
Certification recipes
Different {term}signatures<OpenPGP Signature Packet> in OpenPGP serve various specific purposes. This section provides practical guidance on creating these {term}signatures<OpenPGP Signature Packet>, illustrating each with concrete examples.
(recipe-algorithm-preferences)=
Change algorithm preferences
To modify the preferred {term}symmetric<Symmetric Cryptography>, compression, {term}hash<Hash Function>, or {term}AEAD algorithms<Authenticated Encryption With Associated Data> for a {term}key<Transferable Secret Key>, the {term}key owner<Certificate Holder> needs to issue a {term}direct key signature ({term}type ID<Signature Type ID> 0x1F) on the {term}primary key<OpenPGP Primary Key>.
This {term}signature<OpenPGP Signature Packet> should have the following structure:
{term}Subpacket<OpenPGP Signature Subpacket> |
Area | {term}Critical<Criticality Flag> |
Mandatory | Notes |
|---|---|---|---|---|
{term}Signature Creation Time<Signature Creation Time Subpacket> |
{term}Hashed<Hashed Area> |
True | True | Current time |
{term}Issuer Fingerprint<Issuer Fingerprint Subpacket> |
{term}Hashed<Hashed Area> |
True or False | Strongly Recommended | The {term}primary key is the {term}issuer |
{term}Key Flags<Key Flag> |
{term}Hashed<Hashed Area> |
True | False | Retain {term}key flags<Key Flag> from the previous {term}self-signature |
{term}Features<Features Subpacket> |
{term}Hashed<Hashed Area> |
True | False | Retain {term}features<Features Subpacket> from the previous {term}self-signature |
{term}Key Expiration Time<Key Expiration Time Subpacket> |
{term}Hashed<Hashed Area> |
True | False | Retain {term}expiration time from the previous {term}self-signature, if applicable |
{term}Hash Algorithm Preferences<Preferred Hash Algorithms Subpacket> |
{term}Hashed<Hashed Area> |
False | False | New {term}preferences<Algorithm Preferences> |
{term}Compression Algorithm Preferences<Preferred Compression Algorithms Subpacket> |
{term}Hashed<Hashed Area> |
False | False | New {term}preferences<Algorithm Preferences> |
{term}Symmetric Algorithm Preferences<Preferred Symmetric Ciphers for v1 SEIPD Subpacket> |
{term}Hashed<Hashed Area> |
False | False | New {term}preferences<Algorithm Preferences> |
{term}AEAD Algorithm Preferences<Preferred AEAD Ciphersuites Subpacket> |
{term}Hashed<Hashed Area> |
False | False | New {term}preferences<Algorithm Preferences> |
Change expiration time
To adjust the {term}expiration time of an {term}OpenPGP certificate, a new {term}DirectKey<Direct Key Signature> {term}signature<OpenPGP Signature Packet> ({term}type ID<Signature Type ID> 0x1F) with a modified {term}Key Expiration Time subpacket must be issued. The structure of this {term}signature<OpenPGP Signature Packet> is identical to the one outlined in the previous section on changing {term}algorithm preferences.
Additionally, the {term}expiration time can be altered for individual {term}User IDs<User ID> (detailed below) or separate {term}subkeys<OpenPGP Subkey> (see {numref}bind-subkey).
Add User ID
To {term}bind<Binding> a {term}User ID to an {term}OpenPGP certificate a {term}certification signature<Certification> ({term}type ID<Signature Type ID> 0x10-0x13) is used which should have the following structure:
{term}Subpacket<OpenPGP Signature Subpacket> |
Area | {term}Critical<Criticality Flag> |
Mandatory | Notes |
|---|---|---|---|---|
{term}Signature Creation Time<Signature Creation Time Subpacket> |
{term}Hashed<Hashed Area> |
True | True | Current time |
{term}Issuer Fingerprint<Issuer Fingerprint Subpacket> |
{term}Hashed<Hashed Area> |
True or False | Strongly Recommended | The {term}primary key<OpenPGP Primary Key> is the {term}issuer |
{term}Primary User ID<Primary User ID Subpacket> |
{term}Hashed<Hashed Area> |
True | False | Optional |
{term}Signature Expiration Time<Signature Expiration Time Subpacket> |
{term}Hashed<Hashed Area> |
True | False | Optional |
In addition to these {term}subpackets<OpenPGP Signature Subpacket>, {term}self-certifications<Self-certification> for {term}User IDs<User ID> can include others – such as {term}key flags<Key Flag>, {term}features<Features Subpacket>, and {term}algorithm preferences – as shown in the previous table. This enables the specification of unique capabilities and {term}preferences<Algorithm Preferences> for each {term}identity associated with the {term}certificate<OpenPGP Certificate>.
Remove or revoke a User ID
Since {term}OpenPGP certificates<OpenPGP certificate> are often distributed by the means of {term}key servers<Key Server>, new {term}signatures<OpenPGP Signature Packet> on a {term}certificate<OpenPGP Certificate> are often "merged" into existing copies of the {term}certificate<OpenPGP Certificate> locally by the recipient.
This integration process means it is practically impossible to directly remove {term}signatures<OpenPGP Signature Packet> or {term}User IDs<User ID> from a {term}certificate<OpenPGP Certificate>, as there is no way to communicate the intention of {term}packet<OpenPGP Signature Packet> deletion to the recipient.
To effectively mark a {term}User ID as invalid, the user can publish a copy of their {term}certificate<OpenPGP Certificate> with a {term}Certification Revocation signature<Certification Revocation Signature Packet> ({term}type ID<Signature Type ID> 0x30) attached to the invalidated {term}User ID. This {term}signature<OpenPGP Signature Packet> signals that the specified {term}User ID is no longer valid or associated with the {term}certificate holder.
The structure of a {term}Certification Revocation signature<Certification Revocation Signature Packet> is as follows:
{term}Subpacket<OpenPGP Signature Subpacket> |
Area | {term}Critical<Criticality Flag> |
Mandatory | Notes |
|---|---|---|---|---|
{term}Signature Creation Time<Signature Creation Time Subpacket> |
{term}Hashed<Hashed Area> |
True | True | Current time |
{term}Issuer Fingerprint<Issuer Fingerprint Subpacket> |
{term}Hashed<Hashed Area> |
True or False | Strongly Recommended | The {term}primary key<OpenPGP Primary Key> is the {term}issuer |
{term}Reason for Revocation<Reason for Revocation Subpacket> |
{term}Hashed<Hashed Area> |
True | False | Determines {term}soft<Soft Revocation> or {term}hard revocation |
For {term}User ID {term}revocations<Revocation>, the {term}Reason for Revocation<Reason for Revocation Subpacket> {term}subpacket<OpenPGP Signature Subpacket> is crucial. A value of 0 means no specific reason, leading to a {term}hard revocation, while 32 indicates the {term}User ID is no longer valid, resulting in a {term}soft revocation. Omitting the {term}reason subpacket<Reason For Revocation Subpacket> is also equivalent to a {term}hard revocation.
It is generally advisable to use reason code 32 for revoking {term}User IDs<User ID>.
(recipe-binding-subkeys)=
Add a subkey
As part of {term}life-cycle management, users may need to add a new {term}subkey<OpenPGP Subkey> to their {term}OpenPGP certificate, often for reasons such as upgrading to a {term}subkey<OpenPGP Subkey> with more advanced cryptographic algorithms. The process involves creating a specific {term}signature<OpenPGP Signature Packet> structure:
{term}Subpacket<OpenPGP Signature Subpacket> |
Area | {term}Critical<Criticality Flag> |
Mandatory | Notes |
|---|---|---|---|---|
{term}Signature Creation Time<Signature Creation Time Subpacket> |
{term}Hashed<Hashed Area> |
True | True | Current time |
{term}Issuer Fingerprint<Issuer Fingerprint Subpacket> |
{term}Hashed<Hashed Area> |
True or False | Strongly Recommended | The {term}primary key<OpenPGP Primary Key> is the {term}issuer |
{term}Key Flags<Key Flag> |
{term}Hashed<Hashed Area> |
True | Strongly Recommended | Determine the usage of the {term}key<OpenPGP Subkey> |
{term}Key Expiration Time<Key Expiration Time Subpacket> |
{term}Hashed<Hashed Area> |
True | False | Specifies the {term}expiration time of the {term}subkey<OpenPGP Subkey> |
{term}Embedded Signature<Embedded Signature Subpacket> |
{term}Hashed<Hashed Area> |
True | If {term}Key Flags<Key Flag> contains {term}S<Signing Key Flag> |
{term}Signing subkeys<OpenPGP Signing Subkey> require embedded {term}Primary Key Binding<Primary Key Binding Signature> {term}signature<OpenPGP Signature Packet> |
{term}Hash Algorithm Preferences<Preferred Hash Algorithms Subpacket> |
{term}Hashed<Hashed Area> |
False | False | Per {term}key<Component Key> {term}preferences<Algorithm Preferences> |
{term}Compression Algorithm Preferences<Preferred Compression Algorithms Subpacket> |
{term}Hashed<Hashed Area> |
False | False | Per {term}key<Component Key> {term}preferences<Algorithm Preferences> |
{term}Symmetric Algorithm Preferences<Preferred Symmetric Ciphers for v1 SEIPD Subpacket> |
{term}Hashed<Hashed Area> |
False | False | Per {term}key<Component Key> {term}preferences<Algorithm Preferences> |
{term}AEAD Algorithm Preferences<Preferred AEAD Ciphersuites Subpacket> |
{term}Hashed<Hashed Area> |
False | False | Per {term}key<Component Key> {term}preferences<Algorithm Preferences> |
In addition to these {term}subpackets<OpenPGP Signature Subpacket>, users can specify {term}algorithm preferences for each {term}subkey<OpenPGP Subkey>, distinct from those set in the {term}certificate<OpenPGP Certificate>'s {term}Direct Key<Direct Key Signature> {term}signature<OpenPGP Signature Packet>.
Revoke a subkey
{term}Subkeys<OpenPGP subkey>, like {term}User IDs<User ID>, can be individually revoked in OpenPGP.
This is done by issuing a {term}Subkey Revocation signature<Subkey Revocation Signature Packet> ({term}type ID<Signature Type ID> 0x28) using the {term}primary key<OpenPGP Primary Key>.
The structure of such a {term}signature<OpenPGP Signature Packet> is straightforward:
{term}Subpacket<OpenPGP Signature Subpacket> |
Area | {term}Critical<Criticality Flag> |
Mandatory | Notes |
|---|---|---|---|---|
{term}Signature Creation Time<Signature Creation Time Subpacket> |
{term}Hashed<Hashed Area> |
True | True | Current time |
{term}Issuer Fingerprint<Issuer Fingerprint Subpacket> |
{term}Hashed<Hashed Area> |
True or False | Strongly Recommended | The {term}primary key<OpenPGP Primary Key> is the {term}issuer |
{term}Reason for Revocation<Reason For Revocation Subpacket> |
{term}Hashed<Hashed Area> |
True | False | Determines {term}soft<Soft Revocation> or {term}hard revocation |
In {term}Subkey Revocation signatures<Subkey Revocation Signature Packet>, the reason for revocation {term}subpacket<OpenPGP Signature Subpacket> can only have values in the range of 0-3. The values 1 ({term}key<OpenPGP Subkey> superseded) and 3 ({term}key<OpenPGP Subkey> retired and no longer used) indicate {term}soft revocations<Soft Revocation>, whereas values 0 (no reason) and 2 ({term}key<OpenPGP Subkey> compromised) indicate {term}hard revocations<Hard Revocation>.
Note that a value of 32 is not applicable in these {term}signatures<OpenPGP Signature Packet>.
Revoke a certificate
Users may find themselves needing to revoke their entire {term}OpenPGP certificate, rendering it unusable. This could be for various reasons, such as migrating to a new {term}certificate<OpenPGP certificate> or in response to a compromise of the {term}certificate<OpenPGP certificate>'s {term}secret key material<Private Key Material>.
While a {term}soft-revoked<Soft Revocation> {term}certificate<OpenPGP Certificate> can be re-validated at a later time with a new {term}certification, a {term}hard revocation is permanent.
The recommended way to {term}revoke<Revocation> a {term}certificate<OpenPGP Certificate> is by issuing a {term}Key Revocation signature<Key Revocation Signature Packet> ({term}type ID<Signature Type ID> 0x20). Its structure is similar to that of a {term}Certification Revocation signature<Certification Revocation Signature Packet>.
{term}Subpacket<OpenPGP Signature Subpacket> |
Area | {term}Critical<Criticality Flag> |
Mandatory | Notes |
|---|---|---|---|---|
{term}Signature Creation Time<Signature Creation Time Subpacket> |
{term}Hashed<Hashed Area> |
True | True | Current time |
{term}Issuer Fingerprint<Issuer Fingerprint Subpacket> |
{term}Hashed<Hashed Area> |
True or False | Strongly Recommended | The {term}primary key<OpenPGP Primary Key> is the {term}issuer |
{term}Reason for Revocation<Reason For Revocation Subpacket> |
{term}Hashed<Hashed Area> |
True | False | Determines {term}soft<Soft Revocation> or {term}hard revocation |
For {term}Key Revocation signatures<Key Revocation Signature Packet>, the guidelines regarding the Reason for Revocation subpacket are the same as those for {term}Subkey Revocation signatures<Subkey Revocation Signature Packet>.
Common subpackets in OpenPGP signatures
In OpenPGP, certain {term}subpackets<OpenPGP Signature Subpacket> are universally expected across all types of {term}signatures<OpenPGP Signature Packet>, serving fundamental roles in the {term}signature<OpenPGP Signature Packet>'s structure, {term}verification and {term}validation:
-
{term}
Signature Creation Time<Signature Creation Time Subpacket>: This is a mandatory {term}subpacket<OpenPGP Signature Subpacket>in every {term}OpenPGP signature<OpenPGP Signature Packet>. It contains the timestamp of when the {term}signature<OpenPGP Signature Packet>was created. For security and integrity, this {term}subpacket<OpenPGP Signature Subpacket>must be located in the {term}hashed areaof the {term}signature<OpenPGP Signature Packet>and is recommended to be marked as {term}critical<Criticality Flag>. -
{term}
Issuer Fingerprint<Issuer Fingerprint Subpacket>: Essential for {term}signature<OpenPGP Signature Packet>{term}validation, this {term}subpacket<OpenPGP Signature Subpacket>identifies the {term}key<OpenPGP Primary Key>(or {term}subkey<OpenPGP Subkey>) that was used to create the {term}signature<OpenPGP Signature Packet>. OpenPGP v6 {term}signatures<OpenPGP Signature Packet>should include the {term}Issuer Fingerprint subpacket, containing the 32-byte {term}fingerprint<OpenPGP Fingerprint>of the {term}key<Component Key>.
The {term}`key<Component Key>` used as the {term}`issuer` in the {term}`signature<OpenPGP Signature Packet>` might be a {term}`subkey<OpenPGP Subkey>` of the {term}`certificate<OpenPGP Certificate>`.
These {term}subpackets<OpenPGP Signature Subpacket> can be placed in either the {term}hashed<Hashed Area> or {term}unhashed area due to its self-{term}authenticating<Authentication> nature. However, we recommend including them in the {term}signature<OpenPGP Signature Packet>'s {term}hashed area.
Managing subpacket conflicts and duplication
In {term}OpenPGP signatures<OpenPGP Signature Packet>, both the {term}hashed<Hashed Area> and {term}unhashed areas<Unhashed Area> are composed of lists of {term}subpackets<OpenPGP Signature Subpacket>. Inherently, this structure permits the duplication of the same {term}subpacket<OpenPGP Signature Subpacket>, which could lead to conflicts. To manage these potential conflicts, the following strategies are used:
-
Precedence of {term}
hashed area: {term}Subpackets<OpenPGP Signature Subpacket>within the {term}hashed areaof a {term}signature<OpenPGP Signature Packet>take precedence over those in the {term}unhashed area. This hierarchy helps resolve conflicts when the same {term}subpacket<OpenPGP Signature Subpacket>appears in both areas. -
Handling conflicts within the same area: Conflicts can still arise within the same area, such as when two {term}
subpackets<OpenPGP Signature Subpacket>have different {term}expiration times<Expiration Time>. In such cases, the OpenPGP specification advises that {term}implementations<OpenPGP Implementation>should favor the last occurrence of a conflicting {term}subpacket<OpenPGP Signature Subpacket>in the {term}hashed area.
In certain scenarios, having duplicate {term}subpackets<OpenPGP Signature Subpacket> with conflicting content is logical and even necessary. For example, consider a {term}signature<OpenPGP Signature Packet> created by a version 4 {term}issuer {term}key<Component Key>, which was upgraded from an older OpenPGP version (like v3). Since the {term}key ID calculation scheme changed from v3 to v4, the identifiers for the same {term}key<Component Key> would differ between these versions. Therefore, a v4 signature might contain two {term}issuer key ID subpackets<Issuer Fingerprint Subpacket>, each with different, yet correct values for v3 and v4 {term}keys<Component Key>, respectively. This allows for backward compatibility and ensures the {term}signature<OpenPGP Signature Packet> can be {term}validated<Validation> under both {term}key ID calculation schemes.