var nb = require("buffa"); var openpgp = require("openpgp"); function cleanpgpstring(astr) { var str = astr.trim(); str = str.replace(/\r/g, "\n"); str = str.replace(/\n\n/g, "\n"); var a = str.split("\n"); a = a.filter(function(aa) { return !(aa.indexOf("Version") > -1 || aa.indexOf("Comment") > -1) }) str = a.join("\n"); return str; } function makeloginstr(str) { return nb(cleanpgpstring(str)).toBase(54); } function create_identity(opt) { var options = Object.assign({ "passphrase": "", "numBits": 1024, "userIds": { "name": "user", "email": "" } }, opt) var oper = openpgp.generateKey(options) .then( function(keya) { keya.publickey = makeloginstr(keya.publicKeyArmored) keya.sid = nb(keya.publickey).SHA1().toBase(36); var kkk = { "secured": false, "sid": keya.sid, "publickey": keya.publickey, privatekey: makeloginstr(keya.privateKeyArmored), "options": options } if (keya.key.primaryKey.encrypted) { kkk.secured = true; } kkk.key = keya.key; return kkk; }) return oper; } function encrypt_object_to(keystr, obj, cb) { var keyen = openpgp.key.readArmored(nb(keystr, 54).toString()); var key = keyen.keys[0]; var options = { data: JSON.stringify(obj, true, 2), // input as String (or Uint8Array) publicKeys: key, // for encryption }; openpgp.encrypt(options).then(function(ciphertext) { var encrypted = nb(cleanpgpstring(ciphertext.data)).toBase(59); // '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----' cb(encrypted); }); } function decrypt_object_to(keystr, objstr, cb, passphrase) { var keyen = openpgp.key.readArmored(nb(keystr, 54).toString()); var key = keyen.keys[0]; if (passphrase) { key.decrypt(passphrase) } else { key.decrypt(prompt("passphrase")) } var options = { message: openpgp.message.readArmored(nb(objstr, 59).toString()), // parse armored message privateKey: key // for decryption }; openpgp.decrypt(options).then(function(plaintext) { var decrypted = JSON.parse(plaintext.data) cb(decrypted); }) } module.exports = { decrypt_object_to: decrypt_object_to, encrypt_object_to: encrypt_object_to, create_identity: create_identity, makeloginstr: makeloginstr, cleanpgpstring: cleanpgpstring, openpgp: openpgp }