GnuPG implémente OpenPGP pour la signature et le chiffrement de fichiers et d’e-mails, la signature des paquets dans de nombreuses distributions Linux et la signature des commits git. Les faits présentés ici ont été vérifiés sur le paquet Alpine 3.24.2, soit GnuPG 2.4.9 avec libgcrypt 1.12.2. gpg --quick-gen-key avec un simple ID utilisateur crée une clé primaire Ed25519 pour la signature et la certification, ainsi qu’une sous-clé de chiffrement Curve25519 (cv25519), toutes deux en clés de version 4, et la clé primaire expire au bout de 1095 jours (trois ans), sauf si une expiration est indiquée. Examinez les clés et les signatures avec l’inspecteur OpenPGP.
Des clés ECDSA peuvent être créées sur P-256, P-384, P-521, secp256k1 et les trois courbes Brainpool r1 ; nistp224 échoue avec « Unknown elliptic curve ». Le paquet de signature transporte r et s sous forme de deux MPI OpenPGP, ni en DER ni en r‖s de largeur fixe. Les signatures P-256 utilisent SHA-256 par défaut ; demander SHA-256 avec une clé P-384 échoue avec « signing failed: Invalid length », alors que SHA-512 avec une clé P-256 est accepté.
Les nonces sont déterministes : avec l’horloge figée (--faked-system-time), deux signatures d’un même fichier étaient identiques octet par octet, et r correspondait à une implémentation indépendante de la RFC 6979 ; signer deux fois les mêmes données ne réutilise donc pas un nonce de manière dangereuse. s n’est pas normalisé, et une signature dont s a été remplacé par n − s a été reconnue comme bonne, ce qui importe partout où les signatures sont censées être uniques.
Les signatures Ed25519 utilisent l’ancien format EdDSA (algorithme 22) : R et S sont des MPI, et ce que signe Ed25519 est le condensat SHA-512 du fichier et des champs hachés de la signature, non le fichier lui-même. Une fois R et S complétés à gauche jusqu’à 32 octets chacun, R‖S a été vérifié avec OpenSSL sur ce condensat et a échoué sur le fichier : pour vérifier des signatures gpg avec une bibliothèque Ed25519 généraliste, il faut d’abord calculer le condensat OpenPGP. Les clés Ed448 sont créées sous forme de paquets de clé de version 5, le format du brouillon LibrePGP que suit GnuPG, alors que les clés par défaut, ECDSA et Ed25519 testées étaient toutes en version 4 ; assurez-vous que l’autre partie lit la version 5 avant de choisir Ed448. Cette version ne comporte aucun algorithme post-quantique : la liste des algorithmes à clé publique est RSA, ELG, DSA, ECDH, ECDSA et EDDSA, et ky768_cv25519 est rejeté comme courbe inconnue.
Dans les scripts, lisez la sortie lisible par machine de --status-fd plutôt que le texte : une signature valide a donné GOODSIG et VALIDSIG avec le code de sortie 0, une signature portant sur d’autres données BADSIG avec le code de sortie 1, et un paquet tronqué NODATA avec le code de sortie 2. gpg --export-ssh-key suivi d’une empreinte et de ! écrit une ligne de clé publique OpenSSH pour les clés ECDSA et Ed25519, alors que --export et --export-secret-keys écrivent des paquets OpenPGP.