pgp-key-server.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { Injectable } from "@angular/core";
  2. import { Storage } from "@ionic/storage";
  3. import * as openpgp from 'openpgp';
  4. @Injectable()
  5. export class PgpKeyServerProvider {
  6. hkp = new openpgp.HKP('https://sks-keyservers.net/');
  7. pk: any[] = [];
  8. passphrase = "passphrase";
  9. constructor(private storage: Storage) {}
  10. public async generateKey(passphrase, email) {
  11. let options = {
  12. userIds: [{ email: email }], // multiple user IDs
  13. curve: "ed25519", // ECC curve name
  14. passphrase: this.passphrase // protects the private key
  15. };
  16. let a = await openpgp.generateKey(options);
  17. console.log('the key generated is:', a);
  18. return a;
  19. }
  20. public async publishPubKey(pubkey) {
  21. console.log('passing pubkey to uplaoded : ', pubkey);
  22. this.hkp.upload(pubkey).then(function(result) {
  23. console.log('public key successfully uploaded',result);
  24. });
  25. }
  26. public async lookupKeys(email: string) {
  27. console.log('looking up keys for',email);
  28. var options = {
  29. query: email
  30. };
  31. try{
  32. let armoredPubkey = await this.hkp.lookup(options);
  33. let pubkey = (await openpgp.key.readArmored(armoredPubkey)).keys[0];
  34. console.log('Found latest public key:', pubkey);
  35. this.pk.push(pubkey);
  36. return pubkey;
  37. }
  38. catch(err){
  39. console.log("Error: key not found",err);
  40. return "Key not found";
  41. }
  42. }
  43. /**
  44. * Encrypt text with RSA
  45. * @param plainText plain text
  46. * @param privateKey private key
  47. */
  48. public async encrypt(plainText) {
  49. console.log('pk is:', this.pk);
  50. if(!this.pk){ console.log("this.pk is empty"); return;}
  51. // this.lookupKeys('rohit.shiva.gowda@gmail.com');
  52. const options = {
  53. message: openpgp.message.fromText(plainText), // input as Message object
  54. publicKeys: await Promise.all(this.pk), // for encryption
  55. // privateKey s: [privKeyObj] // for signing (optional)
  56. }
  57. // console.log('options are:', options);
  58. const ciphertext = await openpgp.encrypt(options);
  59. console.log('encrypted text is:', ciphertext);
  60. return ciphertext.data;
  61. }
  62. public async decrypt(encrypted: string,a) {
  63. const privKeyObj = (await openpgp.key.readArmored(a)).keys[0];
  64. console.log('privKeyObj', privKeyObj);
  65. await privKeyObj.decrypt(this.passphrase);
  66. // console.log('a is:',a);
  67. const options2 = {
  68. message: await openpgp.message.readArmored(encrypted), // parse armored message
  69. privateKeys: [privKeyObj] // for decryption
  70. }
  71. // console.log('options2 is: ', options2);
  72. try{
  73. let plaintext = await openpgp.decrypt(options2);
  74. console.log('decrypted text is:', plaintext);
  75. return plaintext.data // 'Hello, World!'
  76. }
  77. catch(err){
  78. console.log('Error thrown:',err);
  79. }
  80. return null;
  81. }
  82. public async revokeKey() {
  83. //using revocation certificate
  84. let pubkey = await this.storage.get("publicKey");
  85. let atest = (await openpgp.key.readArmored(pubkey)).keys[0];
  86. console.log('inside revoke key pubkey is:', atest);
  87. let revocatnCert = this.storage.get("revocationCert");
  88. try {
  89. var options = {
  90. key: atest,
  91. revocationCertificate: revocatnCert
  92. };
  93. openpgp.revokeKey(options).then(function(key) {
  94. console.log("public key revoked", key);
  95. });
  96. } catch (e) {
  97. console.log('revoke failed1', e);
  98. }
  99. }
  100. }