cyberchef 9.52.0 → 9.52.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.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cyberchef",
|
|
3
|
-
"version": "9.52.
|
|
3
|
+
"version": "9.52.1",
|
|
4
4
|
"description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
|
|
5
5
|
"author": "n1474335 <n1474335@gmail.com>",
|
|
6
6
|
"homepage": "https://gchq.github.io/CyberChef",
|
package/src/core/Ingredient.mjs
CHANGED
|
@@ -27,6 +27,7 @@ class Ingredient {
|
|
|
27
27
|
this.toggleValues = [];
|
|
28
28
|
this.target = null;
|
|
29
29
|
this.defaultIndex = 0;
|
|
30
|
+
this.maxLength = null;
|
|
30
31
|
this.min = null;
|
|
31
32
|
this.max = null;
|
|
32
33
|
this.step = 1;
|
|
@@ -53,6 +54,7 @@ class Ingredient {
|
|
|
53
54
|
this.toggleValues = ingredientConfig.toggleValues;
|
|
54
55
|
this.target = typeof ingredientConfig.target !== "undefined" ? ingredientConfig.target : null;
|
|
55
56
|
this.defaultIndex = typeof ingredientConfig.defaultIndex !== "undefined" ? ingredientConfig.defaultIndex : 0;
|
|
57
|
+
this.maxLength = ingredientConfig.maxLength || null;
|
|
56
58
|
this.min = ingredientConfig.min;
|
|
57
59
|
this.max = ingredientConfig.max;
|
|
58
60
|
this.step = ingredientConfig.step;
|
package/src/core/Operation.mjs
CHANGED
|
@@ -184,6 +184,7 @@ class Operation {
|
|
|
184
184
|
if (ing.disabled) conf.disabled = ing.disabled;
|
|
185
185
|
if (ing.target) conf.target = ing.target;
|
|
186
186
|
if (ing.defaultIndex) conf.defaultIndex = ing.defaultIndex;
|
|
187
|
+
if (ing.maxLength) conf.maxLength = ing.maxLength;
|
|
187
188
|
if (typeof ing.min === "number") conf.min = ing.min;
|
|
188
189
|
if (typeof ing.max === "number") conf.max = ing.max;
|
|
189
190
|
if (ing.step) conf.step = ing.step;
|
|
@@ -6160,6 +6160,12 @@
|
|
|
6160
6160
|
"name": "Remove non-alphabet chars",
|
|
6161
6161
|
"type": "boolean",
|
|
6162
6162
|
"value": true
|
|
6163
|
+
},
|
|
6164
|
+
{
|
|
6165
|
+
"name": "All-zero group char",
|
|
6166
|
+
"type": "binaryShortString",
|
|
6167
|
+
"value": "z",
|
|
6168
|
+
"maxLength": 1
|
|
6163
6169
|
}
|
|
6164
6170
|
],
|
|
6165
6171
|
"checks": [
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import Operation from "../Operation.mjs";
|
|
8
8
|
import OperationError from "../errors/OperationError.mjs";
|
|
9
9
|
import Utils from "../Utils.mjs";
|
|
10
|
-
import {
|
|
10
|
+
import {ALPHABET_OPTIONS} from "../lib/Base85.mjs";
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* From Base85 operation
|
|
@@ -37,6 +37,12 @@ class FromBase85 extends Operation {
|
|
|
37
37
|
type: "boolean",
|
|
38
38
|
value: true
|
|
39
39
|
},
|
|
40
|
+
{
|
|
41
|
+
name: "All-zero group char",
|
|
42
|
+
type: "binaryShortString",
|
|
43
|
+
value: "z",
|
|
44
|
+
maxLength: 1
|
|
45
|
+
}
|
|
40
46
|
];
|
|
41
47
|
this.checks = [
|
|
42
48
|
{
|
|
@@ -76,8 +82,8 @@ class FromBase85 extends Operation {
|
|
|
76
82
|
*/
|
|
77
83
|
run(input, args) {
|
|
78
84
|
const alphabet = Utils.expandAlphRange(args[0]).join(""),
|
|
79
|
-
encoding = alphabetName(alphabet),
|
|
80
85
|
removeNonAlphChars = args[1],
|
|
86
|
+
allZeroGroupChar = typeof args[2] === "string" ? args[2].slice(0, 1) : "",
|
|
81
87
|
result = [];
|
|
82
88
|
|
|
83
89
|
if (alphabet.length !== 85 ||
|
|
@@ -85,14 +91,21 @@ class FromBase85 extends Operation {
|
|
|
85
91
|
throw new OperationError("Alphabet must be of length 85");
|
|
86
92
|
}
|
|
87
93
|
|
|
94
|
+
if (allZeroGroupChar && alphabet.includes(allZeroGroupChar)) {
|
|
95
|
+
throw new OperationError("The all-zero group char cannot appear in the alphabet");
|
|
96
|
+
}
|
|
97
|
+
|
|
88
98
|
// Remove delimiters if present
|
|
89
99
|
const matches = input.match(/^<~(.+?)~>$/);
|
|
90
100
|
if (matches !== null) input = matches[1];
|
|
91
101
|
|
|
92
102
|
// Remove non-alphabet characters
|
|
93
103
|
if (removeNonAlphChars) {
|
|
94
|
-
const re = new RegExp("[
|
|
104
|
+
const re = new RegExp("[^~" + allZeroGroupChar +alphabet.replace(/[[\]\\\-^$]/g, "\\$&") + "]", "g");
|
|
95
105
|
input = input.replace(re, "");
|
|
106
|
+
// Remove delimiters again if present (incase of non-alphabet characters in front/behind delimiters)
|
|
107
|
+
const matches = input.match(/^<~(.+?)~>$/);
|
|
108
|
+
if (matches !== null) input = matches[1];
|
|
96
109
|
}
|
|
97
110
|
|
|
98
111
|
if (input.length === 0) return [];
|
|
@@ -100,7 +113,7 @@ class FromBase85 extends Operation {
|
|
|
100
113
|
let i = 0;
|
|
101
114
|
let block, blockBytes;
|
|
102
115
|
while (i < input.length) {
|
|
103
|
-
if (
|
|
116
|
+
if (input[i] === allZeroGroupChar) {
|
|
104
117
|
result.push(0, 0, 0, 0);
|
|
105
118
|
i++;
|
|
106
119
|
} else {
|
|
@@ -110,7 +123,7 @@ class FromBase85 extends Operation {
|
|
|
110
123
|
.split("")
|
|
111
124
|
.map((chr, idx) => {
|
|
112
125
|
const digit = alphabet.indexOf(chr);
|
|
113
|
-
if (digit < 0 || digit > 84) {
|
|
126
|
+
if ((digit < 0 || digit > 84) && chr !== allZeroGroupChar) {
|
|
114
127
|
throw `Invalid character '${chr}' at index ${i + idx}`;
|
|
115
128
|
}
|
|
116
129
|
return digit;
|
|
@@ -30,6 +30,7 @@ class HTMLIngredient {
|
|
|
30
30
|
this.rows = config.rows || false;
|
|
31
31
|
this.target = config.target;
|
|
32
32
|
this.defaultIndex = config.defaultIndex || 0;
|
|
33
|
+
this.maxLength = config.maxLength || null;
|
|
33
34
|
this.toggleValues = config.toggleValues;
|
|
34
35
|
this.ingId = this.app.nextIngId();
|
|
35
36
|
this.id = "ing-" + this.ingId;
|
|
@@ -63,7 +64,8 @@ class HTMLIngredient {
|
|
|
63
64
|
tabindex="${this.tabIndex}"
|
|
64
65
|
arg-name="${this.name}"
|
|
65
66
|
value="${this.value}"
|
|
66
|
-
${this.disabled ? "disabled" : ""}
|
|
67
|
+
${this.disabled ? "disabled" : ""}
|
|
68
|
+
${this.maxLength ? `maxlength="${this.maxLength}"` : ""}>
|
|
67
69
|
</div>`;
|
|
68
70
|
break;
|
|
69
71
|
case "shortString":
|
|
@@ -78,7 +80,8 @@ class HTMLIngredient {
|
|
|
78
80
|
tabindex="${this.tabIndex}"
|
|
79
81
|
arg-name="${this.name}"
|
|
80
82
|
value="${this.value}"
|
|
81
|
-
${this.disabled ? "disabled" : ""}
|
|
83
|
+
${this.disabled ? "disabled" : ""}
|
|
84
|
+
${this.maxLength ? `maxlength="${this.maxLength}"` : ""}>
|
|
82
85
|
</div>`;
|
|
83
86
|
break;
|
|
84
87
|
case "toggleString":
|
|
@@ -93,7 +96,8 @@ class HTMLIngredient {
|
|
|
93
96
|
tabindex="${this.tabIndex}"
|
|
94
97
|
arg-name="${this.name}"
|
|
95
98
|
value="${this.value}"
|
|
96
|
-
${this.disabled ? "disabled" : ""}
|
|
99
|
+
${this.disabled ? "disabled" : ""}
|
|
100
|
+
${this.maxLength ? `maxlength="${this.maxLength}"` : ""}>
|
|
97
101
|
</div>
|
|
98
102
|
<div class="input-group-append">
|
|
99
103
|
<button class="btn btn-secondary dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">${this.toggleValues[0]}</button>
|
|
@@ -16,6 +16,10 @@ DIb:@FD,*)+C]U=@3BN#EcYf8ATD3s@q?d$AftVqCh[NqF<G:8+EV:.+Cf>-FD5W8ARlolDIal(\
|
|
|
16
16
|
DId<j@<?3r@:F%a+D58'ATD4$Bl@l3De:,-DJs`8ARoFb/0JMK@qB4^F!,R<AKZ&-DfTqBG%G>u\
|
|
17
17
|
D.RTpAKYo'+CT/5+Cei#DII?(E,9)oF*2M7/c";
|
|
18
18
|
|
|
19
|
+
const allZeroExample = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff";
|
|
20
|
+
|
|
21
|
+
const allZeroOutput = "zz!!*-'\"9eu7#RLhG$k3[W&.oNg'GVB\"(`=52*$$(B+<_pR,UFcb-n-Vr/1iJ-0JP==1c70M3&s#]4?Ykm5X@_(6q'R884cEH9MJ8X:f1+h<)lt#=BSg3>[:ZC?t!MSA7]@cBPD3sCi+'.E,fo>FEMbNG^4U^I!pHnJ:W<)KS>/9Ll%\"IN/`jYOHG]iPa.Q$R$jD4S=Q7DTV8*TUnsrdW2ZetXKAY/Yd(L?['d?O\\@K2_]Y2%o^qmn*`5Ta:aN;TJbg\"GZd*^:jeCE.%f\\,!5gtgiEi8N\\UjQ5OekiqBum-X60nF?)@o_%qPq\"ad`r;HWp";
|
|
22
|
+
|
|
19
23
|
TestRegister.addTests([
|
|
20
24
|
{
|
|
21
25
|
name: "To Base85",
|
|
@@ -45,4 +49,22 @@ TestRegister.addTests([
|
|
|
45
49
|
"args": ["!-u", false] }
|
|
46
50
|
]
|
|
47
51
|
},
|
|
52
|
+
{
|
|
53
|
+
name: "To Base85",
|
|
54
|
+
input: allZeroExample,
|
|
55
|
+
expectedOutput: allZeroOutput,
|
|
56
|
+
recipeConfig: [
|
|
57
|
+
{ "op": "To Base85",
|
|
58
|
+
"args": ["!-u"] }
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: "From Base85",
|
|
63
|
+
input: allZeroOutput,
|
|
64
|
+
expectedOutput: allZeroExample,
|
|
65
|
+
recipeConfig: [
|
|
66
|
+
{ "op": "From Base85",
|
|
67
|
+
"args": ["!-u", true, "z"] }
|
|
68
|
+
]
|
|
69
|
+
},
|
|
48
70
|
]);
|