@archi-code/crypto-tools 1.0.0-alpha.1

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 (75) hide show
  1. package/dist/cjs/encrypt/cryptoEngine.d.ts +25 -0
  2. package/dist/cjs/encrypt/cryptoEngine.js +136 -0
  3. package/dist/cjs/encrypt/cryptoEngine.js.map +1 -0
  4. package/dist/cjs/hash/client/sodium-hasher.d.ts +8 -0
  5. package/dist/cjs/hash/client/sodium-hasher.js +44 -0
  6. package/dist/cjs/hash/client/sodium-hasher.js.map +1 -0
  7. package/dist/cjs/hash/hasher-factory.d.ts +4 -0
  8. package/dist/cjs/hash/hasher-factory.js +17 -0
  9. package/dist/cjs/hash/hasher-factory.js.map +1 -0
  10. package/dist/cjs/hash/hasher.d.ts +7 -0
  11. package/dist/cjs/hash/hasher.js +13 -0
  12. package/dist/cjs/hash/hasher.js.map +1 -0
  13. package/dist/cjs/index.d.ts +9 -0
  14. package/dist/cjs/index.js +26 -0
  15. package/dist/cjs/index.js.map +1 -0
  16. package/dist/cjs/password-encryptor/client/bcrypt-password-encryptor.d.ts +9 -0
  17. package/dist/cjs/password-encryptor/client/bcrypt-password-encryptor.js +34 -0
  18. package/dist/cjs/password-encryptor/client/bcrypt-password-encryptor.js.map +1 -0
  19. package/dist/cjs/password-encryptor/client/sodium-password-encryptor.d.ts +6 -0
  20. package/dist/cjs/password-encryptor/client/sodium-password-encryptor.js +38 -0
  21. package/dist/cjs/password-encryptor/client/sodium-password-encryptor.js.map +1 -0
  22. package/dist/cjs/password-encryptor/password-encryptor-factory.d.ts +4 -0
  23. package/dist/cjs/password-encryptor/password-encryptor-factory.js +21 -0
  24. package/dist/cjs/password-encryptor/password-encryptor-factory.js.map +1 -0
  25. package/dist/cjs/password-encryptor/password-encryptor.d.ts +6 -0
  26. package/dist/cjs/password-encryptor/password-encryptor.js +13 -0
  27. package/dist/cjs/password-encryptor/password-encryptor.js.map +1 -0
  28. package/dist/cjs/sign/jwt-data-signer.d.ts +11 -0
  29. package/dist/cjs/sign/jwt-data-signer.js +50 -0
  30. package/dist/cjs/sign/jwt-data-signer.js.map +1 -0
  31. package/dist/cjs/sodium-initializer.d.ts +6 -0
  32. package/dist/cjs/sodium-initializer.js +30 -0
  33. package/dist/cjs/sodium-initializer.js.map +1 -0
  34. package/dist/cjs/symmetric-encryption.d.ts +11 -0
  35. package/dist/cjs/symmetric-encryption.js +79 -0
  36. package/dist/cjs/symmetric-encryption.js.map +1 -0
  37. package/dist/esm/encrypt/cryptoEngine.d.ts +25 -0
  38. package/dist/esm/encrypt/cryptoEngine.js +132 -0
  39. package/dist/esm/encrypt/cryptoEngine.js.map +1 -0
  40. package/dist/esm/hash/client/sodium-hasher.d.ts +8 -0
  41. package/dist/esm/hash/client/sodium-hasher.js +40 -0
  42. package/dist/esm/hash/client/sodium-hasher.js.map +1 -0
  43. package/dist/esm/hash/hasher-factory.d.ts +4 -0
  44. package/dist/esm/hash/hasher-factory.js +13 -0
  45. package/dist/esm/hash/hasher-factory.js.map +1 -0
  46. package/dist/esm/hash/hasher.d.ts +7 -0
  47. package/dist/esm/hash/hasher.js +9 -0
  48. package/dist/esm/hash/hasher.js.map +1 -0
  49. package/dist/esm/index.d.ts +9 -0
  50. package/dist/esm/index.js +10 -0
  51. package/dist/esm/index.js.map +1 -0
  52. package/dist/esm/password-encryptor/client/bcrypt-password-encryptor.d.ts +9 -0
  53. package/dist/esm/password-encryptor/client/bcrypt-password-encryptor.js +30 -0
  54. package/dist/esm/password-encryptor/client/bcrypt-password-encryptor.js.map +1 -0
  55. package/dist/esm/password-encryptor/client/sodium-password-encryptor.d.ts +6 -0
  56. package/dist/esm/password-encryptor/client/sodium-password-encryptor.js +34 -0
  57. package/dist/esm/password-encryptor/client/sodium-password-encryptor.js.map +1 -0
  58. package/dist/esm/password-encryptor/password-encryptor-factory.d.ts +4 -0
  59. package/dist/esm/password-encryptor/password-encryptor-factory.js +17 -0
  60. package/dist/esm/password-encryptor/password-encryptor-factory.js.map +1 -0
  61. package/dist/esm/password-encryptor/password-encryptor.d.ts +6 -0
  62. package/dist/esm/password-encryptor/password-encryptor.js +9 -0
  63. package/dist/esm/password-encryptor/password-encryptor.js.map +1 -0
  64. package/dist/esm/sign/jwt-data-signer.d.ts +11 -0
  65. package/dist/esm/sign/jwt-data-signer.js +46 -0
  66. package/dist/esm/sign/jwt-data-signer.js.map +1 -0
  67. package/dist/esm/sodium-initializer.d.ts +6 -0
  68. package/dist/esm/sodium-initializer.js +26 -0
  69. package/dist/esm/sodium-initializer.js.map +1 -0
  70. package/dist/esm/symmetric-encryption.d.ts +11 -0
  71. package/dist/esm/symmetric-encryption.js +75 -0
  72. package/dist/esm/symmetric-encryption.js.map +1 -0
  73. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  74. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  75. package/package.json +93 -0
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SymmetricEncryption = void 0;
4
+ const crypto_1 = require("crypto");
5
+ class SymmetricEncryption {
6
+ constructor(algorithm, key) {
7
+ this.algorithm = algorithm;
8
+ this.ivLength = 16;
9
+ if (!SymmetricEncryption.validAlgorithms.includes(algorithm)) {
10
+ throw new Error(`Invalid algorithm: ${algorithm}. Allowed algorithms are: ${SymmetricEncryption.validAlgorithms.join(', ')}`);
11
+ }
12
+ const keyBuffer = typeof key === 'string' ? Buffer.from(key, 'utf-8') : key;
13
+ if (keyBuffer.length < 16) {
14
+ throw new Error(`Key must have a minimum length of 16 characters.`);
15
+ }
16
+ this.key = this.adjustKey(keyBuffer);
17
+ }
18
+ adjustKey(key) {
19
+ const keyLengths = {
20
+ 'aes-256-cbc': 32,
21
+ 'aes-192-cbc': 24,
22
+ 'aes-128-cbc': 16,
23
+ };
24
+ const requiredLength = keyLengths[this.algorithm] ?? 32;
25
+ if (key.length === requiredLength) {
26
+ return key;
27
+ }
28
+ if (key.length < requiredLength) {
29
+ const repeatedKey = Buffer.alloc(requiredLength);
30
+ for (let i = 0; i < requiredLength; i++) {
31
+ repeatedKey[i] = key[i % key.length];
32
+ }
33
+ return repeatedKey;
34
+ }
35
+ return key.slice(0, requiredLength);
36
+ }
37
+ generateHmac(data) {
38
+ const hmac = (0, crypto_1.createHmac)('sha256', this.key);
39
+ hmac.update(data);
40
+ return hmac.digest('hex');
41
+ }
42
+ encrypt(text) {
43
+ try {
44
+ const iv = (0, crypto_1.randomBytes)(this.ivLength);
45
+ const cipher = (0, crypto_1.createCipheriv)(this.algorithm, this.key, iv);
46
+ const encrypted = Buffer.concat([cipher.update(text, 'utf-8'), cipher.final()]);
47
+ const encryptedData = `${iv.toString('hex')}|${encrypted.toString('hex')}`;
48
+ const hmac = this.generateHmac(encryptedData);
49
+ return `${encryptedData}|${hmac}`;
50
+ }
51
+ catch (error) {
52
+ throw new Error(`Encryption failed: ${error.message}`);
53
+ }
54
+ }
55
+ decrypt(encryptedWithIvAndHmac) {
56
+ try {
57
+ const [iv, encrypted, hmac] = encryptedWithIvAndHmac.split('|');
58
+ if (!iv || !encrypted || !hmac || iv.length !== this.ivLength * 2) {
59
+ throw new Error('Invalid encrypted format.');
60
+ }
61
+ const encryptedData = `${iv}|${encrypted}`;
62
+ if (this.generateHmac(encryptedData) !== hmac) {
63
+ throw new Error('Invalid HMAC. Data may have been tampered with.');
64
+ }
65
+ const decipher = (0, crypto_1.createDecipheriv)(this.algorithm, this.key, Buffer.from(iv, 'hex'));
66
+ const decrypted = Buffer.concat([
67
+ decipher.update(Buffer.from(encrypted, 'hex')),
68
+ decipher.final(),
69
+ ]);
70
+ return decrypted.toString('utf-8');
71
+ }
72
+ catch (error) {
73
+ throw new Error(`Decryption failed: ${error.message}`);
74
+ }
75
+ }
76
+ }
77
+ exports.SymmetricEncryption = SymmetricEncryption;
78
+ SymmetricEncryption.validAlgorithms = ['aes-256-cbc', 'aes-192-cbc', 'aes-128-cbc'];
79
+ //# sourceMappingURL=symmetric-encryption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symmetric-encryption.js","sourceRoot":"","sources":["../../src/symmetric-encryption.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export declare class CryptoEngine {
2
+ private CHARACTER_SET;
3
+ private CHARACTER_SET_LENGTH;
4
+ private plugboardMapping;
5
+ private reflectorMap;
6
+ private wheels;
7
+ private initialWheelPositions;
8
+ constructor(seedKey: string);
9
+ private toBase64;
10
+ private fromBase64;
11
+ resetWheels(): void;
12
+ private charToIndex;
13
+ private indexToChar;
14
+ private keyToSeed;
15
+ private createRandom;
16
+ private createPlugboardMapping;
17
+ private createReflectorMap;
18
+ private createWheels;
19
+ private advanceWheels;
20
+ private forwardThroughWheel;
21
+ private backwardThroughWheel;
22
+ encode(message: string): string;
23
+ decode(message: string): string;
24
+ private transform;
25
+ }
@@ -0,0 +1,132 @@
1
+ export class CryptoEngine {
2
+ constructor(seedKey) {
3
+ this.CHARACTER_SET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
4
+ this.CHARACTER_SET_LENGTH = this.CHARACTER_SET.length;
5
+ const encodedSeedKey = this.toBase64(seedKey);
6
+ this.plugboardMapping = this.createPlugboardMapping(encodedSeedKey);
7
+ this.reflectorMap = this.createReflectorMap(encodedSeedKey);
8
+ this.wheels = this.createWheels(encodedSeedKey);
9
+ this.initialWheelPositions = this.wheels.map((wheel) => wheel.position);
10
+ }
11
+ toBase64(input) {
12
+ return Buffer.from(input, 'utf-8').toString('base64');
13
+ }
14
+ fromBase64(input) {
15
+ return Buffer.from(input, 'base64').toString('utf-8');
16
+ }
17
+ resetWheels() {
18
+ this.wheels.forEach((wheel, index) => {
19
+ wheel.position = this.initialWheelPositions[index];
20
+ });
21
+ }
22
+ charToIndex(char) {
23
+ return this.CHARACTER_SET.indexOf(char);
24
+ }
25
+ indexToChar(index) {
26
+ return this.CHARACTER_SET[index % this.CHARACTER_SET_LENGTH];
27
+ }
28
+ keyToSeed(key) {
29
+ let seed = 0;
30
+ for (const char of key) {
31
+ seed = (seed * 31 + char.charCodeAt(0)) % 233280;
32
+ }
33
+ return seed;
34
+ }
35
+ createRandom(seed) {
36
+ return () => {
37
+ seed = (seed * 9301 + 49297) % 233280;
38
+ return seed / 233280;
39
+ };
40
+ }
41
+ createPlugboardMapping(seedKey) {
42
+ const mapping = new Map();
43
+ const random = this.createRandom(this.keyToSeed(seedKey));
44
+ const indices = Array.from({ length: this.CHARACTER_SET_LENGTH }, (_, i) => i);
45
+ while (indices.length > 1) {
46
+ const a = indices.splice(Math.floor(random() * indices.length), 1)[0];
47
+ const b = indices.splice(Math.floor(random() * indices.length), 1)[0];
48
+ mapping.set(a, b);
49
+ mapping.set(b, a);
50
+ }
51
+ return mapping;
52
+ }
53
+ createReflectorMap(seedKey) {
54
+ const random = this.createRandom(this.keyToSeed(seedKey + '_reflector'));
55
+ const indices = Array.from({ length: this.CHARACTER_SET_LENGTH }, (_, i) => i);
56
+ const mapping = new Array(this.CHARACTER_SET_LENGTH);
57
+ while (indices.length > 1) {
58
+ const a = indices.splice(Math.floor(random() * indices.length), 1)[0];
59
+ const b = indices.splice(Math.floor(random() * indices.length), 1)[0];
60
+ mapping[a] = b;
61
+ mapping[b] = a;
62
+ }
63
+ if (indices.length === 1) {
64
+ const remaining = indices[0];
65
+ mapping[remaining] = remaining;
66
+ }
67
+ return mapping;
68
+ }
69
+ createWheels(seedKey) {
70
+ const firstNumberInKey = parseInt(seedKey.match(/\d+/)?.[0] || '0', 10);
71
+ const numWheels = firstNumberInKey + 3;
72
+ return Array.from({ length: numWheels }, (_, i) => {
73
+ const random = this.createRandom(this.keyToSeed(seedKey + i));
74
+ const mapping = Array.from({ length: this.CHARACTER_SET_LENGTH }, (_item, j) => j).sort(() => random() - 0.5);
75
+ const turnover = Math.floor(random() * this.CHARACTER_SET_LENGTH);
76
+ const position = Math.floor(random() * this.CHARACTER_SET_LENGTH);
77
+ return { mapping, turnover, position };
78
+ });
79
+ }
80
+ advanceWheels() {
81
+ for (let i = this.wheels.length - 1; i >= 0; i--) {
82
+ if (i === this.wheels.length - 1 ||
83
+ this.wheels[i + 1].position === this.wheels[i + 1].turnover) {
84
+ this.wheels[i].position = (this.wheels[i].position + 1) % this.CHARACTER_SET_LENGTH;
85
+ }
86
+ else {
87
+ break;
88
+ }
89
+ }
90
+ }
91
+ forwardThroughWheel(index, wheel) {
92
+ const shiftedIndex = (index + wheel.position) % this.CHARACTER_SET_LENGTH;
93
+ return ((wheel.mapping[shiftedIndex] - wheel.position + this.CHARACTER_SET_LENGTH) %
94
+ this.CHARACTER_SET_LENGTH);
95
+ }
96
+ backwardThroughWheel(index, wheel) {
97
+ return ((wheel.mapping.indexOf((index + wheel.position) % this.CHARACTER_SET_LENGTH) -
98
+ wheel.position +
99
+ this.CHARACTER_SET_LENGTH) %
100
+ this.CHARACTER_SET_LENGTH);
101
+ }
102
+ encode(message) {
103
+ this.resetWheels();
104
+ return this.transform(this.toBase64(message));
105
+ }
106
+ decode(message) {
107
+ this.resetWheels();
108
+ return this.fromBase64(this.transform(message));
109
+ }
110
+ transform(message) {
111
+ return message
112
+ .split('')
113
+ .map((char) => {
114
+ if (!this.CHARACTER_SET.includes(char))
115
+ return char;
116
+ let index = this.charToIndex(char);
117
+ this.advanceWheels();
118
+ index = this.plugboardMapping.get(index) ?? index;
119
+ for (const wheel of this.wheels) {
120
+ index = this.forwardThroughWheel(index, wheel);
121
+ }
122
+ index = this.reflectorMap[index];
123
+ for (const wheel of [...this.wheels].reverse()) {
124
+ index = this.backwardThroughWheel(index, wheel);
125
+ }
126
+ index = this.plugboardMapping.get(index) ?? index;
127
+ return this.indexToChar(index);
128
+ })
129
+ .join('');
130
+ }
131
+ }
132
+ //# sourceMappingURL=cryptoEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cryptoEngine.js","sourceRoot":"","sources":["../../../src/encrypt/cryptoEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Hasher } from '../hasher';
2
+ export declare class SodiumHasher extends Hasher {
3
+ constructor(saltLength?: number);
4
+ private hash;
5
+ blake2b(text: string): Promise<string>;
6
+ sha256(text: string): Promise<string>;
7
+ sha512(text: string): Promise<string>;
8
+ }
@@ -0,0 +1,40 @@
1
+ import { Hasher } from '../hasher';
2
+ import { SodiumInitializer } from '../../sodium-initializer';
3
+ export class SodiumHasher extends Hasher {
4
+ constructor(saltLength = 16) {
5
+ super(saltLength);
6
+ }
7
+ async hash(text, algorithm) {
8
+ const sodium = await SodiumInitializer.getSodium();
9
+ if (this.saltToUse.every((byte) => byte === 0)) {
10
+ this.saltToUse = sodium.randombytes_buf(this.saltToUse.length);
11
+ }
12
+ const textBytes = sodium.from_string(text);
13
+ const combined = new Uint8Array(textBytes.length + this.saltToUse.length);
14
+ combined.set(textBytes);
15
+ combined.set(this.saltToUse, textBytes.length);
16
+ let hash;
17
+ switch (algorithm) {
18
+ case 'sha256':
19
+ hash = sodium.crypto_hash_sha256(combined);
20
+ break;
21
+ case 'sha512':
22
+ hash = sodium.crypto_hash_sha512(combined);
23
+ break;
24
+ case 'blake2b':
25
+ hash = sodium.crypto_generichash(sodium.crypto_generichash_BYTES, combined);
26
+ break;
27
+ }
28
+ return sodium.to_hex(hash);
29
+ }
30
+ async blake2b(text) {
31
+ return await this.hash(text, 'blake2b');
32
+ }
33
+ async sha256(text) {
34
+ return await this.hash(text, 'sha256');
35
+ }
36
+ async sha512(text) {
37
+ return await this.hash(text, 'sha512');
38
+ }
39
+ }
40
+ //# sourceMappingURL=sodium-hasher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sodium-hasher.js","sourceRoot":"","sources":["../../../../src/hash/client/sodium-hasher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,OAAO,YAAa,SAAQ,MAAM;IACtC,YAAY,UAAU,GAAG,EAAE;QACzB,KAAK,CAAC,UAAU,CAAC,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,SAA0C;QACzE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,CAAC;QAGnD,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjE,CAAC;QAGD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1E,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAG/C,IAAI,IAAgB,CAAC;QACrB,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,QAAQ;gBACX,IAAI,GAAG,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBAC3C,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,GAAG,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBAC3C,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,GAAG,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC;gBAC5E,MAAM;QACV,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { Hasher } from './hasher';
2
+ export declare class HasherFactory {
3
+ static create(algorithm: string, saltLength?: number): Hasher;
4
+ }
@@ -0,0 +1,13 @@
1
+ import { SodiumHasher } from './client/sodium-hasher';
2
+ export class HasherFactory {
3
+ static create(algorithm, saltLength = 16) {
4
+ switch (algorithm) {
5
+ case SodiumHasher.name:
6
+ return new SodiumHasher(saltLength);
7
+ break;
8
+ default:
9
+ throw new Error(`Unsupported algorithm: ${algorithm}`);
10
+ }
11
+ }
12
+ }
13
+ //# sourceMappingURL=hasher-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasher-factory.js","sourceRoot":"","sources":["../../../src/hash/hasher-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGtD,MAAM,OAAO,aAAa;IACxB,MAAM,CAAC,MAAM,CAAC,SAAiB,EAAE,UAAU,GAAG,EAAE;QAC9C,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,YAAY,CAAC,IAAI;gBACpB,OAAO,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;gBACpC,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ export declare abstract class Hasher {
2
+ protected saltToUse: Uint8Array;
3
+ constructor(saltLength?: number);
4
+ abstract sha256(text: string): Promise<string>;
5
+ abstract sha512(text: string): Promise<string>;
6
+ abstract blake2b(text: string): Promise<string>;
7
+ }
@@ -0,0 +1,9 @@
1
+ export class Hasher {
2
+ constructor(saltLength = 16) {
3
+ if (saltLength <= 0) {
4
+ throw new Error('Salt length must be a positive number.');
5
+ }
6
+ this.saltToUse = new Uint8Array(saltLength);
7
+ }
8
+ }
9
+ //# sourceMappingURL=hasher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasher.js","sourceRoot":"","sources":["../../../src/hash/hasher.ts"],"names":[],"mappings":"AAAA,MAAM,OAAgB,MAAM;IAG1B,YAAY,UAAU,GAAG,EAAE;QACzB,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;CAOF"}
@@ -0,0 +1,9 @@
1
+ export * from './encrypt/cryptoEngine';
2
+ export * from './sign/jwt-data-signer';
3
+ export * from './hash/hasher';
4
+ export * from './hash/hasher-factory';
5
+ export * from './hash/client/sodium-hasher';
6
+ export * from './password-encryptor/password-encryptor-factory';
7
+ export * from './password-encryptor/password-encryptor';
8
+ export * from './password-encryptor/client/bcrypt-password-encryptor';
9
+ export * from './password-encryptor/client/sodium-password-encryptor';
@@ -0,0 +1,10 @@
1
+ export * from './encrypt/cryptoEngine';
2
+ export * from './sign/jwt-data-signer';
3
+ export * from './hash/hasher';
4
+ export * from './hash/hasher-factory';
5
+ export * from './hash/client/sodium-hasher';
6
+ export * from './password-encryptor/password-encryptor-factory';
7
+ export * from './password-encryptor/password-encryptor';
8
+ export * from './password-encryptor/client/bcrypt-password-encryptor';
9
+ export * from './password-encryptor/client/sodium-password-encryptor';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AAEvC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAE5C,cAAc,iDAAiD,CAAC;AAChE,cAAc,yCAAyC,CAAC;AACxD,cAAc,uDAAuD,CAAC;AACtE,cAAc,uDAAuD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { PasswordEncryptor } from '../password-encryptor';
2
+ export declare class BcryptPasswordEncryptor extends PasswordEncryptor {
3
+ private static bcrypt;
4
+ constructor(saltRounds?: number);
5
+ private ensureBcryptAvailable;
6
+ hashPassword(password: string): Promise<string>;
7
+ verifyPassword(password: string, hash: string): Promise<boolean>;
8
+ static isValidHash(hash: string): boolean;
9
+ }
@@ -0,0 +1,30 @@
1
+ import { PasswordEncryptor } from '../password-encryptor';
2
+ export class BcryptPasswordEncryptor extends PasswordEncryptor {
3
+ constructor(saltRounds = 10) {
4
+ super(saltRounds);
5
+ this.ensureBcryptAvailable();
6
+ }
7
+ ensureBcryptAvailable() {
8
+ if (!BcryptPasswordEncryptor.bcrypt) {
9
+ try {
10
+ BcryptPasswordEncryptor.bcrypt = require('bcrypt');
11
+ }
12
+ catch {
13
+ console.warn('bcrypt is not installed. Password encryption will not be available.');
14
+ throw new Error('bcrypt module is required but not installed.');
15
+ }
16
+ }
17
+ }
18
+ async hashPassword(password) {
19
+ return await BcryptPasswordEncryptor.bcrypt.hash(password, this._saltRounds);
20
+ }
21
+ async verifyPassword(password, hash) {
22
+ return await BcryptPasswordEncryptor.bcrypt.compare(password, hash);
23
+ }
24
+ static isValidHash(hash) {
25
+ const bcryptRegex = /^\$2[aby]?\$\d{2}\$[./A-Za-z0-9]{53}$/;
26
+ return bcryptRegex.test(hash);
27
+ }
28
+ }
29
+ BcryptPasswordEncryptor.bcrypt = null;
30
+ //# sourceMappingURL=bcrypt-password-encryptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bcrypt-password-encryptor.js","sourceRoot":"","sources":["../../../../src/password-encryptor/client/bcrypt-password-encryptor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,OAAO,uBAAwB,SAAQ,iBAAiB;IAO5D,YAAY,UAAU,GAAG,EAAE;QACzB,KAAK,CAAC,UAAU,CAAC,CAAC;QAClB,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAEO,qBAAqB;QAC3B,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,CAAC;gBAEH,uBAAuB,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;gBACpF,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAOD,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,OAAO,MAAM,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/E,CAAC;IAQD,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,IAAY;QACjD,OAAO,MAAM,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;IAOD,MAAM,CAAC,WAAW,CAAC,IAAY;QAC7B,MAAM,WAAW,GAAG,uCAAuC,CAAC;QAC5D,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;;AAlDc,8BAAM,GAAQ,IAAI,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { PasswordEncryptor } from '../password-encryptor';
2
+ export declare class SodiumPasswordEncryptor extends PasswordEncryptor {
3
+ private getOpsAndMemLimits;
4
+ hashPassword(password: string): Promise<string>;
5
+ verifyPassword(password: string, hash: string): Promise<boolean>;
6
+ }
@@ -0,0 +1,34 @@
1
+ import { PasswordEncryptor } from '../password-encryptor';
2
+ import { SodiumInitializer } from '../../sodium-initializer';
3
+ export class SodiumPasswordEncryptor extends PasswordEncryptor {
4
+ getOpsAndMemLimits(sodium) {
5
+ if (this._saltRounds <= 10) {
6
+ return {
7
+ opslimit: sodium.crypto_pwhash_OPSLIMIT_INTERACTIVE,
8
+ memlimit: sodium.crypto_pwhash_MEMLIMIT_INTERACTIVE,
9
+ };
10
+ }
11
+ else if (this._saltRounds <= 20) {
12
+ return {
13
+ opslimit: sodium.crypto_pwhash_OPSLIMIT_MODERATE,
14
+ memlimit: sodium.crypto_pwhash_MEMLIMIT_MODERATE,
15
+ };
16
+ }
17
+ else {
18
+ return {
19
+ opslimit: sodium.crypto_pwhash_OPSLIMIT_SENSITIVE,
20
+ memlimit: sodium.crypto_pwhash_MEMLIMIT_SENSITIVE,
21
+ };
22
+ }
23
+ }
24
+ async hashPassword(password) {
25
+ const sodium = await SodiumInitializer.getSodium();
26
+ const { opslimit, memlimit } = this.getOpsAndMemLimits(sodium);
27
+ return sodium.crypto_pwhash_str(password, opslimit, memlimit);
28
+ }
29
+ async verifyPassword(password, hash) {
30
+ const sodium = await SodiumInitializer.getSodium();
31
+ return sodium.crypto_pwhash_str_verify(hash, password);
32
+ }
33
+ }
34
+ //# sourceMappingURL=sodium-password-encryptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sodium-password-encryptor.js","sourceRoot":"","sources":["../../../../src/password-encryptor/client/sodium-password-encryptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,OAAO,uBAAwB,SAAQ,iBAAiB;IACpD,kBAAkB,CAAC,MAAM;QAC/B,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;YAC3B,OAAO;gBACL,QAAQ,EAAE,MAAM,CAAC,kCAAkC;gBACnD,QAAQ,EAAE,MAAM,CAAC,kCAAkC;aACpD,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;YAClC,OAAO;gBACL,QAAQ,EAAE,MAAM,CAAC,+BAA+B;gBAChD,QAAQ,EAAE,MAAM,CAAC,+BAA+B;aACjD,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,QAAQ,EAAE,MAAM,CAAC,gCAAgC;gBACjD,QAAQ,EAAE,MAAM,CAAC,gCAAgC;aAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,CAAC;QACnD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE/D,OAAO,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,IAAY;QACjD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,CAAC;QACnD,OAAO,MAAM,CAAC,wBAAwB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { PasswordEncryptor } from './password-encryptor';
2
+ export declare class PasswordEncryptorFactory {
3
+ static create(algorithm: string, saltRounds?: number): PasswordEncryptor;
4
+ }
@@ -0,0 +1,17 @@
1
+ import { BcryptPasswordEncryptor } from './client/bcrypt-password-encryptor';
2
+ import { SodiumPasswordEncryptor } from './client/sodium-password-encryptor';
3
+ export class PasswordEncryptorFactory {
4
+ static create(algorithm, saltRounds = 10) {
5
+ switch (algorithm) {
6
+ case BcryptPasswordEncryptor.name:
7
+ return new BcryptPasswordEncryptor(saltRounds);
8
+ break;
9
+ case SodiumPasswordEncryptor.name:
10
+ return new SodiumPasswordEncryptor(saltRounds);
11
+ break;
12
+ default:
13
+ throw new Error(`Unsupported algorithm: ${algorithm}`);
14
+ }
15
+ }
16
+ }
17
+ //# sourceMappingURL=password-encryptor-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-encryptor-factory.js","sourceRoot":"","sources":["../../../src/password-encryptor/password-encryptor-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,MAAM,OAAO,wBAAwB;IACnC,MAAM,CAAC,MAAM,CAAC,SAAiB,EAAE,UAAU,GAAG,EAAE;QAC9C,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,uBAAuB,CAAC,IAAI;gBAC/B,OAAO,IAAI,uBAAuB,CAAC,UAAU,CAAC,CAAC;gBAC/C,MAAM;YACR,KAAK,uBAAuB,CAAC,IAAI;gBAC/B,OAAO,IAAI,uBAAuB,CAAC,UAAU,CAAC,CAAC;gBAC/C,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ export declare abstract class PasswordEncryptor {
2
+ protected readonly _saltRounds: number;
3
+ constructor(saltRounds?: number);
4
+ abstract hashPassword(password: string): Promise<string>;
5
+ abstract verifyPassword(password: string, hash: string): Promise<boolean>;
6
+ }
@@ -0,0 +1,9 @@
1
+ export class PasswordEncryptor {
2
+ constructor(saltRounds = 10) {
3
+ if (saltRounds < 4 || saltRounds > 31) {
4
+ throw new Error('Salt rounds must be between 4 and 31.');
5
+ }
6
+ this._saltRounds = saltRounds;
7
+ }
8
+ }
9
+ //# sourceMappingURL=password-encryptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-encryptor.js","sourceRoot":"","sources":["../../../src/password-encryptor/password-encryptor.ts"],"names":[],"mappings":"AAAA,MAAM,OAAgB,iBAAiB;IAGrC,YAAY,UAAU,GAAG,EAAE;QACzB,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;CAgBF"}
@@ -0,0 +1,11 @@
1
+ export declare class JWTDataSigner {
2
+ private static jwt;
3
+ private readonly secretKey;
4
+ private readonly signOptions;
5
+ private readonly verifyOptions;
6
+ constructor(secretKey: string, signOptions?: any, verifyOptions?: any);
7
+ private ensureJWTAvailable;
8
+ sign(data: object): string;
9
+ verify(signedData: string): object;
10
+ data(signedData: string): object;
11
+ }
@@ -0,0 +1,46 @@
1
+ export class JWTDataSigner {
2
+ constructor(secretKey, signOptions = {}, verifyOptions = {}) {
3
+ const MIN_SECRET_KEY_LENGTH = 16;
4
+ this.ensureJWTAvailable();
5
+ if (typeof secretKey !== 'string' || secretKey.length < MIN_SECRET_KEY_LENGTH) {
6
+ throw new Error(`La clave secreta debe ser una cadena de al menos ${MIN_SECRET_KEY_LENGTH} caracteres.`);
7
+ }
8
+ this.secretKey = secretKey;
9
+ this.signOptions = signOptions;
10
+ this.verifyOptions = verifyOptions;
11
+ }
12
+ ensureJWTAvailable() {
13
+ if (!JWTDataSigner.jwt) {
14
+ try {
15
+ JWTDataSigner.jwt = require('jsonwebtoken');
16
+ }
17
+ catch {
18
+ console.warn('jsonwebtoken is not installed. JWT signing functionality will not be available.');
19
+ throw new Error('jsonwebtoken module is required but not installed.');
20
+ }
21
+ }
22
+ }
23
+ sign(data) {
24
+ return JWTDataSigner.jwt.sign(data, this.secretKey, this.signOptions);
25
+ }
26
+ verify(signedData) {
27
+ try {
28
+ const data = JWTDataSigner.jwt.verify(signedData, this.secretKey, this.verifyOptions);
29
+ return data ?? {};
30
+ }
31
+ catch (error) {
32
+ throw new Error(`verify Error: ${error.message}`);
33
+ }
34
+ }
35
+ data(signedData) {
36
+ try {
37
+ const decoded = JWTDataSigner.jwt.decode(signedData);
38
+ return decoded ?? {};
39
+ }
40
+ catch (error) {
41
+ throw new Error(`data Error: ${error.message}`);
42
+ }
43
+ }
44
+ }
45
+ JWTDataSigner.jwt = null;
46
+ //# sourceMappingURL=jwt-data-signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-data-signer.js","sourceRoot":"","sources":["../../../src/sign/jwt-data-signer.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAa;IAMxB,YAAY,SAAiB,EAAE,cAAmB,EAAE,EAAE,gBAAqB,EAAE;QAC3E,MAAM,qBAAqB,GAAG,EAAE,CAAC;QAEjC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;YAC9E,MAAM,IAAI,KAAK,CACb,oDAAoD,qBAAqB,cAAc,CACxF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC;gBAEH,aAAa,CAAC,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;YAC9C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CACV,iFAAiF,CAClF,CAAC;gBACF,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAY;QACf,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,CAAC,UAAkB;QACvB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAE5E,CAAC;YACT,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,iBAAkB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAkB;QACrB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAkB,CAAC;YACtE,OAAO,OAAO,IAAI,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,eAAgB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;;AAzDc,iBAAG,GAAQ,IAAI,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare class SodiumInitializer {
2
+ private static initializedPromise;
3
+ private static sodium;
4
+ static ensureInitialized(): Promise<void>;
5
+ static getSodium(): Promise<any>;
6
+ }
@@ -0,0 +1,26 @@
1
+ export class SodiumInitializer {
2
+ static async ensureInitialized() {
3
+ if (!this.initializedPromise) {
4
+ this.sodium = require('libsodium-wrappers-sumo');
5
+ this.initializedPromise = this.sodium.ready
6
+ .then(() => {
7
+ console.debug('Sodium successfully initialized.');
8
+ })
9
+ .catch((error) => {
10
+ console.error('Failed to initialize Sodium:', error);
11
+ throw error;
12
+ });
13
+ }
14
+ await this.initializedPromise;
15
+ }
16
+ static async getSodium() {
17
+ await this.ensureInitialized();
18
+ if (!this.sodium) {
19
+ throw new Error('libsodium-wrappers-sumo is not available. Please install it if needed.');
20
+ }
21
+ return this.sodium;
22
+ }
23
+ }
24
+ SodiumInitializer.initializedPromise = null;
25
+ SodiumInitializer.sodium = null;
26
+ //# sourceMappingURL=sodium-initializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sodium-initializer.js","sourceRoot":"","sources":["../../src/sodium-initializer.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAiB;IAIrB,MAAM,CAAC,KAAK,CAAC,iBAAiB;QACnC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAE7B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;YACjD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK;iBACxC,IAAI,CAAC,GAAG,EAAE;gBACT,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACpD,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;gBACrD,MAAM,KAAK,CAAC;YACd,CAAC,CAAC,CAAC;QACP,CAAC;QACD,MAAM,IAAI,CAAC,kBAAkB,CAAC;IAChC,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,SAAS;QAC3B,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;;AAzBc,oCAAkB,GAAyB,IAAI,CAAC;AAChD,wBAAM,GAAQ,IAAI,CAAC"}