From 772f7866bfcf243629a9134169b8d21ff37bc245 Mon Sep 17 00:00:00 2001 From: GCHQDeveloper581 <63102987+GCHQDeveloper581@users.noreply.github.com> Date: Thu, 28 May 2026 09:17:43 +0100 Subject: [PATCH] Fix pgp tests (#2461) Co-authored-by: C85297 <95289555+C85297@users.noreply.github.com> (fix for #2267) --- src/core/config/Categories.json | 1 + src/core/operations/GeneratePGPKeyPair.mjs | 15 +- src/core/operations/PGPSign.mjs | 83 ++++++ tests/node/index.mjs | 1 + tests/node/tests/PGP.mjs | 69 +++++ tests/operations/tests/PGP.mjs | 332 +++++++++++---------- 6 files changed, 340 insertions(+), 161 deletions(-) create mode 100644 src/core/operations/PGPSign.mjs create mode 100644 tests/node/tests/PGP.mjs diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json index 5fcba297..3404dc6d 100644 --- a/src/core/config/Categories.json +++ b/src/core/config/Categories.json @@ -188,6 +188,7 @@ "Generate PGP Key Pair", "PGP Encrypt", "PGP Decrypt", + "PGP Sign", "PGP Verify", "PGP Encrypt and Sign", "PGP Decrypt and Verify", diff --git a/src/core/operations/GeneratePGPKeyPair.mjs b/src/core/operations/GeneratePGPKeyPair.mjs index a26b5cc8..e3fd6742 100644 --- a/src/core/operations/GeneratePGPKeyPair.mjs +++ b/src/core/operations/GeneratePGPKeyPair.mjs @@ -12,6 +12,7 @@ import { getSubkeySize, ASP } from "../lib/PGP.mjs"; import { cryptNotice } from "../lib/Crypt.mjs"; import * as es6promisify from "es6-promisify"; const promisify = es6promisify.default ? es6promisify.default.promisify : es6promisify.promisify; +const KEY_FLAGS = kbpgp.const.openpgp.key_flags; /** @@ -73,11 +74,11 @@ class GeneratePGPKeyPair extends Operation { if (name) userIdentifier += name; if (email) userIdentifier += ` <${email}>`; - let flags = kbpgp.const.openpgp.certify_keys; - flags |= kbpgp.const.openpgp.sign_data; - flags |= kbpgp.const.openpgp.auth; - flags |= kbpgp.const.openpgp.encrypt_comm; - flags |= kbpgp.const.openpgp.encrypt_storage; + let flags = KEY_FLAGS.certify_keys; + flags |= KEY_FLAGS.sign_data; + flags |= KEY_FLAGS.auth; + flags |= KEY_FLAGS.encrypt_comm; + flags |= KEY_FLAGS.encrypt_storage; const keyGenerationOptions = { userid: userIdentifier, @@ -89,11 +90,11 @@ class GeneratePGPKeyPair extends Operation { }, subkeys: [{ "nbits": getSubkeySize(keySize), - "flags": kbpgp.const.openpgp.sign_data, + "flags": KEY_FLAGS.sign_data, "expire_in": 86400 * 365 * 8 }, { "nbits": getSubkeySize(keySize), - "flags": kbpgp.const.openpgp.encrypt_comm | kbpgp.const.openpgp.encrypt_storage, + "flags": KEY_FLAGS.encrypt_comm | KEY_FLAGS.encrypt_storage, "expire_in": 86400 * 365 * 2 }], asp: ASP diff --git a/src/core/operations/PGPSign.mjs b/src/core/operations/PGPSign.mjs new file mode 100644 index 00000000..e3063d89 --- /dev/null +++ b/src/core/operations/PGPSign.mjs @@ -0,0 +1,83 @@ +/** + * @author GCHQDeveloper581 + * @copyright Crown Copyright 2026 + * @license Apache-2.0 + */ + +import Operation from "../Operation.mjs"; +import kbpgp from "kbpgp"; +import { ASP, importPrivateKey } from "../lib/PGP.mjs"; +import OperationError from "../errors/OperationError.mjs"; +import * as es6promisify from "es6-promisify"; +const promisify = es6promisify.default ? es6promisify.default.promisify : es6promisify.promisify; + +/** + * PGP Sign operation + */ +class PGPSign extends Operation { + + /** + * PGPSign constructor + */ + constructor() { + super(); + + this.name = "PGP Sign"; + this.module = "PGP"; + this.description = [ + "Input: the message you want to sign", + "

", + "Arguments: the ASCII-armoured PGP private key of the sender.", + "

", + "Pretty Good Privacy is an encryption standard (OpenPGP) used for encrypting, decrypting, and signing messages.", + "

", + "This function uses the Keybase implementation of PGP.", + ].join("\n"); + this.infoURL = "https://wikipedia.org/wiki/Pretty_Good_Privacy"; // Usually a Wikipedia link. Remember to remove localisation (i.e. https://wikipedia.org/etc rather than https://en.wikipedia.org/etc) + this.inputType = "string"; + this.outputType = "string"; + this.args = [ + { + "name": "Private key of signer", + "type": "text", + "value": "" + }, + { + "name": "Private key passphrase (optional)", + "type": "string", + "value": "" + } + ]; + } + + /** + * @param {string} input + * @param {Object[]} args + * @returns {string} + * + * @throws {OperationError} if failed private key import or failed encryption + */ + async run(input, args) { + const message = input, + [privateKey, passphrase] = args; + let signedMessage; + + if (!privateKey) throw new OperationError("Enter the private key of the signer."); + const privKey = await importPrivateKey(privateKey, passphrase); + + try { + signedMessage = await promisify(kbpgp.box)({ + "msg": message, + "sign_with": privKey, + "asp": ASP + }); + } catch (err) { + throw new OperationError(`Couldn't sign message: ${err}`); + } + + return signedMessage; + } + +} + +export default PGPSign; diff --git a/tests/node/index.mjs b/tests/node/index.mjs index f872f8f4..52670d48 100644 --- a/tests/node/index.mjs +++ b/tests/node/index.mjs @@ -18,6 +18,7 @@ import { import TestRegister from "../lib/TestRegister.mjs"; import "./tests/nodeApi.mjs"; import "./tests/operations.mjs"; +import "./tests/PGP.mjs"; import "./tests/File.mjs"; import "./tests/Dish.mjs"; import "./tests/NodeDish.mjs"; diff --git a/tests/node/tests/PGP.mjs b/tests/node/tests/PGP.mjs new file mode 100644 index 00000000..2a695ea3 --- /dev/null +++ b/tests/node/tests/PGP.mjs @@ -0,0 +1,69 @@ +/** + * PGP node tests. + * + * @author C85297 [95289555+C85297@users.noreply.github.com] + * @copyright Crown Copyright 2026 + * @license Apache-2.0 + */ + +import assert from "assert"; +import kbpgp from "kbpgp"; +import * as es6promisify from "es6-promisify"; + +import TestRegister from "../../lib/TestRegister.mjs"; +import it from "../assertionHandler.mjs"; +import GeneratePGPKeyPair from "../../../src/core/operations/GeneratePGPKeyPair.mjs"; + +const promisify = es6promisify.default ? es6promisify.default.promisify : es6promisify.promisify; + +const PUBLIC_KEY_BLOCK = /-----BEGIN PGP PUBLIC KEY BLOCK-----[\s\S]*-----END PGP PUBLIC KEY BLOCK-----/; + +/** + * Generate a PGP key pair and import the generated public key. + * + * @param {string} keyType + * @returns {Promise} + */ +async function generateAndImportPublicKey(keyType) { + const operation = new GeneratePGPKeyPair(); + const generatedKeyPair = await operation.run("", [ + keyType, + "", + "User", + "akb@notreal.gchq.gov.uk" + ]); + + const publicKey = generatedKeyPair.match(PUBLIC_KEY_BLOCK); + + assert(publicKey, "Generated key pair should contain an ASCII-armoured public key"); + + return promisify(kbpgp.KeyManager.import_from_armored_pgp)({ + armored: publicKey[0], + opts: { + "no_check_keys": true + } + }); +} + +TestRegister.addApiTests([ + it("Generate PGP Key Pair: ECC keys should include ECDSA signing and ECDH encryption subkeys", async () => { + const publicKey = await generateAndImportPublicKey("ECC-256"); + const subkeyAlgorithms = publicKey.subkeys.map(subkey => subkey.key.type); + + assert.strictEqual( + publicKey.primary.key.type, + kbpgp.const.openpgp.public_key_algorithms.ECDSA, + "Generated ECC PGP primary key should use ECDSA" + ); + + assert( + subkeyAlgorithms.includes(kbpgp.const.openpgp.public_key_algorithms.ECDSA), + "Generated ECC PGP key should include an ECDSA signing subkey" + ); + + assert( + subkeyAlgorithms.includes(kbpgp.const.openpgp.public_key_algorithms.ECDH), + "Generated ECC PGP key should include an ECDH encryption subkey" + ); + }) +]); diff --git a/tests/operations/tests/PGP.mjs b/tests/operations/tests/PGP.mjs index 8df05fe9..0d2b1bca 100644 --- a/tests/operations/tests/PGP.mjs +++ b/tests/operations/tests/PGP.mjs @@ -10,138 +10,144 @@ import {ASCII_TEXT, UTF8_TEXT, ALL_BYTES} from "../../samples/Ciphers.mjs"; // RSA-1024 const ALICE_PRIVATE = `-----BEGIN PGP PRIVATE KEY BLOCK----- -Version: Keybase OpenPGP v2.0.77 +Version: Keybase OpenPGP v2.1.17 Comment: https://keybase.io/crypto -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 -W03Cwfs= -=Mb52 +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 +Eq/5/Q== +=HBWf -----END PGP PRIVATE KEY BLOCK-----`; const ALICE_PUBLIC = `-----BEGIN PGP PUBLIC KEY BLOCK----- -Version: Keybase OpenPGP v2.0.77 +Version: Keybase OpenPGP v2.1.17 Comment: https://keybase.io/crypto -xo0EWw1piwEEAL2ueaNPMssEJ7LaCr26f5dc/Tz2w/cA42FKK90mUkQRaO3332iD -y8zXxNwSTWzHIi2n8YuUT9PvQ08UC91VcojQoNBn1+bvskMqK2XnzuelFqyk45cv -XJRUUZWvhgQ8MugBPg8mDAjdOwQF8sZ45moGp3+y3D8UqOs1kktFh+OdABEBAAHN -AMK0BBMBCgAeBQJbDWmLAhsvAwsJBwMVCggCHgECF4ADFgIBAhkBAAoJEIQkZUjf -mOSF4+UD/AmZ7Nc5VpO0t+w4b8XtytxGFYHn3PhA1rI98b5aPkFCkDAJgDRTZ6mM -7fvpr3FYbxs8p/sGtuOHyW98RmAIvhuGGuaVkG10swFYY7Xh8i3I0ulWf8ncQxgm -St+xnDGLP/MeJMHVPgPP20ISfp0VRCY5INDnKB/ayb9JAfopXAuyzo0EWw1piwEE -AOXOJib0QIvuqKAZiN3Yol3xC9Wz5aXQyg7qCnnYHHrPIMgYvGrTjjvDFCwM5uxC -v38Qd6rJnzrRXTC1EiAia/b7f76Z0r4W+j6KdVCGpQnVQE6b//WdY5ys1xLAkNr4 -xwNj42nrOIMGB1qV0XezJ4VBOMpMHlwE2WR27HOQakXDABEBAAHCwIMEGAEKAA8F -AlsNaYsFCQ8JnAACGy4AqAkQhCRlSN+Y5IWdIAQZAQoABgUCWw1piwAKCRA+2VNA -UiMLOuO9BACHIaNnbMMzHJcDegSgPdF+M9C0BgU8nmLT+Kv8UPadfv/9zJ3zMlLb -g/pL34gPy8HSf4nAXoqu+Oqkyd5dds+aLk55uoyiAtqFaaEK2OuIMqt8kmIvQeZM -oaXz2nZnn14GgtubgmmTWsvsSaiJuyZRl0FS61/S3Dki6xd38Hmw3CF2BACsHPId -UgXI3596BMT1xHrvsz3Y2NiGpjxz58X8BX7tdC/RWyL0H/8d5MwKaXqPK3F1IhkG -Xu4utqwg53QUmT5U/tSs58NrPqhWr61qtK0B6V+pP0NFBfD6cR16zhvEOw++LU6J -5O17ElE7XzXN2yY66S/ZGGCsnMUJynMCRRgaqM6NBFsNaYsBBACwyhti+jTYU12d -zCSS1bRDw+uXPSpk/A2oCVwqdHJd20G3LPsy5rH2MJyCjUzsZ4cQBEfuXuo5luCu -7Gy2Ofd6zoqg111/DkdvLfPCBo5SK1XftrevpmuXnEoLMlagQxRU6QM4PkBVnZNl -RDpQOczXwnV/eKS1DIzwwB0rGX67nwARAQABwsCDBBgBCgAPBQJbDWmLBQkDwmcA -AhsuAKgJEIQkZUjfmOSFnSAEGQEKAAYFAlsNaYsACgkQW/Z2teklb4u5/gP/fnZ7 -ZuV+l4c2EQY5Xnk8S/lY3Xr9zoucjQwQWeRKwAQYoiovzxA4XV8gGyrdAsrIPUFL -p7PmUBG4YJV/7sVozzRwVq+jS8Jo0xYbGJMv2DuAnXXrYCZWZRqRscr1Wlc+CUAC -mxYZjC1DVVrAXr0jTqYTk+jjhemTTAtUelgMhcX82wP9EEU66hCYFUayjn4bBlR1 -yEvMpJd8JSTHR/dZH8t3Ri6R2AYRqBxro0JEXDhL9iDnuPQVxsbgq2YlhHrPJI8o -pKuxV7wrXrupzwFfKixJMNwsAPk/nSc4qIZvXTi2fmyAZDJYUgsm6CwkxumaVvId -VNGRmxqGSRTuEIntW03Cwfs= -=PuGL +xo0EahcezQEEAMHouiP41c1AGBU0IO0VjE2+O9WKc8Cpbv+ymy+MI6EOsiSoZ/Z+ +hjqyMumx1loeH4K0QClzcWfeAtKrXs8JjQonByKtuneRjITNnasCEmWmqZbea5qa +p9+s6A6m+VHUehrtIvipNaq/Bfrynk9RwRMoAoTYJBUyPWaSLzzaV0zNABEBAAHN +AMK0BBMBCgAeBQJqFx7NAhsvAwsJBwMVCggCHgECF4ADFgIBAhkBAAoJEBt1IEsq +342M/VsEALQX4Lc7Udc9Obc5AnxABhzDZnCaFHYeZFJwyWtHpIN60gGFkz9vePji +0DP1Kbeyo6awzUIzA8tuIGgZXQCJ04KPCP8dSXH0HpbrmSinuJW5kk+ttvaJxOm1 +3m9e52i2WkomCP6i8gvMXm/VpH5kfLkbpl0ha0ycR7z8yweD4Mdpzo0EahcezQEE +AKjU543TxZbzZiae6XWFIXjFgWE/vBC+5ZYEyTAG6jtwfP4tgagb+chJG+hoFA9H +ZXXPr5CPiNZUW6aPpbaMRmubIZs7uCpw3RfcZ+AR+Q9unf0kCJxXThRBhhWHipaL +B44MweCueUawRjwnJVog9nIEE1Heg5G9/fHemLZJ7iU/ABEBAAHCwIMEGAEKAA8F +AmoXHs0FCQ8JnAACGy4AqAkQG3UgSyrfjYydIAQZAQoABgUCahcezQAKCRA5/CQI +qiKa+krFA/9Tnl0E4Ck9zR6BYKAQFpShzBnpODx28LDn/yH+20e1vt2Hgb5cerfM +87PzIdLbavS5OYNtAVPtCc9a4WA3lQFggziOKVNt5UtsI9hNe8KfMAXpBEtXU53C +sRKkWzi+rBlSZ9/Oh4jqsUcj0cceJRn9La71h3Kot8cxNl72zyIHK4y2A/4jNAej +Mx0Rc0VSUWnHD9vlO/imzkez7+JKIYkMm8LrG1ZeLaSlTaQ0AIpbr2+3/kMuWhM0 +dU4BHtmjjNU5ijq7/+ZBG+O2bO+vlYmDpOL6j+dkRpQgvsJdoLBt14mQbxBJfVTm +XvfhTUPZT4nCZN+5nUNAF2XsDatMic+Yjki7Ps6NBGoXHs0BBADEJr0pscgaUine +6UW2M0zQ57UybQphUYv4xYeZwOG1NvNLK6jcxQ9NGIlhUhJ/hV4piYy4A4bt7/Vy +O+CgSDWXf7kc8YL1tve9k9KIMceAT60Wt7QnHSSooysH5zRtE/Zqzc9luD9iWNGU +dKSAveJ5tJoPBJBB8cAsqWr8ZqP5qQARAQABwsCDBBgBCgAPBQJqFx7NBQkDwmcA +AhsuAKgJEBt1IEsq342MnSAEGQEKAAYFAmoXHs0ACgkQjWbXIJgXR6SYaQP+PjA9 +SI4z/bbROkoNv73VCWM4o9r0DMASHK2Dyd71vOoOFjM/GtpGgQvjAKB82Db7+wsG +T6V6bxpvY1sMOxCjphsLs2u2IvZLHqlc/v8CCXLHoiN3v6PVwkYG17UyZoDbCVt3 +0SCZ5jJ7gCf+MpC9RseIteW5MtbFtKb6FwGgi9GNQQQAr4PFi8aXZ71lmB7/c/8f +XAzsWRto9v64xtlZwpQ5GSOPvwzNjQfZf3Q4lKormkoqTxxC1tsxRxvbr51ZwfJU +8LCfKZz9p+M1ncX6nyJBJupmesqfrjWizzuEYqo8D4q0jaoWq6lEsUWLSBcJXKaA +kHFtNAeebzImsGV9hhKv+f0= +=IODM -----END PGP PUBLIC KEY BLOCK-----`; // ECC-384 const BOB_PRIVATE = `-----BEGIN PGP PRIVATE KEY BLOCK----- -Version: Keybase OpenPGP v2.0.77 +Version: Keybase OpenPGP v2.1.17 Comment: https://keybase.io/crypto -xcAABFsNafYBAYDHiv+tCi4267xI6iTmBrhOKdNbKLWIYMG1OoE1f9qpT+nAVKFR -zUAFXKqQjqMDESkAEQEAAQABewd7cLkIQHGKly8PE+P0h7fV7X5bJqwZiqDwC8DU -38vCUO/KtkZO3jEQYA1U9DsNDQDA73KCr3K1tSX1afeWzb8vVBY4ZzXocKb9AMDV -Vk17t1N4nClMfqpGIDELtYBMiiCDyJ0AwLsnQb9cE+g1MZETtNDYXXxilkO/4CP9 -8j4HzQDCZAQTAQoAHgUCWw1p9gIbLwMLCQcDFQoIAh4BAheAAxYCAQIZAQAKCRCE -cIHWt/IPg+sqAYC6goCyOCYD/DytOW3I2cb12iDyFOSDsOx6lrmIgLyP0dDnbJHb -S9ar68yuHeDqP7jHiARbDWn2AQEAwSE4qpbLQzSIUfwmfWXmHneAuQIkEYawRxK/ -H1JkGxcAEQEAAQAA/0pvbnK5OdBGMABBSehs3LrW/hWWIL0y/MfS7h/6gSJ5AID3 -YOgHLqEgM1Bo2TzvIjwlAIDH3E+0ynQFdLH96FPp47eLAH9e/NZ74e2N8sTMBoYO -1sbcLp7CkwQYAQoADwUCWw1p9gUJDwmcAAIbLgBICRCEcIHWt/IPgz0gBBkBCgAG -BQJbDWn2AAoJELU8cYHhYcru2lwBAL4OUK2fkhzh2VU3meXgAMWjoP6ryRUCTmSQ -xuULvvCyfZMBfiHzV5QLgXSUVUA7Og6mlH5pw2gtgsZhijwwywkzF3tQ+s++hOZR -161wHxQKgwHIU8eIBFsNafYBAQCjOV/I3a0HkXVtLndCrWFcjmLzim9PX8EpYUV3 -yG2/AQARAQABAAD8DBWPVduzl7/ZJcAu7CzR7F376NxG8J42+ioX12n9cNEAgNj7 -qAcnQCtTDlb1waf4mdcAgMCTCuwur8AqIOSjoOzqwucAf1MfeKXhwNAEtoiD7S44 -f8UvxsKTBBgBCgAPBQJbDWn2BQkDwmcAAhsuAEgJEIRwgda38g+DPSAEGQEKAAYF -AlsNafYACgkQNBtaoVz6VrvTVAD+LD063VrU7vlJ7xQwtMun4G3FW+RKgb7Rsww8 -B1mt68F5dQGAm8ctxECzEMmyO8jSkjOLkG6u8zLQWFm9MBZqcdmt6EUDf1dA/3xu -/y59qEGb0j4w -=I/Gz +xaQEahclbRMFK4EEACIDAwSvC1SlbUU7/QJFldLQGfAeyhu0mRvTIcxzANM9SdkI +dS2ArnVOZCB7cnfj5AF1nAjphKCv+01LAkGpCF6dUrvDwDeicMaq+E1OPVc+G0bH +O4qQwJgyRLV/GNUZ0ASSmNYAAYCxPV5eRqoX/13vQ38EFBDqWVQE5BuIvvFqNI2R +2RW7hAyI8AWazxDF90gurec8mWYXJM0AwpYEExMKAB4FAmoXJW0CGy8DCwkHAxUK +CAIeAQIXgAMWAgECGQEACgkQXd9oo/PqkifstAF+KMP1xACDyAqsoZjzmOdD03+r +qaHk3EDO7J98qA+g3laUj/bx21IM8FJNEJHKs9TpAYD8LpHAGHmDuBKZDCZKabIS +avxAOuoEHOOu9GlGk+8LgftPLW3EYUf/R7m4mGIq1UzHdwRqFyVtEwgqhkjOPQMB +BwIDBGf0GrkZYEH+SU15lkMjYcHndaqwYbF+JPgUVc6ZiQYDkaY2uodq+n82HoNr +zsCvKJxzC9upm8qzOwFHL+C7UvoAAP9MeWPmsuLSLXq+cVeqoEHAFQ/VYTBL/N7A +XeiiDdUbKBFmwsAnBBgTCgAPBQJqFyVtBQkPCZwAAhsCAGoJEF3faKPz6pInXyAE +GRMKAAYFAmoXJW0ACgkQVQZtQ9p5kJtfDQD+Ns1eh7rEAXveFSOLhx7Vw/5kUWm8 +wVWbqWDK5tJTF5EA/2+3jIQfg+/pE+VkO/NuIGQ9bUqGmGuX0s14TcjqDm9LNugB +f27462A7iEkTab0nOQXtd6+L3PeHRUPUT1CFq+74M5GABr0wobJ5CCaQNxQH++IK +vwF+MSD0JajEVgi99qzSQOTZe8UGArddSCIJuUxNwEzaxvT6DombpLJ2O4yYklR/ +xwoJx3sEahclbRIIKoZIzj0DAQcCAwRjn9T4UunA8a8ZuWP31AJheebCAcPFWBGx +dkxFeX65heVpMipOZ97EczRkitfAmiwt7cREq6yhvZ42KMOcZHPIAwEKCQABAFwA +UyvBBcchnSFCguG8EbEeA+DFKS62fvhqMHyMLGtfDUvChwQYEwoADwUCahclbQUJ +A8JnAAIbDAAKCRBd32ij8+qSJ1+sAX4wkp3GZiRAtUZujC3bJ0ukYJjieNHFapA6 +r+0ku3mR/9OFDbVaTPEcL7nhgGY94q8BfRvczdClIK0rdY/bopQDq4uERoiB/bsH +1VFadIEvMZeIppWGb8d93IpZErGT9xQI8A== +=XC/n -----END PGP PRIVATE KEY BLOCK-----`; const BOB_PUBLIC = `-----BEGIN PGP PUBLIC KEY BLOCK----- -Version: Keybase OpenPGP v2.0.77 +Version: Keybase OpenPGP v2.1.17 Comment: https://keybase.io/crypto -xj0EWw1p9gEBgMeK/60KLjbrvEjqJOYGuE4p01sotYhgwbU6gTV/2qlP6cBUoVHN -QAVcqpCOowMRKQARAQABzQDCZAQTAQoAHgUCWw1p9gIbLwMLCQcDFQoIAh4BAheA -AxYCAQIZAQAKCRCEcIHWt/IPg+sqAYC6goCyOCYD/DytOW3I2cb12iDyFOSDsOx6 -lrmIgLyP0dDnbJHbS9ar68yuHeDqP7jOLQRbDWn2AQEAwSE4qpbLQzSIUfwmfWXm -HneAuQIkEYawRxK/H1JkGxcAEQEAAcKTBBgBCgAPBQJbDWn2BQkPCZwAAhsuAEgJ -EIRwgda38g+DPSAEGQEKAAYFAlsNafYACgkQtTxxgeFhyu7aXAEAvg5QrZ+SHOHZ -VTeZ5eAAxaOg/qvJFQJOZJDG5Qu+8LJ9kwF+IfNXlAuBdJRVQDs6DqaUfmnDaC2C -xmGKPDDLCTMXe1D6z76E5lHXrXAfFAqDAchTzi0EWw1p9gEBAKM5X8jdrQeRdW0u -d0KtYVyOYvOKb09fwSlhRXfIbb8BABEBAAHCkwQYAQoADwUCWw1p9gUJA8JnAAIb -LgBICRCEcIHWt/IPgz0gBBkBCgAGBQJbDWn2AAoJEDQbWqFc+la701QA/iw9Ot1a -1O75Se8UMLTLp+BtxVvkSoG+0bMMPAdZrevBeXUBgJvHLcRAsxDJsjvI0pIzi5Bu -rvMy0FhZvTAWanHZrehFA39XQP98bv8ufahBm9I+MA== -=K9ht +xm8EahclbRMFK4EEACIDAwSvC1SlbUU7/QJFldLQGfAeyhu0mRvTIcxzANM9SdkI +dS2ArnVOZCB7cnfj5AF1nAjphKCv+01LAkGpCF6dUrvDwDeicMaq+E1OPVc+G0bH +O4qQwJgyRLV/GNUZ0ASSmNbNAMKWBBMTCgAeBQJqFyVtAhsvAwsJBwMVCggCHgEC +F4ADFgIBAhkBAAoJEF3faKPz6pIn7LQBfijD9cQAg8gKrKGY85jnQ9N/q6mh5NxA +zuyffKgPoN5WlI/28dtSDPBSTRCRyrPU6QGA/C6RwBh5g7gSmQwmSmmyEmr8QDrq +BBzjrvRpRpPvC4H7Ty1txGFH/0e5uJhiKtVMzlIEahclbRMIKoZIzj0DAQcCAwRn +9Bq5GWBB/klNeZZDI2HB53WqsGGxfiT4FFXOmYkGA5GmNrqHavp/Nh6Da87Aryic +cwvbqZvKszsBRy/gu1L6wsAnBBgTCgAPBQJqFyVtBQkPCZwAAhsCAGoJEF3faKPz +6pInXyAEGRMKAAYFAmoXJW0ACgkQVQZtQ9p5kJtfDQD+Ns1eh7rEAXveFSOLhx7V +w/5kUWm8wVWbqWDK5tJTF5EA/2+3jIQfg+/pE+VkO/NuIGQ9bUqGmGuX0s14Tcjq +Dm9LNugBf27462A7iEkTab0nOQXtd6+L3PeHRUPUT1CFq+74M5GABr0wobJ5CCaQ +NxQH++IKvwF+MSD0JajEVgi99qzSQOTZe8UGArddSCIJuUxNwEzaxvT6DombpLJ2 +O4yYklR/xwoJzlYEahclbRIIKoZIzj0DAQcCAwRjn9T4UunA8a8ZuWP31AJheebC +AcPFWBGxdkxFeX65heVpMipOZ97EczRkitfAmiwt7cREq6yhvZ42KMOcZHPIAwEK +CcKHBBgTCgAPBQJqFyVtBQkDwmcAAhsMAAoJEF3faKPz6pInX6wBfjCSncZmJEC1 +Rm6MLdsnS6RgmOJ40cVqkDqv7SS7eZH/04UNtVpM8RwvueGAZj3irwF9G9zN0KUg +rSt1j9uilAOri4RGiIH9uwfVUVp0gS8xl4imlYZvx33cilkSsZP3FAjw +=BHOx -----END PGP PUBLIC KEY BLOCK-----`; TestRegister.addTests([ @@ -205,29 +211,46 @@ TestRegister.addTests([ } ] }, + { + name: "PGP Sign/Verify: RSA, All bytes", + input: ALL_BYTES, + expectedMatch: /Signed by PGP key ID: 2ADF8D8C\nPGP fingerprint: 7afe93ff7614167c3fe831fe1b75204b2adf8d8c\nSigned on .*\n----------------------------------\n/, + recipeConfig: [ + { + "op": "PGP Sign", + "args": [ALICE_PRIVATE, ""] + }, + { + "op": "PGP Verify", + "args": [ALICE_PUBLIC] + } + ] + }, { name: "PGP Decrypt and Verify: UTF8, Alice -> Bob", input: `-----BEGIN PGP MESSAGE----- -Version: Keybase OpenPGP v2.0.77 +Version: Keybase OpenPGP v2.1.17 Comment: https://keybase.io/crypto -wTwDhHCB1rfyD4MBAX9ld8xGcf2v+X+pwINN0R0TvkWxNesKOQIKPV01AH8JG0J+ -+yFqLXqDHgYSLANNamfSwQoBOTWuh/5V6gpiXVm2oLHPv997AtoD/kVQrqylF5Xo -HUsqPGtSgBA5WPX8tMoHKuqWxEy9FviLnIv73OZN0Ph70uo2E+QIv0Qx27znK0Jy -KDSERvcldgShmVbDP3Pxtxkfr9xa2gar5f0OPovOmKGsTGciQJqPkclRwzIXg12L -hyd2ElYOMf6vg/yOc06sX4Ih1Tn6JkYqMVJydykMv3g4Z8OXTfwrMLxwO1n3ZB/T -OLdhBdsnREnyCqntBVjMKoRTQhfwq48n7b6caZ+aCPISdDIyDKBpxEzXaNBeEY2V -GCqORM9WhsQ4A6pAx2SP694qH5vgOwrYrgeOU17oK++mzd1GyU2CXoFi73/PANJD -TdC3hGr+S4XeuqZ368QG1cBWhNybsOu5sM2YbArb71ZMYuLDp+VolJbEkVf4c/dD -pVEOaX39NVKe6HcpOiw+CFO6GEkQqCXNprWK6ivBHzkAlF2pjjqlS6qhWxFPicSD -+1ZKM1fmZu99bhTmdqE3MJx//QMu7mvlHaM85OQkWhWPBxGw/60GVBX9YtvUtfMS -IOE1W/Zqmqzq+4frwnzWwYv9/U1RwIs/qlFVnzliREOzW+om8EncSSd7fQ== -=fEAT +wX4DEY2FMRPYAl0SAgMEKY2yuB8s16oRWWhJ1RsxNhR8byKFUyFZvi0ETIORMYu+ +kkLWgFlVjqPV9q2eVtuVK9f+S/OIm0pztImhq5ZNMDB8r7s0wX4YskSrWRpMKwRr +CtoNlPS3//fT3Ll4a2tn8guxyC7lAtmJ6nxZj+qpSZLSwQwBhFlgARdqlp4eTAhF +PRcqHVCqZYSTdjAyerLtfZDaswEwLgGxsshRSJ7BDHxg7NqRcdFkChrWT0s4JpnV +/Woq0xcApim1bpyHXG/tT4oM3hbjfpulb92gq2TUNdzb9lJGaKbLHl/0zkoBvHDE +pxtr021JXERB8MNDIIpDESpjCrZ20YCHNr/sBqVm0yM7YGrDLlV+n7oUgL4HK2FU +tehxUEt4rca81UesYu/Wul6mHh/7Ft4jJuZuf/w9fCWQ6z+9MAEOBXdzWUp5BCyF +ce1STpICAdtRHInJ9zR08qn0ahrwHsvHPFPVIQJDargD5MSqav/3LS2TYqKYYKHy +TUCxIWqA77Qk3rEaFX+eHxTW4BTlMPArA7ffywkgJAPzrLL+gEgtOLCv2RhNZevR +weglQRtcuh5N/F9fsmPfsi80R0//LpEeyFX6GueXDw81+AKG9pOTI71Ny8H4W0eA +B5dCiOFNHZKCZUlA6GFa04X/XgmfPzTPMtgizbT72/2kfwxJGZY4ngdMVLqfhnVA +nfyQLFrOF9giJqDEsjtPXJ0h20stMLMykPUIK0UUf9vPthE86ugCY1XcGQWsuB4U +jmdH1dqEUk29TaUz/97s +=Ah/0 -----END PGP MESSAGE----- `, - expectedOutput: `Signed by PGP key ID: DF98E485 -PGP fingerprint: e94e06dd0b3744a0e970de9d84246548df98e485 -Signed on Tue, 29 May 2018 15:44:52 GMT + expectedOutput: `Signed by PGP key ID: 2ADF8D8C +PGP fingerprint: 7afe93ff7614167c3fe831fe1b75204b2adf8d8c +Signed on Wed, 27 May 2026 17:18:20 GMT ---------------------------------- ${UTF8_TEXT}`, recipeConfig: [ @@ -238,19 +261,19 @@ ${UTF8_TEXT}`, ] }, { - name: "PGP Decrypt: ASCII, Alice -> Bob", + name: "PGP Decrypt: ASCII, Alice", input: `-----BEGIN PGP MESSAGE----- -Version: Keybase OpenPGP v2.0.77 +Version: Keybase OpenPGP v2.1.17 Comment: https://keybase.io/crypto -wYwDPtlTQFIjCzoBBACSlbN7tmQVxR5ZD0rvCwXUkxO3RU8WgBkkmrTCUs9a+xrS -F9HuKcpX/N6XrwTXyuX3BN2tGys4zd6nHV8jYqBoIyWJsWe3viTa1dh/x4183+GP -fP61gizi3pj0gi2vfGnMhnThbdiO32PVKAeHLHBK+r3XlXZ0kzZCQKRgd55yr9Kk -Aa4SR+qpvtdobkDzbnbhcPLR6CQ8TMjTiNXEpgTc1i0JcP8jaMVFzBt8qgmDMdqU -H2qMY1O7hezH3fp+EZzCAccJMtK7VPk13WAgMRH22HirG4aK1i75IVOtjBgObzDh -8zKua7QLi6wJD/AtQ+D3/NgVpzoXwdoLvTjEcAyy+YWNWkJF/jvx3XV1Q/Fz7sHJ -/bspORYvbi591S4U0m4pikwiOZk= -=AVb/ +wYwDOfwkCKoimvoBA/98ONH8b+HoaDOVLhtF+9Pz5Sk/NZ43htOpm/3+b2B81GKZ +fcUfJYzItyt4X5Ps1ksfrArokG6blkIHPwZdcF7TJ9rWy/cC9S3zP/LF893xT9Z7 +buWj1BjqfNy15WtGJnnQeCJVI4ya0cb3G/I/zAF/mT6R/JcldbJ1OTz9Zy5pZtKi +AQL7B8IscCxsx9jxc1ZR3swn+fr603BVP6/mXRRtKIa5DXZR5uMU9ChZ5AYQeHXe +ZzstlcSJWJvuF+uJy3Yc07ttzqQtOQGLh0iBeALK7BWqLsUBqKabZSHTZ4uFdkv9 +86ZebPsfjVlhz4oFYenBUq1C15Zpvut28pHpgh2TLuXPHKkmTwI2Zz9LvVRjBW7A +rmDPrpTfy9MOrkjkY7zQSevi +=/Zwh -----END PGP MESSAGE-----`, expectedOutput: ASCII_TEXT, recipeConfig: [ @@ -262,21 +285,22 @@ H2qMY1O7hezH3fp+EZzCAccJMtK7VPk13WAgMRH22HirG4aK1i75IVOtjBgObzDh }, { name: "PGP Verify: ASCII, Alice", - input: `-----BEGIN PGP SIGNED MESSAGE----- -Hash: SHA256 + input: `-----BEGIN PGP MESSAGE----- +Version: Keybase OpenPGP v2.1.17 +Comment: https://keybase.io/crypto -A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools. ------BEGIN PGP SIGNATURE----- - -iLMEAQEIAB0WIQRLbJy6MLpYOr9qojE+2VNAUiMLOgUCXRTsvwAKCRA+2VNAUiML -OuaHBADMMNtsuN92Fb+UrDimsv6TDQpbJhDkwp9kZdKYP5HAmSYAhXBG7N+YCMw+ -v2FSpUu9jJiPBm1K1SEwLufQVexoRv6RsBNolRFB07sArau0s0DnIXUchCZWvyTP -1KsjBnDr84U2b11H58g4DlTT4gQrz30rFuHz9AGmPAtDHbSXIA== -=vnk/ ------END PGP SIGNATURE-----`, - expectedOutput: `Signed by PGP key ID: DF98E485 -PGP fingerprint: e94e06dd0b3744a0e970de9d84246548df98e485 -Signed on Thu, 27 Jun 2019 16:20:15 GMT +yMB1AnicO8LLzMDFaPlHhWOV0qxfjKcnljJkiTsIOiok5+fm5ucp5GYWlyRmpyqU +ZCSWKBSk5hfkpCrkggTKM1LzFEqKKjPz0hVK8hVSUosz0/MUivNzU0syQGJA/UC1 +Jak5lQpp+fk5BUX5+WkKmcUgtaV5KalFqcUlmbmJJSCTUxWAGlLzSjNLKhWAimA6 +wfqK9Q7NYWFg5GJgY2UCOYyBi1MA5tqzj1kYZqaFSuxmUvBnvvAzZOOuyT9vnT75 +5GVzY2WfOB8H08l5vCZNbBUegsqPPh2aXPQgo8GglTPO2e7qY75g49mzDm+8POfH +nstrb2/93JHrXD5fbcbuVrsFJ01XWE2Xy7HtTgrasGG7ySLZqLStBj2r0n4dTX7g +MV1ETCdx6nqHA+4as4Oy9040BACRHYIP +=rkte +-----END PGP MESSAGE-----`, + expectedOutput: `Signed by PGP key ID: 2ADF8D8C +PGP fingerprint: 7afe93ff7614167c3fe831fe1b75204b2adf8d8c +Signed on Wed, 27 May 2026 19:03:45 GMT ---------------------------------- A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools.`, recipeConfig: [