@aidc-toolkit/utility 1.0.25-beta → 1.0.27-beta
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/dist/character-set.d.ts +222 -0
- package/dist/character-set.d.ts.map +1 -0
- package/dist/character-set.js +568 -0
- package/dist/character-set.js.map +1 -0
- package/dist/exclusion.d.ts +26 -0
- package/dist/exclusion.d.ts.map +1 -0
- package/dist/exclusion.js +18 -0
- package/dist/exclusion.js.map +1 -0
- package/dist/index.d.ts +26 -953
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -3505
- package/dist/index.js.map +1 -1
- package/dist/iterable-utility.d.ts +39 -0
- package/dist/iterable-utility.d.ts.map +1 -0
- package/dist/iterable-utility.js +35 -0
- package/dist/iterable-utility.js.map +1 -0
- package/dist/locale/en/locale-resources.d.ts +33 -0
- package/dist/locale/en/locale-resources.d.ts.map +1 -0
- package/dist/locale/en/locale-resources.js +32 -0
- package/dist/locale/en/locale-resources.js.map +1 -0
- package/dist/locale/fr/locale-resources.d.ts +33 -0
- package/dist/locale/fr/locale-resources.d.ts.map +1 -0
- package/dist/locale/fr/locale-resources.js +32 -0
- package/dist/locale/fr/locale-resources.js.map +1 -0
- package/dist/locale/i18n.d.ts +27 -0
- package/dist/locale/i18n.d.ts.map +1 -0
- package/dist/locale/i18n.js +34 -0
- package/dist/locale/i18n.js.map +1 -0
- package/dist/record.d.ts +37 -0
- package/dist/record.d.ts.map +1 -0
- package/dist/record.js +58 -0
- package/dist/record.js.map +1 -0
- package/dist/reg-exp.d.ts +40 -0
- package/dist/reg-exp.d.ts.map +1 -0
- package/dist/reg-exp.js +55 -0
- package/dist/reg-exp.js.map +1 -0
- package/dist/sequence.d.ts +45 -0
- package/dist/sequence.d.ts.map +1 -0
- package/dist/sequence.js +96 -0
- package/dist/sequence.js.map +1 -0
- package/dist/string.d.ts +25 -0
- package/dist/string.d.ts.map +1 -0
- package/dist/string.js +2 -0
- package/dist/string.js.map +1 -0
- package/dist/transformer.d.ts +196 -0
- package/dist/transformer.d.ts.map +1 -0
- package/dist/transformer.js +457 -0
- package/dist/transformer.js.map +1 -0
- package/package.json +10 -6
- package/src/character-set.ts +62 -59
- package/src/index.ts +9 -9
- package/src/locale/i18n.ts +3 -3
- package/src/locale/i18next.d.ts +1 -1
- package/src/record.ts +8 -8
- package/src/reg-exp.ts +6 -6
- package/src/sequence.ts +21 -21
- package/src/transformer.ts +54 -54
- package/test/character-set.test.ts +1 -1
- package/test/record.test.ts +1 -1
- package/test/reg-exp.test.ts +1 -1
- package/test/sequence.test.ts +1 -1
- package/test/setup.ts +1 -1
- package/test/transformer.test.ts +1 -6
- package/tsconfig-config.json +4 -0
- package/tsconfig-src.json +8 -0
- package/tsconfig-test.json +9 -0
- package/tsconfig.json +12 -1
- package/tsup.config.ts +3 -2
- package/dist/index.cjs +0 -3570
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -953
package/src/sequence.ts
CHANGED
|
@@ -5,32 +5,32 @@ export class Sequence implements Iterable<bigint> {
|
|
|
5
5
|
/**
|
|
6
6
|
* Start value (inclusive).
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
readonly #startValue: bigint;
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* End value (exclusive).
|
|
12
12
|
*/
|
|
13
|
-
|
|
13
|
+
readonly #endValue: bigint;
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Count of values.
|
|
17
17
|
*/
|
|
18
|
-
|
|
18
|
+
readonly #count: number;
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* Delta to the next value; equal to the sign of the count.
|
|
22
22
|
*/
|
|
23
|
-
|
|
23
|
+
readonly #nextDelta: 1n | -1n;
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
26
|
* Minimum value (inclusive).
|
|
27
27
|
*/
|
|
28
|
-
|
|
28
|
+
readonly #minimumValue: bigint;
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* Maximum value (inclusive).
|
|
32
32
|
*/
|
|
33
|
-
|
|
33
|
+
readonly #maximumValue: bigint;
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Constructor.
|
|
@@ -43,18 +43,18 @@ export class Sequence implements Iterable<bigint> {
|
|
|
43
43
|
* start value.
|
|
44
44
|
*/
|
|
45
45
|
constructor(startValue: number | bigint, count: number) {
|
|
46
|
-
this
|
|
47
|
-
this
|
|
48
|
-
this
|
|
46
|
+
this.#startValue = BigInt(startValue);
|
|
47
|
+
this.#endValue = this.#startValue + BigInt(count);
|
|
48
|
+
this.#count = count;
|
|
49
49
|
|
|
50
50
|
if (count >= 0) {
|
|
51
|
-
this
|
|
52
|
-
this
|
|
53
|
-
this
|
|
51
|
+
this.#nextDelta = 1n;
|
|
52
|
+
this.#minimumValue = this.#startValue;
|
|
53
|
+
this.#maximumValue = this.#endValue - 1n;
|
|
54
54
|
} else {
|
|
55
|
-
this
|
|
56
|
-
this
|
|
57
|
-
this
|
|
55
|
+
this.#nextDelta = -1n;
|
|
56
|
+
this.#minimumValue = this.#endValue + 1n;
|
|
57
|
+
this.#maximumValue = this.#startValue;
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
|
|
@@ -62,35 +62,35 @@ export class Sequence implements Iterable<bigint> {
|
|
|
62
62
|
* Get the start value (inclusive).
|
|
63
63
|
*/
|
|
64
64
|
get startValue(): bigint {
|
|
65
|
-
return this
|
|
65
|
+
return this.#startValue;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
/**
|
|
69
69
|
* Get the end value (exclusive).
|
|
70
70
|
*/
|
|
71
71
|
get endValue(): bigint {
|
|
72
|
-
return this
|
|
72
|
+
return this.#endValue;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
/**
|
|
76
76
|
* Get the count of values.
|
|
77
77
|
*/
|
|
78
78
|
get count(): number {
|
|
79
|
-
return this
|
|
79
|
+
return this.#count;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
/**
|
|
83
83
|
* Get the minimum value (inclusive).
|
|
84
84
|
*/
|
|
85
85
|
get minimumValue(): bigint {
|
|
86
|
-
return this
|
|
86
|
+
return this.#minimumValue;
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
/**
|
|
90
90
|
* Get the maximum value (inclusive).
|
|
91
91
|
*/
|
|
92
92
|
get maximumValue(): bigint {
|
|
93
|
-
return this
|
|
93
|
+
return this.#maximumValue;
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
/**
|
|
@@ -100,7 +100,7 @@ export class Sequence implements Iterable<bigint> {
|
|
|
100
100
|
* Next value in sequence.
|
|
101
101
|
*/
|
|
102
102
|
* [Symbol.iterator](): Generator<bigint> {
|
|
103
|
-
for (let value = this
|
|
103
|
+
for (let value = this.#startValue; value !== this.#endValue; value += this.#nextDelta) {
|
|
104
104
|
yield value;
|
|
105
105
|
}
|
|
106
106
|
}
|
package/src/transformer.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { type IndexedCallback, mapIterable } from "./iterable-utility";
|
|
2
|
-
import { i18nextUtility } from "./locale/i18n";
|
|
3
|
-
import { Sequence } from "./sequence";
|
|
1
|
+
import { type IndexedCallback, mapIterable } from "./iterable-utility.js";
|
|
2
|
+
import { i18nextUtility } from "./locale/i18n.js";
|
|
3
|
+
import { Sequence } from "./sequence.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Transformer primitive type.
|
|
@@ -54,12 +54,12 @@ export abstract class Transformer {
|
|
|
54
54
|
/**
|
|
55
55
|
* Transformers cache, mapping a domain to another map, which maps an optional tweak to a transformer.
|
|
56
56
|
*/
|
|
57
|
-
|
|
57
|
+
static readonly #TRANSFORMER_MAPS_MAP = new Map<bigint, Map<bigint | undefined, Transformer>>();
|
|
58
58
|
|
|
59
59
|
/**
|
|
60
60
|
* Domain.
|
|
61
61
|
*/
|
|
62
|
-
|
|
62
|
+
readonly #domain: bigint;
|
|
63
63
|
|
|
64
64
|
/**
|
|
65
65
|
* Constructor.
|
|
@@ -68,9 +68,9 @@ export abstract class Transformer {
|
|
|
68
68
|
* Domain.
|
|
69
69
|
*/
|
|
70
70
|
constructor(domain: number | bigint) {
|
|
71
|
-
this
|
|
71
|
+
this.#domain = BigInt(domain);
|
|
72
72
|
|
|
73
|
-
if (this
|
|
73
|
+
if (this.#domain <= 0n) {
|
|
74
74
|
throw new RangeError(i18nextUtility.t("Transformer.domainMustBeGreaterThanZero", {
|
|
75
75
|
domain
|
|
76
76
|
}));
|
|
@@ -95,11 +95,11 @@ export abstract class Transformer {
|
|
|
95
95
|
static get(domain: number | bigint, tweak?: number | bigint): Transformer {
|
|
96
96
|
const domainN = BigInt(domain);
|
|
97
97
|
|
|
98
|
-
let transformersMap = Transformer
|
|
98
|
+
let transformersMap = Transformer.#TRANSFORMER_MAPS_MAP.get(domainN);
|
|
99
99
|
|
|
100
100
|
if (transformersMap === undefined) {
|
|
101
101
|
transformersMap = new Map();
|
|
102
|
-
Transformer
|
|
102
|
+
Transformer.#TRANSFORMER_MAPS_MAP.set(domainN, transformersMap);
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
const tweakN = tweak === undefined ? undefined : BigInt(tweak);
|
|
@@ -118,7 +118,7 @@ export abstract class Transformer {
|
|
|
118
118
|
* Get the domain.
|
|
119
119
|
*/
|
|
120
120
|
get domain(): bigint {
|
|
121
|
-
return this
|
|
121
|
+
return this.#domain;
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
/**
|
|
@@ -127,7 +127,7 @@ export abstract class Transformer {
|
|
|
127
127
|
* @param value
|
|
128
128
|
* Value.
|
|
129
129
|
*/
|
|
130
|
-
|
|
130
|
+
#validate(value: bigint): void {
|
|
131
131
|
if (value < 0n) {
|
|
132
132
|
throw new RangeError(i18nextUtility.t("Transformer.valueMustBeGreaterThanOrEqualToZero", {
|
|
133
133
|
value
|
|
@@ -162,10 +162,10 @@ export abstract class Transformer {
|
|
|
162
162
|
* @returns
|
|
163
163
|
* Transformed value.
|
|
164
164
|
*/
|
|
165
|
-
|
|
165
|
+
#validateDoForward(value: number | bigint): bigint {
|
|
166
166
|
const valueN = BigInt(value);
|
|
167
167
|
|
|
168
|
-
this
|
|
168
|
+
this.#validate(valueN);
|
|
169
169
|
|
|
170
170
|
return this.doForward(valueN);
|
|
171
171
|
}
|
|
@@ -185,8 +185,8 @@ export abstract class Transformer {
|
|
|
185
185
|
* @returns
|
|
186
186
|
* Transformed value.
|
|
187
187
|
*/
|
|
188
|
-
|
|
189
|
-
return transformerCallback(this
|
|
188
|
+
#validateDoForwardCallback<TOutput>(transformerCallback: IndexedCallback<bigint, TOutput>, value: number | bigint, index?: number): TOutput {
|
|
189
|
+
return transformerCallback(this.#validateDoForward(value), index);
|
|
190
190
|
};
|
|
191
191
|
|
|
192
192
|
/**
|
|
@@ -231,7 +231,7 @@ export abstract class Transformer {
|
|
|
231
231
|
let result: bigint | TOutput | Iterable<bigint> | Iterable<TOutput>;
|
|
232
232
|
|
|
233
233
|
if (typeof valueOrValues !== "object") {
|
|
234
|
-
result = transformerCallback === undefined ? this
|
|
234
|
+
result = transformerCallback === undefined ? this.#validateDoForward(valueOrValues) : this.#validateDoForwardCallback(transformerCallback, valueOrValues);
|
|
235
235
|
} else if (valueOrValues instanceof Sequence) {
|
|
236
236
|
if (valueOrValues.minimumValue < 0n) {
|
|
237
237
|
throw new RangeError(i18nextUtility.t("Transformer.minimumValueMustBeGreaterThanOrEqualToZero", {
|
|
@@ -248,7 +248,7 @@ export abstract class Transformer {
|
|
|
248
248
|
|
|
249
249
|
result = transformerCallback === undefined ? mapIterable(valueOrValues, value => this.doForward(value)) : mapIterable(valueOrValues, (value, index) => transformerCallback(this.doForward(value), index));
|
|
250
250
|
} else {
|
|
251
|
-
result = transformerCallback === undefined ? mapIterable(valueOrValues, value => this
|
|
251
|
+
result = transformerCallback === undefined ? mapIterable(valueOrValues, value => this.#validateDoForward(value)) : mapIterable(valueOrValues, (value, index) => this.#validateDoForwardCallback(transformerCallback, value, index));
|
|
252
252
|
}
|
|
253
253
|
|
|
254
254
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Type determination is handled above.
|
|
@@ -278,7 +278,7 @@ export abstract class Transformer {
|
|
|
278
278
|
reverse(transformedValue: number | bigint): bigint {
|
|
279
279
|
const transformedValueN = BigInt(transformedValue);
|
|
280
280
|
|
|
281
|
-
this
|
|
281
|
+
this.#validate(transformedValueN);
|
|
282
282
|
|
|
283
283
|
return this.doReverse(transformedValueN);
|
|
284
284
|
}
|
|
@@ -328,41 +328,41 @@ export class EncryptionTransformer extends Transformer {
|
|
|
328
328
|
/**
|
|
329
329
|
* Individual bits, pre-calculated for performance.
|
|
330
330
|
*/
|
|
331
|
-
|
|
331
|
+
static readonly #BITS = new Uint8Array([
|
|
332
332
|
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
|
|
333
333
|
]);
|
|
334
334
|
|
|
335
335
|
/**
|
|
336
336
|
* Inverse individual bits, pre-calculated for performance.
|
|
337
337
|
*/
|
|
338
|
-
|
|
338
|
+
static readonly #INVERSE_BITS = new Uint8Array([
|
|
339
339
|
0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F
|
|
340
340
|
]);
|
|
341
341
|
|
|
342
342
|
/**
|
|
343
343
|
* Number of bytes covered by the domain.
|
|
344
344
|
*/
|
|
345
|
-
|
|
345
|
+
readonly #domainBytes: number;
|
|
346
346
|
|
|
347
347
|
/**
|
|
348
348
|
* Xor bytes array generated from the domain and tweak.
|
|
349
349
|
*/
|
|
350
|
-
|
|
350
|
+
readonly #xorBytes: Uint8Array;
|
|
351
351
|
|
|
352
352
|
/**
|
|
353
353
|
* Bits array generated from the domain and tweak.
|
|
354
354
|
*/
|
|
355
|
-
|
|
355
|
+
readonly #bits: Uint8Array;
|
|
356
356
|
|
|
357
357
|
/**
|
|
358
358
|
* Inverse bits array generated from the domain and tweak.
|
|
359
359
|
*/
|
|
360
|
-
|
|
360
|
+
readonly #inverseBits: Uint8Array;
|
|
361
361
|
|
|
362
362
|
/**
|
|
363
363
|
* Number of rounds (length of arrays) generated from the domain and tweak.
|
|
364
364
|
*/
|
|
365
|
-
|
|
365
|
+
readonly #rounds: number;
|
|
366
366
|
|
|
367
367
|
/**
|
|
368
368
|
* Constructor.
|
|
@@ -389,7 +389,7 @@ export class EncryptionTransformer extends Transformer {
|
|
|
389
389
|
domainBytes++;
|
|
390
390
|
}
|
|
391
391
|
|
|
392
|
-
this
|
|
392
|
+
this.#domainBytes = domainBytes;
|
|
393
393
|
|
|
394
394
|
const xorBytes = new Array<number>();
|
|
395
395
|
const bits = new Array<number>();
|
|
@@ -404,29 +404,29 @@ export class EncryptionTransformer extends Transformer {
|
|
|
404
404
|
const bitNumber = Number(BigInt.asUintN(3, reducedKey));
|
|
405
405
|
|
|
406
406
|
// Bits are applied in reverse order so that they don't correlate directly with the key bytes at the same index.
|
|
407
|
-
bits.push(EncryptionTransformer
|
|
408
|
-
inverseBits.push(EncryptionTransformer
|
|
407
|
+
bits.push(EncryptionTransformer.#BITS[bitNumber]);
|
|
408
|
+
inverseBits.push(EncryptionTransformer.#INVERSE_BITS[bitNumber]);
|
|
409
409
|
}
|
|
410
410
|
|
|
411
411
|
// Domains occupying a single byte will not shuffle and will map all values to themselves for very small domains.
|
|
412
412
|
if (domainBytes === 1) {
|
|
413
413
|
// Determine the lowest possible mask that will cover all values in the domain.
|
|
414
|
-
const domainMask = EncryptionTransformer
|
|
414
|
+
const domainMask = EncryptionTransformer.#BITS.filter(bit => bit < domain).reduce((accumulator, bit) => accumulator | bit, 0);
|
|
415
415
|
|
|
416
416
|
// Reduce all xor bytes to a single byte and strip higher bits.
|
|
417
|
-
this
|
|
417
|
+
this.#xorBytes = new Uint8Array([xorBytes.reduce((accumulator, xorByte) => accumulator ^ xorByte, 0) & domainMask]);
|
|
418
418
|
|
|
419
419
|
// Bits and inverse bits are irrelevant as there will be no shuffling; choose first bit arbitrarily.
|
|
420
|
-
this
|
|
421
|
-
this
|
|
420
|
+
this.#bits = new Uint8Array([EncryptionTransformer.#BITS[0]]);
|
|
421
|
+
this.#inverseBits = new Uint8Array([EncryptionTransformer.#INVERSE_BITS[0]]);
|
|
422
422
|
|
|
423
423
|
// Everything will be done in one round.
|
|
424
|
-
this
|
|
424
|
+
this.#rounds = 1;
|
|
425
425
|
} else {
|
|
426
|
-
this
|
|
427
|
-
this
|
|
428
|
-
this
|
|
429
|
-
this
|
|
426
|
+
this.#xorBytes = new Uint8Array(xorBytes);
|
|
427
|
+
this.#bits = new Uint8Array(bits);
|
|
428
|
+
this.#inverseBits = new Uint8Array(inverseBits);
|
|
429
|
+
this.#rounds = xorBytes.length;
|
|
430
430
|
}
|
|
431
431
|
}
|
|
432
432
|
|
|
@@ -439,11 +439,11 @@ export class EncryptionTransformer extends Transformer {
|
|
|
439
439
|
* @returns
|
|
440
440
|
* Big-endian byte array equivalent to the value.
|
|
441
441
|
*/
|
|
442
|
-
|
|
443
|
-
const bytes = new Uint8Array(this
|
|
442
|
+
#valueToBytes(value: bigint): Uint8Array {
|
|
443
|
+
const bytes = new Uint8Array(this.#domainBytes);
|
|
444
444
|
|
|
445
445
|
// Build byte array in reverse order to get as big-endian.
|
|
446
|
-
for (let index = this
|
|
446
|
+
for (let index = this.#domainBytes - 1, reducedValue = value; index >= 0 && reducedValue !== 0n; index--, reducedValue >>= 8n) {
|
|
447
447
|
bytes[index] = Number(BigInt.asUintN(8, reducedValue));
|
|
448
448
|
}
|
|
449
449
|
|
|
@@ -459,7 +459,7 @@ export class EncryptionTransformer extends Transformer {
|
|
|
459
459
|
* @returns
|
|
460
460
|
* Value.
|
|
461
461
|
*/
|
|
462
|
-
|
|
462
|
+
static #bytesToValue(bytes: Uint8Array): bigint {
|
|
463
463
|
return bytes.reduce((accumulator, byte) => accumulator << 8n | BigInt(byte), 0n);
|
|
464
464
|
}
|
|
465
465
|
|
|
@@ -493,7 +493,7 @@ export class EncryptionTransformer extends Transformer {
|
|
|
493
493
|
* @returns
|
|
494
494
|
* Shuffled byte array.
|
|
495
495
|
*/
|
|
496
|
-
|
|
496
|
+
#shuffle(bytes: Uint8Array, round: number, forward: boolean): Uint8Array {
|
|
497
497
|
const bytesLength = bytes.length;
|
|
498
498
|
|
|
499
499
|
const determinants = new Uint8Array(bytesLength);
|
|
@@ -501,7 +501,7 @@ export class EncryptionTransformer extends Transformer {
|
|
|
501
501
|
const shuffleIndexes1 = new Array<number>();
|
|
502
502
|
const shuffleIndexes0 = new Array<number>();
|
|
503
503
|
|
|
504
|
-
const bit = this
|
|
504
|
+
const bit = this.#bits[round];
|
|
505
505
|
|
|
506
506
|
bytes.forEach((byte, index) => {
|
|
507
507
|
const determinant = byte & bit;
|
|
@@ -512,7 +512,7 @@ export class EncryptionTransformer extends Transformer {
|
|
|
512
512
|
(determinant !== 0 ? shuffleIndexes1 : shuffleIndexes0).push(index);
|
|
513
513
|
});
|
|
514
514
|
|
|
515
|
-
const inverseBit = this
|
|
515
|
+
const inverseBit = this.#inverseBits[round];
|
|
516
516
|
|
|
517
517
|
const shuffleBytes = new Uint8Array(bytesLength);
|
|
518
518
|
|
|
@@ -560,8 +560,8 @@ export class EncryptionTransformer extends Transformer {
|
|
|
560
560
|
* @returns
|
|
561
561
|
* Xored byte array.
|
|
562
562
|
*/
|
|
563
|
-
|
|
564
|
-
let cumulativeXorByte = this
|
|
563
|
+
#xor(bytes: Uint8Array, round: number, forward: boolean): Uint8Array {
|
|
564
|
+
let cumulativeXorByte = this.#xorBytes[round];
|
|
565
565
|
|
|
566
566
|
return bytes.map((byte) => {
|
|
567
567
|
const xorByte = byte ^ cumulativeXorByte;
|
|
@@ -576,17 +576,17 @@ export class EncryptionTransformer extends Transformer {
|
|
|
576
576
|
* @inheritDoc
|
|
577
577
|
*/
|
|
578
578
|
protected doForward(value: bigint): bigint {
|
|
579
|
-
let bytes = this
|
|
579
|
+
let bytes = this.#valueToBytes(value);
|
|
580
580
|
let transformedValue: bigint;
|
|
581
581
|
|
|
582
582
|
// Loop repeats until transformed value is within domain.
|
|
583
583
|
do {
|
|
584
584
|
// Forward operation is shuffle then xor for the number of rounds.
|
|
585
|
-
for (let round = 0; round < this
|
|
586
|
-
bytes = this
|
|
585
|
+
for (let round = 0; round < this.#rounds; round++) {
|
|
586
|
+
bytes = this.#xor(this.#shuffle(bytes, round, true), round, true);
|
|
587
587
|
}
|
|
588
588
|
|
|
589
|
-
transformedValue = EncryptionTransformer
|
|
589
|
+
transformedValue = EncryptionTransformer.#bytesToValue(bytes);
|
|
590
590
|
} while (transformedValue >= this.domain);
|
|
591
591
|
|
|
592
592
|
return transformedValue;
|
|
@@ -596,17 +596,17 @@ export class EncryptionTransformer extends Transformer {
|
|
|
596
596
|
* @inheritDoc
|
|
597
597
|
*/
|
|
598
598
|
protected doReverse(transformedValue: bigint): bigint {
|
|
599
|
-
let bytes = this
|
|
599
|
+
let bytes = this.#valueToBytes(transformedValue);
|
|
600
600
|
let value: bigint;
|
|
601
601
|
|
|
602
602
|
// Loop repeats until value is within domain.
|
|
603
603
|
do {
|
|
604
604
|
// Reverse operation is xor then shuffle for the number of rounds in reverse.
|
|
605
|
-
for (let round = this
|
|
606
|
-
bytes = this
|
|
605
|
+
for (let round = this.#rounds - 1; round >= 0; round--) {
|
|
606
|
+
bytes = this.#shuffle(this.#xor(bytes, round, false), round, false);
|
|
607
607
|
}
|
|
608
608
|
|
|
609
|
-
value = EncryptionTransformer
|
|
609
|
+
value = EncryptionTransformer.#bytesToValue(bytes);
|
|
610
610
|
} while (value >= this.domain);
|
|
611
611
|
|
|
612
612
|
return value;
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
NUMERIC_CREATOR,
|
|
14
14
|
NUMERIC_VALIDATOR,
|
|
15
15
|
Sequence
|
|
16
|
-
} from "../src";
|
|
16
|
+
} from "../src/index.js";
|
|
17
17
|
|
|
18
18
|
// Type is used to ensure that testCharacterSet() is not called with creator twice.
|
|
19
19
|
type ValidatorNotCreator<T extends CharacterSetValidator> = T extends CharacterSetCreator ? never : T;
|
package/test/record.test.ts
CHANGED
package/test/reg-exp.test.ts
CHANGED
package/test/sequence.test.ts
CHANGED
package/test/setup.ts
CHANGED
package/test/transformer.test.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test } from "vitest";
|
|
2
|
-
import { EncryptionTransformer, IdentityTransformer, Sequence, Transformer } from "../src";
|
|
2
|
+
import { EncryptionTransformer, IdentityTransformer, Sequence, Transformer } from "../src/index.js";
|
|
3
3
|
|
|
4
4
|
function testTransformer(domain: number, tweak?: number, callback?: (value: bigint, forwardValue: bigint) => void): void {
|
|
5
5
|
const transformer = Transformer.get(domain, tweak);
|
|
@@ -120,11 +120,6 @@ describe("Encryption", () => {
|
|
|
120
120
|
});
|
|
121
121
|
|
|
122
122
|
test("Byte boundary", () => {
|
|
123
|
-
expect((Transformer.get(256n, 1n) as EncryptionTransformer)["_domainBytes"]).toBe(1);
|
|
124
|
-
expect((Transformer.get(257n, 1n) as EncryptionTransformer)["_domainBytes"]).toBe(2);
|
|
125
|
-
expect((Transformer.get(65536n, 1n) as EncryptionTransformer)["_domainBytes"]).toBe(2);
|
|
126
|
-
expect((Transformer.get(65537n, 1n) as EncryptionTransformer)["_domainBytes"]).toBe(3);
|
|
127
|
-
|
|
128
123
|
testTransformer(256, 1);
|
|
129
124
|
testTransformer(257, 1);
|
|
130
125
|
});
|
package/tsconfig.json
CHANGED
package/tsup.config.ts
CHANGED