@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.
- package/README.md +331 -0
- package/dist/X25519/index.d.ts +4 -0
- package/dist/X25519/index.d.ts.map +1 -0
- package/dist/X25519/index.js +4 -0
- package/dist/X25519/index.js.map +1 -0
- package/dist/X25519/key-pair.d.ts +13 -0
- package/dist/X25519/key-pair.d.ts.map +1 -0
- package/dist/X25519/key-pair.js +39 -0
- package/dist/X25519/key-pair.js.map +1 -0
- package/dist/X25519/private-key.d.ts +11 -0
- package/dist/X25519/private-key.d.ts.map +1 -0
- package/dist/X25519/private-key.js +40 -0
- package/dist/X25519/private-key.js.map +1 -0
- package/dist/X25519/public-key.d.ts +13 -0
- package/dist/X25519/public-key.d.ts.map +1 -0
- package/dist/X25519/public-key.js +49 -0
- package/dist/X25519/public-key.js.map +1 -0
- package/dist/X25519/utils.d.ts +2 -0
- package/dist/X25519/utils.d.ts.map +1 -0
- package/dist/X25519/utils.js +12 -0
- package/dist/X25519/utils.js.map +1 -0
- package/dist/X25519/x25519.test.d.ts +18 -0
- package/dist/X25519/x25519.test.d.ts.map +1 -0
- package/dist/X25519/x25519.test.js +183 -0
- package/dist/X25519/x25519.test.js.map +1 -0
- package/dist/base/index.d.ts +5 -0
- package/dist/base/index.d.ts.map +1 -0
- package/dist/base/index.js +5 -0
- package/dist/base/index.js.map +1 -0
- package/dist/base/key-pair.d.ts +27 -0
- package/dist/base/key-pair.d.ts.map +1 -0
- package/dist/base/key-pair.js +29 -0
- package/dist/base/key-pair.js.map +1 -0
- package/dist/base/key.d.ts +7 -0
- package/dist/base/key.d.ts.map +1 -0
- package/dist/base/key.js +10 -0
- package/dist/base/key.js.map +1 -0
- package/dist/base/private-key.d.ts +11 -0
- package/dist/base/private-key.d.ts.map +1 -0
- package/dist/base/private-key.js +4 -0
- package/dist/base/private-key.js.map +1 -0
- package/dist/base/public-key.d.ts +6 -0
- package/dist/base/public-key.d.ts.map +1 -0
- package/dist/base/public-key.js +4 -0
- package/dist/base/public-key.js.map +1 -0
- package/dist/exceptions/index.d.ts +2 -0
- package/dist/exceptions/index.d.ts.map +1 -0
- package/dist/exceptions/index.js +2 -0
- package/dist/exceptions/index.js.map +1 -0
- package/dist/exceptions/invalid-decryption-key.expection.d.ts +5 -0
- package/dist/exceptions/invalid-decryption-key.expection.d.ts.map +1 -0
- package/dist/exceptions/invalid-decryption-key.expection.js +7 -0
- package/dist/exceptions/invalid-decryption-key.expection.js.map +1 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/rsa/index.d.ts +4 -0
- package/dist/rsa/index.d.ts.map +1 -0
- package/dist/rsa/index.js +4 -0
- package/dist/rsa/index.js.map +1 -0
- package/dist/rsa/key-pair.d.ts +12 -0
- package/dist/rsa/key-pair.d.ts.map +1 -0
- package/dist/rsa/key-pair.js +40 -0
- package/dist/rsa/key-pair.js.map +1 -0
- package/dist/rsa/private-key.d.ts +16 -0
- package/dist/rsa/private-key.d.ts.map +1 -0
- package/dist/rsa/private-key.js +65 -0
- package/dist/rsa/private-key.js.map +1 -0
- package/dist/rsa/public-key.d.ts +19 -0
- package/dist/rsa/public-key.d.ts.map +1 -0
- package/dist/{rsa.public-key.js → rsa/public-key.js} +42 -9
- package/dist/rsa/public-key.js.map +1 -0
- package/dist/{rsa.test.d.ts → rsa/rsa.test.d.ts} +2 -0
- package/dist/rsa/rsa.test.d.ts.map +1 -0
- package/dist/{rsa.test.js → rsa/rsa.test.js} +56 -29
- package/dist/rsa/rsa.test.js.map +1 -0
- package/package.json +11 -9
- package/src/X25519/index.ts +3 -0
- package/src/X25519/key-pair.ts +58 -0
- package/src/X25519/private-key.ts +54 -0
- package/src/X25519/public-key.ts +68 -0
- package/src/X25519/utils.ts +22 -0
- package/src/X25519/x25519.test.ts +150 -0
- package/src/base/index.ts +4 -0
- package/src/base/key-pair.ts +75 -0
- package/src/base/key.ts +13 -0
- package/src/base/private-key.ts +17 -0
- package/src/base/public-key.ts +7 -0
- package/src/exceptions/index.ts +1 -0
- package/src/exceptions/invalid-decryption-key.expection.ts +7 -0
- package/src/index.ts +4 -3
- package/src/rsa/index.ts +3 -0
- package/src/rsa/key-pair.ts +55 -0
- package/src/rsa/private-key.ts +82 -0
- package/src/rsa/public-key.ts +110 -0
- package/src/{rsa.test.ts → rsa/rsa.test.ts} +52 -31
- package/dist/rsa.base-key.d.ts +0 -17
- package/dist/rsa.base-key.d.ts.map +0 -1
- package/dist/rsa.base-key.js +0 -57
- package/dist/rsa.base-key.js.map +0 -1
- package/dist/rsa.key-pair.d.ts +0 -19
- package/dist/rsa.key-pair.d.ts.map +0 -1
- package/dist/rsa.key-pair.js +0 -46
- package/dist/rsa.key-pair.js.map +0 -1
- package/dist/rsa.private-key.d.ts +0 -13
- package/dist/rsa.private-key.d.ts.map +0 -1
- package/dist/rsa.private-key.js +0 -38
- package/dist/rsa.private-key.js.map +0 -1
- package/dist/rsa.public-key.d.ts +0 -13
- package/dist/rsa.public-key.d.ts.map +0 -1
- package/dist/rsa.public-key.js.map +0 -1
- package/dist/rsa.test.d.ts.map +0 -1
- package/dist/rsa.test.js.map +0 -1
- package/src/rsa.base-key.ts +0 -78
- package/src/rsa.key-pair.ts +0 -65
- package/src/rsa.private-key.ts +0 -50
- 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 {
|
|
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
|
|
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
|
|
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=
|
|
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
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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
|
|
10
|
-
const key =
|
|
11
|
-
const keyPairFromKey = new
|
|
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
|
|
17
|
-
const keyPairFromKey = new
|
|
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
|
|
23
|
-
const key =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
73
|
-
const rsaToTest = new
|
|
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
|
|
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
|
|
87
|
-
const rsa2 = new
|
|
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
|
|
93
|
-
const rsaFromString =
|
|
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
|
|
98
|
-
const rsaFromString =
|
|
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
|
|
103
|
-
|
|
116
|
+
const rsa = new RsaKeyPair({ bits: 786 });
|
|
117
|
+
RsaPublicKey.schema.parse(rsa.publicKey.toString());
|
|
104
118
|
}
|
|
105
119
|
async publicKeyValidationsFails() {
|
|
106
|
-
|
|
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.
|
|
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.
|
|
22
|
-
"@hg-ts/exception": "0.7.
|
|
23
|
-
"@hg-ts/linter": "0.7.
|
|
24
|
-
"@hg-ts/tests": "0.7.
|
|
25
|
-
"@hg-ts/types": "0.7.
|
|
26
|
-
"@hg-ts/validation": "0.7.
|
|
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.
|
|
40
|
-
"@hg-ts/validation": "0.7.
|
|
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,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
|
+
}
|