pgpstuff.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. var nb = require("buffa");
  2. var openpgp = require("openpgp");
  3. function cleanpgpstring(astr) {
  4. var str = astr.trim();
  5. str = str.replace(/\r/g, "\n");
  6. str = str.replace(/\n\n/g, "\n");
  7. var a = str.split("\n");
  8. a = a.filter(function(aa) {
  9. return !(aa.indexOf("Version") > -1 || aa.indexOf("Comment") > -1)
  10. })
  11. str = a.join("\n");
  12. return str;
  13. }
  14. function makeloginstr(str) {
  15. return nb(cleanpgpstring(str)).toBase(54);
  16. }
  17. function create_identity(opt) {
  18. var options = Object.assign({
  19. "passphrase": "",
  20. "numBits": 1024,
  21. "userIds": {
  22. "name": "user",
  23. "email": ""
  24. }
  25. }, opt)
  26. var oper = openpgp.generateKey(options)
  27. .then(
  28. function(keya) {
  29. keya.publickey = makeloginstr(keya.publicKeyArmored)
  30. keya.sid = nb(keya.publickey).SHA1().toBase(36);
  31. var kkk = {
  32. "secured": false,
  33. "sid": keya.sid,
  34. "publickey": keya.publickey,
  35. privatekey: makeloginstr(keya.privateKeyArmored),
  36. "options": options
  37. }
  38. if (keya.key.primaryKey.encrypted) {
  39. kkk.secured = true;
  40. }
  41. kkk.key = keya.key;
  42. return kkk;
  43. })
  44. return oper;
  45. }
  46. function encrypt_object_to(keystr, obj, cb) {
  47. var keyen = openpgp.key.readArmored(nb(keystr, 54).toString());
  48. var key = keyen.keys[0];
  49. var options = {
  50. data: JSON.stringify(obj, true, 2), // input as String (or Uint8Array)
  51. publicKeys: key, // for encryption
  52. };
  53. openpgp.encrypt(options).then(function(ciphertext) {
  54. var encrypted = nb(cleanpgpstring(ciphertext.data)).toBase(59); // '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----'
  55. cb(encrypted);
  56. });
  57. }
  58. function decrypt_object_to(keystr, objstr, cb, passphrase) {
  59. var keyen = openpgp.key.readArmored(nb(keystr, 54).toString());
  60. var key = keyen.keys[0];
  61. if (passphrase) {
  62. key.decrypt(passphrase)
  63. } else {
  64. key.decrypt(prompt("passphrase"))
  65. }
  66. var options = {
  67. message: openpgp.message.readArmored(nb(objstr, 59).toString()), // parse armored message
  68. privateKey: key // for decryption
  69. };
  70. openpgp.decrypt(options).then(function(plaintext) {
  71. var decrypted = JSON.parse(plaintext.data)
  72. cb(decrypted);
  73. })
  74. }
  75. module.exports = {
  76. decrypt_object_to: decrypt_object_to,
  77. encrypt_object_to: encrypt_object_to,
  78. create_identity: create_identity,
  79. makeloginstr: makeloginstr,
  80. cleanpgpstring: cleanpgpstring,
  81. openpgp: openpgp
  82. }