cyberchef 9.34.1 → 9.36.0

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.
@@ -0,0 +1,89 @@
1
+ /**
2
+ * @author Thomas Weißschuh [thomas@t-8ch.de]
3
+ * @copyright Crown Copyright 2021
4
+ * @license Apache-2.0
5
+ */
6
+
7
+ import {ALPHABET, highlightToBase45, highlightFromBase45} from "../lib/Base45.mjs";
8
+ import Operation from "../Operation.mjs";
9
+ import OperationError from "../errors/OperationError.mjs";
10
+ import Utils from "../Utils.mjs";
11
+
12
+
13
+ /**
14
+ * From Base45 operation
15
+ */
16
+ class FromBase45 extends Operation {
17
+
18
+ /**
19
+ * FromBase45 constructor
20
+ */
21
+ constructor() {
22
+ super();
23
+
24
+ this.name = "From Base45";
25
+ this.module = "Default";
26
+ this.description = "Base45 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system. Base45 is optimized for usage with QR codes.";
27
+ this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems";
28
+ this.inputType = "string";
29
+ this.outputType = "byteArray";
30
+ this.args = [
31
+ {
32
+ name: "Alphabet",
33
+ type: "string",
34
+ value: ALPHABET
35
+ }
36
+ ];
37
+
38
+ this.highlight = highlightFromBase45;
39
+ this.highlightReverse = highlightToBase45;
40
+ }
41
+
42
+ /**
43
+ * @param {string} input
44
+ * @param {Object[]} args
45
+ * @returns {byteArray}
46
+ */
47
+ run(input, args) {
48
+ if (!input) return [];
49
+ const alphabet = Utils.expandAlphRange(args[0]);
50
+
51
+ const res = [];
52
+
53
+ for (const triple of Utils.chunked(input, 3)) {
54
+ triple.reverse();
55
+ let b = 0;
56
+ for (const c of triple) {
57
+ const idx = alphabet.indexOf(c);
58
+ if (idx === -1) {
59
+ throw new OperationError(`Character not in alphabet: '${c}'`);
60
+ }
61
+ b *= 45;
62
+ b += idx;
63
+ }
64
+
65
+ if (b > 65535) {
66
+ throw new OperationError(`Triplet too large: '${triple.join("")}'`);
67
+ }
68
+
69
+ if (triple.length > 2) {
70
+ /**
71
+ * The last triple may only have 2 bytes so we push the MSB when we got 3 bytes
72
+ * Pushing MSB
73
+ */
74
+ res.push(b >> 8);
75
+ }
76
+
77
+ /**
78
+ * Pushing LSB
79
+ */
80
+ res.push(b & 0xff);
81
+
82
+ }
83
+
84
+ return res;
85
+ }
86
+
87
+ }
88
+
89
+ export default FromBase45;
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * Emulation of the Lorenz SZ40/42a/42b cipher attachment.
3
3
  *
4
+ * Tested against the Colossus Rebuild at Bletchley Park's TNMOC
5
+ * using a variety of inputs and settings to confirm correctness.
6
+ *
4
7
  * @author VirtualColossus [martin@virtualcolossus.co.uk]
5
8
  * @copyright Crown Copyright 2019
6
9
  * @license Apache-2.0
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Emulation of the SIGABA machine.
3
+ *
4
+ * @author hettysymes
5
+ * @copyright hettysymes 2020
6
+ * @license Apache-2.0
7
+ */
8
+
9
+ import Operation from "../Operation.mjs";
10
+ import {LETTERS} from "../lib/Enigma.mjs";
11
+ import {NUMBERS, CR_ROTORS, I_ROTORS, SigabaMachine, CRRotor, IRotor} from "../lib/SIGABA.mjs";
12
+
13
+ /**
14
+ * Sigaba operation
15
+ */
16
+ class Sigaba extends Operation {
17
+
18
+ /**
19
+ * Sigaba constructor
20
+ */
21
+ constructor() {
22
+ super();
23
+
24
+ this.name = "SIGABA";
25
+ this.module = "Bletchley";
26
+ this.description = "Encipher/decipher with the WW2 SIGABA machine. <br><br>SIGABA, otherwise known as ECM Mark II, was used by the United States for message encryption during WW2 up to the 1950s. It was developed in the 1930s by the US Army and Navy, and has up to this day never been broken. Consisting of 15 rotors: 5 cipher rotors and 10 rotors (5 control rotors and 5 index rotors) controlling the stepping of the cipher rotors, the rotor stepping for SIGABA is much more complex than other rotor machines of its time, such as Enigma. All example rotor wirings are random example sets.<br><br>To configure rotor wirings, for the cipher and control rotors enter a string of letters which map from A to Z, and for the index rotors enter a sequence of numbers which map from 0 to 9. Note that encryption is not the same as decryption, so first choose the desired mode. <br><br> Note: Whilst this has been tested against other software emulators, it has not been tested against hardware.";
27
+ this.infoURL = "https://wikipedia.org/wiki/SIGABA";
28
+ this.inputType = "string";
29
+ this.outputType = "string";
30
+ this.args = [
31
+ {
32
+ name: "1st (left-hand) cipher rotor",
33
+ type: "editableOption",
34
+ value: CR_ROTORS,
35
+ defaultIndex: 0
36
+ },
37
+ {
38
+ name: "1st cipher rotor reversed",
39
+ type: "boolean",
40
+ value: false
41
+ },
42
+ {
43
+ name: "1st cipher rotor intial value",
44
+ type: "option",
45
+ value: LETTERS
46
+ },
47
+ {
48
+ name: "2nd cipher rotor",
49
+ type: "editableOption",
50
+ value: CR_ROTORS,
51
+ defaultIndex: 0
52
+ },
53
+ {
54
+ name: "2nd cipher rotor reversed",
55
+ type: "boolean",
56
+ value: false
57
+ },
58
+ {
59
+ name: "2nd cipher rotor intial value",
60
+ type: "option",
61
+ value: LETTERS
62
+ },
63
+ {
64
+ name: "3rd (middle) cipher rotor",
65
+ type: "editableOption",
66
+ value: CR_ROTORS,
67
+ defaultIndex: 0
68
+ },
69
+ {
70
+ name: "3rd cipher rotor reversed",
71
+ type: "boolean",
72
+ value: false
73
+ },
74
+ {
75
+ name: "3rd cipher rotor intial value",
76
+ type: "option",
77
+ value: LETTERS
78
+ },
79
+ {
80
+ name: "4th cipher rotor",
81
+ type: "editableOption",
82
+ value: CR_ROTORS,
83
+ defaultIndex: 0
84
+ },
85
+ {
86
+ name: "4th cipher rotor reversed",
87
+ type: "boolean",
88
+ value: false
89
+ },
90
+ {
91
+ name: "4th cipher rotor intial value",
92
+ type: "option",
93
+ value: LETTERS
94
+ },
95
+ {
96
+ name: "5th (right-hand) cipher rotor",
97
+ type: "editableOption",
98
+ value: CR_ROTORS,
99
+ defaultIndex: 0
100
+ },
101
+ {
102
+ name: "5th cipher rotor reversed",
103
+ type: "boolean",
104
+ value: false
105
+ },
106
+ {
107
+ name: "5th cipher rotor intial value",
108
+ type: "option",
109
+ value: LETTERS
110
+ },
111
+ {
112
+ name: "1st (left-hand) control rotor",
113
+ type: "editableOption",
114
+ value: CR_ROTORS,
115
+ defaultIndex: 0
116
+ },
117
+ {
118
+ name: "1st control rotor reversed",
119
+ type: "boolean",
120
+ value: false
121
+ },
122
+ {
123
+ name: "1st control rotor intial value",
124
+ type: "option",
125
+ value: LETTERS
126
+ },
127
+ {
128
+ name: "2nd control rotor",
129
+ type: "editableOption",
130
+ value: CR_ROTORS,
131
+ defaultIndex: 0
132
+ },
133
+ {
134
+ name: "2nd control rotor reversed",
135
+ type: "boolean",
136
+ value: false
137
+ },
138
+ {
139
+ name: "2nd control rotor intial value",
140
+ type: "option",
141
+ value: LETTERS
142
+ },
143
+ {
144
+ name: "3rd (middle) control rotor",
145
+ type: "editableOption",
146
+ value: CR_ROTORS,
147
+ defaultIndex: 0
148
+ },
149
+ {
150
+ name: "3rd control rotor reversed",
151
+ type: "boolean",
152
+ value: false
153
+ },
154
+ {
155
+ name: "3rd control rotor intial value",
156
+ type: "option",
157
+ value: LETTERS
158
+ },
159
+ {
160
+ name: "4th control rotor",
161
+ type: "editableOption",
162
+ value: CR_ROTORS,
163
+ defaultIndex: 0
164
+ },
165
+ {
166
+ name: "4th control rotor reversed",
167
+ type: "boolean",
168
+ value: false
169
+ },
170
+ {
171
+ name: "4th control rotor intial value",
172
+ type: "option",
173
+ value: LETTERS
174
+ },
175
+ {
176
+ name: "5th (right-hand) control rotor",
177
+ type: "editableOption",
178
+ value: CR_ROTORS,
179
+ defaultIndex: 0
180
+ },
181
+ {
182
+ name: "5th control rotor reversed",
183
+ type: "boolean",
184
+ value: false
185
+ },
186
+ {
187
+ name: "5th control rotor intial value",
188
+ type: "option",
189
+ value: LETTERS
190
+ },
191
+ {
192
+ name: "1st (left-hand) index rotor",
193
+ type: "editableOption",
194
+ value: I_ROTORS,
195
+ defaultIndex: 0
196
+ },
197
+ {
198
+ name: "1st index rotor intial value",
199
+ type: "option",
200
+ value: NUMBERS
201
+ },
202
+ {
203
+ name: "2nd index rotor",
204
+ type: "editableOption",
205
+ value: I_ROTORS,
206
+ defaultIndex: 0
207
+ },
208
+ {
209
+ name: "2nd index rotor intial value",
210
+ type: "option",
211
+ value: NUMBERS
212
+ },
213
+ {
214
+ name: "3rd (middle) index rotor",
215
+ type: "editableOption",
216
+ value: I_ROTORS,
217
+ defaultIndex: 0
218
+ },
219
+ {
220
+ name: "3rd index rotor intial value",
221
+ type: "option",
222
+ value: NUMBERS
223
+ },
224
+ {
225
+ name: "4th index rotor",
226
+ type: "editableOption",
227
+ value: I_ROTORS,
228
+ defaultIndex: 0
229
+ },
230
+ {
231
+ name: "4th index rotor intial value",
232
+ type: "option",
233
+ value: NUMBERS
234
+ },
235
+ {
236
+ name: "5th (right-hand) index rotor",
237
+ type: "editableOption",
238
+ value: I_ROTORS,
239
+ defaultIndex: 0
240
+ },
241
+ {
242
+ name: "5th index rotor intial value",
243
+ type: "option",
244
+ value: NUMBERS
245
+ },
246
+ {
247
+ name: "SIGABA mode",
248
+ type: "option",
249
+ value: ["Encrypt", "Decrypt"]
250
+ }
251
+ ];
252
+ }
253
+
254
+ /**
255
+ * @param {string} input
256
+ * @param {Object[]} args
257
+ * @returns {string}
258
+ */
259
+ run(input, args) {
260
+ const sigabaSwitch = args[40];
261
+ const cipherRotors = [];
262
+ const controlRotors = [];
263
+ const indexRotors = [];
264
+ for (let i=0; i<5; i++) {
265
+ const rotorWiring = args[i*3];
266
+ cipherRotors.push(new CRRotor(rotorWiring, args[i*3+2], args[i*3+1]));
267
+ }
268
+ for (let i=5; i<10; i++) {
269
+ const rotorWiring = args[i*3];
270
+ controlRotors.push(new CRRotor(rotorWiring, args[i*3+2], args[i*3+1]));
271
+ }
272
+ for (let i=15; i<20; i++) {
273
+ const rotorWiring = args[i*2];
274
+ indexRotors.push(new IRotor(rotorWiring, args[i*2+1]));
275
+ }
276
+ const sigaba = new SigabaMachine(cipherRotors, controlRotors, indexRotors);
277
+ let result;
278
+ if (sigabaSwitch === "Encrypt") {
279
+ result = sigaba.encrypt(input);
280
+ } else if (sigabaSwitch === "Decrypt") {
281
+ result = sigaba.decrypt(input);
282
+ }
283
+ return result;
284
+ }
285
+
286
+ }
287
+ export default Sigaba;
@@ -87,7 +87,7 @@ class ScatterChart extends Operation {
87
87
  const recordDelimiter = Utils.charRep(args[0]),
88
88
  fieldDelimiter = Utils.charRep(args[1]),
89
89
  columnHeadingsAreIncluded = args[2],
90
- fillColour = args[5],
90
+ fillColour = Utils.escapeHtml(args[5]),
91
91
  radius = args[6],
92
92
  colourInInput = args[7],
93
93
  dimension = 500;
@@ -72,7 +72,10 @@ class SeriesChart extends Operation {
72
72
  fieldDelimiter = Utils.charRep(args[1]),
73
73
  xLabel = args[2],
74
74
  pipRadius = args[3],
75
- seriesColours = args[4].split(","),
75
+ // Escape HTML from all colours to prevent reflected XSS. See https://github.com/gchq/CyberChef/issues/1265
76
+ seriesColours = args[4].split(",").map((colour) => {
77
+ return Utils.escapeHtml(colour);
78
+ }),
76
79
  svgWidth = 500,
77
80
  interSeriesPadding = 20,
78
81
  xAxisHeight = 50,
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @author Thomas Weißschuh [thomas@t-8ch.de]
3
+ * @copyright Crown Copyright 2021
4
+ * @license Apache-2.0
5
+ */
6
+
7
+ import {ALPHABET, highlightToBase45, highlightFromBase45} from "../lib/Base45.mjs";
8
+ import Operation from "../Operation.mjs";
9
+ import Utils from "../Utils.mjs";
10
+
11
+ /**
12
+ * To Base45 operation
13
+ */
14
+ class ToBase45 extends Operation {
15
+
16
+ /**
17
+ * ToBase45 constructor
18
+ */
19
+ constructor() {
20
+ super();
21
+
22
+ this.name = "To Base45";
23
+ this.module = "Default";
24
+ this.description = "Base45 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system. Base45 is optimized for usage with QR codes.";
25
+ this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems";
26
+ this.inputType = "ArrayBuffer";
27
+ this.outputType = "string";
28
+ this.args = [
29
+ {
30
+ name: "Alphabet",
31
+ type: "string",
32
+ value: ALPHABET
33
+ }
34
+ ];
35
+
36
+ this.highlight = highlightToBase45;
37
+ this.highlightReverse = highlightFromBase45;
38
+ }
39
+
40
+ /**
41
+ * @param {ArrayBuffer} input
42
+ * @param {Object[]} args
43
+ * @returns {string}
44
+ */
45
+ run(input, args) {
46
+ input = new Uint8Array(input);
47
+ const alphabet = Utils.expandAlphRange(args[0]);
48
+ if (!input) return "";
49
+
50
+ const res = [];
51
+
52
+ for (const pair of Utils.chunked(input, 2)) {
53
+ let b = 0;
54
+ for (const e of pair) {
55
+ b *= 256;
56
+ b += e;
57
+ }
58
+
59
+ let chars = 0;
60
+ do {
61
+ res.push(alphabet[b % 45]);
62
+ chars++;
63
+ b = Math.floor(b / 45);
64
+ } while (b > 0);
65
+
66
+ if (chars < 2) {
67
+ res.push("0");
68
+ }
69
+ }
70
+
71
+
72
+ return res.join("");
73
+
74
+ }
75
+
76
+ }
77
+
78
+ export default ToBase45;
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * Emulation of the Typex machine.
3
3
  *
4
+ * Tested against a genuine Typex machine using a variety of inputs
5
+ * and settings to confirm correctness.
6
+ *
4
7
  * @author s2224834
5
8
  * @copyright Crown Copyright 2019
6
9
  * @license Apache-2.0
@@ -120,6 +120,7 @@ import FrequencyDistribution from "./FrequencyDistribution.mjs";
120
120
  import FromBCD from "./FromBCD.mjs";
121
121
  import FromBase from "./FromBase.mjs";
122
122
  import FromBase32 from "./FromBase32.mjs";
123
+ import FromBase45 from "./FromBase45.mjs";
123
124
  import FromBase58 from "./FromBase58.mjs";
124
125
  import FromBase62 from "./FromBase62.mjs";
125
126
  import FromBase64 from "./FromBase64.mjs";
@@ -274,6 +275,7 @@ import SHA0 from "./SHA0.mjs";
274
275
  import SHA1 from "./SHA1.mjs";
275
276
  import SHA2 from "./SHA2.mjs";
276
277
  import SHA3 from "./SHA3.mjs";
278
+ import SIGABA from "./SIGABA.mjs";
277
279
  import SM3 from "./SM3.mjs";
278
280
  import SQLBeautify from "./SQLBeautify.mjs";
279
281
  import SQLMinify from "./SQLMinify.mjs";
@@ -315,6 +317,7 @@ import TextEncodingBruteForce from "./TextEncodingBruteForce.mjs";
315
317
  import ToBCD from "./ToBCD.mjs";
316
318
  import ToBase from "./ToBase.mjs";
317
319
  import ToBase32 from "./ToBase32.mjs";
320
+ import ToBase45 from "./ToBase45.mjs";
318
321
  import ToBase58 from "./ToBase58.mjs";
319
322
  import ToBase62 from "./ToBase62.mjs";
320
323
  import ToBase64 from "./ToBase64.mjs";
@@ -487,6 +490,7 @@ export {
487
490
  FromBCD,
488
491
  FromBase,
489
492
  FromBase32,
493
+ FromBase45,
490
494
  FromBase58,
491
495
  FromBase62,
492
496
  FromBase64,
@@ -641,6 +645,7 @@ export {
641
645
  SHA1,
642
646
  SHA2,
643
647
  SHA3,
648
+ SIGABA,
644
649
  SM3,
645
650
  SQLBeautify,
646
651
  SQLMinify,
@@ -682,6 +687,7 @@ export {
682
687
  ToBCD,
683
688
  ToBase,
684
689
  ToBase32,
690
+ ToBase45,
685
691
  ToBase58,
686
692
  ToBase62,
687
693
  ToBase64,
@@ -127,6 +127,7 @@ import {
127
127
  FromBCD as core_FromBCD,
128
128
  FromBase as core_FromBase,
129
129
  FromBase32 as core_FromBase32,
130
+ FromBase45 as core_FromBase45,
130
131
  FromBase58 as core_FromBase58,
131
132
  FromBase62 as core_FromBase62,
132
133
  FromBase64 as core_FromBase64,
@@ -275,6 +276,7 @@ import {
275
276
  SHA1 as core_SHA1,
276
277
  SHA2 as core_SHA2,
277
278
  SHA3 as core_SHA3,
279
+ SIGABA as core_SIGABA,
278
280
  SM3 as core_SM3,
279
281
  SQLBeautify as core_SQLBeautify,
280
282
  SQLMinify as core_SQLMinify,
@@ -315,6 +317,7 @@ import {
315
317
  ToBCD as core_ToBCD,
316
318
  ToBase as core_ToBase,
317
319
  ToBase32 as core_ToBase32,
320
+ ToBase45 as core_ToBase45,
318
321
  ToBase58 as core_ToBase58,
319
322
  ToBase62 as core_ToBase62,
320
323
  ToBase64 as core_ToBase64,
@@ -494,6 +497,7 @@ function generateChef() {
494
497
  "fromBCD": _wrap(core_FromBCD),
495
498
  "fromBase": _wrap(core_FromBase),
496
499
  "fromBase32": _wrap(core_FromBase32),
500
+ "fromBase45": _wrap(core_FromBase45),
497
501
  "fromBase58": _wrap(core_FromBase58),
498
502
  "fromBase62": _wrap(core_FromBase62),
499
503
  "fromBase64": _wrap(core_FromBase64),
@@ -642,6 +646,7 @@ function generateChef() {
642
646
  "SHA1": _wrap(core_SHA1),
643
647
  "SHA2": _wrap(core_SHA2),
644
648
  "SHA3": _wrap(core_SHA3),
649
+ "SIGABA": _wrap(core_SIGABA),
645
650
  "SM3": _wrap(core_SM3),
646
651
  "SQLBeautify": _wrap(core_SQLBeautify),
647
652
  "SQLMinify": _wrap(core_SQLMinify),
@@ -682,6 +687,7 @@ function generateChef() {
682
687
  "toBCD": _wrap(core_ToBCD),
683
688
  "toBase": _wrap(core_ToBase),
684
689
  "toBase32": _wrap(core_ToBase32),
690
+ "toBase45": _wrap(core_ToBase45),
685
691
  "toBase58": _wrap(core_ToBase58),
686
692
  "toBase62": _wrap(core_ToBase62),
687
693
  "toBase64": _wrap(core_ToBase64),
@@ -872,6 +878,7 @@ const frequencyDistribution = chef.frequencyDistribution;
872
878
  const fromBCD = chef.fromBCD;
873
879
  const fromBase = chef.fromBase;
874
880
  const fromBase32 = chef.fromBase32;
881
+ const fromBase45 = chef.fromBase45;
875
882
  const fromBase58 = chef.fromBase58;
876
883
  const fromBase62 = chef.fromBase62;
877
884
  const fromBase64 = chef.fromBase64;
@@ -1026,6 +1033,7 @@ const SHA0 = chef.SHA0;
1026
1033
  const SHA1 = chef.SHA1;
1027
1034
  const SHA2 = chef.SHA2;
1028
1035
  const SHA3 = chef.SHA3;
1036
+ const SIGABA = chef.SIGABA;
1029
1037
  const SM3 = chef.SM3;
1030
1038
  const SQLBeautify = chef.SQLBeautify;
1031
1039
  const SQLMinify = chef.SQLMinify;
@@ -1067,6 +1075,7 @@ const textEncodingBruteForce = chef.textEncodingBruteForce;
1067
1075
  const toBCD = chef.toBCD;
1068
1076
  const toBase = chef.toBase;
1069
1077
  const toBase32 = chef.toBase32;
1078
+ const toBase45 = chef.toBase45;
1070
1079
  const toBase58 = chef.toBase58;
1071
1080
  const toBase62 = chef.toBase62;
1072
1081
  const toBase64 = chef.toBase64;
@@ -1241,6 +1250,7 @@ const operations = [
1241
1250
  fromBCD,
1242
1251
  fromBase,
1243
1252
  fromBase32,
1253
+ fromBase45,
1244
1254
  fromBase58,
1245
1255
  fromBase62,
1246
1256
  fromBase64,
@@ -1395,6 +1405,7 @@ const operations = [
1395
1405
  SHA1,
1396
1406
  SHA2,
1397
1407
  SHA3,
1408
+ SIGABA,
1398
1409
  SM3,
1399
1410
  SQLBeautify,
1400
1411
  SQLMinify,
@@ -1436,6 +1447,7 @@ const operations = [
1436
1447
  toBCD,
1437
1448
  toBase,
1438
1449
  toBase32,
1450
+ toBase45,
1439
1451
  toBase58,
1440
1452
  toBase62,
1441
1453
  toBase64,
@@ -1614,6 +1626,7 @@ export {
1614
1626
  fromBCD,
1615
1627
  fromBase,
1616
1628
  fromBase32,
1629
+ fromBase45,
1617
1630
  fromBase58,
1618
1631
  fromBase62,
1619
1632
  fromBase64,
@@ -1768,6 +1781,7 @@ export {
1768
1781
  SHA1,
1769
1782
  SHA2,
1770
1783
  SHA3,
1784
+ SIGABA,
1771
1785
  SM3,
1772
1786
  SQLBeautify,
1773
1787
  SQLMinify,
@@ -1809,6 +1823,7 @@ export {
1809
1823
  toBCD,
1810
1824
  toBase,
1811
1825
  toBase32,
1826
+ toBase45,
1812
1827
  toBase58,
1813
1828
  toBase62,
1814
1829
  toBase64,
@@ -20,6 +20,7 @@ import TestRegister from "../lib/TestRegister.mjs";
20
20
  import "./tests/BCD.mjs";
21
21
  import "./tests/BSON.mjs";
22
22
  import "./tests/BaconCipher.mjs";
23
+ import "./tests/Base45.mjs";
23
24
  import "./tests/Base58.mjs";
24
25
  import "./tests/Base64.mjs";
25
26
  import "./tests/Base62.mjs";
@@ -108,6 +109,8 @@ import "./tests/JA3Fingerprint.mjs";
108
109
  import "./tests/JA3SFingerprint.mjs";
109
110
  import "./tests/HASSH.mjs";
110
111
  import "./tests/GetAllCasings.mjs";
112
+ import "./tests/SIGABA.mjs";
113
+
111
114
 
112
115
  // Cannot test operations that use the File type yet
113
116
  // import "./tests/SplitColourChannels.mjs";