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.0",
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",
@@ -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;
@@ -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 {alphabetName, ALPHABET_OPTIONS} from "../lib/Base85.mjs";
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("[^" + alphabet.replace(/[[\]\\\-^$]/g, "\\$&") + "]", "g");
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 (encoding === "Standard" && input[i] === "z") {
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
  ]);