cyberchef 11.1.0 → 11.3.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.
Files changed (148) hide show
  1. package/AGENTS.md +75 -0
  2. package/CHANGELOG.md +173 -2
  3. package/Dockerfile +2 -2
  4. package/Gruntfile.js +1 -0
  5. package/README.md +7 -6
  6. package/SECURITY.md +3 -1
  7. package/package.json +22 -21
  8. package/src/core/Chef.mjs +2 -0
  9. package/src/core/Dish.mjs +1 -5
  10. package/src/core/Ingredient.mjs +92 -0
  11. package/src/core/Operation.mjs +19 -0
  12. package/src/core/Recipe.mjs +4 -0
  13. package/src/core/Utils.mjs +48 -0
  14. package/src/core/config/Categories.json +22 -6
  15. package/src/core/config/OperationConfig.json +4774 -1228
  16. package/src/core/config/modules/Ciphers.mjs +20 -0
  17. package/src/core/config/modules/Crypto.mjs +10 -0
  18. package/src/core/config/modules/Default.mjs +8 -0
  19. package/src/core/config/modules/File.mjs +16 -0
  20. package/src/core/config/modules/OpModules.mjs +2 -0
  21. package/src/core/config/scripts/generateHTMLEntities.mjs +139 -0
  22. package/src/core/config/scripts/htmlEntityOverrides.mjs +86 -0
  23. package/src/core/dishTypes/DishType.mjs +1 -1
  24. package/src/core/errors/ExcludedOperationError.mjs +1 -1
  25. package/src/core/lib/Arithmetic.mjs +21 -5
  26. package/src/core/lib/BigIntUtils.mjs +0 -1
  27. package/src/core/lib/COBS.mjs +86 -0
  28. package/src/core/lib/Charts.mjs +3 -3
  29. package/src/core/lib/Decimal.mjs +5 -5
  30. package/src/core/lib/HTMLEntities.mjs +2068 -0
  31. package/src/core/lib/Present.mjs +422 -0
  32. package/src/core/lib/Protocol.mjs +8 -6
  33. package/src/core/lib/TEA.mjs +494 -0
  34. package/src/core/lib/TLVParser.mjs +16 -7
  35. package/src/core/lib/Twofish.mjs +608 -0
  36. package/src/core/operations/AsconDecrypt.mjs +112 -0
  37. package/src/core/operations/AsconEncrypt.mjs +108 -0
  38. package/src/core/operations/AsconHash.mjs +49 -0
  39. package/src/core/operations/AsconMAC.mjs +68 -0
  40. package/src/core/operations/AutomatedValidationTestOp.mjs +84 -0
  41. package/src/core/operations/AvroToJSON.mjs +1 -1
  42. package/src/core/operations/BLAKE3.mjs +5 -1
  43. package/src/core/operations/BcryptCompare.mjs +11 -5
  44. package/src/core/operations/BitShiftLeft.mjs +4 -1
  45. package/src/core/operations/Bzip2Compress.mjs +1 -1
  46. package/src/core/operations/DechunkHTTPResponse.mjs +4 -1
  47. package/src/core/operations/ExtendedGCD.mjs +101 -0
  48. package/src/core/operations/FromBase.mjs +2 -1
  49. package/src/core/operations/FromCOBS.mjs +38 -0
  50. package/src/core/operations/FromDecimal.mjs +6 -1
  51. package/src/core/operations/FromHTMLEntity.mjs +2 -1458
  52. package/src/core/operations/GenerateDeBruijnSequence.mjs +8 -0
  53. package/src/core/operations/GenerateHOTP.mjs +21 -6
  54. package/src/core/operations/GenerateImage.mjs +22 -10
  55. package/src/core/operations/GeneratePrime.mjs +154 -0
  56. package/src/core/operations/GenerateTOTP.mjs +24 -7
  57. package/src/core/operations/Gzip.mjs +1 -3
  58. package/src/core/operations/Jsonata.mjs +12 -0
  59. package/src/core/operations/MIMEDecoding.mjs +1 -1
  60. package/src/core/operations/MOD.mjs +62 -0
  61. package/src/core/operations/ModularInverse.mjs +107 -0
  62. package/src/core/operations/PRESENTDecrypt.mjs +94 -0
  63. package/src/core/operations/PRESENTEncrypt.mjs +94 -0
  64. package/src/core/operations/ParityBit.mjs +1 -1
  65. package/src/core/operations/ParseIPv4Header.mjs +1 -1
  66. package/src/core/operations/ParseURI.mjs +18 -5
  67. package/src/core/operations/PseudoRandomNumberGenerator.mjs +2 -1
  68. package/src/core/operations/RandomPrime.mjs +154 -0
  69. package/src/core/operations/RenderPDF.mjs +100 -0
  70. package/src/core/operations/SHA2.mjs +1 -1
  71. package/src/core/operations/SM4Encrypt.mjs +1 -1
  72. package/src/core/operations/SetDifference.mjs +8 -1
  73. package/src/core/operations/SetIntersection.mjs +8 -1
  74. package/src/core/operations/ShowOnMap.mjs +14 -2
  75. package/src/core/operations/TEADecrypt.mjs +98 -0
  76. package/src/core/operations/TEAEncrypt.mjs +98 -0
  77. package/src/core/operations/ToBase.mjs +4 -4
  78. package/src/core/operations/ToBase32.mjs +20 -4
  79. package/src/core/operations/ToBinary.mjs +4 -1
  80. package/src/core/operations/ToCOBS.mjs +38 -0
  81. package/src/core/operations/ToHTMLEntity.mjs +7 -1430
  82. package/src/core/operations/ToHexdump.mjs +7 -1
  83. package/src/core/operations/TwofishDecrypt.mjs +94 -0
  84. package/src/core/operations/TwofishEncrypt.mjs +94 -0
  85. package/src/core/operations/URLEncode.mjs +22 -18
  86. package/src/core/operations/UnescapeUnicodeCharacters.mjs +2 -1
  87. package/src/core/operations/ViewBitPlane.mjs +9 -3
  88. package/src/core/operations/Wrap.mjs +5 -0
  89. package/src/core/operations/XORBruteForce.mjs +4 -1
  90. package/src/core/operations/XORChecksum.mjs +10 -3
  91. package/src/core/operations/XTEADecrypt.mjs +110 -0
  92. package/src/core/operations/XTEAEncrypt.mjs +110 -0
  93. package/src/core/operations/index.mjs +42 -0
  94. package/src/core/vendor/ascon.mjs +162 -0
  95. package/src/core/vendor/htmlEntities/entity.json +2233 -0
  96. package/src/core/vendor/htmlEntities/entity.txt +14 -0
  97. package/src/node/api.mjs +4 -1
  98. package/src/node/index.mjs +105 -0
  99. package/src/web/HTMLOperation.mjs +2 -1
  100. package/src/web/stylesheets/layout/_io.css +8 -0
  101. package/tests/browser/00_nightwatch.js +26 -0
  102. package/tests/browser/02_ops.js +20 -4
  103. package/tests/node/index.mjs +2 -0
  104. package/tests/node/tests/Dish.mjs +19 -0
  105. package/tests/node/tests/NodeDish.mjs +36 -0
  106. package/tests/node/tests/ToHTMLEntity.mjs +82 -0
  107. package/tests/node/tests/Utils.mjs +77 -0
  108. package/tests/node/tests/lib/ChartsProtocolPrototypePollution.mjs +90 -0
  109. package/tests/node/tests/nodeApi.mjs +33 -1
  110. package/tests/node/tests/operations.mjs +26 -1
  111. package/tests/operations/index.mjs +17 -0
  112. package/tests/operations/tests/Arithmetic.mjs +33 -0
  113. package/tests/operations/tests/Ascon.mjs +501 -0
  114. package/tests/operations/tests/AutomatedValidation.mjs +154 -0
  115. package/tests/operations/tests/BLAKE3.mjs +39 -1
  116. package/tests/operations/tests/Base32.mjs +22 -0
  117. package/tests/operations/tests/COBS.mjs +476 -0
  118. package/tests/operations/tests/CharEnc.mjs +2 -2
  119. package/tests/operations/tests/DechunkHTTPResponse.mjs +66 -0
  120. package/tests/operations/tests/ExtendedGCD.mjs +78 -0
  121. package/tests/operations/tests/FromBase.mjs +66 -0
  122. package/tests/operations/tests/FromDecimal.mjs +55 -0
  123. package/tests/operations/tests/GenerateLoremIpsum.mjs +2 -2
  124. package/tests/operations/tests/Gzip.mjs +60 -0
  125. package/tests/operations/tests/HTMLEntity.mjs +126 -0
  126. package/tests/operations/tests/Hash.mjs +44 -0
  127. package/tests/operations/tests/Hexdump.mjs +11 -0
  128. package/tests/operations/tests/Image.mjs +26 -0
  129. package/tests/operations/tests/Jsonata.mjs +23 -0
  130. package/tests/operations/tests/MIMEDecoding.mjs +33 -0
  131. package/tests/operations/tests/MOD.mjs +208 -0
  132. package/tests/operations/tests/Median.mjs +33 -0
  133. package/tests/operations/tests/ModularInverse.mjs +78 -0
  134. package/tests/operations/tests/OTP.mjs +167 -2
  135. package/tests/operations/tests/PRESENT.mjs +465 -0
  136. package/tests/operations/tests/ParseIPv4Header.mjs +11 -0
  137. package/tests/operations/tests/ParseTLV.mjs +41 -0
  138. package/tests/operations/tests/RenderPDF.mjs +55 -0
  139. package/tests/operations/tests/SM2.mjs +1 -1
  140. package/tests/operations/tests/SetDifference.mjs +22 -0
  141. package/tests/operations/tests/SetIntersection.mjs +23 -1
  142. package/tests/operations/tests/ShowOnMap.mjs +61 -0
  143. package/tests/operations/tests/TEA.mjs +566 -0
  144. package/tests/operations/tests/Twofish.mjs +486 -0
  145. package/tests/operations/tests/URLEncodeDecode.mjs +26 -0
  146. package/tests/operations/tests/UnescapeUnicodeCharacters.mjs +88 -0
  147. package/tests/operations/tests/Wrap.mjs +44 -0
  148. package/webpack.config.js +3 -3
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Show on map tests
3
+ *
4
+ * @author Leon Zandman [leon@wirwar.com]
5
+ *
6
+ * @copyright Crown Copyright 2026
7
+ * @license Apache-2.0
8
+ */
9
+ import TestRegister from "../../lib/TestRegister.mjs";
10
+
11
+ TestRegister.addTests([
12
+ {
13
+ name: "Show on map: valid coordinate pair",
14
+ input: "51.5007, -0.1246",
15
+ // The presented output is the Leaflet map HTML; just check the coordinates made it through.
16
+ expectedMatch: /51\.5007,-0\.1246/,
17
+ recipeConfig: [
18
+ {
19
+ op: "Show on map",
20
+ args: [13, "Auto", "Auto"]
21
+ },
22
+ ],
23
+ },
24
+ {
25
+ // Regression test: a comma-separated input with the delimiter set to "\n" used to be
26
+ // mis-detected as a single Degrees Decimal Minutes value (1° 24' = 1.4°), producing a single
27
+ // coordinate. That single value was then passed to Leaflet's setView([1.4], ...), throwing
28
+ // an uncaught "Cannot read properties of null (reading 'lat')" TypeError in the browser.
29
+ name: "Show on map: single value is rejected with a helpful error",
30
+ input: "1, 24",
31
+ expectedOutput: "Could not show coordinates '1.4' on the map. Expected a latitude and longitude pair - check that the input format and delimiter are correct.",
32
+ recipeConfig: [
33
+ {
34
+ op: "Show on map",
35
+ args: [13, "Auto", "\\n"]
36
+ },
37
+ ],
38
+ },
39
+ {
40
+ name: "Show on map: empty input format is rejected",
41
+ input: "1, 24",
42
+ expectedOutput: "Input Format cannot be empty.",
43
+ recipeConfig: [
44
+ {
45
+ op: "Show on map",
46
+ args: [13, "", "Auto"]
47
+ },
48
+ ],
49
+ },
50
+ {
51
+ name: "Show on map: empty input delimiter is rejected",
52
+ input: "1, 24",
53
+ expectedOutput: "Input Delimiter cannot be empty.",
54
+ recipeConfig: [
55
+ {
56
+ op: "Show on map",
57
+ args: [13, "Auto", ""]
58
+ },
59
+ ],
60
+ },
61
+ ]);
@@ -0,0 +1,566 @@
1
+ /**
2
+ * TEA and XTEA cipher tests.
3
+ *
4
+ * Test vectors sourced from:
5
+ * - TEA: https://www.cix.co.uk/~klockstone/teavect.htm (Wheeler & Needham reference)
6
+ * - XTEA: https://github.com/golang/crypto/blob/master/xtea/xtea_test.go (Go standard library)
7
+ * Bouncy Castle XTEA test vectors (big-endian)
8
+ *
9
+ * @author Medjedtxm
10
+ * @copyright Crown Copyright 2026
11
+ * @license Apache-2.0
12
+ */
13
+
14
+ import TestRegister from "../../lib/TestRegister.mjs";
15
+
16
+ /**
17
+ * TEA ECB Tests — Official test vectors from Wheeler & Needham
18
+ *
19
+ * From teavect.htm: TEA uses a fixed 32 cycles (64 Feistel rounds).
20
+ * Row 1: plaintext 00000000 00000000, key 00000000 00000000 00000000 00000000
21
+ * -> ciphertext 41ea3a0a 94baa940
22
+ */
23
+ TestRegister.addTests([
24
+ // ==================== TEA ECB TESTS ====================
25
+ {
26
+ name: "TEA Encrypt: ECB, all-zero key and plaintext",
27
+ input: "0000000000000000",
28
+ expectedOutput: "41ea3a0a94baa940",
29
+ recipeConfig: [
30
+ {
31
+ "op": "TEA Encrypt",
32
+ "args": [
33
+ {"option": "Hex", "string": "00000000000000000000000000000000"},
34
+ {"option": "Hex", "string": ""},
35
+ "ECB", "Hex", "Hex", "NO"
36
+ ]
37
+ }
38
+ ],
39
+ },
40
+ {
41
+ name: "TEA Decrypt: ECB, all-zero key",
42
+ input: "41ea3a0a94baa940",
43
+ expectedOutput: "0000000000000000",
44
+ recipeConfig: [
45
+ {
46
+ "op": "TEA Decrypt",
47
+ "args": [
48
+ {"option": "Hex", "string": "00000000000000000000000000000000"},
49
+ {"option": "Hex", "string": ""},
50
+ "ECB", "Hex", "Hex", "NO"
51
+ ]
52
+ }
53
+ ],
54
+ },
55
+ {
56
+ name: "TEA Encrypt then Decrypt: round-trip ECB",
57
+ input: "48656c6c6f212121",
58
+ expectedOutput: "48656c6c6f212121",
59
+ recipeConfig: [
60
+ {
61
+ "op": "TEA Encrypt",
62
+ "args": [
63
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
64
+ {"option": "Hex", "string": ""},
65
+ "ECB", "Hex", "Hex", "NO"
66
+ ]
67
+ },
68
+ {
69
+ "op": "TEA Decrypt",
70
+ "args": [
71
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
72
+ {"option": "Hex", "string": ""},
73
+ "ECB", "Hex", "Hex", "NO"
74
+ ]
75
+ }
76
+ ],
77
+ },
78
+
79
+ // ==================== TEA CBC TEST ====================
80
+ {
81
+ name: "TEA Encrypt then Decrypt: round-trip CBC with PKCS5",
82
+ input: "Hello TEA cipher!",
83
+ expectedOutput: "Hello TEA cipher!",
84
+ recipeConfig: [
85
+ {
86
+ "op": "TEA Encrypt",
87
+ "args": [
88
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
89
+ {"option": "Hex", "string": "0000000000000000"},
90
+ "CBC", "Raw", "Hex", "PKCS5"
91
+ ]
92
+ },
93
+ {
94
+ "op": "TEA Decrypt",
95
+ "args": [
96
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
97
+ {"option": "Hex", "string": "0000000000000000"},
98
+ "CBC", "Hex", "Raw", "PKCS5"
99
+ ]
100
+ }
101
+ ],
102
+ },
103
+
104
+ // ==================== TEA CTR TEST ====================
105
+ {
106
+ name: "TEA Encrypt then Decrypt: round-trip CTR",
107
+ input: "Short",
108
+ expectedOutput: "Short",
109
+ recipeConfig: [
110
+ {
111
+ "op": "TEA Encrypt",
112
+ "args": [
113
+ {"option": "Hex", "string": "deadbeefdeadbeefdeadbeefdeadbeef"},
114
+ {"option": "Hex", "string": "0102030405060708"},
115
+ "CTR", "Raw", "Hex", "NO"
116
+ ]
117
+ },
118
+ {
119
+ "op": "TEA Decrypt",
120
+ "args": [
121
+ {"option": "Hex", "string": "deadbeefdeadbeefdeadbeefdeadbeef"},
122
+ {"option": "Hex", "string": "0102030405060708"},
123
+ "CTR", "Hex", "Raw", "NO"
124
+ ]
125
+ }
126
+ ],
127
+ },
128
+
129
+ // ==================== TEA CFB TEST ====================
130
+ {
131
+ name: "TEA Encrypt then Decrypt: round-trip CFB",
132
+ input: "CFB mode testing with TEA",
133
+ expectedOutput: "CFB mode testing with TEA",
134
+ recipeConfig: [
135
+ {
136
+ "op": "TEA Encrypt",
137
+ "args": [
138
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
139
+ {"option": "Hex", "string": "aabbccddeeff0011"},
140
+ "CFB", "Raw", "Hex", "NO"
141
+ ]
142
+ },
143
+ {
144
+ "op": "TEA Decrypt",
145
+ "args": [
146
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
147
+ {"option": "Hex", "string": "aabbccddeeff0011"},
148
+ "CFB", "Hex", "Raw", "NO"
149
+ ]
150
+ }
151
+ ],
152
+ },
153
+
154
+ // ==================== TEA OFB TEST ====================
155
+ {
156
+ name: "TEA Encrypt then Decrypt: round-trip OFB",
157
+ input: "OFB mode testing with TEA",
158
+ expectedOutput: "OFB mode testing with TEA",
159
+ recipeConfig: [
160
+ {
161
+ "op": "TEA Encrypt",
162
+ "args": [
163
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
164
+ {"option": "Hex", "string": "1122334455667788"},
165
+ "OFB", "Raw", "Hex", "NO"
166
+ ]
167
+ },
168
+ {
169
+ "op": "TEA Decrypt",
170
+ "args": [
171
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
172
+ {"option": "Hex", "string": "1122334455667788"},
173
+ "OFB", "Hex", "Raw", "NO"
174
+ ]
175
+ }
176
+ ],
177
+ },
178
+
179
+ // ==================== XTEA ECB TESTS ====================
180
+ // Go standard library + Bouncy Castle test vectors (big-endian)
181
+ {
182
+ name: "XTEA Encrypt: ECB, sequential key, 'ABCDEFGH'",
183
+ input: "4142434445464748",
184
+ expectedOutput: "497df3d072612cb5",
185
+ recipeConfig: [
186
+ {
187
+ "op": "XTEA Encrypt",
188
+ "args": [
189
+ {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"},
190
+ {"option": "Hex", "string": ""},
191
+ "ECB", "Hex", "Hex", "NO", 32
192
+ ]
193
+ }
194
+ ],
195
+ },
196
+ {
197
+ name: "XTEA Decrypt: ECB, sequential key",
198
+ input: "497df3d072612cb5",
199
+ expectedOutput: "4142434445464748",
200
+ recipeConfig: [
201
+ {
202
+ "op": "XTEA Decrypt",
203
+ "args": [
204
+ {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"},
205
+ {"option": "Hex", "string": ""},
206
+ "ECB", "Hex", "Hex", "NO", 32
207
+ ]
208
+ }
209
+ ],
210
+ },
211
+ {
212
+ name: "XTEA Encrypt: ECB, sequential key, 'AAAAAAAA'",
213
+ input: "4141414141414141",
214
+ expectedOutput: "e78f2d13744341d8",
215
+ recipeConfig: [
216
+ {
217
+ "op": "XTEA Encrypt",
218
+ "args": [
219
+ {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"},
220
+ {"option": "Hex", "string": ""},
221
+ "ECB", "Hex", "Hex", "NO", 32
222
+ ]
223
+ }
224
+ ],
225
+ },
226
+ {
227
+ name: "XTEA Encrypt: ECB, sequential key, plaintext 5a5b6e27",
228
+ input: "5a5b6e278948d77f",
229
+ expectedOutput: "4141414141414141",
230
+ recipeConfig: [
231
+ {
232
+ "op": "XTEA Encrypt",
233
+ "args": [
234
+ {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"},
235
+ {"option": "Hex", "string": ""},
236
+ "ECB", "Hex", "Hex", "NO", 32
237
+ ]
238
+ }
239
+ ],
240
+ },
241
+ {
242
+ name: "XTEA Encrypt: ECB, all-zero key, 'ABCDEFGH'",
243
+ input: "4142434445464748",
244
+ expectedOutput: "a0390589f8b8efa5",
245
+ recipeConfig: [
246
+ {
247
+ "op": "XTEA Encrypt",
248
+ "args": [
249
+ {"option": "Hex", "string": "00000000000000000000000000000000"},
250
+ {"option": "Hex", "string": ""},
251
+ "ECB", "Hex", "Hex", "NO", 32
252
+ ]
253
+ }
254
+ ],
255
+ },
256
+ {
257
+ name: "XTEA Encrypt: ECB, all-zero key, 'AAAAAAAA'",
258
+ input: "4141414141414141",
259
+ expectedOutput: "ed23375a821a8c2d",
260
+ recipeConfig: [
261
+ {
262
+ "op": "XTEA Encrypt",
263
+ "args": [
264
+ {"option": "Hex", "string": "00000000000000000000000000000000"},
265
+ {"option": "Hex", "string": ""},
266
+ "ECB", "Hex", "Hex", "NO", 32
267
+ ]
268
+ }
269
+ ],
270
+ },
271
+ {
272
+ name: "XTEA Encrypt: ECB, all-zero key, all-zero plaintext",
273
+ input: "0000000000000000",
274
+ expectedOutput: "dee9d4d8f7131ed9",
275
+ recipeConfig: [
276
+ {
277
+ "op": "XTEA Encrypt",
278
+ "args": [
279
+ {"option": "Hex", "string": "00000000000000000000000000000000"},
280
+ {"option": "Hex", "string": ""},
281
+ "ECB", "Hex", "Hex", "NO", 32
282
+ ]
283
+ }
284
+ ],
285
+ },
286
+ {
287
+ name: "XTEA Encrypt: ECB, all-zero key, sequential plaintext",
288
+ input: "0102030405060708",
289
+ expectedOutput: "065c1b8975c6a816",
290
+ recipeConfig: [
291
+ {
292
+ "op": "XTEA Encrypt",
293
+ "args": [
294
+ {"option": "Hex", "string": "00000000000000000000000000000000"},
295
+ {"option": "Hex", "string": ""},
296
+ "ECB", "Hex", "Hex", "NO", 32
297
+ ]
298
+ }
299
+ ],
300
+ },
301
+ {
302
+ name: "XTEA Encrypt: ECB, pattern key, all-zero plaintext",
303
+ input: "0000000000000000",
304
+ expectedOutput: "1ff9a0261ac64264",
305
+ recipeConfig: [
306
+ {
307
+ "op": "XTEA Encrypt",
308
+ "args": [
309
+ {"option": "Hex", "string": "0123456712345678234567893456789a"},
310
+ {"option": "Hex", "string": ""},
311
+ "ECB", "Hex", "Hex", "NO", 32
312
+ ]
313
+ }
314
+ ],
315
+ },
316
+ {
317
+ name: "XTEA Encrypt: ECB, pattern key, sequential plaintext",
318
+ input: "0102030405060708",
319
+ expectedOutput: "8c67155b2ef91ead",
320
+ recipeConfig: [
321
+ {
322
+ "op": "XTEA Encrypt",
323
+ "args": [
324
+ {"option": "Hex", "string": "0123456712345678234567893456789a"},
325
+ {"option": "Hex", "string": ""},
326
+ "ECB", "Hex", "Hex", "NO", 32
327
+ ]
328
+ }
329
+ ],
330
+ },
331
+ {
332
+ name: "XTEA Decrypt: ECB, pattern key, sequential ciphertext",
333
+ input: "8c67155b2ef91ead",
334
+ expectedOutput: "0102030405060708",
335
+ recipeConfig: [
336
+ {
337
+ "op": "XTEA Decrypt",
338
+ "args": [
339
+ {"option": "Hex", "string": "0123456712345678234567893456789a"},
340
+ {"option": "Hex", "string": ""},
341
+ "ECB", "Hex", "Hex", "NO", 32
342
+ ]
343
+ }
344
+ ],
345
+ },
346
+
347
+ // ==================== XTEA CBC TEST ====================
348
+ {
349
+ name: "XTEA Encrypt then Decrypt: round-trip CBC with PKCS5",
350
+ input: "Hello XTEA cipher!",
351
+ expectedOutput: "Hello XTEA cipher!",
352
+ recipeConfig: [
353
+ {
354
+ "op": "XTEA Encrypt",
355
+ "args": [
356
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
357
+ {"option": "Hex", "string": "fedcba9876543210"},
358
+ "CBC", "Raw", "Hex", "PKCS5", 32
359
+ ]
360
+ },
361
+ {
362
+ "op": "XTEA Decrypt",
363
+ "args": [
364
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
365
+ {"option": "Hex", "string": "fedcba9876543210"},
366
+ "CBC", "Hex", "Raw", "PKCS5", 32
367
+ ]
368
+ }
369
+ ],
370
+ },
371
+
372
+ // ==================== XTEA OFB TEST ====================
373
+ {
374
+ name: "XTEA Encrypt then Decrypt: round-trip OFB",
375
+ input: "Stream mode test",
376
+ expectedOutput: "Stream mode test",
377
+ recipeConfig: [
378
+ {
379
+ "op": "XTEA Encrypt",
380
+ "args": [
381
+ {"option": "Hex", "string": "deadbeefdeadbeefdeadbeefdeadbeef"},
382
+ {"option": "Hex", "string": "0102030405060708"},
383
+ "OFB", "Raw", "Hex", "NO", 32
384
+ ]
385
+ },
386
+ {
387
+ "op": "XTEA Decrypt",
388
+ "args": [
389
+ {"option": "Hex", "string": "deadbeefdeadbeefdeadbeefdeadbeef"},
390
+ {"option": "Hex", "string": "0102030405060708"},
391
+ "OFB", "Hex", "Raw", "NO", 32
392
+ ]
393
+ }
394
+ ],
395
+ },
396
+
397
+ // ==================== XTEA CTR TEST ====================
398
+ {
399
+ name: "XTEA Encrypt then Decrypt: round-trip CTR",
400
+ input: "CTR mode with XTEA",
401
+ expectedOutput: "CTR mode with XTEA",
402
+ recipeConfig: [
403
+ {
404
+ "op": "XTEA Encrypt",
405
+ "args": [
406
+ {"option": "Hex", "string": "deadbeefdeadbeefdeadbeefdeadbeef"},
407
+ {"option": "Hex", "string": "0000000000000001"},
408
+ "CTR", "Raw", "Hex", "NO", 32
409
+ ]
410
+ },
411
+ {
412
+ "op": "XTEA Decrypt",
413
+ "args": [
414
+ {"option": "Hex", "string": "deadbeefdeadbeefdeadbeefdeadbeef"},
415
+ {"option": "Hex", "string": "0000000000000001"},
416
+ "CTR", "Hex", "Raw", "NO", 32
417
+ ]
418
+ }
419
+ ],
420
+ },
421
+
422
+ // ==================== XTEA CFB TEST ====================
423
+ {
424
+ name: "XTEA Encrypt then Decrypt: round-trip CFB",
425
+ input: "CFB mode with XTEA cipher",
426
+ expectedOutput: "CFB mode with XTEA cipher",
427
+ recipeConfig: [
428
+ {
429
+ "op": "XTEA Encrypt",
430
+ "args": [
431
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
432
+ {"option": "Hex", "string": "aabbccddeeff0011"},
433
+ "CFB", "Raw", "Hex", "NO", 32
434
+ ]
435
+ },
436
+ {
437
+ "op": "XTEA Decrypt",
438
+ "args": [
439
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
440
+ {"option": "Hex", "string": "aabbccddeeff0011"},
441
+ "CFB", "Hex", "Raw", "NO", 32
442
+ ]
443
+ }
444
+ ],
445
+ },
446
+
447
+ // ==================== XTEA NON-DEFAULT ROUNDS TEST ====================
448
+ {
449
+ name: "XTEA Encrypt then Decrypt: round-trip ECB with 16 rounds",
450
+ input: "4142434445464748",
451
+ expectedOutput: "4142434445464748",
452
+ recipeConfig: [
453
+ {
454
+ "op": "XTEA Encrypt",
455
+ "args": [
456
+ {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"},
457
+ {"option": "Hex", "string": ""},
458
+ "ECB", "Hex", "Hex", "NO", 16
459
+ ]
460
+ },
461
+ {
462
+ "op": "XTEA Decrypt",
463
+ "args": [
464
+ {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"},
465
+ {"option": "Hex", "string": ""},
466
+ "ECB", "Hex", "Hex", "NO", 16
467
+ ]
468
+ }
469
+ ],
470
+ },
471
+ {
472
+ name: "XTEA Encrypt: ECB, 16 rounds differs from 32 rounds",
473
+ input: "4142434445464748",
474
+ expectedOutput: "497df3d072612cb5",
475
+ recipeConfig: [
476
+ {
477
+ "op": "XTEA Encrypt",
478
+ "args": [
479
+ {"option": "Hex", "string": "000102030405060708090a0b0c0d0e0f"},
480
+ {"option": "Hex", "string": ""},
481
+ "ECB", "Hex", "Hex", "NO", 32
482
+ ]
483
+ }
484
+ ],
485
+ },
486
+
487
+ // ==================== EDGE CASES ====================
488
+ {
489
+ name: "TEA Encrypt: empty input returns empty",
490
+ input: "",
491
+ expectedOutput: "",
492
+ recipeConfig: [
493
+ {
494
+ "op": "TEA Encrypt",
495
+ "args": [
496
+ {"option": "Hex", "string": "00000000000000000000000000000000"},
497
+ {"option": "Hex", "string": ""},
498
+ "ECB", "Hex", "Hex", "NO"
499
+ ]
500
+ }
501
+ ],
502
+ },
503
+ {
504
+ name: "XTEA Encrypt: empty input returns empty",
505
+ input: "",
506
+ expectedOutput: "",
507
+ recipeConfig: [
508
+ {
509
+ "op": "XTEA Encrypt",
510
+ "args": [
511
+ {"option": "Hex", "string": "00000000000000000000000000000000"},
512
+ {"option": "Hex", "string": ""},
513
+ "ECB", "Hex", "Hex", "NO", 32
514
+ ]
515
+ }
516
+ ],
517
+ },
518
+
519
+ // ==================== MULTI-BLOCK ECB TESTS ====================
520
+ {
521
+ name: "TEA Encrypt then Decrypt: multi-block ECB with PKCS5",
522
+ input: "This is a longer message that spans multiple TEA blocks!",
523
+ expectedOutput: "This is a longer message that spans multiple TEA blocks!",
524
+ recipeConfig: [
525
+ {
526
+ "op": "TEA Encrypt",
527
+ "args": [
528
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
529
+ {"option": "Hex", "string": ""},
530
+ "ECB", "Raw", "Hex", "PKCS5"
531
+ ]
532
+ },
533
+ {
534
+ "op": "TEA Decrypt",
535
+ "args": [
536
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
537
+ {"option": "Hex", "string": ""},
538
+ "ECB", "Hex", "Raw", "PKCS5"
539
+ ]
540
+ }
541
+ ],
542
+ },
543
+ {
544
+ name: "XTEA Encrypt then Decrypt: multi-block ECB with PKCS5",
545
+ input: "This is a longer message that spans multiple XTEA blocks!",
546
+ expectedOutput: "This is a longer message that spans multiple XTEA blocks!",
547
+ recipeConfig: [
548
+ {
549
+ "op": "XTEA Encrypt",
550
+ "args": [
551
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
552
+ {"option": "Hex", "string": ""},
553
+ "ECB", "Raw", "Hex", "PKCS5", 32
554
+ ]
555
+ },
556
+ {
557
+ "op": "XTEA Decrypt",
558
+ "args": [
559
+ {"option": "Hex", "string": "0123456789abcdef0123456789abcdef"},
560
+ {"option": "Hex", "string": ""},
561
+ "ECB", "Hex", "Raw", "PKCS5", 32
562
+ ]
563
+ }
564
+ ],
565
+ },
566
+ ]);