diff --git a/pgpainless-core/src/main/java/org/pgpainless/algorithm/SignatureSubpacket.java b/pgpainless-core/src/main/java/org/pgpainless/algorithm/SignatureSubpacket.java index 8ba5d75f..ead28d8a 100644 --- a/pgpainless-core/src/main/java/org/pgpainless/algorithm/SignatureSubpacket.java +++ b/pgpainless-core/src/main/java/org/pgpainless/algorithm/SignatureSubpacket.java @@ -50,33 +50,348 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public enum SignatureSubpacket { + + /** + * The time the signature was made. + * MUST be present in the hashed area of the signature. + * + * @see Signature Creation Time + */ signatureCreationTime(CREATION_TIME), + + /** + * 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. + * + * @see Signature Expiration Time + */ signatureExpirationTime(EXPIRE_TIME), + + /** + * Denotes whether or not the signature is exportable for other users. + * + * @see Exportable Certification + */ exportableCertification(EXPORTABLE), + + /** + * 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, i.e., that + * it 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. + * + * @see Trust Signature + */ trustSignature(TRUST_SIG), + + /** + * 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 the Henry Spencer's + * "almost public domain" regular expression [REGEX] package. A + * description of the syntax is found in Section 8 below. + * + * @see Regular Expression + */ regularExpression(REG_EXP), + + /** + * Signature's revocability status. The packet body contains a Boolean + * flag indicating whether the signature is revocable. Signatures that + * are not revocable have any later revocation signatures ignored. They + * represent a commitment by the signer that he cannot revoke his + * signature for the life of his key. If this packet is not present, + * the signature is revocable. + * + * @see Revocable + */ revocable(REVOCABLE), + + /** + * The validity period of the key. This is the number of seconds after + * the key creation time that the key expires. If this is not present + * or has a value of zero, the key never expires. This is found only on + * a self-signature. + * + * @see Key Expiration Time + */ keyExpirationTime(KEY_EXPIRE_TIME), + + /** + * Placeholder for backwards compatibility. + */ placeholder(PLACEHOLDER), + + /** + * Symmetric algorithm numbers that indicate which algorithms the key + * holder prefers to use. The subpacket body is an ordered list of + * octets with the most preferred listed first. It is assumed that only + * algorithms listed are supported by the recipient's software. + * This is only found on a self-signature. + * + * @see Preferred Symmetric Algorithms + */ preferredSymmetricAlgorithms(PREFERRED_SYM_ALGS), + + /** + * Authorizes the specified key to issue revocation signatures for this + * key. Class octet must have bit 0x80 set. If the bit 0x40 is set, + * then this means that the revocation information is sensitive. Other + * bits are for future expansion to other kinds of authorizations. This + * is found on a self-signature. + * + * 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: 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. + * + * @see Revocation Key + */ revocationKey(REVOCATION_KEY), + + /** + * The OpenPGP Key ID of the key issuing the signature. + * + * @see Issuer Key ID + */ issuerKeyId(ISSUER_KEY_ID), + + /** + * 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 four octets of + * flags. + * + * @see Notation Data + */ notationData(NOTATION_DATA), + + /** + * Message digest algorithm numbers that indicate which algorithms the + * key holder prefers to receive. Like the preferred symmetric + * algorithms, the list is ordered. + * This is only found on a self-signature. + * + * @see Preferred Hash Algorithms + */ preferredHashAlgorithms(PREFERRED_HASH_ALGS), + + /** + * Compression algorithm numbers that indicate which algorithms the key + * holder prefers to use. Like the preferred symmetric algorithms, the + * list is ordered. If this subpacket is not included, ZIP is preferred. + * A zero denotes that uncompressed data is preferred; the key holder's + * software might have no compression software in that implementation. + * This is only found on a self-signature. + * + * @see Preferred Compressio Algorithms + */ preferredCompressionAlgorithms(PREFERRED_COMP_ALGS), + + /** + * This is a list of one-bit flags that indicate preferences that the + * key holder has about how the key is handled on a key server. All + * undefined flags MUST be zero. + * This is found only on a self-signature. + * + * @see Key Server Preferences + */ keyServerPreferences(KEY_SERVER_PREFS), + + /** + * This is a URI of a key server that the key holder 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 ftp, http, + * finger, etc. + * + * @see Preferred Key Server + */ preferredKeyServers(PREFERRED_KEY_SERV), + + /** + * 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, etc. 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 to say, there are two + * different and independent "primaries" -- one for User IDs, and one + * for User Attributes. + * + * @see Primary User-ID + */ primaryUserId(PRIMARY_USER_ID), + + /** + * This subpacket contains a URI of a document that describes the policy + * under which the signature was issued. + * + * @see Policy URL + */ policyUrl(POLICY_URL), + + /** + * 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. This is so it can grow over time. If a + * list is shorter than an implementation expects, the unstated flags + * are considered to be zero. + * + * @see Key Flags + */ keyFlags(KEY_FLAGS), + + /** + * 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. + * + * @see Signer's User ID + */ signerUserId(SIGNER_USER_ID), + + /** + * This subpacket is used only in key revocation and certification + * revocation signatures. It describes the reason why the key or + * certificate was revoked. + * + * The first octet contains a machine-readable code that denotes the + * reason for the revocation: + * + * 0 - No reason specified (key revocations or cert revocations) + * 1 - Key is superseded (key revocations) + * 2 - Key material has been compromised (key revocations) + * 3 - Key is retired and no longer used (key revocations) + * 32 - User ID information is no longer valid (cert revocations) + * 100-110 - Private Use + * + * @see Reason for Revocation + */ revocationReason(REVOCATION_REASON), + + /** + * 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 backwards-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. + * + * @see Features + */ features(FEATURES), + + /** + * 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 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 hash of the + * signature. For example, a target signature with a SHA-1 hash MUST + * have 20 octets of hash data. + * + * @see Signature Target + */ signatureTarget(SIGNATURE_TARGET), + + /** + * This subpacket contains a complete Signature packet body as + * specified in Section 5.2 above. It is useful when one signature + * needs to refer to, or be incorporated in, another signature. + * + * @see Embedded Signature + */ embeddedSignature(EMBEDDED_SIGNATURE), + + /** + * 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 subpacket is also included in the + * signature, the key ID of the Issuer 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 5 key N is 32. + * + * @see Issuer Fingerprint + */ issuerFingerprint(ISSUER_FINGERPRINT), + + /** + * AEAD algorithm numbers that indicate which AEAD algorithms the key + * holder prefers to use. The subpacket body is an ordered list of + * octets with the most preferred listed first. It is assumed that only + * algorithms listed are supported by the recipient's software. + * This is only found on a self-signature. + * Note that support for the AEAD Encrypted Data packet in the general + * is indicated by a Feature Flag. + * + * @see Preferred AEAD Algorithms + */ preferredAEADAlgorithms(PREFERRED_AEAD_ALGORITHMS), + + /** + * 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. + * + * Note that the length N of the fingerprint for a version 4 key is 20 + * octets; for a version 5 key N is 32. + * + * @see Intended Recipient Fingerprint + */ intendedRecipientFingerprint(INTENDED_RECIPIENT_FINGERPRINT), + + /** + * This subpacket MUST only appear as a hashed subpacket of an + * Attestation Key Signature. It has no meaning in any other signature + * type. It is used by the primary key to attest to a set of third- + * party certifications over the associated User ID or User Attribute. + * This enables the holder of an OpenPGP primary key to mark specific + * third-party certifications as re-distributable with the rest of the + * Transferable Public Key (see the "No-modify" flag in "Key Server + * Preferences", above). Implementations MUST include exactly one + * Attested Certification subpacket in any generated Attestation Key + * Signature. + * + * @see Attested Certification + */ attestedCertification(ATTESTED_CERTIFICATIONS) ;