# OpenPGP Implementation Progress

## OpenPGP RFCs

PGPy is focused on eventually reaching complete OpenPGP implementation, adhering to the base OpenPGP message format specification, and its extension RFCs.

### RFC 4880

PGPy is currently focused on achieving RFC 4880 compliance for OpenPGP, which is the latest complete OpenPGP Message Format specification. It supersedes RFC 1991 and RFC 2440.

Progress | 118/139
--- | ---
Versioned Packets, v1 | 1/1
✓ | Tag 18 Symetrically Encrypted and Integrity Protected Data Packet
Versioned Packets, v3 | 2/7
✓ | Tag 1 Public-Key Encrypted Session Key Packets
| Tag 2 Signature Packet
✓ | Tag 4 One-Pass Signature Packet
| Tag 5 Secret-Key Packet
| Tag 6 Public-Key Packet
| Tag 7 Secret-Subkey Packet
| Tag 14 Public-SubKey Packet
Versioned Packets, v4 | 6/6
✓ | Tag 2 Signature Packet
✓ | Tag 3 Symmetric-Key Encrypted Session Key Packet
✓ | Tag 5 Secret-Key Packet
✓ | Tag 6 Public-Key Packet
✓ | Tag 7 Secret-Subkey Packet
✓ | Tag 14 Public-SubKey Packet
Unversioned Packets | 8/8
✓ | Tag 8 Compressed Data Packet
✓ | Tag 9 Symetrically Encrypted Data Packet
✓ | Tag 10 Marker Packet
✓ | Tag 11 Literal Data Packet
✓ | Tag 12 Trust Packet
✓ | Tag 13 User ID Packet
✓ | Tag 17 User Attribute Packet
✓ | Tag 19 Modification Detection Code Packet
Signature Subpackets | 22/23
✓ | 0x02 Signature Creation Time
✓ | 0x03 Signature Expiration Time
✓ | 0x04 Exportable Certification
✓ | 0x05 Trust Signature
✓ | 0x06 Regular Expression
✓ | 0x07 Revocable
✓ | 0x09 Key Expiration Time
✓ | 0x0B Preferred Symmetric Algorithms
✓ | 0x0C Revocation Key
✓ | 0x10 Issuer
✓ | 0x14 Notation Data
✓ | 0x15 Preferred Hash Algorithms
✓ | 0x16 Preferred Compression Algorithms
✓ | 0x17 Key Server Preferences
✓ | 0x18 Preferred Key Server
✓ | 0x19 Primary User ID
✓ | 0x1A Policy URI
✓ | 0x1B Key Flags
✓ | 0x1C Signer’s User ID
✓ | 0x1D Reason For Revocation
✓ | 0x1E Features
| 0x1F Signature Target
✓ | 0x20 Embedded Signature
User Attribute Subpackets | 1/1
✓ | 0x01 Image
Storage Formats | 3/4
✓ | ASCII ASCII armored PGP blocks
✓ | binary binary PGP packets
✓ | GPG GPG <= 2.0.x keyrings
| KBX GPG >= 2.1.x keyboxes
Other Sources | 0/2
| Retrieve Retrieve from HKP key servers
| Upload Submit to HKP key servers
Key Types | 3/3
✓ | RSA RSA
✓ | DSA DSA
✓ | ElGamal ElGamal
Key Actions | 8/10
✓ | Protect Protect private keys encryped with CAST5
✓ | Protect Protect private keys encryped with Blowfish
✓ | Protect Protect private keys encryped with AES
| Protect Protect private keys encryped with Twofish
✓ | Unprotect Unprotect private keys encrypted with IDEA*
✓ | Unprotect Unprotect private keys encrypted with Triple-DES
✓ | Unprotect Unprotect private keys encrypted with CAST5
✓ | Unprotect Unprotect private keys encrypted with Blowfish
✓ | Unprotect Unprotect private keys encrypted with AES
| Unprotect Unprotect private keys encrypted with Twofish
RSA Key Actions | 31/34
✓ | Load Load Keys
✓ | Generate Generate Keys
✓ | Generate Generate Subkeys
✓ | Sign Generate detached signatures of binary documents
✓ | Sign Generate inline signatures of canonical documents
✓ | Sign Sign messages
✓ | Sign Sign keys
✓ | Sign Certify User IDs
✓ | Sign Certify User Attributes
✓ | Sign Generate key binding signatures
✓ | Sign Revoke certifications
✓ | Sign Revoke keys
✓ | Sign Revoke subkeys
✓ | Sign Generate timestamp signatures
✓ | Sign Generate standalone signatures
| Sign Generate third party confirmation signatures
✓ | Verify Verify detached signatures
✓ | Verify Verify inline signatures of canonical documents
✓ | Verify Verify messages
✓ | Verify Verify key signatures
✓ | Verify Verify User ID certification signatures
✓ | Verify Verify User Attribute certification signatures
✓ | Verify Verify key binding signatures
✓ | Verify Verify key revocation signatures
✓ | Verify Verify subkey revocation signatures
✓ | Verify Verify certification revocation signatures
✓ | Verify Verify timestamp signatures
✓ | Verify Verify standalone signatures
| Verify Verify third party confirmation signatures
✓ | Revocation Designate Revocation Key
✓ | Revocation Revoke (Sub)Key with Self Signature
| Revocation Revoke (Sub)Key using Designated Revocation Key
✓ | Encryption Encrypt data/messages
✓ | Decryption Decrypt data/messages
DSA Key Actions | 30/33
✓ | Load Load Keys
✓ | Generate Generate Keys
✓ | Generate Generate Subkeys
✓ | Sign Generate detached signatures of binary documents
✓ | Sign Generate inline signatures of canonical documents
✓ | Sign One-Pass Sign messages
✓ | Sign Sign messages
✓ | Sign Sign keys
✓ | Sign Certify User IDs
✓ | Sign Certify User Attributes
✓ | Sign Generate key binding signatures
✓ | Sign Revoke certifications
✓ | Sign Revoke keys
✓ | Sign Revoke subkeys
✓ | Sign Generate timestamp signatures
✓ | Sign Generate standalone signatures
| Sign Generate third party confirmation signatures
✓ | Verify Verify detached signatures
✓ | Verify Verify inline signatures of canonical documents
✓ | Verify Verify messages
✓ | Verify Verify key signatures
✓ | Verify Verify User ID certification signatures
✓ | Verify Verify User Attribute certification signatures
✓ | Verify Verify key binding signatures
✓ | Verify Verify key revocation signatures
✓ | Verify Verify subkey revocation signatures
✓ | Verify Verify certification revocation signatures
✓ | Verify Verify timestamp signatures
✓ | Verify Verify standalone signatures
| Verify Verify third party confirmation signatures
✓ | Revocation Designate Revocation Key
✓ | Revocation Revoke (Sub)Key with Self Signature
| Revocation Revoke (Sub)Key using Designated Revocation Key
ElGamal Key Actions | 1/5
✓ | Load Load Keys
| Generate Generate Keys
| Generate Generate Subkeys
| Encryption Encrypt data/messages
| Decryption Decrypt data/messages
Other Actions | 2/2
✓ | Encryption Encrypt data/messages using symmetric ciphers with passphrases
✓ | Decryption Decrypt data/messages using symmetric ciphers with passphrases

### RFC 4398

RFC 4398 covers publishing and retrieving PGP public keys via DNS CERT records.

Progress | 0/2
--- | ---
Key Sources | 0/2
| DNS CERT Look up and retrieve keys stored in Content-based DNS CERT records
| DNS CERT Look up and retrieve keys stored in Purpose-based DNS CERT records

### RFC 5581

RFC 5581 extends RFC 4880 to officially add support for the Camellia cipher

Progress | 2/2
--- | ---
Actions | 2/2
✓ | Encryption Camellia*
✓ | Decryption Camellia*

### RFC 6637

RFC 6637 extends OpenPGP to officially add support for elliptic curve cryptography

Progress | 40/43
--- | ---
Key Types | 2/2
✓ | ECDH Elliptic Curve Diffie-Hellman
✓ | ECDSA Elliptic Curve Digital Signature Algorithm
Curves | 3/3
✓ | Curve NIST P-256
✓ | Curve NIST P-386
✓ | Curve NIST P-521
ECDH Key Actions | 5/5
✓ | Load Load Keys
✓ | Generate Generate Keys
✓ | Generate Generate Subkeys
✓ | KDF Encode KDF data for encryption
✓ | KDF Decode KDF data for decryption
ECDSA Key Actions | 30/33
✓ | Load Load Keys
✓ | Generate Generate Keys
✓ | Generate Generate Subkeys
✓ | Sign Generate detached signatures of binary documents
✓ | Sign Generate inline signatures of canonical documents
✓ | Sign One-Pass Sign messages
✓ | Sign Sign messages
✓ | Sign Sign keys
✓ | Sign Certify User IDs
✓ | Sign Certify User Attributes
✓ | Sign Generate key binding signatures
✓ | Sign Revoke certifications
✓ | Sign Revoke keys
✓ | Sign Revoke subkeys
✓ | Sign Generate timestamp signatures
✓ | Sign Generate standalone signatures
| Sign Generate third party confirmation signatures
✓ | Verify Verify detached signatures
✓ | Verify Verify inline signatures of canonical documents
✓ | Verify Verify messages
✓ | Verify Verify key signatures
✓ | Verify Verify Use r ID certification signatures
✓ | Verify Verify User Attribute certification signatures
✓ | Verify Verify key binding signatures
✓ | Verify Verify key revocation signatures
✓ | Verify Verify subkey revocation signatures
✓ | Verify Verify certification revocation signatures
✓ | Verify Verify timestamp signatures
✓ | Verify Verify standalone signatures
| Verify Verify third party confirmation signatures
✓ | Revocation Designate Revocation Key
✓ | Revocation Revoke (Sub)Key with Self Signature
| Revocation Revoke (Sub)Key using Designated Revocation Key

## Non-RFC Extensions

This section covers things that are considered extensions to PGP, but are not codified in the form of an RFC.

### DNS PKA

Publishing OpenPGP keys in DNS

Progress | 0/1
--- | ---
Other Sources | 0/1
| DNS PKA Look up and retrieve keys stored in DNS PKA records.

### OpenPGP HTTP Keyserver Protocol (HKP)

The protocol is specified in Marc Horowitz’s thesis paper, and an expired RFC draft by David Shaw, draft-shaw-openpgp-hkp-00.

Progress | 0/2
--- | ---
HKP | 0/2
| HKP Look up and retrieve keys from key server
| HKP Send keys to key server

### EdDSA for OpenPGP

Use of Ed25519 with ECDSA and ECDH in OpenPGP is currently specified in an in-progress RFC draft by Werner Koch, draft-koch-eddsa-for-openpgp.

Progress | 0/1
--- | ---
Curves | 0/1
| Curve Ed25519

### Additional Curves for OpenPGP

Some additional curves that can be used with ECDSA/ECDH that are not explicitly called out in RFC 6637, but have standardized OIDs and are implemented in other software.

Progress | 4/5
--- | ---
Curves | 4/5
✓ | Curve Brainpool P-256
✓ | Curve Brainpool P-384
✓ | Curve Brainpool P-512
| Curve Curve25519
✓ | Curve SECP256K1

Note

Use of Brainpool curves with ECDSA/ECDH Although these curves are not explicitly mentioned in an RFC for OpenPGP at this point, GnuPG 2.1.x+ does support using them, so I have included them here as well.

* Cipher availability depends on the currently installed OpenSSL being compiled with support for it