@hg-ts/rsa 0.7.24 → 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 (120) 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 +85 -0
  73. package/dist/rsa/public-key.js.map +1 -0
  74. package/dist/{rsa.test.d.ts → rsa/rsa.test.d.ts} +6 -0
  75. package/dist/rsa/rsa.test.d.ts.map +1 -0
  76. package/dist/{rsa.test.js → rsa/rsa.test.js} +101 -24
  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/rsa.test.ts +194 -0
  98. package/dist/rsa.base-key.d.ts +0 -16
  99. package/dist/rsa.base-key.d.ts.map +0 -1
  100. package/dist/rsa.base-key.js +0 -54
  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 +0 -52
  113. package/dist/rsa.public-key.js.map +0 -1
  114. package/dist/rsa.test.d.ts.map +0 -1
  115. package/dist/rsa.test.js.map +0 -1
  116. package/src/rsa.base-key.ts +0 -75
  117. package/src/rsa.key-pair.ts +0 -65
  118. package/src/rsa.private-key.ts +0 -50
  119. package/src/rsa.public-key.ts +0 -65
  120. package/src/rsa.test.ts +0 -134
@@ -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"}
@@ -0,0 +1,85 @@
1
+ import { z } from '@hg-ts/validation';
2
+ import forge from 'node-forge';
3
+ import { BasePublicKey } from '../base/index.js';
4
+ const schema = z.string().transform((value, ctx) => {
5
+ try {
6
+ const publicKey = forge.pki.publicKeyFromPem(value);
7
+ return forge.pki.publicKeyToPem(publicKey);
8
+ }
9
+ catch (error) {
10
+ ctx.issues.push({
11
+ message: 'Invalid public key',
12
+ fatal: true,
13
+ code: 'invalid_format',
14
+ input: value,
15
+ format: 'RSA Public Key',
16
+ });
17
+ return value;
18
+ }
19
+ }).pipe(z.string());
20
+ export class RsaPublicKey extends BasePublicKey {
21
+ static schema = schema;
22
+ encrypt(value) {
23
+ const md = this.getMd();
24
+ const chunks = this.prepareToEncrypt(value);
25
+ const encryptedChunks = chunks.map(chunk => this.key.encrypt(chunk, 'RSAES-PKCS1-V1_5', { md }));
26
+ return this.formatEncrypted(encryptedChunks);
27
+ }
28
+ verify(signature, value) {
29
+ const hash = this.getMd();
30
+ hash.update(value, 'utf8');
31
+ const pss = forge.pss.create({
32
+ md: this.getMd(),
33
+ mgf: forge.mgf.mgf1.create(this.getMd()),
34
+ saltLength: 20,
35
+ });
36
+ const formattedSignature = this.formatSignature(signature);
37
+ return this.key.verify(hash.digest().bytes(), formattedSignature, pss);
38
+ }
39
+ toString() {
40
+ return forge.pki.publicKeyToPem(this.key);
41
+ }
42
+ static fromString(pemKey) {
43
+ const key = forge.pki.publicKeyFromPem(pemKey);
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;
83
+ }
84
+ }
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,10 +1,16 @@
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>;
6
+ keyPairFromPrivateKeyEncryption(): Promise<void>;
5
7
  signature(): Promise<void>;
6
8
  signatureBuffer(): Promise<void>;
7
9
  encryption(): Promise<void>;
10
+ encryptionFailsForAnotherRecipient(): Promise<void>;
11
+ encryptionRu(): Promise<void>;
12
+ encryptionHex(): Promise<void>;
13
+ encryptionEn(): Promise<void>;
8
14
  encryptionBuffer(): Promise<void>;
9
15
  longMessageEncryption(): Promise<void>;
10
16
  longMessageSignature(): 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,88 +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: 512 });
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: 512 });
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
  }
28
+ async keyPairFromPrivateKeyEncryption() {
29
+ const { privateKey } = new RsaKeyPair({ bits: 786 });
30
+ const key = RsaPrivateKey.fromString(privateKey);
31
+ const value = Math.random().toString();
32
+ const encrypted = key.toPublicKey().encrypt(value);
33
+ const decrypted = key.decrypt(encrypted);
34
+ expect(value).toBe(decrypted);
35
+ }
21
36
  async signature() {
22
- const rsa = new RSAKeyPair({ bits: 512 });
37
+ const rsa = new RsaKeyPair({ bits: 786 });
23
38
  const value = Math.random().toString();
24
39
  const signature = rsa.sign(value);
25
40
  expect(rsa.verify(signature.toString('binary'), value)).toBeTruthy();
26
41
  }
27
42
  async signatureBuffer() {
28
- const rsa = new RSAKeyPair({ bits: 512 });
43
+ const rsa = new RsaKeyPair({ bits: 786 });
29
44
  const value = Math.random().toString();
30
45
  const signature = rsa.sign(value);
31
46
  expect(rsa.verify(signature, value)).toBeTruthy();
32
47
  }
33
48
  async encryption() {
34
- const rsa = new RSAKeyPair({ bits: 1024 });
49
+ const rsa = new RsaKeyPair({ bits: 786 });
50
+ const value = Math.random().toString();
51
+ const encrypted = rsa.encrypt(value);
52
+ expect(rsa.decrypt(encrypted.toString('hex'))).toBe(value);
53
+ }
54
+ async encryptionFailsForAnotherRecipient() {
55
+ const rsa = new RsaKeyPair({ bits: 786 });
56
+ const anotherRecipient = new RsaKeyPair({ bits: 786 });
35
57
  const value = Math.random().toString();
36
58
  const encrypted = rsa.encrypt(value);
59
+ anotherRecipient.decrypt(encrypted.toString('hex'));
60
+ }
61
+ async encryptionRu() {
62
+ const rsa = new RsaKeyPair({ bits: 786 });
63
+ const value = 'Тестовый текст';
64
+ const encrypted = rsa.encrypt(value);
65
+ expect(rsa.decrypt(encrypted.toString('hex'))).toBe(value);
66
+ }
67
+ async encryptionHex() {
68
+ const rsa = new RsaKeyPair({ bits: 786 });
69
+ const value = Math.floor(Math.random() * 10000).toString(16);
70
+ const encrypted = rsa.encrypt(value);
71
+ expect(rsa.decrypt(encrypted.toString('hex'))).toBe(value);
72
+ }
73
+ async encryptionEn() {
74
+ const rsa = new RsaKeyPair({ bits: 786 });
75
+ const value = 'Test text';
76
+ const encrypted = rsa.encrypt(value);
37
77
  expect(rsa.decrypt(encrypted.toString('hex'))).toBe(value);
38
78
  }
39
79
  async encryptionBuffer() {
40
- const rsa = new RSAKeyPair({ bits: 1024 });
80
+ const rsa = new RsaKeyPair({ bits: 786 });
41
81
  const value = Buffer.from(Math.random().toString(), 'utf-8');
42
82
  const encrypted = rsa.encrypt(value);
43
83
  expect(Buffer.from(rsa.decrypt(encrypted), 'hex')).toMatchObject(value);
44
84
  }
45
85
  async longMessageEncryption() {
46
- const rsa = new RSAKeyPair({ bits: 1024 });
47
- const rsaToTest = new RSAKeyPair({ bits: 1024 });
86
+ const rsa = new RsaKeyPair({ bits: 786 });
87
+ const rsaToTest = new RsaKeyPair({ bits: 786 });
48
88
  const value = rsaToTest.publicKey;
49
89
  const encrypted = rsa.encrypt(value);
50
90
  expect(rsa.decrypt(encrypted)).toBe(value);
51
91
  }
52
92
  async longMessageSignature() {
53
- const rsa = new RSAKeyPair({ bits: 512 });
93
+ const rsa = new RsaKeyPair({ bits: 786 });
54
94
  const value = rsa.publicKey;
55
95
  const signature = rsa.sign(value);
56
96
  expect(rsa.verify(signature, value)).toBeTruthy();
57
97
  }
58
98
  async seeded() {
59
99
  const seed = Math.random().toString();
60
- const rsa1 = new RSAKeyPair({ seed, bits: 512 });
61
- const rsa2 = new RSAKeyPair({ seed, bits: 512 });
100
+ const rsa1 = new RsaKeyPair({ seed, bits: 786 });
101
+ const rsa2 = new RsaKeyPair({ seed, bits: 786 });
62
102
  expect(rsa1.privateKey).toBe(rsa2.privateKey);
63
103
  expect(rsa1.publicKey).toBe(rsa2.publicKey);
64
104
  }
65
105
  async privateKeyFromString() {
66
- const rsa = new RSAKeyPair({ bits: 512 });
67
- const rsaFromString = RSAPrivateKey.fromString(rsa.privateKey);
106
+ const rsa = new RsaKeyPair({ bits: 786 });
107
+ const rsaFromString = RsaPrivateKey.fromString(rsa.privateKey);
68
108
  expect(rsaFromString.toString()).toBe(rsa.privateKey.toString());
69
109
  }
70
110
  async publicKeyFromString() {
71
- const rsa = new RSAKeyPair({ bits: 512 });
72
- const rsaFromString = RSAPublicKey.fromString(rsa.publicKey);
111
+ const rsa = new RsaKeyPair({ bits: 786 });
112
+ const rsaFromString = RsaPublicKey.fromString(rsa.publicKey);
73
113
  expect(rsaFromString.toString()).toBe(rsa.publicKey.toString());
74
114
  }
75
115
  async publicKeyValidationsValid() {
76
- const rsa = new RSAKeyPair({ bits: 512 });
77
- RSAPublicKey.schema.parse(rsa.publicKey.toString());
116
+ const rsa = new RsaKeyPair({ bits: 786 });
117
+ RsaPublicKey.schema.parse(rsa.publicKey.toString());
78
118
  }
79
119
  async publicKeyValidationsFails() {
80
- RSAPublicKey.schema.parse(`-----BEGIN PUBLIC KEY-----
120
+ RsaPublicKey.schema.parse(`-----BEGIN PUBLIC KEY-----
81
121
  MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALnfPJr6J2UXwvZhbPWolBw4UJHAEMd
82
122
  /FvIyIYADhT/k+2TIFixs4pxM5VaGMP7Tny+5WAouv9ulh4tACPxKoMCAwEAAQ==
83
123
  -----END PUBLIC KEY-----`);
84
124
  }
85
125
  };
126
+ __decorate([
127
+ Test(),
128
+ __metadata("design:type", Function),
129
+ __metadata("design:paramtypes", []),
130
+ __metadata("design:returntype", Promise)
131
+ ], RsaTest.prototype, "nativeKey", null);
86
132
  __decorate([
87
133
  Test(),
88
134
  __metadata("design:type", Function),
@@ -95,6 +141,12 @@ __decorate([
95
141
  __metadata("design:paramtypes", []),
96
142
  __metadata("design:returntype", Promise)
97
143
  ], RsaTest.prototype, "keyPairFromPrivateKeyString", null);
144
+ __decorate([
145
+ Test(),
146
+ __metadata("design:type", Function),
147
+ __metadata("design:paramtypes", []),
148
+ __metadata("design:returntype", Promise)
149
+ ], RsaTest.prototype, "keyPairFromPrivateKeyEncryption", null);
98
150
  __decorate([
99
151
  Test(),
100
152
  __metadata("design:type", Function),
@@ -113,6 +165,31 @@ __decorate([
113
165
  __metadata("design:paramtypes", []),
114
166
  __metadata("design:returntype", Promise)
115
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);
175
+ __decorate([
176
+ Test(),
177
+ __metadata("design:type", Function),
178
+ __metadata("design:paramtypes", []),
179
+ __metadata("design:returntype", Promise)
180
+ ], RsaTest.prototype, "encryptionRu", null);
181
+ __decorate([
182
+ Test(),
183
+ __metadata("design:type", Function),
184
+ __metadata("design:paramtypes", []),
185
+ __metadata("design:returntype", Promise)
186
+ ], RsaTest.prototype, "encryptionHex", null);
187
+ __decorate([
188
+ Test(),
189
+ __metadata("design:type", Function),
190
+ __metadata("design:paramtypes", []),
191
+ __metadata("design:returntype", Promise)
192
+ ], RsaTest.prototype, "encryptionEn", null);
116
193
  __decorate([
117
194
  Test(),
118
195
  __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.24",
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.24",
22
- "@hg-ts/exception": "0.7.24",
23
- "@hg-ts/linter": "0.7.24",
24
- "@hg-ts/tests": "0.7.24",
25
- "@hg-ts/types": "0.7.24",
26
- "@hg-ts/validation": "0.7.24",
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.24",
40
- "@hg-ts/validation": "0.7.24",
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
+ }