/** * @author tlwr [toby@toby.codes] * @copyright Crown Copyright 2017 * @license Apache-2.0 */ import Operation from "../Operation"; import kbpgp from "kbpgp"; import { ASP, importPrivateKey, importPublicKey } from "../lib/PGP"; import OperationError from "../errors/OperationError"; import promisifyDefault from "es6-promisify"; const promisify = promisifyDefault.promisify; /** * PGP Encrypt and Sign operation */ class PGPEncryptAndSign extends Operation { /** * PGPEncryptAndSign constructor */ constructor() { super(); this.name = "PGP Encrypt and Sign"; this.module = "PGP"; this.description = "Input: the cleartext you want to sign.\n

\nArguments: the ASCII-armoured private key of the signer (plus the private key password if necessary)\nand the ASCII-armoured PGP public key of the recipient.\n

\nThis operation uses PGP to produce an encrypted digital signature.\n

\nPretty Good Privacy is an encryption standard (OpenPGP) used for encrypting, decrypting, and signing messages.\n

\nThis function uses the Keybase implementation of PGP."; this.inputType = "string"; this.outputType = "string"; this.args = [ { "name": "Private key of signer", "type": "text", "value": "" }, { "name": "Private key passphrase", "type": "string", "value": "" }, { "name": "Public key of recipient", "type": "text", "value": "" } ]; } /** * @param {string} input * @param {Object[]} args * @returns {string} * * @throws {OperationError} if failure to sign message */ async run(input, args) { const message = input, privateKey = args[0], passphrase = args[1], publicKey = args[2]; let signedMessage; if (!privateKey) throw new OperationError("Enter the private key of the signer."); if (!publicKey) throw new OperationError("Enter the public key of the recipient."); const privKey = await importPrivateKey(privateKey, passphrase); const pubKey = await importPublicKey(publicKey); try { signedMessage = await promisify(kbpgp.box)({ "msg": message, "encrypt_for": pubKey, "sign_with": privKey, "asp": ASP }); } catch (err) { throw new OperationError(`Couldn't sign message: ${err}`); } return signedMessage; } } export default PGPEncryptAndSign;