cyberchef 9.38.2 → 9.38.6

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.38.2",
3
+ "version": "9.38.6",
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",
@@ -39,26 +39,27 @@
39
39
  "node >= 16"
40
40
  ],
41
41
  "devDependencies": {
42
- "@babel/core": "^7.17.8",
43
- "@babel/eslint-parser": "^7.17.0",
44
- "@babel/plugin-syntax-import-assertions": "^7.16.7",
45
- "@babel/plugin-transform-runtime": "^7.17.0",
46
- "@babel/preset-env": "^7.16.11",
47
- "@babel/runtime": "^7.17.8",
48
- "autoprefixer": "^10.4.4",
49
- "babel-loader": "^8.2.4",
42
+ "@babel/core": "^7.18.2",
43
+ "@babel/eslint-parser": "^7.18.2",
44
+ "@babel/plugin-syntax-import-assertions": "^7.17.12",
45
+ "@babel/plugin-transform-runtime": "^7.18.2",
46
+ "@babel/preset-env": "^7.18.2",
47
+ "@babel/runtime": "^7.18.3",
48
+ "autoprefixer": "^10.4.7",
49
+ "babel-loader": "^8.2.5",
50
50
  "babel-plugin-dynamic-import-node": "^2.3.3",
51
+ "babel-plugin-transform-builtin-extend": "1.1.2",
51
52
  "chromedriver": "^101.0.0",
52
- "cli-progress": "^3.10.0",
53
+ "cli-progress": "^3.11.1",
53
54
  "colors": "^1.4.0",
54
- "copy-webpack-plugin": "^10.2.4",
55
- "core-js": "^3.21.1",
55
+ "copy-webpack-plugin": "^11.0.0",
56
+ "core-js": "^3.22.8",
56
57
  "css-loader": "6.7.1",
57
- "eslint": "^8.12.0",
58
- "grunt": "^1.4.1",
58
+ "eslint": "^8.16.0",
59
+ "grunt": "^1.5.3",
59
60
  "grunt-chmod": "~1.1.1",
60
61
  "grunt-concurrent": "^3.0.0",
61
- "grunt-contrib-clean": "~2.0.0",
62
+ "grunt-contrib-clean": "~2.0.1",
62
63
  "grunt-contrib-connect": "^3.0.0",
63
64
  "grunt-contrib-copy": "~1.0.0",
64
65
  "grunt-contrib-watch": "^1.1.0",
@@ -67,29 +68,28 @@
67
68
  "grunt-webpack": "^5.0.0",
68
69
  "grunt-zip": "^0.18.2",
69
70
  "html-webpack-plugin": "^5.5.0",
70
- "imports-loader": "^3.1.1",
71
+ "imports-loader": "^4.0.0",
71
72
  "mini-css-extract-plugin": "2.6.0",
72
73
  "modify-source-webpack-plugin": "^3.0.0",
73
- "nightwatch": "^2.0.10",
74
- "postcss": "^8.4.12",
74
+ "nightwatch": "^2.1.7",
75
+ "postcss": "^8.4.14",
75
76
  "postcss-css-variables": "^0.18.0",
76
77
  "postcss-import": "^14.1.0",
77
- "postcss-loader": "^6.2.1",
78
- "prompt": "^1.2.2",
79
- "sass-loader": "^12.6.0",
78
+ "postcss-loader": "^7.0.0",
79
+ "prompt": "^1.3.0",
80
+ "sass-loader": "^13.0.0",
80
81
  "sitemap": "^7.1.1",
81
- "terser": "^5.12.1",
82
- "webpack": "^5.70.0",
82
+ "terser": "^5.14.0",
83
+ "webpack": "^5.73.0",
83
84
  "webpack-bundle-analyzer": "^4.5.0",
84
- "webpack-dev-server": "4.7.4",
85
+ "webpack-dev-server": "4.9.1",
85
86
  "webpack-node-externals": "^3.0.0",
86
87
  "worker-loader": "^3.0.8"
87
88
  },
88
89
  "dependencies": {
89
90
  "@babel/polyfill": "^7.12.1",
90
91
  "arrive": "^2.4.1",
91
- "avsc": "^5.7.3",
92
- "babel-plugin-transform-builtin-extend": "1.1.2",
92
+ "avsc": "^5.7.4",
93
93
  "bcryptjs": "^2.4.3",
94
94
  "bignumber.js": "^9.0.2",
95
95
  "blakejs": "^1.2.1",
@@ -97,7 +97,7 @@
97
97
  "bootstrap-colorpicker": "^3.4.0",
98
98
  "bootstrap-material-design": "^4.1.3",
99
99
  "browserify-zlib": "^0.2.0",
100
- "bson": "^4.6.2",
100
+ "bson": "^4.6.4",
101
101
  "buffer": "^6.0.3",
102
102
  "cbor": "8.1.0",
103
103
  "chi-squared": "^1.1.0",
@@ -106,9 +106,9 @@
106
106
  "crypto-browserify": "^3.12.0",
107
107
  "crypto-js": "^4.1.1",
108
108
  "ctph.js": "0.0.5",
109
- "d3": "7.3.0",
109
+ "d3": "7.4.4",
110
110
  "d3-hexbin": "^0.2.2",
111
- "diff": "^5.0.0",
111
+ "diff": "^5.1.0",
112
112
  "es6-promisify": "^7.0.0",
113
113
  "escodegen": "^2.0.0",
114
114
  "esprima": "^4.0.1",
@@ -116,7 +116,7 @@
116
116
  "file-saver": "^2.0.5",
117
117
  "flat": "^5.0.2",
118
118
  "geodesy": "1.1.3",
119
- "highlight.js": "^11.5.0",
119
+ "highlight.js": "^11.5.1",
120
120
  "jimp": "^0.16.1",
121
121
  "jquery": "3.6.0",
122
122
  "js-crc": "^0.2.0",
@@ -125,28 +125,28 @@
125
125
  "jsonpath": "^1.1.1",
126
126
  "jsonwebtoken": "^8.5.1",
127
127
  "jsqr": "^1.4.0",
128
- "jsrsasign": "^10.5.14",
128
+ "jsrsasign": "^10.5.23",
129
129
  "kbpgp": "2.1.15",
130
130
  "libbzip2-wasm": "0.0.4",
131
131
  "libyara-wasm": "^1.1.0",
132
132
  "lodash": "^4.17.21",
133
133
  "loglevel": "^1.8.0",
134
134
  "loglevel-message-prefix": "^3.0.0",
135
- "markdown-it": "^12.3.2",
136
- "moment": "^2.29.1",
135
+ "markdown-it": "^13.0.1",
136
+ "moment": "^2.29.3",
137
137
  "moment-timezone": "^0.5.34",
138
138
  "ngeohash": "^0.6.3",
139
- "node-forge": "^1.3.0",
139
+ "node-forge": "^1.3.1",
140
140
  "node-md6": "^0.1.0",
141
141
  "node-sass": "^7.0.1",
142
142
  "nodom": "^2.4.0",
143
- "notepack.io": "^2.3.0",
143
+ "notepack.io": "^3.0.1",
144
144
  "nwmatcher": "^1.4.4",
145
145
  "otp": "0.1.3",
146
146
  "path": "^0.12.7",
147
147
  "popper.js": "^1.16.1",
148
148
  "process": "^0.11.10",
149
- "protobufjs": "^6.11.2",
149
+ "protobufjs": "^6.11.3",
150
150
  "qr-image": "^3.2.0",
151
151
  "scryptsy": "^2.1.0",
152
152
  "snackbarjs": "^1.1.0",
@@ -5791,6 +5791,11 @@
5791
5791
  "name": "Remove non-alphabet chars",
5792
5792
  "type": "boolean",
5793
5793
  "value": true
5794
+ },
5795
+ {
5796
+ "name": "Strict mode",
5797
+ "type": "boolean",
5798
+ "value": false
5794
5799
  }
5795
5800
  ],
5796
5801
  "checks": [
@@ -5799,7 +5804,8 @@
5799
5804
  "flags": "i",
5800
5805
  "args": [
5801
5806
  "A-Za-z0-9+/=",
5802
- true
5807
+ true,
5808
+ false
5803
5809
  ]
5804
5810
  },
5805
5811
  {
@@ -5807,7 +5813,8 @@
5807
5813
  "flags": "i",
5808
5814
  "args": [
5809
5815
  "A-Za-z0-9-_",
5810
- true
5816
+ true,
5817
+ false
5811
5818
  ]
5812
5819
  },
5813
5820
  {
@@ -5815,7 +5822,8 @@
5815
5822
  "flags": "i",
5816
5823
  "args": [
5817
5824
  "A-Za-z0-9+\\-=",
5818
- true
5825
+ true,
5826
+ false
5819
5827
  ]
5820
5828
  },
5821
5829
  {
@@ -5823,7 +5831,8 @@
5823
5831
  "flags": "i",
5824
5832
  "args": [
5825
5833
  "./0-9A-Za-z=",
5826
- true
5834
+ true,
5835
+ false
5827
5836
  ]
5828
5837
  },
5829
5838
  {
@@ -5831,7 +5840,8 @@
5831
5840
  "flags": "i",
5832
5841
  "args": [
5833
5842
  "A-Za-z0-9_.",
5834
- true
5843
+ true,
5844
+ false
5835
5845
  ]
5836
5846
  },
5837
5847
  {
@@ -5839,7 +5849,8 @@
5839
5849
  "flags": "i",
5840
5850
  "args": [
5841
5851
  "A-Za-z0-9._-",
5842
- true
5852
+ true,
5853
+ false
5843
5854
  ]
5844
5855
  },
5845
5856
  {
@@ -5847,7 +5858,8 @@
5847
5858
  "flags": "i",
5848
5859
  "args": [
5849
5860
  "0-9a-zA-Z+/=",
5850
- true
5861
+ true,
5862
+ false
5851
5863
  ]
5852
5864
  },
5853
5865
  {
@@ -5855,7 +5867,8 @@
5855
5867
  "flags": "i",
5856
5868
  "args": [
5857
5869
  "0-9A-Za-z+/=",
5858
- true
5870
+ true,
5871
+ false
5859
5872
  ]
5860
5873
  },
5861
5874
  {
@@ -5863,6 +5876,7 @@
5863
5876
  "flags": "",
5864
5877
  "args": [
5865
5878
  " -_",
5879
+ false,
5866
5880
  false
5867
5881
  ]
5868
5882
  },
@@ -5871,7 +5885,8 @@
5871
5885
  "flags": "i",
5872
5886
  "args": [
5873
5887
  "+\\-0-9A-Za-z",
5874
- true
5888
+ true,
5889
+ false
5875
5890
  ]
5876
5891
  },
5877
5892
  {
@@ -5879,7 +5894,8 @@
5879
5894
  "flags": "",
5880
5895
  "args": [
5881
5896
  "!-,-0-689@A-NP-VX-Z[`a-fh-mp-r",
5882
- true
5897
+ true,
5898
+ false
5883
5899
  ]
5884
5900
  },
5885
5901
  {
@@ -5887,7 +5903,8 @@
5887
5903
  "flags": "i",
5888
5904
  "args": [
5889
5905
  "N-ZA-Mn-za-m0-9+/=",
5890
- true
5906
+ true,
5907
+ false
5891
5908
  ]
5892
5909
  },
5893
5910
  {
@@ -5895,7 +5912,8 @@
5895
5912
  "flags": "i",
5896
5913
  "args": [
5897
5914
  "./0-9A-Za-z",
5898
- true
5915
+ true,
5916
+ false
5899
5917
  ]
5900
5918
  },
5901
5919
  {
@@ -5903,7 +5921,8 @@
5903
5921
  "flags": "i",
5904
5922
  "args": [
5905
5923
  "/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC",
5906
- true
5924
+ true,
5925
+ false
5907
5926
  ]
5908
5927
  },
5909
5928
  {
@@ -5911,7 +5930,8 @@
5911
5930
  "flags": "i",
5912
5931
  "args": [
5913
5932
  "3GHIJKLMNOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5",
5914
- true
5933
+ true,
5934
+ false
5915
5935
  ]
5916
5936
  },
5917
5937
  {
@@ -5919,7 +5939,8 @@
5919
5939
  "flags": "i",
5920
5940
  "args": [
5921
5941
  "ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2",
5922
- true
5942
+ true,
5943
+ false
5923
5944
  ]
5924
5945
  },
5925
5946
  {
@@ -5927,7 +5948,8 @@
5927
5948
  "flags": "i",
5928
5949
  "args": [
5929
5950
  "HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5",
5930
- true
5951
+ true,
5952
+ false
5931
5953
  ]
5932
5954
  }
5933
5955
  ]
@@ -8556,14 +8578,20 @@
8556
8578
  ]
8557
8579
  },
8558
8580
  "PEM to Hex": {
8559
- "module": "PublicKey",
8581
+ "module": "Default",
8560
8582
  "description": "Converts PEM (Privacy Enhanced Mail) format to a hexadecimal DER (Distinguished Encoding Rules) string.",
8561
- "infoURL": "https://wikipedia.org/wiki/X.690#DER_encoding",
8583
+ "infoURL": "https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail#Format",
8562
8584
  "inputType": "string",
8563
8585
  "outputType": "string",
8564
8586
  "flowControl": false,
8565
8587
  "manualBake": false,
8566
- "args": []
8588
+ "args": [],
8589
+ "checks": [
8590
+ {
8591
+ "pattern": "----BEGIN ([A-Z][A-Z ]+[A-Z])-----",
8592
+ "args": []
8593
+ }
8594
+ ]
8567
8595
  },
8568
8596
  "PGP Decrypt": {
8569
8597
  "module": "PGP",
@@ -89,6 +89,7 @@ import NOT from "../../operations/NOT.mjs";
89
89
  import Numberwang from "../../operations/Numberwang.mjs";
90
90
  import OR from "../../operations/OR.mjs";
91
91
  import OffsetChecker from "../../operations/OffsetChecker.mjs";
92
+ import PEMToHex from "../../operations/PEMToHex.mjs";
92
93
  import PHPDeserialize from "../../operations/PHPDeserialize.mjs";
93
94
  import PadLines from "../../operations/PadLines.mjs";
94
95
  import ParseColourCode from "../../operations/ParseColourCode.mjs";
@@ -256,6 +257,7 @@ OpModules.Default = {
256
257
  "Numberwang": Numberwang,
257
258
  "OR": OR,
258
259
  "Offset checker": OffsetChecker,
260
+ "PEM to Hex": PEMToHex,
259
261
  "PHP Deserialize": PHPDeserialize,
260
262
  "Pad lines": PadLines,
261
263
  "Parse colour code": ParseColourCode,
@@ -8,7 +8,6 @@
8
8
  import HexToObjectIdentifier from "../../operations/HexToObjectIdentifier.mjs";
9
9
  import HexToPEM from "../../operations/HexToPEM.mjs";
10
10
  import ObjectIdentifierToHex from "../../operations/ObjectIdentifierToHex.mjs";
11
- import PEMToHex from "../../operations/PEMToHex.mjs";
12
11
  import ParseASN1HexString from "../../operations/ParseASN1HexString.mjs";
13
12
  import ParseX509Certificate from "../../operations/ParseX509Certificate.mjs";
14
13
 
@@ -18,7 +17,6 @@ OpModules.PublicKey = {
18
17
  "Hex to Object Identifier": HexToObjectIdentifier,
19
18
  "Hex to PEM": HexToPEM,
20
19
  "Object Identifier to Hex": ObjectIdentifierToHex,
21
- "PEM to Hex": PEMToHex,
22
20
  "Parse ASN.1 hex string": ParseASN1HexString,
23
21
  "Parse X.509 certificate": ParseX509Certificate,
24
22
  };
@@ -82,47 +82,74 @@ export function toBase64(data, alphabet="A-Za-z0-9+/=") {
82
82
  * // returns [72, 101, 108, 108, 111]
83
83
  * fromBase64("SGVsbG8=", null, "byteArray");
84
84
  */
85
- export function fromBase64(data, alphabet="A-Za-z0-9+/=", returnType="string", removeNonAlphChars=true) {
85
+ export function fromBase64(data, alphabet="A-Za-z0-9+/=", returnType="string", removeNonAlphChars=true, strictMode=false) {
86
86
  if (!data) {
87
87
  return returnType === "string" ? "" : [];
88
88
  }
89
89
 
90
90
  alphabet = alphabet || "A-Za-z0-9+/=";
91
91
  alphabet = Utils.expandAlphRange(alphabet).join("");
92
+
93
+ // Confirm alphabet is a valid length
92
94
  if (alphabet.length !== 64 && alphabet.length !== 65) { // Allow for padding
93
- throw new OperationError(`Invalid Base64 alphabet length (${alphabet.length}): ${alphabet}`);
95
+ throw new OperationError(`Error: Base64 alphabet should be 64 characters long, or 65 with a padding character. Found ${alphabet.length}: ${alphabet}`);
94
96
  }
95
97
 
96
- const output = [];
97
- let chr1, chr2, chr3,
98
- enc1, enc2, enc3, enc4,
99
- i = 0;
100
-
98
+ // Remove non-alphabet characters
101
99
  if (removeNonAlphChars) {
102
100
  const re = new RegExp("[^" + alphabet.replace(/[[\]\\\-^$]/g, "\\$&") + "]", "g");
103
101
  data = data.replace(re, "");
104
102
  }
105
103
 
104
+ if (strictMode) {
105
+ // Check for incorrect lengths (even without padding)
106
+ if (data.length % 4 === 1) {
107
+ throw new OperationError(`Error: Invalid Base64 input length (${data.length}). Cannot be 4n+1, even without padding chars.`);
108
+ }
109
+
110
+ if (alphabet.length === 65) { // Padding character included
111
+ const pad = alphabet.charAt(64);
112
+ const padPos = data.indexOf(pad);
113
+ if (padPos >= 0) {
114
+ // Check that the padding character is only used at the end and maximum of twice
115
+ if (padPos < data.length - 2 || data.charAt(data.length - 1) !== pad) {
116
+ throw new OperationError(`Error: Base64 padding character (${pad}) not used in the correct place.`);
117
+ }
118
+
119
+ // Check that input is padded to the correct length
120
+ if (data.length % 4 !== 0) {
121
+ throw new OperationError("Error: Base64 not padded to a multiple of 4.");
122
+ }
123
+ }
124
+ }
125
+ }
126
+
127
+ const output = [];
128
+ let chr1, chr2, chr3,
129
+ enc1, enc2, enc3, enc4,
130
+ i = 0;
131
+
106
132
  while (i < data.length) {
107
133
  enc1 = alphabet.indexOf(data.charAt(i++));
108
- enc2 = alphabet.indexOf(data.charAt(i++) || "=");
109
- enc3 = alphabet.indexOf(data.charAt(i++) || "=");
110
- enc4 = alphabet.indexOf(data.charAt(i++) || "=");
134
+ enc2 = alphabet.indexOf(data.charAt(i++));
135
+ enc3 = alphabet.indexOf(data.charAt(i++));
136
+ enc4 = alphabet.indexOf(data.charAt(i++));
111
137
 
112
- enc2 = enc2 === -1 ? 64 : enc2;
113
- enc3 = enc3 === -1 ? 64 : enc3;
114
- enc4 = enc4 === -1 ? 64 : enc4;
138
+ if (strictMode && (enc1 < 0 || enc2 < 0 || enc3 < 0 || enc4 < 0)) {
139
+ throw new OperationError("Error: Base64 input contains non-alphabet char(s)");
140
+ }
115
141
 
116
142
  chr1 = (enc1 << 2) | (enc2 >> 4);
117
143
  chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
118
144
  chr3 = ((enc3 & 3) << 6) | enc4;
119
145
 
120
- output.push(chr1);
121
-
122
- if (enc3 !== 64) {
146
+ if (chr1 < 256) {
147
+ output.push(chr1);
148
+ }
149
+ if (chr2 < 256 && enc3 !== 64) {
123
150
  output.push(chr2);
124
151
  }
125
- if (enc4 !== 64) {
152
+ if (chr3 < 256 && enc4 !== 64) {
126
153
  output.push(chr3);
127
154
  }
128
155
  }
@@ -19,31 +19,33 @@ import OperationError from "../errors/OperationError.mjs";
19
19
  * @returns {string}
20
20
  *
21
21
  * @example
22
- * // returns "00010000 00100000 00110000"
22
+ * // returns "00001010 00010100 00011110"
23
23
  * toBinary([10,20,30]);
24
24
  *
25
- * // returns "00010000 00100000 00110000"
26
- * toBinary([10,20,30], ":");
25
+ * // returns "00001010:00010100:00011110"
26
+ * toBinary([10,20,30], "Colon");
27
+ *
28
+ * // returns "1010:10100:11110"
29
+ * toBinary([10,20,30], "Colon", 0);
27
30
  */
28
31
  export function toBinary(data, delim="Space", padding=8) {
32
+ if (data === undefined || data === null)
33
+ throw new OperationError("Unable to convert to binary: Empty input data enocuntered");
34
+
29
35
  delim = Utils.charRep(delim);
30
36
  let output = "";
31
37
 
32
38
  if (data.length) { // array
33
39
  for (let i = 0; i < data.length; i++) {
34
- output += data[i].toString(2).padStart(padding, "0") + delim;
40
+ output += data[i].toString(2).padStart(padding, "0");
41
+ if (i !== data.length - 1) output += delim;
35
42
  }
36
43
  } else if (typeof data === "number") { // Single value
37
44
  return data.toString(2).padStart(padding, "0");
38
45
  } else {
39
46
  return "";
40
47
  }
41
-
42
- if (delim.length) {
43
- return output.slice(0, -delim.length);
44
- } else {
45
- return output;
46
- }
48
+ return output;
47
49
  }
48
50
 
49
51
 
@@ -57,10 +59,10 @@ export function toBinary(data, delim="Space", padding=8) {
57
59
  *
58
60
  * @example
59
61
  * // returns [10,20,30]
60
- * fromBinary("00010000 00100000 00110000");
62
+ * fromBinary("00001010 00010100 00011110");
61
63
  *
62
64
  * // returns [10,20,30]
63
- * fromBinary("00010000:00100000:00110000", "Colon");
65
+ * fromBinary("00001010:00010100:00011110", "Colon");
64
66
  */
65
67
  export function fromBinary(data, delim="Space", byteLen=8) {
66
68
  if (byteLen < 1 || Math.round(byteLen) !== byteLen)
@@ -34,93 +34,98 @@ class FromBase64 extends Operation {
34
34
  name: "Remove non-alphabet chars",
35
35
  type: "boolean",
36
36
  value: true
37
+ },
38
+ {
39
+ name: "Strict mode",
40
+ type: "boolean",
41
+ value: false
37
42
  }
38
43
  ];
39
44
  this.checks = [
40
45
  {
41
46
  pattern: "^\\s*(?:[A-Z\\d+/]{4})+(?:[A-Z\\d+/]{2}==|[A-Z\\d+/]{3}=)?\\s*$",
42
47
  flags: "i",
43
- args: ["A-Za-z0-9+/=", true]
48
+ args: ["A-Za-z0-9+/=", true, false]
44
49
  },
45
50
  {
46
51
  pattern: "^\\s*[A-Z\\d\\-_]{20,}\\s*$",
47
52
  flags: "i",
48
- args: ["A-Za-z0-9-_", true]
53
+ args: ["A-Za-z0-9-_", true, false]
49
54
  },
50
55
  {
51
56
  pattern: "^\\s*(?:[A-Z\\d+\\-]{4}){5,}(?:[A-Z\\d+\\-]{2}==|[A-Z\\d+\\-]{3}=)?\\s*$",
52
57
  flags: "i",
53
- args: ["A-Za-z0-9+\\-=", true]
58
+ args: ["A-Za-z0-9+\\-=", true, false]
54
59
  },
55
60
  {
56
61
  pattern: "^\\s*(?:[A-Z\\d./]{4}){5,}(?:[A-Z\\d./]{2}==|[A-Z\\d./]{3}=)?\\s*$",
57
62
  flags: "i",
58
- args: ["./0-9A-Za-z=", true]
63
+ args: ["./0-9A-Za-z=", true, false]
59
64
  },
60
65
  {
61
66
  pattern: "^\\s*[A-Z\\d_.]{20,}\\s*$",
62
67
  flags: "i",
63
- args: ["A-Za-z0-9_.", true]
68
+ args: ["A-Za-z0-9_.", true, false]
64
69
  },
65
70
  {
66
71
  pattern: "^\\s*(?:[A-Z\\d._]{4}){5,}(?:[A-Z\\d._]{2}--|[A-Z\\d._]{3}-)?\\s*$",
67
72
  flags: "i",
68
- args: ["A-Za-z0-9._-", true]
73
+ args: ["A-Za-z0-9._-", true, false]
69
74
  },
70
75
  {
71
76
  pattern: "^\\s*(?:[A-Z\\d+/]{4}){5,}(?:[A-Z\\d+/]{2}==|[A-Z\\d+/]{3}=)?\\s*$",
72
77
  flags: "i",
73
- args: ["0-9a-zA-Z+/=", true]
78
+ args: ["0-9a-zA-Z+/=", true, false]
74
79
  },
75
80
  {
76
81
  pattern: "^\\s*(?:[A-Z\\d+/]{4}){5,}(?:[A-Z\\d+/]{2}==|[A-Z\\d+/]{3}=)?\\s*$",
77
82
  flags: "i",
78
- args: ["0-9A-Za-z+/=", true]
83
+ args: ["0-9A-Za-z+/=", true, false]
79
84
  },
80
85
  {
81
86
  pattern: "^[ !\"#$%&'()*+,\\-./\\d:;<=>?@A-Z[\\\\\\]^_]{20,}$",
82
87
  flags: "",
83
- args: [" -_", false]
88
+ args: [" -_", false, false]
84
89
  },
85
90
  {
86
91
  pattern: "^\\s*[A-Z\\d+\\-]{20,}\\s*$",
87
92
  flags: "i",
88
- args: ["+\\-0-9A-Za-z", true]
93
+ args: ["+\\-0-9A-Za-z", true, false]
89
94
  },
90
95
  {
91
96
  pattern: "^\\s*[!\"#$%&'()*+,\\-0-689@A-NP-VX-Z[`a-fh-mp-r]{20,}\\s*$",
92
97
  flags: "",
93
- args: ["!-,-0-689@A-NP-VX-Z[`a-fh-mp-r", true]
98
+ args: ["!-,-0-689@A-NP-VX-Z[`a-fh-mp-r", true, false]
94
99
  },
95
100
  {
96
101
  pattern: "^\\s*(?:[N-ZA-M\\d+/]{4}){5,}(?:[N-ZA-M\\d+/]{2}==|[N-ZA-M\\d+/]{3}=)?\\s*$",
97
102
  flags: "i",
98
- args: ["N-ZA-Mn-za-m0-9+/=", true]
103
+ args: ["N-ZA-Mn-za-m0-9+/=", true, false]
99
104
  },
100
105
  {
101
106
  pattern: "^\\s*[A-Z\\d./]{20,}\\s*$",
102
107
  flags: "i",
103
- args: ["./0-9A-Za-z", true]
108
+ args: ["./0-9A-Za-z", true, false]
104
109
  },
105
110
  {
106
111
  pattern: "^\\s*(?:[A-Z=\\d\\+/]{4}){5,}(?:[A-Z=\\d\\+/]{2}CC|[A-Z=\\d\\+/]{3}C)?\\s*$",
107
112
  flags: "i",
108
- args: ["/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC", true]
113
+ args: ["/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC", true, false]
109
114
  },
110
115
  {
111
116
  pattern: "^\\s*(?:[A-Z=\\d\\+/]{4}){5,}(?:[A-Z=\\d\\+/]{2}55|[A-Z=\\d\\+/]{3}5)?\\s*$",
112
117
  flags: "i",
113
- args: ["3GHIJKLMNOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5", true]
118
+ args: ["3GHIJKLMNOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5", true, false]
114
119
  },
115
120
  {
116
121
  pattern: "^\\s*(?:[A-Z=\\d\\+/]{4}){5,}(?:[A-Z=\\d\\+/]{2}22|[A-Z=\\d\\+/]{3}2)?\\s*$",
117
122
  flags: "i",
118
- args: ["ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2", true]
123
+ args: ["ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2", true, false]
119
124
  },
120
125
  {
121
126
  pattern: "^\\s*(?:[A-Z=\\d\\+/]{4}){5,}(?:[A-Z=\\d\\+/]{2}55|[A-Z=\\d\\+/]{3}5)?\\s*$",
122
127
  flags: "i",
123
- args: ["HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5", true]
128
+ args: ["HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5", true, false]
124
129
  }
125
130
  ];
126
131
  }
@@ -131,9 +136,9 @@ class FromBase64 extends Operation {
131
136
  * @returns {byteArray}
132
137
  */
133
138
  run(input, args) {
134
- const [alphabet, removeNonAlphChars] = args;
139
+ const [alphabet, removeNonAlphChars, strictMode] = args;
135
140
 
136
- return fromBase64(input, alphabet, "byteArray", removeNonAlphChars);
141
+ return fromBase64(input, alphabet, "byteArray", removeNonAlphChars, strictMode);
137
142
  }
138
143
 
139
144
  /**
@@ -1,11 +1,14 @@
1
1
  /**
2
2
  * @author n1474335 [n1474335@gmail.com]
3
+ * @author cplussharp
3
4
  * @copyright Crown Copyright 2016
4
5
  * @license Apache-2.0
5
6
  */
6
7
 
7
- import r from "jsrsasign";
8
+ import { fromBase64 } from "../lib/Base64.mjs";
9
+ import { toHexFast } from "../lib/Hex.mjs";
8
10
  import Operation from "../Operation.mjs";
11
+ import OperationError from "../errors/OperationError.mjs";
9
12
 
10
13
  /**
11
14
  * PEM to Hex operation
@@ -19,12 +22,18 @@ class PEMToHex extends Operation {
19
22
  super();
20
23
 
21
24
  this.name = "PEM to Hex";
22
- this.module = "PublicKey";
25
+ this.module = "Default";
23
26
  this.description = "Converts PEM (Privacy Enhanced Mail) format to a hexadecimal DER (Distinguished Encoding Rules) string.";
24
- this.infoURL = "https://wikipedia.org/wiki/X.690#DER_encoding";
27
+ this.infoURL = "https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail#Format";
25
28
  this.inputType = "string";
26
29
  this.outputType = "string";
27
30
  this.args = [];
31
+ this.checks = [
32
+ {
33
+ "pattern": "----BEGIN ([A-Z][A-Z ]+[A-Z])-----",
34
+ "args": []
35
+ }
36
+ ];
28
37
  }
29
38
 
30
39
  /**
@@ -33,17 +42,25 @@ class PEMToHex extends Operation {
33
42
  * @returns {string}
34
43
  */
35
44
  run(input, args) {
36
- if (input.indexOf("-----BEGIN") < 0) {
37
- // Add header so that the KEYUTIL function works
38
- input = "-----BEGIN CERTIFICATE-----" + input;
39
- }
40
- if (input.indexOf("-----END") < 0) {
41
- // Add footer so that the KEYUTIL function works
42
- input = input + "-----END CERTIFICATE-----";
45
+ const output = [];
46
+ let match;
47
+ const regex = /-----BEGIN ([A-Z][A-Z ]+[A-Z])-----/g;
48
+ while ((match = regex.exec(input)) !== null) {
49
+ // find corresponding end tag
50
+ const indexBase64 = match.index + match[0].length;
51
+ const footer = `-----END ${match[1]}-----`;
52
+ const indexFooter = input.indexOf(footer, indexBase64);
53
+ if (indexFooter === -1) {
54
+ throw new OperationError(`PEM footer '${footer}' not found`);
55
+ }
56
+
57
+ // decode base64 content
58
+ const base64 = input.substring(indexBase64, indexFooter);
59
+ const bytes = fromBase64(base64, "A-Za-z0-9+/=", "byteArray", true);
60
+ const hex = toHexFast(bytes);
61
+ output.push(hex);
43
62
  }
44
- const cert = new r.X509();
45
- cert.readCertPEM(input);
46
- return cert.hex;
63
+ return output.join("\n");
47
64
  }
48
65
 
49
66
  }
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  import Operation from "../Operation.mjs";
8
+ import OperationError from "../errors/OperationError.mjs";
8
9
 
9
10
  /**
10
11
  * To Upper case operation
@@ -37,25 +38,30 @@ class ToUpperCase extends Operation {
37
38
  * @returns {string}
38
39
  */
39
40
  run(input, args) {
41
+ if (!args || args.length === 0) {
42
+ throw new OperationError("No capitalization scope was provided.");
43
+ }
44
+
40
45
  const scope = args[0];
41
46
 
42
- switch (scope) {
43
- case "Word":
44
- return input.replace(/(\b\w)/gi, function(m) {
45
- return m.toUpperCase();
46
- });
47
- case "Sentence":
48
- return input.replace(/(?:\.|^)\s*(\b\w)/gi, function(m) {
49
- return m.toUpperCase();
50
- });
51
- case "Paragraph":
52
- return input.replace(/(?:\n|^)\s*(\b\w)/gi, function(m) {
53
- return m.toUpperCase();
54
- });
55
- case "All": /* falls through */
56
- default:
57
- return input.toUpperCase();
47
+ if (scope === "All") {
48
+ return input.toUpperCase();
49
+ }
50
+
51
+ const scopeRegex = {
52
+ "Word": /(\b\w)/gi,
53
+ "Sentence": /(?:\.|^)\s*(\b\w)/gi,
54
+ "Paragraph": /(?:\n|^)\s*(\b\w)/gi
55
+ }[scope];
56
+
57
+ if (scopeRegex === undefined) {
58
+ throw new OperationError("Unrecognized capitalization scope");
58
59
  }
60
+
61
+ // Use the regex to capitalize the input
62
+ return input.replace(scopeRegex, function(m) {
63
+ return m.toUpperCase();
64
+ });
59
65
  }
60
66
 
61
67
  /**
@@ -67,6 +67,7 @@ import "./tests/PGP.mjs";
67
67
  import "./tests/PHP.mjs";
68
68
  import "./tests/ParseIPRange.mjs";
69
69
  import "./tests/ParseQRCode.mjs";
70
+ import "./tests/PEMtoHex.mjs";
70
71
  import "./tests/PowerSet.mjs";
71
72
  import "./tests/Regex.mjs";
72
73
  import "./tests/Register.mjs";
@@ -68,7 +68,7 @@ TestRegister.addTests([
68
68
  {
69
69
  name: "Magic Chain: Base64",
70
70
  input: "WkVkV2VtUkRRbnBrU0Vwd1ltMWpQUT09",
71
- expectedMatch: /From_Base64\('A-Za-z0-9\+\/=',true\)\nFrom_Base64\('A-Za-z0-9\+\/=',true\)\nFrom_Base64\('A-Za-z0-9\+\/=',true\)/,
71
+ expectedMatch: /From_Base64\('A-Za-z0-9\+\/=',true,false\)\nFrom_Base64\('A-Za-z0-9\+\/=',true,false\)\nFrom_Base64\('A-Za-z0-9\+\/=',true,false\)/,
72
72
  recipeConfig: [
73
73
  {
74
74
  op: "Magic",
@@ -79,7 +79,7 @@ TestRegister.addTests([
79
79
  {
80
80
  name: "Magic Chain: Hex -> Hexdump -> Base64",
81
81
  input: "MDAwMDAwMDAgIDM3IDM0IDIwIDM2IDM1IDIwIDM3IDMzIDIwIDM3IDM0IDIwIDMyIDMwIDIwIDM3ICB8NzQgNjUgNzMgNzQgMjAgN3wKMDAwMDAwMTAgIDMzIDIwIDM3IDM0IDIwIDM3IDMyIDIwIDM2IDM5IDIwIDM2IDY1IDIwIDM2IDM3ICB8MyA3NCA3MiA2OSA2ZSA2N3w=",
82
- expectedMatch: /From_Base64\('A-Za-z0-9\+\/=',true\)\nFrom_Hexdump\(\)\nFrom_Hex\('Space'\)/,
82
+ expectedMatch: /From_Base64\('A-Za-z0-9\+\/=',true,false\)\nFrom_Hexdump\(\)\nFrom_Hex\('Space'\)/,
83
83
  recipeConfig: [
84
84
  {
85
85
  op: "Magic",
@@ -0,0 +1,294 @@
1
+ /**
2
+ * Test PEMtoHex with different inputs
3
+ *
4
+ * @author cplussharp
5
+ *
6
+ * @license Apache-2.0
7
+ */
8
+
9
+ import TestRegister from "../../lib/TestRegister.mjs";
10
+
11
+ /** RSA 2048bit key pair as PKCS1 and PKCS8 and as certificate */
12
+ const PEMS_RSA_PRIVATE_KEY_PKCS1 = `-----BEGIN RSA PRIVATE KEY-----
13
+ MIIEogIBAAKCAQEA5WykLKHiBAhmZh5WhocgpQQqZjdrApuRxRT21SJZx6Ce+Oz2
14
+ V17/heozu5LEz63jCxW1NrBckzl/Ys8p9LeqYTu6x/LbKloTjfEWxlzXnzUSqn9J
15
+ HIxmmJQzjXp9X1D99Tj+NWpRGEIiCFE7JfDhe2KnMGVDDg6kfCLokDdLo256LeQ4
16
+ CEkViwY6d+at4xDlIHwvZZmG4Smk56eHhvQE3I8sSAzgoLMBamQ5m3MbiULAYtxs
17
+ kCpCfjFxrL6Ziaaj7HZoneF40R30KCI9ygF8vkzxLwe3t5Y4XgHL9TYQm1+BDnin
18
+ upIB/zTeO1ygBGA66m6zpmkmuG7d8HXIducz+wIDAQABAoIBACQu3jWr0lmQeZXh
19
+ cwQEi8F6xrUYSGhA4NyUUdmLcV1ql6fqt29QLDySk1Yh76hRZF17LvlRF0ig6NZM
20
+ lfFihhyPrwWZ57bmPe9E9rKSMe+KD0eUi5NVEVk/BmJpzxwZSfRC6NTDz8Zjp7po
21
+ FUwGkYlEJdocHlc5N/fcCZG1Jti/Z1AsZIjO6r6S0O7neC7icECBKHUyWa8/yE1N
22
+ ++TVyMV+z53Ad1PC+SHMGDlbqJAM3o4wAzD/FAIzyVo6GSnnC+bFdgMtIwtwgYTH
23
+ rbr8M8j5fqAHTqNJeblqt/5KHEj2VVsIsHIuQ6lv4llESEqmH+N5KE4O33U7/Wmj
24
+ y/+VGAECgYEA9ysROHXOx1ofh3tI/r2C2FUan6/AAe4dc+8E4jMGI5T4xeqYHTRV
25
+ l1yS+ZKIxqclIoAmd6SJ7Nx2GdQ55MmokZdZRqsFN1flFOZw2kFH/I0zQZXdOjF+
26
+ sf5Lu0FfcTw3VJhJ/YU3CVdlgdP4ekHbaJVFW5i/pTUf5vNs6AGBGxsCgYEA7Z9D
27
+ 0qnF6GhxA8lJfwnyuktYnwIQoXE6Xp26/NZD7t7HzxHDf43LQxmTk+mDP/yIQHwb
28
+ xIx2NE/ncNxlUMl/g1PkJbKVkB8tdIZrLyiT4lebeqgT72Q07IsxRl/GHOr7CfN0
29
+ 61OBRCe44IlOtaNAZk4zWwuAwAYx+G8ifuOJ+KECgYBP5NvsJChyx+7pHDC8JwXk
30
+ Z53zgBvQg+eBUgGCHHwfhEflsa75wbDo/EOF6JfNnrmiLUpB4i2zIpAKSU9tZMHY
31
+ TdPNw/orqX2jA9n2sqNSP1ISIR8hcF5Dqq9QGBGByLUZ4yAHksf3fQiSrrHi0ubZ
32
+ J2cD9Jv+Cu4E+Sp61AGngQKBgHmuTPTbq1TP5s+hi9laJsnvO3pxfEKv0MwSyWYf
33
+ 8rmnq3oGBq6S1buOpVvhAC0MDFm5NB76Lq2rHUFWGyu7g2ik1PfY823SCVzaWJjV
34
+ lqUZZ6zv1QWJsvBOdvUqpjC4w8TcvsqjAFb+YFXa+ktZRekdsn607UFn6r7laizA
35
+ KC8BAoGAZty7sIGMt1gDaoIjySgOox8x7AlY3QUyNQC5N8KW3MZ8KLC5UBtjhqLy
36
+ wYOJr+/1R/7ibiHrKkIE/dmg5QN1iS5tZmFvyLwJ+nHQZObFrlcKtpr+1lekQY/m
37
+ ly6YJFk3yj2nhYzt8eVXBX2lCoLG1gsrbpXvUfIGJ53L9m1mVAo=
38
+ -----END RSA PRIVATE KEY-----`;
39
+
40
+ const PEMS_RSA_PRIVATE_KEY_PKCS8 = `-----BEGIN PRIVATE KEY-----
41
+ MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDlbKQsoeIECGZm
42
+ HlaGhyClBCpmN2sCm5HFFPbVIlnHoJ747PZXXv+F6jO7ksTPreMLFbU2sFyTOX9i
43
+ zyn0t6phO7rH8tsqWhON8RbGXNefNRKqf0kcjGaYlDONen1fUP31OP41alEYQiII
44
+ UTsl8OF7YqcwZUMODqR8IuiQN0ujbnot5DgISRWLBjp35q3jEOUgfC9lmYbhKaTn
45
+ p4eG9ATcjyxIDOCgswFqZDmbcxuJQsBi3GyQKkJ+MXGsvpmJpqPsdmid4XjRHfQo
46
+ Ij3KAXy+TPEvB7e3ljheAcv1NhCbX4EOeKe6kgH/NN47XKAEYDrqbrOmaSa4bt3w
47
+ dch25zP7AgMBAAECggEAJC7eNavSWZB5leFzBASLwXrGtRhIaEDg3JRR2YtxXWqX
48
+ p+q3b1AsPJKTViHvqFFkXXsu+VEXSKDo1kyV8WKGHI+vBZnntuY970T2spIx74oP
49
+ R5SLk1URWT8GYmnPHBlJ9ELo1MPPxmOnumgVTAaRiUQl2hweVzk399wJkbUm2L9n
50
+ UCxkiM7qvpLQ7ud4LuJwQIEodTJZrz/ITU375NXIxX7PncB3U8L5IcwYOVuokAze
51
+ jjADMP8UAjPJWjoZKecL5sV2Ay0jC3CBhMetuvwzyPl+oAdOo0l5uWq3/kocSPZV
52
+ Wwiwci5DqW/iWURISqYf43koTg7fdTv9aaPL/5UYAQKBgQD3KxE4dc7HWh+He0j+
53
+ vYLYVRqfr8AB7h1z7wTiMwYjlPjF6pgdNFWXXJL5kojGpyUigCZ3pIns3HYZ1Dnk
54
+ yaiRl1lGqwU3V+UU5nDaQUf8jTNBld06MX6x/ku7QV9xPDdUmEn9hTcJV2WB0/h6
55
+ QdtolUVbmL+lNR/m82zoAYEbGwKBgQDtn0PSqcXoaHEDyUl/CfK6S1ifAhChcTpe
56
+ nbr81kPu3sfPEcN/jctDGZOT6YM//IhAfBvEjHY0T+dw3GVQyX+DU+QlspWQHy10
57
+ hmsvKJPiV5t6qBPvZDTsizFGX8Yc6vsJ83TrU4FEJ7jgiU61o0BmTjNbC4DABjH4
58
+ byJ+44n4oQKBgE/k2+wkKHLH7ukcMLwnBeRnnfOAG9CD54FSAYIcfB+ER+WxrvnB
59
+ sOj8Q4Xol82euaItSkHiLbMikApJT21kwdhN083D+iupfaMD2fayo1I/UhIhHyFw
60
+ XkOqr1AYEYHItRnjIAeSx/d9CJKuseLS5tknZwP0m/4K7gT5KnrUAaeBAoGAea5M
61
+ 9NurVM/mz6GL2Vomye87enF8Qq/QzBLJZh/yuaeregYGrpLVu46lW+EALQwMWbk0
62
+ HvourasdQVYbK7uDaKTU99jzbdIJXNpYmNWWpRlnrO/VBYmy8E529SqmMLjDxNy+
63
+ yqMAVv5gVdr6S1lF6R2yfrTtQWfqvuVqLMAoLwECgYBm3LuwgYy3WANqgiPJKA6j
64
+ HzHsCVjdBTI1ALk3wpbcxnwosLlQG2OGovLBg4mv7/VH/uJuIesqQgT92aDlA3WJ
65
+ Lm1mYW/IvAn6cdBk5sWuVwq2mv7WV6RBj+aXLpgkWTfKPaeFjO3x5VcFfaUKgsbW
66
+ Cytule9R8gYnncv2bWZUCg==
67
+ -----END PRIVATE KEY-----`;
68
+
69
+ const PEMS_RSA_PUBLIC_KEY_PKCS1 = `-----BEGIN RSA PUBLIC KEY-----
70
+ MIIBCgKCAQEA5WykLKHiBAhmZh5WhocgpQQqZjdrApuRxRT21SJZx6Ce+Oz2V17/
71
+ heozu5LEz63jCxW1NrBckzl/Ys8p9LeqYTu6x/LbKloTjfEWxlzXnzUSqn9JHIxm
72
+ mJQzjXp9X1D99Tj+NWpRGEIiCFE7JfDhe2KnMGVDDg6kfCLokDdLo256LeQ4CEkV
73
+ iwY6d+at4xDlIHwvZZmG4Smk56eHhvQE3I8sSAzgoLMBamQ5m3MbiULAYtxskCpC
74
+ fjFxrL6Ziaaj7HZoneF40R30KCI9ygF8vkzxLwe3t5Y4XgHL9TYQm1+BDninupIB
75
+ /zTeO1ygBGA66m6zpmkmuG7d8HXIducz+wIDAQAB
76
+ -----END RSA PUBLIC KEY-----`;
77
+
78
+ const PEMS_RSA_PUBLIC_KEY_PKCS8 = `-----BEGIN PUBLIC KEY-----
79
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5WykLKHiBAhmZh5Whocg
80
+ pQQqZjdrApuRxRT21SJZx6Ce+Oz2V17/heozu5LEz63jCxW1NrBckzl/Ys8p9Leq
81
+ YTu6x/LbKloTjfEWxlzXnzUSqn9JHIxmmJQzjXp9X1D99Tj+NWpRGEIiCFE7JfDh
82
+ e2KnMGVDDg6kfCLokDdLo256LeQ4CEkViwY6d+at4xDlIHwvZZmG4Smk56eHhvQE
83
+ 3I8sSAzgoLMBamQ5m3MbiULAYtxskCpCfjFxrL6Ziaaj7HZoneF40R30KCI9ygF8
84
+ vkzxLwe3t5Y4XgHL9TYQm1+BDninupIB/zTeO1ygBGA66m6zpmkmuG7d8HXIducz
85
+ +wIDAQAB
86
+ -----END PUBLIC KEY-----`;
87
+
88
+ const PEMS_RSA_CERT = `-----BEGIN CERTIFICATE-----
89
+ MIIDGzCCAgOgAwIBAgIUROs52CB3BsvEVLOCtALalnJG8tEwDQYJKoZIhvcNAQEL
90
+ BQAwHTEbMBkGA1UEAwwSUlNBIDIwNDggUHVibGljS2V5MB4XDTIxMDQxMzIxMDE0
91
+ OVoXDTMxMDQxMTIxMDE0OVowHTEbMBkGA1UEAwwSUlNBIDIwNDggUHVibGljS2V5
92
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5WykLKHiBAhmZh5Whocg
93
+ pQQqZjdrApuRxRT21SJZx6Ce+Oz2V17/heozu5LEz63jCxW1NrBckzl/Ys8p9Leq
94
+ YTu6x/LbKloTjfEWxlzXnzUSqn9JHIxmmJQzjXp9X1D99Tj+NWpRGEIiCFE7JfDh
95
+ e2KnMGVDDg6kfCLokDdLo256LeQ4CEkViwY6d+at4xDlIHwvZZmG4Smk56eHhvQE
96
+ 3I8sSAzgoLMBamQ5m3MbiULAYtxskCpCfjFxrL6Ziaaj7HZoneF40R30KCI9ygF8
97
+ vkzxLwe3t5Y4XgHL9TYQm1+BDninupIB/zTeO1ygBGA66m6zpmkmuG7d8HXIducz
98
+ +wIDAQABo1MwUTAdBgNVHQ4EFgQUcRhRB6H5JqlDHbymwqydW2/EAt8wHwYDVR0j
99
+ BBgwFoAUcRhRB6H5JqlDHbymwqydW2/EAt8wDwYDVR0TAQH/BAUwAwEB/zANBgkq
100
+ hkiG9w0BAQsFAAOCAQEALXBmDizTp/Uz4M2A4nCl0AVclrXEk+YjAKqZnvtj44Gs
101
+ CUcpxtcXu64ppsSYCwawvzIm6B2Mdmib422aInH0e0oNrn8cRzC144Hjnzxguamj
102
+ LyZXnH/0wN9SAjqCKt++urH9wbRMIl0v+g4CWjGyY+eYkMmd1UMQvdCCCv6RVm56
103
+ 7dBCijJIHg23JbgPJD72JCluXtTYWllv3duSwuWeYHo5EftU456pDcztkgn9XwFk
104
+ PFGnHLmbjpSzjE7u29qCjwHl3CiUsjfUlYFl/mf27oDXPqaWqPYv3fWH3H3ymiZQ
105
+ cqptUF4hDtPkaNkKWFmlljChN92o8g/jrv4DVDgJzQ==
106
+ -----END CERTIFICATE-----`;
107
+
108
+ /** EC P-256 key pair and certificate */
109
+ const PEMS_EC_P256_PRIVATE_KEY = `-----BEGIN EC PRIVATE KEY-----
110
+ MHcCAQEEIIhdQxQIcMnCHD3X4WqNv+VgycWmFoEZpRl9X0+dT9uHoAoGCCqGSM49
111
+ AwEHoUQDQgAEFLQcBbzDweo6af4k3k0gKWMNWOZVn8+9hH2rv4DKKYZ7E1z64LBt
112
+ PnB1gMz++HDKySr2ozD3/46dIbQMXUZKpw==
113
+ -----END EC PRIVATE KEY-----`;
114
+
115
+ const PEMS_EC_P256_PRIVATE_KEY_PKCS8 = `-----BEGIN PRIVATE KEY-----
116
+ MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgiF1DFAhwycIcPdfh
117
+ ao2/5WDJxaYWgRmlGX1fT51P24ehRANCAAQUtBwFvMPB6jpp/iTeTSApYw1Y5lWf
118
+ z72Efau/gMophnsTXPrgsG0+cHWAzP74cMrJKvajMPf/jp0htAxdRkqn
119
+ -----END PRIVATE KEY-----`;
120
+
121
+ const PEMS_EC_P256_PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
122
+ MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFLQcBbzDweo6af4k3k0gKWMNWOZV
123
+ n8+9hH2rv4DKKYZ7E1z64LBtPnB1gMz++HDKySr2ozD3/46dIbQMXUZKpw==
124
+ -----END PUBLIC KEY-----`;
125
+
126
+ const PEMS_FOO = `-----BEGIN FOO-----
127
+ Rk9P
128
+ -----END FOO-----`;
129
+ const PEMS_BAR = `-----BEGIN BAR-----
130
+ QkFS
131
+ -----END BAR-----`;
132
+
133
+ TestRegister.addTests([
134
+ {
135
+ name: "PEMtoHex: Nothing",
136
+ input: "",
137
+ expectedOutput: "",
138
+ recipeConfig: [
139
+ {
140
+ "op": "PEM to Hex",
141
+ "args": []
142
+ }
143
+ ]
144
+ },
145
+ {
146
+ name: "PEMtoHex: No footer",
147
+ input: PEMS_RSA_PRIVATE_KEY_PKCS1.substring(0, 200),
148
+ expectedOutput: "PEM footer '-----END RSA PRIVATE KEY-----' not found",
149
+ recipeConfig: [
150
+ {
151
+ "op": "PEM to Hex",
152
+ "args": []
153
+ }
154
+ ]
155
+ },
156
+ {
157
+ name: "PEMtoHex: Multiple PEMs",
158
+ input: PEMS_FOO + "\n" + PEMS_BAR,
159
+ expectedOutput: "FOOBAR",
160
+ recipeConfig: [
161
+ {
162
+ "op": "PEM to Hex",
163
+ "args": []
164
+ },
165
+ {
166
+ "op": "From Hex",
167
+ "args": ["Auto"]
168
+ }
169
+ ]
170
+ },
171
+ {
172
+ name: "PEMtoHex: Single line PEM",
173
+ input: PEMS_FOO.replace(/(\n|\r)/gm, ""),
174
+ expectedOutput: "FOO",
175
+ recipeConfig: [
176
+ {
177
+ "op": "PEM to Hex",
178
+ "args": []
179
+ },
180
+ {
181
+ "op": "From Hex",
182
+ "args": ["None"]
183
+ }
184
+ ]
185
+ },
186
+ {
187
+ name: "PEMtoHex: EC P-256 Private Key",
188
+ input: PEMS_EC_P256_PRIVATE_KEY,
189
+ expectedOutput: "30770201010420885d43140870c9c21c3dd7e16a8dbfe560c9c5a6168119a5197d5f4f9d4fdb87a00a06082a8648ce3d030107a1440342000414b41c05bcc3c1ea3a69fe24de4d2029630d58e6559fcfbd847dabbf80ca29867b135cfae0b06d3e707580ccfef870cac92af6a330f7ff8e9d21b40c5d464aa7",
190
+ recipeConfig: [
191
+ {
192
+ "op": "PEM to Hex",
193
+ "args": []
194
+ }
195
+ ]
196
+ },
197
+ {
198
+ name: "PEMtoHex: EC P-256 Private Key PKCS8",
199
+ input: PEMS_EC_P256_PRIVATE_KEY_PKCS8,
200
+ expectedOutput: "308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b0201010420885d43140870c9c21c3dd7e16a8dbfe560c9c5a6168119a5197d5f4f9d4fdb87a1440342000414b41c05bcc3c1ea3a69fe24de4d2029630d58e6559fcfbd847dabbf80ca29867b135cfae0b06d3e707580ccfef870cac92af6a330f7ff8e9d21b40c5d464aa7",
201
+ recipeConfig: [
202
+ {
203
+ "op": "PEM to Hex",
204
+ "args": []
205
+ }
206
+ ]
207
+ },
208
+ {
209
+ name: "PEMtoHex: EC P-256 Public Key",
210
+ input: PEMS_EC_P256_PUBLIC_KEY,
211
+ expectedOutput: "3059301306072a8648ce3d020106082a8648ce3d0301070342000414b41c05bcc3c1ea3a69fe24de4d2029630d58e6559fcfbd847dabbf80ca29867b135cfae0b06d3e707580ccfef870cac92af6a330f7ff8e9d21b40c5d464aa7",
212
+ recipeConfig: [
213
+ {
214
+ "op": "PEM to Hex",
215
+ "args": []
216
+ }
217
+ ]
218
+ },
219
+ {
220
+ name: "PEMtoHex: RSA Private Key PKCS1",
221
+ input: PEMS_RSA_PRIVATE_KEY_PKCS1,
222
+ expectedOutput: "fb49bd96ffc5d1351a35d773921fac03",
223
+ recipeConfig: [
224
+ {
225
+ "op": "PEM to Hex",
226
+ "args": []
227
+ },
228
+ {
229
+ "op": "MD5",
230
+ "args": []
231
+ }
232
+ ]
233
+ },
234
+ {
235
+ name: "PEMtoHex: RSA Private Key PKCS8",
236
+ input: PEMS_RSA_PRIVATE_KEY_PKCS8,
237
+ expectedOutput: "23086d03633689fee64680c3c24409eb",
238
+ recipeConfig: [
239
+ {
240
+ "op": "PEM to Hex",
241
+ "args": []
242
+ },
243
+ {
244
+ "op": "MD5",
245
+ "args": []
246
+ }
247
+ ]
248
+ },
249
+ {
250
+ name: "PEMtoHex: RSA Public Key PKCS1",
251
+ input: PEMS_RSA_PUBLIC_KEY_PKCS1,
252
+ expectedOutput: "5fc3f1f6c5d5806760b12eaad0c0292c",
253
+ recipeConfig: [
254
+ {
255
+ "op": "PEM to Hex",
256
+ "args": []
257
+ },
258
+ {
259
+ "op": "MD5",
260
+ "args": []
261
+ }
262
+ ]
263
+ },
264
+ {
265
+ name: "PEMtoHex: RSA Public Key PKCS8",
266
+ input: PEMS_RSA_PUBLIC_KEY_PKCS8,
267
+ expectedOutput: "30fbe8e9495d591232affebdd6206ea6",
268
+ recipeConfig: [
269
+ {
270
+ "op": "PEM to Hex",
271
+ "args": []
272
+ },
273
+ {
274
+ "op": "MD5",
275
+ "args": []
276
+ }
277
+ ]
278
+ },
279
+ {
280
+ name: "PEMtoHex: Certificate",
281
+ input: PEMS_RSA_CERT,
282
+ expectedOutput: "6694d8ca4a0ceb84c3951d25dc05ec6e",
283
+ recipeConfig: [
284
+ {
285
+ "op": "PEM to Hex",
286
+ "args": []
287
+ },
288
+ {
289
+ "op": "MD5",
290
+ "args": []
291
+ }
292
+ ]
293
+ }
294
+ ]);