cyberchef 10.22.1 → 10.24.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 (118) hide show
  1. package/CHANGELOG.md +182 -0
  2. package/CONTRIBUTING.md +40 -0
  3. package/Dockerfile +2 -0
  4. package/Gruntfile.js +2 -28
  5. package/README.md +1 -1
  6. package/babel.config.js +0 -6
  7. package/package.json +64 -63
  8. package/src/core/Chef.mjs +8 -1
  9. package/src/core/Ingredient.mjs +5 -2
  10. package/src/core/Operation.mjs +6 -1
  11. package/src/core/Recipe.mjs +10 -5
  12. package/src/core/config/Categories.json +20 -4
  13. package/src/core/config/OperationConfig.json +550 -26
  14. package/src/core/config/modules/Ciphers.mjs +6 -0
  15. package/src/core/config/modules/Crypto.mjs +6 -0
  16. package/src/core/config/modules/Default.mjs +8 -0
  17. package/src/core/config/modules/Shellcode.mjs +2 -0
  18. package/src/core/config/scripts/fixCryptoApiImports.mjs +54 -0
  19. package/src/core/config/scripts/fixSnackBarMarkup.mjs +28 -0
  20. package/src/core/lib/AudioBytes.mjs +103 -0
  21. package/src/core/lib/AudioMetaSchema.mjs +82 -0
  22. package/src/core/lib/AudioParsers.mjs +630 -0
  23. package/src/core/lib/BigIntUtils.mjs +73 -0
  24. package/src/core/lib/Extract.mjs +5 -0
  25. package/src/core/lib/Modhex.mjs +2 -0
  26. package/src/core/lib/ParityBit.mjs +50 -0
  27. package/src/core/lib/QRCode.mjs +30 -10
  28. package/src/core/lib/RC6.mjs +625 -0
  29. package/src/core/operations/A1Z26CipherDecode.mjs +1 -1
  30. package/src/core/operations/AddTextToImage.mjs +116 -64
  31. package/src/core/operations/AnalyseUUID.mjs +109 -6
  32. package/src/core/operations/BlurImage.mjs +10 -12
  33. package/src/core/operations/ContainImage.mjs +50 -40
  34. package/src/core/operations/ConvertImageFormat.mjs +33 -39
  35. package/src/core/operations/CoverImage.mjs +39 -37
  36. package/src/core/operations/CropImage.mjs +35 -21
  37. package/src/core/operations/DisassembleARM.mjs +193 -0
  38. package/src/core/operations/DitherImage.mjs +8 -8
  39. package/src/core/operations/EscapeUnicodeCharacters.mjs +0 -17
  40. package/src/core/operations/ExtractAudioMetadata.mjs +175 -0
  41. package/src/core/operations/ExtractEmailAddresses.mjs +2 -3
  42. package/src/core/operations/ExtractLSB.mjs +17 -11
  43. package/src/core/operations/ExtractRGBA.mjs +12 -10
  44. package/src/core/operations/FlaskSessionDecode.mjs +80 -0
  45. package/src/core/operations/FlaskSessionSign.mjs +89 -0
  46. package/src/core/operations/FlaskSessionVerify.mjs +136 -0
  47. package/src/core/operations/FlipImage.mjs +14 -10
  48. package/src/core/operations/GenerateImage.mjs +39 -32
  49. package/src/core/operations/ImageBrightnessContrast.mjs +10 -10
  50. package/src/core/operations/ImageFilter.mjs +14 -13
  51. package/src/core/operations/ImageHueSaturationLightness.mjs +22 -20
  52. package/src/core/operations/ImageOpacity.mjs +6 -8
  53. package/src/core/operations/InvertImage.mjs +4 -6
  54. package/src/core/operations/Jq.mjs +12 -4
  55. package/src/core/operations/NormaliseImage.mjs +5 -7
  56. package/src/core/operations/OffsetChecker.mjs +1 -1
  57. package/src/core/operations/ParityBit.mjs +128 -0
  58. package/src/core/operations/ParseEthernetFrame.mjs +112 -0
  59. package/src/core/operations/ParseIPv4Header.mjs +23 -6
  60. package/src/core/operations/ParseQRCode.mjs +13 -13
  61. package/src/core/operations/PseudoRandomIntegerGenerator.mjs +164 -0
  62. package/src/core/operations/RC6Decrypt.mjs +119 -0
  63. package/src/core/operations/RC6Encrypt.mjs +119 -0
  64. package/src/core/operations/RandomizeColourPalette.mjs +11 -11
  65. package/src/core/operations/RegularExpression.mjs +2 -1
  66. package/src/core/operations/RenderMarkdown.mjs +35 -4
  67. package/src/core/operations/ResizeImage.mjs +30 -23
  68. package/src/core/operations/RotateImage.mjs +8 -9
  69. package/src/core/operations/SQLBeautify.mjs +21 -3
  70. package/src/core/operations/SharpenImage.mjs +94 -62
  71. package/src/core/operations/SplitColourChannels.mjs +47 -21
  72. package/src/core/operations/TextIntegerConverter.mjs +123 -0
  73. package/src/core/operations/UnescapeUnicodeCharacters.mjs +17 -0
  74. package/src/core/operations/ViewBitPlane.mjs +16 -20
  75. package/src/core/operations/index.mjs +22 -0
  76. package/src/node/index.mjs +55 -0
  77. package/src/web/HTMLIngredient.mjs +24 -43
  78. package/src/web/HTMLOperation.mjs +8 -2
  79. package/src/web/Manager.mjs +1 -0
  80. package/src/web/html/index.html +6 -6
  81. package/src/web/static/fonts/bmfonts/Roboto72White.fnt +491 -485
  82. package/src/web/static/fonts/bmfonts/RobotoBlack72White.fnt +494 -488
  83. package/src/web/static/fonts/bmfonts/RobotoMono72White.fnt +110 -103
  84. package/src/web/static/fonts/bmfonts/RobotoSlab72White.fnt +498 -492
  85. package/src/web/stylesheets/layout/_banner.css +30 -0
  86. package/src/web/stylesheets/layout/_modals.css +5 -0
  87. package/src/web/stylesheets/utils/_overrides.css +7 -0
  88. package/src/web/waiters/ControlsWaiter.mjs +82 -0
  89. package/src/web/waiters/InputWaiter.mjs +12 -6
  90. package/src/web/waiters/OperationsWaiter.mjs +30 -13
  91. package/src/web/waiters/RecipeWaiter.mjs +2 -2
  92. package/tests/browser/02_ops.js +23 -3
  93. package/tests/node/index.mjs +1 -0
  94. package/tests/node/tests/lib/BigIntUtils.mjs +150 -0
  95. package/tests/node/tests/operations.mjs +11 -10
  96. package/tests/operations/index.mjs +13 -0
  97. package/tests/operations/tests/A1Z26CipherDecode.mjs +33 -0
  98. package/tests/operations/tests/AnalyseUUID.mjs +66 -0
  99. package/tests/operations/tests/DisassembleARM.mjs +377 -0
  100. package/tests/operations/tests/ExtractAudioMetadata.mjs +287 -0
  101. package/tests/operations/tests/ExtractEmailAddresses.mjs +38 -12
  102. package/tests/operations/tests/Fernet.mjs +18 -3
  103. package/tests/operations/tests/FlaskSession.mjs +246 -0
  104. package/tests/operations/tests/GenerateQRCode.mjs +67 -0
  105. package/tests/operations/tests/JWTSign.mjs +83 -8
  106. package/tests/operations/tests/Jq.mjs +32 -0
  107. package/tests/operations/tests/Modhex.mjs +20 -0
  108. package/tests/operations/tests/ParityBit.mjs +147 -0
  109. package/tests/operations/tests/ParseEthernetFrame.mjs +45 -0
  110. package/tests/operations/tests/RC6.mjs +487 -0
  111. package/tests/operations/tests/RegularExpression.mjs +75 -0
  112. package/tests/operations/tests/RenderMarkdown.mjs +110 -0
  113. package/tests/operations/tests/SQLBeautify.mjs +54 -0
  114. package/tests/operations/tests/TextIntegerConverter.mjs +199 -0
  115. package/tests/samples/Audio.mjs +73 -0
  116. package/tests/samples/Images.mjs +0 -12
  117. package/webpack.config.js +10 -7
  118. package/src/core/lib/ImageManipulation.mjs +0 -251
@@ -0,0 +1,33 @@
1
+ /**
2
+ * A1Z26 Cipher Decode tests
3
+ *
4
+ * @author brick-pixel
5
+ * @copyright Crown Copyright 2026
6
+ * @license Apache-2.0
7
+ */
8
+ import TestRegister from "../../lib/TestRegister.mjs";
9
+
10
+ TestRegister.addTests([
11
+ {
12
+ "name": "A1Z26 Cipher Decode: basic decode",
13
+ "input": "8 5 12 12 15",
14
+ "expectedOutput": "hello",
15
+ "recipeConfig": [
16
+ {
17
+ "op": "A1Z26 Cipher Decode",
18
+ "args": ["Space"]
19
+ }
20
+ ]
21
+ },
22
+ {
23
+ "name": "A1Z26 Cipher Decode: empty input returns empty string",
24
+ "input": "",
25
+ "expectedOutput": "",
26
+ "recipeConfig": [
27
+ {
28
+ "op": "A1Z26 Cipher Decode",
29
+ "args": ["Space"]
30
+ }
31
+ ]
32
+ }
33
+ ]);
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Analyse UUID tests
3
+ *
4
+ * @author ko80240 [csk.dev@proton.me]
5
+ * @copyright Crown Copyright 2023
6
+ * @license Apache-2.0
7
+ */
8
+ import TestRegister from "../../lib/TestRegister.mjs";
9
+
10
+ TestRegister.addTests([
11
+ {
12
+ "name": "Analyse UUID: v1 UUID extracts timestamp, clock, and node",
13
+ "input": "cefa1760-28ee-11f1-9f95-1fb76af3e239",
14
+ "expectedOutput": "Version:\n1\n\nTimestamp:\n1774514156502\n\nTimestamp (ISO):\n2026-03-26T08:35:56.502Z\n\nNode:\n1F:B7:6A:F3:E2:39\n\nClock:\n8085\n\nUUID Integer:\n275119515460318071558429785403790975545",
15
+ "recipeConfig": [
16
+ {
17
+ "op": "Analyse UUID",
18
+ "args": [true]
19
+ }
20
+ ]
21
+ },
22
+ {
23
+ "name": "Analyse UUID: v7 UUID extracts timestamp, randA, and randB",
24
+ "input": "019d294a-af64-7728-9524-26da08f50708",
25
+ "expectedOutput": "Version:\n7\n\nTimestamp:\n1774514253668\n\nTimestamp (ISO):\n2026-03-26T08:37:33.668Z\n\nRand A:\n1832\n\nRand B:\n952426DA08F50708\n\nUUID Integer:\n2145256098533991595556290452700595976",
26
+ "recipeConfig": [
27
+ {
28
+ "op": "Analyse UUID",
29
+ "args": [true]
30
+ }
31
+ ]
32
+ },
33
+ {
34
+ "name": "Analyse UUID: v4 UUID should show no metadata - not possible",
35
+ "input": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
36
+ "expectedOutput": "Version:\n4\n\nNo metadata available. Only versions 1, 6, 7 are supported.\n\nUUID Integer:\n324969006592305634633390616021200786553",
37
+ "recipeConfig": [
38
+ {
39
+ "op": "Analyse UUID",
40
+ "args": [true]
41
+ }
42
+ ]
43
+ },
44
+ {
45
+ "name": "Analyse UUID: if the 'Include Metadata' option is false it should return not metadata",
46
+ "input": "cefa1760-28ee-11f1-9f95-1fb76af3e239",
47
+ "expectedOutput": "Version:\n1\n\nUUID Integer:\n275119515460318071558429785403790975545",
48
+ "recipeConfig": [
49
+ {
50
+ "op": "Analyse UUID",
51
+ "args": [false]
52
+ }
53
+ ]
54
+ },
55
+ {
56
+ "name": "Analyse UUID: invalid UUID should return error message",
57
+ "input": "not-a-uuid",
58
+ "expectedOutput": "Invalid UUID",
59
+ "recipeConfig": [
60
+ {
61
+ "op": "Analyse UUID",
62
+ "args": [true]
63
+ }
64
+ ]
65
+ }
66
+ ]);
@@ -0,0 +1,377 @@
1
+ /**
2
+ * Disassemble ARM tests.
3
+ *
4
+ * @author MedjedThomasXM
5
+ *
6
+ * @copyright Crown Copyright 2024
7
+ * @license Apache-2.0
8
+ */
9
+ import TestRegister from "../../lib/TestRegister.mjs";
10
+
11
+ TestRegister.addTests([
12
+ // ==================== ARM32 TESTS ====================
13
+ {
14
+ name: "Disassemble ARM: ARM32 NOP (mov r0, r0)",
15
+ input: "00 00 a0 e1",
16
+ expectedMatch: /mov\s+r0,\s*r0/,
17
+ recipeConfig: [
18
+ {
19
+ op: "Disassemble ARM",
20
+ args: ["ARM (32-bit)", "ARM", "Little Endian", 0, true, true],
21
+ },
22
+ ],
23
+ },
24
+ {
25
+ name: "Disassemble ARM: ARM32 bx lr",
26
+ input: "1e ff 2f e1",
27
+ expectedMatch: /bx\s+lr/,
28
+ recipeConfig: [
29
+ {
30
+ op: "Disassemble ARM",
31
+ args: ["ARM (32-bit)", "ARM", "Little Endian", 0, true, true],
32
+ },
33
+ ],
34
+ },
35
+ {
36
+ name: "Disassemble ARM: ARM32 push {fp, lr}",
37
+ input: "00 48 2d e9",
38
+ expectedMatch: /push\s+\{fp,\s*lr\}/,
39
+ recipeConfig: [
40
+ {
41
+ op: "Disassemble ARM",
42
+ args: ["ARM (32-bit)", "ARM", "Little Endian", 0, true, true],
43
+ },
44
+ ],
45
+ },
46
+ {
47
+ name: "Disassemble ARM: ARM32 add fp, sp, #4",
48
+ input: "04 b0 8d e2",
49
+ expectedMatch: /add\s+fp,\s*sp/,
50
+ recipeConfig: [
51
+ {
52
+ op: "Disassemble ARM",
53
+ args: ["ARM (32-bit)", "ARM", "Little Endian", 0, true, true],
54
+ },
55
+ ],
56
+ },
57
+ {
58
+ name: "Disassemble ARM: ARM32 ldr r0, [r1]",
59
+ input: "00 00 91 e5",
60
+ expectedMatch: /ldr\s+r0,\s*\[r1\]/,
61
+ recipeConfig: [
62
+ {
63
+ op: "Disassemble ARM",
64
+ args: ["ARM (32-bit)", "ARM", "Little Endian", 0, true, true],
65
+ },
66
+ ],
67
+ },
68
+ {
69
+ name: "Disassemble ARM: ARM32 str r0, [r1]",
70
+ input: "00 00 81 e5",
71
+ expectedMatch: /str\s+r0,\s*\[r1\]/,
72
+ recipeConfig: [
73
+ {
74
+ op: "Disassemble ARM",
75
+ args: ["ARM (32-bit)", "ARM", "Little Endian", 0, true, true],
76
+ },
77
+ ],
78
+ },
79
+ {
80
+ name: "Disassemble ARM: ARM32 bl (branch link)",
81
+ input: "00 00 00 eb",
82
+ expectedMatch: /bl\s+/,
83
+ recipeConfig: [
84
+ {
85
+ op: "Disassemble ARM",
86
+ args: ["ARM (32-bit)", "ARM", "Little Endian", 0, true, true],
87
+ },
88
+ ],
89
+ },
90
+ {
91
+ name: "Disassemble ARM: ARM32 mul r0, r1, r2",
92
+ input: "91 02 00 e0",
93
+ expectedMatch: /mul\s+r0,\s*r1,\s*r2/,
94
+ recipeConfig: [
95
+ {
96
+ op: "Disassemble ARM",
97
+ args: ["ARM (32-bit)", "ARM", "Little Endian", 0, true, true],
98
+ },
99
+ ],
100
+ },
101
+
102
+ // ==================== ARM32 THUMB TESTS ====================
103
+ {
104
+ name: "Disassemble ARM: Thumb mov r0, r0",
105
+ input: "00 46",
106
+ expectedMatch: /mov\s+r0,\s*r0/,
107
+ recipeConfig: [
108
+ {
109
+ op: "Disassemble ARM",
110
+ args: ["ARM (32-bit)", "Thumb", "Little Endian", 0, true, true],
111
+ },
112
+ ],
113
+ },
114
+ {
115
+ name: "Disassemble ARM: Thumb bx lr",
116
+ input: "70 47",
117
+ expectedMatch: /bx\s+lr/,
118
+ recipeConfig: [
119
+ {
120
+ op: "Disassemble ARM",
121
+ args: ["ARM (32-bit)", "Thumb", "Little Endian", 0, true, true],
122
+ },
123
+ ],
124
+ },
125
+ {
126
+ name: "Disassemble ARM: Thumb push {r4, lr}",
127
+ input: "10 b5",
128
+ expectedMatch: /push\s+\{r4,\s*lr\}/,
129
+ recipeConfig: [
130
+ {
131
+ op: "Disassemble ARM",
132
+ args: ["ARM (32-bit)", "Thumb", "Little Endian", 0, true, true],
133
+ },
134
+ ],
135
+ },
136
+ {
137
+ name: "Disassemble ARM: Thumb pop {r4, pc}",
138
+ input: "10 bd",
139
+ expectedMatch: /pop\s+\{r4,\s*pc\}/,
140
+ recipeConfig: [
141
+ {
142
+ op: "Disassemble ARM",
143
+ args: ["ARM (32-bit)", "Thumb", "Little Endian", 0, true, true],
144
+ },
145
+ ],
146
+ },
147
+
148
+ // ==================== ARM64 TESTS ====================
149
+ {
150
+ name: "Disassemble ARM: ARM64 ret",
151
+ input: "c0 03 5f d6",
152
+ expectedMatch: /ret/,
153
+ recipeConfig: [
154
+ {
155
+ op: "Disassemble ARM",
156
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
157
+ },
158
+ ],
159
+ },
160
+ {
161
+ name: "Disassemble ARM: ARM64 mov x0, #0",
162
+ input: "00 00 80 d2",
163
+ expectedMatch: /mov[z]?\s+x0,\s*#0/,
164
+ recipeConfig: [
165
+ {
166
+ op: "Disassemble ARM",
167
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
168
+ },
169
+ ],
170
+ },
171
+ {
172
+ name: "Disassemble ARM: ARM64 stp x29, x30, [sp, #-16]!",
173
+ input: "fd 7b bf a9",
174
+ expectedMatch: /stp\s+x29,\s*x30,\s*\[sp/,
175
+ recipeConfig: [
176
+ {
177
+ op: "Disassemble ARM",
178
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
179
+ },
180
+ ],
181
+ },
182
+ {
183
+ name: "Disassemble ARM: ARM64 ldp x29, x30, [sp], #16",
184
+ input: "fd 7b c1 a8",
185
+ expectedMatch: /ldp\s+x29,\s*x30,\s*\[sp\]/,
186
+ recipeConfig: [
187
+ {
188
+ op: "Disassemble ARM",
189
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
190
+ },
191
+ ],
192
+ },
193
+ {
194
+ name: "Disassemble ARM: ARM64 add x0, x1, x2",
195
+ input: "20 00 02 8b",
196
+ expectedMatch: /add\s+x0,\s*x1,\s*x2/,
197
+ recipeConfig: [
198
+ {
199
+ op: "Disassemble ARM",
200
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
201
+ },
202
+ ],
203
+ },
204
+ {
205
+ name: "Disassemble ARM: ARM64 sub x0, x1, x2",
206
+ input: "20 00 02 cb",
207
+ expectedMatch: /sub\s+x0,\s*x1,\s*x2/,
208
+ recipeConfig: [
209
+ {
210
+ op: "Disassemble ARM",
211
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
212
+ },
213
+ ],
214
+ },
215
+ {
216
+ name: "Disassemble ARM: ARM64 mul x0, x1, x2",
217
+ input: "20 7c 02 9b",
218
+ expectedMatch: /mul\s+x0,\s*x1,\s*x2/,
219
+ recipeConfig: [
220
+ {
221
+ op: "Disassemble ARM",
222
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
223
+ },
224
+ ],
225
+ },
226
+ {
227
+ name: "Disassemble ARM: ARM64 ldr x0, [x1]",
228
+ input: "20 00 40 f9",
229
+ expectedMatch: /ldr\s+x0,\s*\[x1\]/,
230
+ recipeConfig: [
231
+ {
232
+ op: "Disassemble ARM",
233
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
234
+ },
235
+ ],
236
+ },
237
+ {
238
+ name: "Disassemble ARM: ARM64 str x0, [x1]",
239
+ input: "20 00 00 f9",
240
+ expectedMatch: /str\s+x0,\s*\[x1\]/,
241
+ recipeConfig: [
242
+ {
243
+ op: "Disassemble ARM",
244
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
245
+ },
246
+ ],
247
+ },
248
+ {
249
+ name: "Disassemble ARM: ARM64 bl (branch link)",
250
+ input: "00 00 00 94",
251
+ expectedMatch: /bl\s+/,
252
+ recipeConfig: [
253
+ {
254
+ op: "Disassemble ARM",
255
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
256
+ },
257
+ ],
258
+ },
259
+ {
260
+ name: "Disassemble ARM: ARM64 cbz x0",
261
+ input: "00 00 00 b4",
262
+ expectedMatch: /cbz\s+x0/,
263
+ recipeConfig: [
264
+ {
265
+ op: "Disassemble ARM",
266
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
267
+ },
268
+ ],
269
+ },
270
+ {
271
+ name: "Disassemble ARM: ARM64 cbnz x0",
272
+ input: "00 00 00 b5",
273
+ expectedMatch: /cbnz\s+x0/,
274
+ recipeConfig: [
275
+ {
276
+ op: "Disassemble ARM",
277
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
278
+ },
279
+ ],
280
+ },
281
+ {
282
+ name: "Disassemble ARM: ARM64 sub sp, sp, #0x20",
283
+ input: "ff 83 00 d1",
284
+ expectedMatch: /sub\s+sp,\s*sp/,
285
+ recipeConfig: [
286
+ {
287
+ op: "Disassemble ARM",
288
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
289
+ },
290
+ ],
291
+ },
292
+ {
293
+ name: "Disassemble ARM: ARM64 add sp, sp, #0x20",
294
+ input: "ff 83 00 91",
295
+ expectedMatch: /add\s+sp,\s*sp/,
296
+ recipeConfig: [
297
+ {
298
+ op: "Disassemble ARM",
299
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
300
+ },
301
+ ],
302
+ },
303
+
304
+ // ==================== MULTI-INSTRUCTION TESTS ====================
305
+ {
306
+ name: "Disassemble ARM: ARM32 multiple instructions",
307
+ input: "00 48 2d e9 04 b0 8d e2 00 00 a0 e1 00 88 bd e8",
308
+ expectedMatch: /push.*\n.*add.*\n.*mov.*\n.*pop/s,
309
+ recipeConfig: [
310
+ {
311
+ op: "Disassemble ARM",
312
+ args: ["ARM (32-bit)", "ARM", "Little Endian", 0, true, true],
313
+ },
314
+ ],
315
+ },
316
+ {
317
+ name: "Disassemble ARM: ARM64 function prologue/epilogue",
318
+ input: "fd 7b bf a9 fd 03 00 91 00 00 80 52 fd 7b c1 a8 c0 03 5f d6",
319
+ expectedMatch: /stp.*\n.*mov.*\n.*mov.*\n.*ldp.*\n.*ret/s,
320
+ recipeConfig: [
321
+ {
322
+ op: "Disassemble ARM",
323
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
324
+ },
325
+ ],
326
+ },
327
+
328
+ // ==================== ADDRESS TESTS ====================
329
+ {
330
+ name: "Disassemble ARM: ARM64 with start address 0x1000",
331
+ input: "c0 03 5f d6",
332
+ expectedMatch: /0x00001000/,
333
+ recipeConfig: [
334
+ {
335
+ op: "Disassemble ARM",
336
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 4096, true, true],
337
+ },
338
+ ],
339
+ },
340
+ {
341
+ name: "Disassemble ARM: ARM32 with start address 0x8000",
342
+ input: "00 00 a0 e1",
343
+ expectedMatch: /0x00008000/,
344
+ recipeConfig: [
345
+ {
346
+ op: "Disassemble ARM",
347
+ args: ["ARM (32-bit)", "ARM", "Little Endian", 32768, true, true],
348
+ },
349
+ ],
350
+ },
351
+
352
+ // ==================== ENDIANNESS TESTS ====================
353
+ {
354
+ name: "Disassemble ARM: ARM32 Big Endian",
355
+ input: "e1 a0 00 00",
356
+ expectedMatch: /mov\s+r0,\s*r0/,
357
+ recipeConfig: [
358
+ {
359
+ op: "Disassemble ARM",
360
+ args: ["ARM (32-bit)", "ARM", "Big Endian", 0, true, true],
361
+ },
362
+ ],
363
+ },
364
+
365
+ // ==================== EDGE CASES ====================
366
+ {
367
+ name: "Disassemble ARM: Empty input",
368
+ input: "",
369
+ expectedOutput: "",
370
+ recipeConfig: [
371
+ {
372
+ op: "Disassemble ARM",
373
+ args: ["ARM64 (AArch64)", "ARM", "Little Endian", 0, true, true],
374
+ },
375
+ ],
376
+ },
377
+ ]);