@hg-ts/rsa 0.7.25 → 0.7.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +331 -0
  2. package/dist/X25519/index.d.ts +4 -0
  3. package/dist/X25519/index.d.ts.map +1 -0
  4. package/dist/X25519/index.js +4 -0
  5. package/dist/X25519/index.js.map +1 -0
  6. package/dist/X25519/key-pair.d.ts +13 -0
  7. package/dist/X25519/key-pair.d.ts.map +1 -0
  8. package/dist/X25519/key-pair.js +39 -0
  9. package/dist/X25519/key-pair.js.map +1 -0
  10. package/dist/X25519/private-key.d.ts +11 -0
  11. package/dist/X25519/private-key.d.ts.map +1 -0
  12. package/dist/X25519/private-key.js +40 -0
  13. package/dist/X25519/private-key.js.map +1 -0
  14. package/dist/X25519/public-key.d.ts +13 -0
  15. package/dist/X25519/public-key.d.ts.map +1 -0
  16. package/dist/X25519/public-key.js +49 -0
  17. package/dist/X25519/public-key.js.map +1 -0
  18. package/dist/X25519/utils.d.ts +2 -0
  19. package/dist/X25519/utils.d.ts.map +1 -0
  20. package/dist/X25519/utils.js +12 -0
  21. package/dist/X25519/utils.js.map +1 -0
  22. package/dist/X25519/x25519.test.d.ts +18 -0
  23. package/dist/X25519/x25519.test.d.ts.map +1 -0
  24. package/dist/X25519/x25519.test.js +183 -0
  25. package/dist/X25519/x25519.test.js.map +1 -0
  26. package/dist/base/index.d.ts +5 -0
  27. package/dist/base/index.d.ts.map +1 -0
  28. package/dist/base/index.js +5 -0
  29. package/dist/base/index.js.map +1 -0
  30. package/dist/base/key-pair.d.ts +27 -0
  31. package/dist/base/key-pair.d.ts.map +1 -0
  32. package/dist/base/key-pair.js +29 -0
  33. package/dist/base/key-pair.js.map +1 -0
  34. package/dist/base/key.d.ts +7 -0
  35. package/dist/base/key.d.ts.map +1 -0
  36. package/dist/base/key.js +10 -0
  37. package/dist/base/key.js.map +1 -0
  38. package/dist/base/private-key.d.ts +11 -0
  39. package/dist/base/private-key.d.ts.map +1 -0
  40. package/dist/base/private-key.js +4 -0
  41. package/dist/base/private-key.js.map +1 -0
  42. package/dist/base/public-key.d.ts +6 -0
  43. package/dist/base/public-key.d.ts.map +1 -0
  44. package/dist/base/public-key.js +4 -0
  45. package/dist/base/public-key.js.map +1 -0
  46. package/dist/exceptions/index.d.ts +2 -0
  47. package/dist/exceptions/index.d.ts.map +1 -0
  48. package/dist/exceptions/index.js +2 -0
  49. package/dist/exceptions/index.js.map +1 -0
  50. package/dist/exceptions/invalid-decryption-key.expection.d.ts +5 -0
  51. package/dist/exceptions/invalid-decryption-key.expection.d.ts.map +1 -0
  52. package/dist/exceptions/invalid-decryption-key.expection.js +7 -0
  53. package/dist/exceptions/invalid-decryption-key.expection.js.map +1 -0
  54. package/dist/index.d.ts +4 -3
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +4 -3
  57. package/dist/index.js.map +1 -1
  58. package/dist/rsa/index.d.ts +4 -0
  59. package/dist/rsa/index.d.ts.map +1 -0
  60. package/dist/rsa/index.js +4 -0
  61. package/dist/rsa/index.js.map +1 -0
  62. package/dist/rsa/key-pair.d.ts +12 -0
  63. package/dist/rsa/key-pair.d.ts.map +1 -0
  64. package/dist/rsa/key-pair.js +40 -0
  65. package/dist/rsa/key-pair.js.map +1 -0
  66. package/dist/rsa/private-key.d.ts +16 -0
  67. package/dist/rsa/private-key.d.ts.map +1 -0
  68. package/dist/rsa/private-key.js +65 -0
  69. package/dist/rsa/private-key.js.map +1 -0
  70. package/dist/rsa/public-key.d.ts +19 -0
  71. package/dist/rsa/public-key.d.ts.map +1 -0
  72. package/dist/{rsa.public-key.js → rsa/public-key.js} +42 -9
  73. package/dist/rsa/public-key.js.map +1 -0
  74. package/dist/{rsa.test.d.ts → rsa/rsa.test.d.ts} +2 -0
  75. package/dist/rsa/rsa.test.d.ts.map +1 -0
  76. package/dist/{rsa.test.js → rsa/rsa.test.js} +56 -29
  77. package/dist/rsa/rsa.test.js.map +1 -0
  78. package/package.json +11 -9
  79. package/src/X25519/index.ts +3 -0
  80. package/src/X25519/key-pair.ts +58 -0
  81. package/src/X25519/private-key.ts +54 -0
  82. package/src/X25519/public-key.ts +68 -0
  83. package/src/X25519/utils.ts +22 -0
  84. package/src/X25519/x25519.test.ts +150 -0
  85. package/src/base/index.ts +4 -0
  86. package/src/base/key-pair.ts +75 -0
  87. package/src/base/key.ts +13 -0
  88. package/src/base/private-key.ts +17 -0
  89. package/src/base/public-key.ts +7 -0
  90. package/src/exceptions/index.ts +1 -0
  91. package/src/exceptions/invalid-decryption-key.expection.ts +7 -0
  92. package/src/index.ts +4 -3
  93. package/src/rsa/index.ts +3 -0
  94. package/src/rsa/key-pair.ts +55 -0
  95. package/src/rsa/private-key.ts +82 -0
  96. package/src/rsa/public-key.ts +110 -0
  97. package/src/{rsa.test.ts → rsa/rsa.test.ts} +52 -31
  98. package/dist/rsa.base-key.d.ts +0 -17
  99. package/dist/rsa.base-key.d.ts.map +0 -1
  100. package/dist/rsa.base-key.js +0 -57
  101. package/dist/rsa.base-key.js.map +0 -1
  102. package/dist/rsa.key-pair.d.ts +0 -19
  103. package/dist/rsa.key-pair.d.ts.map +0 -1
  104. package/dist/rsa.key-pair.js +0 -46
  105. package/dist/rsa.key-pair.js.map +0 -1
  106. package/dist/rsa.private-key.d.ts +0 -13
  107. package/dist/rsa.private-key.d.ts.map +0 -1
  108. package/dist/rsa.private-key.js +0 -38
  109. package/dist/rsa.private-key.js.map +0 -1
  110. package/dist/rsa.public-key.d.ts +0 -13
  111. package/dist/rsa.public-key.d.ts.map +0 -1
  112. package/dist/rsa.public-key.js.map +0 -1
  113. package/dist/rsa.test.d.ts.map +0 -1
  114. package/dist/rsa.test.js.map +0 -1
  115. package/src/rsa.base-key.ts +0 -78
  116. package/src/rsa.key-pair.ts +0 -65
  117. package/src/rsa.private-key.ts +0 -50
  118. package/src/rsa.public-key.ts +0 -65
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-key.d.ts","sourceRoot":"","sources":["../../src/rsa/public-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AACtC,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAmBjD,qBAAa,YAAa,SAAQ,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC;IACvE,OAAc,MAAM,iFAAU;IAEvB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;IASvC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAejD,QAAQ,IAAI,MAAM;WAIpB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAMtD,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,KAAK;IAIb,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,CAAC,gBAAgB;CAWxB"}
@@ -1,6 +1,6 @@
1
1
  import { z } from '@hg-ts/validation';
2
2
  import forge from 'node-forge';
3
- import { RSABaseKey } from './rsa.base-key.js';
3
+ import { BasePublicKey } from '../base/index.js';
4
4
  const schema = z.string().transform((value, ctx) => {
5
5
  try {
6
6
  const publicKey = forge.pki.publicKeyFromPem(value);
@@ -17,13 +17,8 @@ const schema = z.string().transform((value, ctx) => {
17
17
  return value;
18
18
  }
19
19
  }).pipe(z.string());
20
- export class RSAPublicKey extends RSABaseKey {
21
- key;
20
+ export class RsaPublicKey extends BasePublicKey {
22
21
  static schema = schema;
23
- constructor(key) {
24
- super();
25
- this.key = key;
26
- }
27
22
  encrypt(value) {
28
23
  const md = this.getMd();
29
24
  const chunks = this.prepareToEncrypt(value);
@@ -46,7 +41,45 @@ export class RSAPublicKey extends RSABaseKey {
46
41
  }
47
42
  static fromString(pemKey) {
48
43
  const key = forge.pki.publicKeyFromPem(pemKey);
49
- return new RSAPublicKey(key);
44
+ return new RsaPublicKey(key);
45
+ }
46
+ prepareToEncrypt(data) {
47
+ const input = this.formatDecryptedInputToBinary(data);
48
+ return this.splitBinaryInput(input, this.maxLength);
49
+ }
50
+ formatDecryptedInputToBinary(data) {
51
+ if (typeof data === 'string') {
52
+ return forge.util.encodeUtf8(data);
53
+ }
54
+ return Buffer.from(data).toString('hex');
55
+ }
56
+ formatSignature(data) {
57
+ if (typeof data === 'string') {
58
+ return data;
59
+ }
60
+ return Buffer.from(data).toString('binary');
61
+ }
62
+ formatEncrypted(data) {
63
+ const chunks = data.map(chunk => Buffer.from(chunk, 'binary').toString('hex'));
64
+ return Buffer.from(chunks.join(''), 'hex');
65
+ }
66
+ getMd() {
67
+ return forge.md.sha256.create();
68
+ }
69
+ get maxLength() {
70
+ return this.keyLength - (this.getMd().digestLength * 2) - 2;
71
+ }
72
+ get keyLength() {
73
+ return Math.ceil(this.key.n.bitLength() / 8);
74
+ }
75
+ splitBinaryInput(value, length) {
76
+ const chunks = [];
77
+ let index = 0;
78
+ while (index < value.length) {
79
+ chunks.push(value.slice(index, index + length));
80
+ index += length;
81
+ }
82
+ return chunks;
50
83
  }
51
84
  }
52
- //# sourceMappingURL=rsa.public-key.js.map
85
+ //# sourceMappingURL=public-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-key.js","sourceRoot":"","sources":["../../src/rsa/public-key.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,13 @@
1
1
  import { Suite } from '@hg-ts/tests';
2
2
  export declare class RsaTest extends Suite {
3
+ nativeKey(): Promise<void>;
3
4
  keyPairFromPrivateKey(): Promise<void>;
4
5
  keyPairFromPrivateKeyString(): Promise<void>;
5
6
  keyPairFromPrivateKeyEncryption(): Promise<void>;
6
7
  signature(): Promise<void>;
7
8
  signatureBuffer(): Promise<void>;
8
9
  encryption(): Promise<void>;
10
+ encryptionFailsForAnotherRecipient(): Promise<void>;
9
11
  encryptionRu(): Promise<void>;
10
12
  encryptionHex(): Promise<void>;
11
13
  encryptionEn(): Promise<void>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsa.test.d.ts","sourceRoot":"","sources":["../../src/rsa/rsa.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,KAAK,EAEL,MAAM,cAAc,CAAC;AAQtB,qBACa,OAAQ,SAAQ,KAAK;IAEpB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ1B,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtC,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5C,+BAA+B,IAAI,OAAO,CAAC,IAAI,CAAC;IAYhD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAS1B,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAShC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,kCAAkC,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAS7B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAS7B,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUtC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IASrC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAUvB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrC,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQpC,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ1C,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;CAOvD"}
@@ -1,114 +1,134 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  import { Describe, expect, ExpectException, Suite, Test, } from '@hg-ts/tests';
3
3
  import { z } from '@hg-ts/validation';
4
- import { RSAKeyPair } from './rsa.key-pair.js';
5
- import { RSAPrivateKey } from './rsa.private-key.js';
6
- import { RSAPublicKey } from './rsa.public-key.js';
4
+ import forge from 'node-forge';
5
+ import { InvalidDecryptionKeyExpection } from '../exceptions/index.js';
6
+ import { RsaKeyPair } from './key-pair.js';
7
+ import { RsaPrivateKey } from './private-key.js';
8
+ import { RsaPublicKey } from './public-key.js';
7
9
  let RsaTest = class RsaTest extends Suite {
10
+ async nativeKey() {
11
+ const { privateKeyInstance, privateKey, publicKeyInstance, publicKey } = new RsaKeyPair({ bits: 786 });
12
+ expect(privateKey).toBe(forge.pki.privateKeyToPem(privateKeyInstance.nativeKey));
13
+ expect(publicKey).toBe(forge.pki.publicKeyToPem(publicKeyInstance.nativeKey));
14
+ }
8
15
  async keyPairFromPrivateKey() {
9
- const { privateKey, publicKey } = new RSAKeyPair({ bits: 786 });
10
- const key = RSAPrivateKey.fromString(privateKey);
11
- const keyPairFromKey = new RSAKeyPair({ privateKey: key });
16
+ const { privateKey, publicKey } = new RsaKeyPair();
17
+ const key = RsaPrivateKey.fromString(privateKey);
18
+ const keyPairFromKey = new RsaKeyPair({ privateKey: key });
12
19
  expect(keyPairFromKey.privateKey).toBe(privateKey);
13
20
  expect(keyPairFromKey.publicKey).toBe(publicKey);
14
21
  }
15
22
  async keyPairFromPrivateKeyString() {
16
- const { privateKey, publicKey } = new RSAKeyPair({ bits: 786 });
17
- const keyPairFromKey = new RSAKeyPair({ privateKey });
23
+ const { privateKey, publicKey } = new RsaKeyPair({ bits: 786 });
24
+ const keyPairFromKey = new RsaKeyPair({ privateKey });
18
25
  expect(keyPairFromKey.privateKey).toBe(privateKey);
19
26
  expect(keyPairFromKey.publicKey).toBe(publicKey);
20
27
  }
21
28
  async keyPairFromPrivateKeyEncryption() {
22
- const { privateKey } = new RSAKeyPair({ bits: 786 });
23
- const key = RSAPrivateKey.fromString(privateKey);
29
+ const { privateKey } = new RsaKeyPair({ bits: 786 });
30
+ const key = RsaPrivateKey.fromString(privateKey);
24
31
  const value = Math.random().toString();
25
32
  const encrypted = key.toPublicKey().encrypt(value);
26
33
  const decrypted = key.decrypt(encrypted);
27
34
  expect(value).toBe(decrypted);
28
35
  }
29
36
  async signature() {
30
- const rsa = new RSAKeyPair({ bits: 786 });
37
+ const rsa = new RsaKeyPair({ bits: 786 });
31
38
  const value = Math.random().toString();
32
39
  const signature = rsa.sign(value);
33
40
  expect(rsa.verify(signature.toString('binary'), value)).toBeTruthy();
34
41
  }
35
42
  async signatureBuffer() {
36
- const rsa = new RSAKeyPair({ bits: 786 });
43
+ const rsa = new RsaKeyPair({ bits: 786 });
37
44
  const value = Math.random().toString();
38
45
  const signature = rsa.sign(value);
39
46
  expect(rsa.verify(signature, value)).toBeTruthy();
40
47
  }
41
48
  async encryption() {
42
- const rsa = new RSAKeyPair({ bits: 786 });
49
+ const rsa = new RsaKeyPair({ bits: 786 });
43
50
  const value = Math.random().toString();
44
51
  const encrypted = rsa.encrypt(value);
45
52
  expect(rsa.decrypt(encrypted.toString('hex'))).toBe(value);
46
53
  }
54
+ async encryptionFailsForAnotherRecipient() {
55
+ const rsa = new RsaKeyPair({ bits: 786 });
56
+ const anotherRecipient = new RsaKeyPair({ bits: 786 });
57
+ const value = Math.random().toString();
58
+ const encrypted = rsa.encrypt(value);
59
+ anotherRecipient.decrypt(encrypted.toString('hex'));
60
+ }
47
61
  async encryptionRu() {
48
- const rsa = new RSAKeyPair({ bits: 786 });
62
+ const rsa = new RsaKeyPair({ bits: 786 });
49
63
  const value = 'Тестовый текст';
50
64
  const encrypted = rsa.encrypt(value);
51
65
  expect(rsa.decrypt(encrypted.toString('hex'))).toBe(value);
52
66
  }
53
67
  async encryptionHex() {
54
- const rsa = new RSAKeyPair({ bits: 786 });
68
+ const rsa = new RsaKeyPair({ bits: 786 });
55
69
  const value = Math.floor(Math.random() * 10000).toString(16);
56
70
  const encrypted = rsa.encrypt(value);
57
71
  expect(rsa.decrypt(encrypted.toString('hex'))).toBe(value);
58
72
  }
59
73
  async encryptionEn() {
60
- const rsa = new RSAKeyPair({ bits: 786 });
74
+ const rsa = new RsaKeyPair({ bits: 786 });
61
75
  const value = 'Test text';
62
76
  const encrypted = rsa.encrypt(value);
63
77
  expect(rsa.decrypt(encrypted.toString('hex'))).toBe(value);
64
78
  }
65
79
  async encryptionBuffer() {
66
- const rsa = new RSAKeyPair({ bits: 786 });
80
+ const rsa = new RsaKeyPair({ bits: 786 });
67
81
  const value = Buffer.from(Math.random().toString(), 'utf-8');
68
82
  const encrypted = rsa.encrypt(value);
69
83
  expect(Buffer.from(rsa.decrypt(encrypted), 'hex')).toMatchObject(value);
70
84
  }
71
85
  async longMessageEncryption() {
72
- const rsa = new RSAKeyPair({ bits: 786 });
73
- const rsaToTest = new RSAKeyPair({ bits: 786 });
86
+ const rsa = new RsaKeyPair({ bits: 786 });
87
+ const rsaToTest = new RsaKeyPair({ bits: 786 });
74
88
  const value = rsaToTest.publicKey;
75
89
  const encrypted = rsa.encrypt(value);
76
90
  expect(rsa.decrypt(encrypted)).toBe(value);
77
91
  }
78
92
  async longMessageSignature() {
79
- const rsa = new RSAKeyPair({ bits: 786 });
93
+ const rsa = new RsaKeyPair({ bits: 786 });
80
94
  const value = rsa.publicKey;
81
95
  const signature = rsa.sign(value);
82
96
  expect(rsa.verify(signature, value)).toBeTruthy();
83
97
  }
84
98
  async seeded() {
85
99
  const seed = Math.random().toString();
86
- const rsa1 = new RSAKeyPair({ seed, bits: 786 });
87
- const rsa2 = new RSAKeyPair({ seed, bits: 786 });
100
+ const rsa1 = new RsaKeyPair({ seed, bits: 786 });
101
+ const rsa2 = new RsaKeyPair({ seed, bits: 786 });
88
102
  expect(rsa1.privateKey).toBe(rsa2.privateKey);
89
103
  expect(rsa1.publicKey).toBe(rsa2.publicKey);
90
104
  }
91
105
  async privateKeyFromString() {
92
- const rsa = new RSAKeyPair({ bits: 786 });
93
- const rsaFromString = RSAPrivateKey.fromString(rsa.privateKey);
106
+ const rsa = new RsaKeyPair({ bits: 786 });
107
+ const rsaFromString = RsaPrivateKey.fromString(rsa.privateKey);
94
108
  expect(rsaFromString.toString()).toBe(rsa.privateKey.toString());
95
109
  }
96
110
  async publicKeyFromString() {
97
- const rsa = new RSAKeyPair({ bits: 786 });
98
- const rsaFromString = RSAPublicKey.fromString(rsa.publicKey);
111
+ const rsa = new RsaKeyPair({ bits: 786 });
112
+ const rsaFromString = RsaPublicKey.fromString(rsa.publicKey);
99
113
  expect(rsaFromString.toString()).toBe(rsa.publicKey.toString());
100
114
  }
101
115
  async publicKeyValidationsValid() {
102
- const rsa = new RSAKeyPair({ bits: 786 });
103
- RSAPublicKey.schema.parse(rsa.publicKey.toString());
116
+ const rsa = new RsaKeyPair({ bits: 786 });
117
+ RsaPublicKey.schema.parse(rsa.publicKey.toString());
104
118
  }
105
119
  async publicKeyValidationsFails() {
106
- RSAPublicKey.schema.parse(`-----BEGIN PUBLIC KEY-----
120
+ RsaPublicKey.schema.parse(`-----BEGIN PUBLIC KEY-----
107
121
  MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALnfPJr6J2UXwvZhbPWolBw4UJHAEMd
108
122
  /FvIyIYADhT/k+2TIFixs4pxM5VaGMP7Tny+5WAouv9ulh4tACPxKoMCAwEAAQ==
109
123
  -----END PUBLIC KEY-----`);
110
124
  }
111
125
  };
126
+ __decorate([
127
+ Test(),
128
+ __metadata("design:type", Function),
129
+ __metadata("design:paramtypes", []),
130
+ __metadata("design:returntype", Promise)
131
+ ], RsaTest.prototype, "nativeKey", null);
112
132
  __decorate([
113
133
  Test(),
114
134
  __metadata("design:type", Function),
@@ -145,6 +165,13 @@ __decorate([
145
165
  __metadata("design:paramtypes", []),
146
166
  __metadata("design:returntype", Promise)
147
167
  ], RsaTest.prototype, "encryption", null);
168
+ __decorate([
169
+ Test(),
170
+ ExpectException(InvalidDecryptionKeyExpection),
171
+ __metadata("design:type", Function),
172
+ __metadata("design:paramtypes", []),
173
+ __metadata("design:returntype", Promise)
174
+ ], RsaTest.prototype, "encryptionFailsForAnotherRecipient", null);
148
175
  __decorate([
149
176
  Test(),
150
177
  __metadata("design:type", Function),
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsa.test.js","sourceRoot":"","sources":["../../src/rsa/rsa.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hg-ts/rsa",
3
- "version": "0.7.25",
3
+ "version": "0.7.26",
4
4
  "main": "dist/index.js",
5
5
  "type": "module",
6
6
  "exports": {
@@ -18,12 +18,12 @@
18
18
  "test:dev": "vitest watch"
19
19
  },
20
20
  "devDependencies": {
21
- "@hg-ts-config/typescript": "0.7.25",
22
- "@hg-ts/exception": "0.7.25",
23
- "@hg-ts/linter": "0.7.25",
24
- "@hg-ts/tests": "0.7.25",
25
- "@hg-ts/types": "0.7.25",
26
- "@hg-ts/validation": "0.7.25",
21
+ "@hg-ts-config/typescript": "0.7.26",
22
+ "@hg-ts/exception": "0.7.26",
23
+ "@hg-ts/linter": "0.7.26",
24
+ "@hg-ts/tests": "0.7.26",
25
+ "@hg-ts/types": "0.7.26",
26
+ "@hg-ts/validation": "0.7.26",
27
27
  "@types/node": "22.19.1",
28
28
  "@types/node-forge": "^1",
29
29
  "@vitest/coverage-v8": "4.0.14",
@@ -36,13 +36,15 @@
36
36
  "vitest": "4.0.14"
37
37
  },
38
38
  "peerDependencies": {
39
- "@hg-ts/exception": "0.7.25",
40
- "@hg-ts/validation": "0.7.25",
39
+ "@hg-ts/exception": "0.7.26",
40
+ "@hg-ts/validation": "0.7.26",
41
41
  "reflect-metadata": "*",
42
42
  "tslib": "*",
43
43
  "vitest": "*"
44
44
  },
45
45
  "dependencies": {
46
+ "@signalapp/libsignal-client": "0.93.1",
47
+ "libsodium-wrappers": "0.8.4",
46
48
  "node-forge": "1.3.1"
47
49
  }
48
50
  }
@@ -0,0 +1,3 @@
1
+ export * from './public-key.js';
2
+ export * from './private-key.js';
3
+ export * from './key-pair.js';
@@ -0,0 +1,58 @@
1
+ import sodium from 'libsodium-wrappers';
2
+ import {
3
+ BaseKeyPair,
4
+ KeyPairOptions,
5
+ KeyPairResult,
6
+ NewKeyPairOptions,
7
+ } from '../base/index.js';
8
+ import { X25519PrivateKey } from './private-key.js';
9
+ import { X25519PublicKey } from './public-key.js';
10
+
11
+ export class X25519KeyPair extends BaseKeyPair<
12
+ X25519PrivateKey,
13
+ X25519PublicKey
14
+ > {
15
+ public constructor(options: KeyPairOptions<X25519PrivateKey> = {}) {
16
+ super(options, X25519PrivateKey);
17
+ }
18
+
19
+ public override encrypt(value: string | Buffer, recipientPublicKey: X25519PublicKey): Buffer {
20
+ return recipientPublicKey.encrypt(value, this.privateKeyInstance);
21
+ }
22
+
23
+ public override decrypt(value: string | Buffer, senderPublicKey: X25519PublicKey): string {
24
+ return this.privateKeyInstance.decrypt(value, senderPublicKey);
25
+ }
26
+
27
+ public override sign(value: string): Buffer {
28
+ return this.privateKeyInstance.sign(value);
29
+ }
30
+
31
+ public override verify(signature: string | Buffer, value: string): boolean {
32
+ return this.publicKeyInstance.verify(signature, value);
33
+ }
34
+
35
+ protected generateNewKeys(options: NewKeyPairOptions): KeyPairResult<X25519PrivateKey, X25519PublicKey> {
36
+ const privateKey = this.generatePrivateKey(options.seed);
37
+ const privateKeyInstance = new X25519PrivateKey(privateKey);
38
+
39
+ return {
40
+ privateKey: privateKeyInstance,
41
+ publicKey: privateKeyInstance.toPublicKey(),
42
+ };
43
+ }
44
+
45
+ private generatePrivateKey(seed?: string): Buffer {
46
+ if (!seed) {
47
+ return Buffer.from(sodium.randombytes_buf(sodium.crypto_scalarmult_SCALARBYTES));
48
+ }
49
+
50
+ const bytes = Buffer.from(seed, 'utf8');
51
+
52
+ if (bytes.length === sodium.crypto_scalarmult_SCALARBYTES) {
53
+ return bytes;
54
+ }
55
+
56
+ return Buffer.from(sodium.crypto_generichash(sodium.crypto_scalarmult_SCALARBYTES, bytes, null));
57
+ }
58
+ }
@@ -0,0 +1,54 @@
1
+ import { NotImplementedException } from '@hg-ts/exception';
2
+ import sodium from 'libsodium-wrappers';
3
+ import { BasePrivateKey } from '../base/index.js';
4
+ import { InvalidDecryptionKeyExpection } from '../exceptions/index.js';
5
+ import { X25519PublicKey } from './public-key.js';
6
+ import { deriveEncryptionKey } from './utils.js';
7
+
8
+ export class X25519PrivateKey extends BasePrivateKey<Buffer, X25519PublicKey> {
9
+ public override decrypt(encrypted: string | Buffer, senderPublicKeyInstance: X25519PublicKey): string {
10
+ const payload = typeof encrypted === 'string' ? Buffer.from(encrypted, 'base64') : encrypted;
11
+
12
+ const senderPublicKey = senderPublicKeyInstance.nativeKey;
13
+ const sharedSecret = Buffer.from(sodium.crypto_scalarmult(this.key, senderPublicKey));
14
+
15
+ const publicKey = this.toPublicKey().nativeKey;
16
+ const encryptionKey = deriveEncryptionKey(sharedSecret, senderPublicKey, publicKey);
17
+
18
+ try {
19
+ const nonce = payload.subarray(0, 24);
20
+ const ciphertext = payload.subarray(24);
21
+ const decrypted = sodium.crypto_aead_xchacha20poly1305_ietf_decrypt(
22
+ null,
23
+ ciphertext,
24
+ null,
25
+ nonce,
26
+ encryptionKey,
27
+ );
28
+
29
+ return Buffer.from(decrypted).toString('utf-8');
30
+ } catch {
31
+ throw new InvalidDecryptionKeyExpection();
32
+ }
33
+ }
34
+
35
+ public override sign(_value: string): Buffer {
36
+ throw new NotImplementedException();
37
+ }
38
+
39
+ public override toPublicKey(): X25519PublicKey {
40
+ return new X25519PublicKey(Buffer.from(sodium.crypto_scalarmult_base(this.key)));
41
+ }
42
+
43
+ public override toString(): string {
44
+ return this.key.toString('base64');
45
+ }
46
+
47
+ public override get nativeKey(): Buffer {
48
+ return Buffer.from(this.key);
49
+ }
50
+
51
+ public static fromString(value: string): X25519PrivateKey {
52
+ return new X25519PrivateKey(Buffer.from(value, 'base64'));
53
+ }
54
+ }
@@ -0,0 +1,68 @@
1
+ import { NotImplementedException } from '@hg-ts/exception';
2
+ import { z } from '@hg-ts/validation';
3
+ import sodium from 'libsodium-wrappers';
4
+ import { BasePublicKey } from '../base/index.js';
5
+ import type { X25519PrivateKey } from './private-key.js';
6
+ import { deriveEncryptionKey } from './utils.js';
7
+
8
+ const schema = z.string().transform((value, ctx) => {
9
+ const publicKey = Buffer.from(value, 'base64');
10
+
11
+ if (publicKey.length !== sodium.crypto_scalarmult_BYTES) {
12
+ ctx.issues.push({
13
+ message: 'Invalid X25519 public key',
14
+ fatal: true,
15
+ code: 'invalid_format',
16
+ input: value,
17
+ format: 'X25519 Public Key',
18
+ });
19
+ return value;
20
+ }
21
+
22
+ return value;
23
+ }).pipe(z.string());
24
+
25
+ export class X25519PublicKey extends BasePublicKey<Buffer> {
26
+ public static schema = schema;
27
+
28
+ public override encrypt(value: string | Buffer, senderPrivateKeyInstance: X25519PrivateKey): Buffer {
29
+ const senderPrivateKey = senderPrivateKeyInstance.nativeKey;
30
+ const sharedSecret = Buffer.from(sodium.crypto_scalarmult(senderPrivateKey, this.key));
31
+
32
+ const senderPublicKey = senderPrivateKeyInstance.toPublicKey().nativeKey;
33
+ const encryptionKey = deriveEncryptionKey(sharedSecret, senderPublicKey, this.key);
34
+
35
+ const nonce = Buffer.from(sodium.randombytes_buf(sodium.crypto_aead_xchacha20poly1305_ietf_NPUBBYTES));
36
+ const ciphertext = Buffer.from(sodium.crypto_aead_xchacha20poly1305_ietf_encrypt(
37
+ this.formatInput(value),
38
+ null,
39
+ null,
40
+ nonce,
41
+ encryptionKey,
42
+ ));
43
+
44
+ return Buffer.concat([nonce, ciphertext]);
45
+ }
46
+
47
+ public override verify(_signature: string | Buffer, _value: string): boolean {
48
+ throw new NotImplementedException();
49
+ }
50
+
51
+ public override toString(): string {
52
+ return this.key.toString('base64');
53
+ }
54
+
55
+ public override get nativeKey(): Buffer {
56
+ return Buffer.from(this.key);
57
+ }
58
+
59
+ public static fromString(value: string): X25519PublicKey {
60
+ return new X25519PublicKey(Buffer.from(value, 'base64'));
61
+ }
62
+
63
+ private formatInput(value: string | Buffer): Buffer {
64
+ return typeof value === 'string'
65
+ ? Buffer.from(value, 'utf8')
66
+ : value;
67
+ }
68
+ }
@@ -0,0 +1,22 @@
1
+ import sodium from 'libsodium-wrappers';
2
+
3
+ const ALGORITHM = Buffer.from('X25519-XChaCha20-Poly1305', 'utf8');
4
+
5
+ sodium.ready.catch(() => {});
6
+
7
+ export function deriveEncryptionKey(
8
+ sharedSecret: Buffer,
9
+ senderPublicKey: Buffer,
10
+ recipientPublicKey: Buffer,
11
+ ): Buffer {
12
+ return Buffer.from(sodium.crypto_generichash(
13
+ sodium.crypto_aead_xchacha20poly1305_ietf_KEYBYTES,
14
+ Buffer.concat([
15
+ ALGORITHM,
16
+ sharedSecret,
17
+ senderPublicKey,
18
+ recipientPublicKey,
19
+ ]),
20
+ null,
21
+ ));
22
+ }