cyberchef 9.38.4 → 9.38.7

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.4",
3
+ "version": "9.38.7",
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",
@@ -8578,14 +8578,20 @@
8578
8578
  ]
8579
8579
  },
8580
8580
  "PEM to Hex": {
8581
- "module": "PublicKey",
8581
+ "module": "Default",
8582
8582
  "description": "Converts PEM (Privacy Enhanced Mail) format to a hexadecimal DER (Distinguished Encoding Rules) string.",
8583
- "infoURL": "https://wikipedia.org/wiki/X.690#DER_encoding",
8583
+ "infoURL": "https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail#Format",
8584
8584
  "inputType": "string",
8585
8585
  "outputType": "string",
8586
8586
  "flowControl": false,
8587
8587
  "manualBake": false,
8588
- "args": []
8588
+ "args": [],
8589
+ "checks": [
8590
+ {
8591
+ "pattern": "----BEGIN ([A-Z][A-Z ]+[A-Z])-----",
8592
+ "args": []
8593
+ }
8594
+ ]
8589
8595
  },
8590
8596
  "PGP Decrypt": {
8591
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
  };
@@ -130,10 +130,11 @@ export function fromBase64(data, alphabet="A-Za-z0-9+/=", returnType="string", r
130
130
  i = 0;
131
131
 
132
132
  while (i < data.length) {
133
- enc1 = 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++));
133
+ // Including `|| null` forces empty strings to null so that indexOf returns -1 instead of 0
134
+ enc1 = alphabet.indexOf(data.charAt(i++) || null);
135
+ enc2 = alphabet.indexOf(data.charAt(i++) || null);
136
+ enc3 = alphabet.indexOf(data.charAt(i++) || null);
137
+ enc4 = alphabet.indexOf(data.charAt(i++) || null);
137
138
 
138
139
  if (strictMode && (enc1 < 0 || enc2 < 0 || enc3 < 0 || enc4 < 0)) {
139
140
  throw new OperationError("Error: Base64 input contains non-alphabet char(s)");
@@ -143,13 +144,13 @@ export function fromBase64(data, alphabet="A-Za-z0-9+/=", returnType="string", r
143
144
  chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
144
145
  chr3 = ((enc3 & 3) << 6) | enc4;
145
146
 
146
- if (chr1 < 256) {
147
+ if (chr1 >= 0 && chr1 < 256) {
147
148
  output.push(chr1);
148
149
  }
149
- if (chr2 < 256 && enc3 !== 64) {
150
+ if (chr2 >= 0 && chr2 < 256 && enc3 !== 64) {
150
151
  output.push(chr2);
151
152
  }
152
- if (chr3 < 256 && enc4 !== 64) {
153
+ if (chr3 >= 0 && chr3 < 256 && enc4 !== 64) {
153
154
  output.push(chr3);
154
155
  }
155
156
  }
@@ -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
  }
@@ -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";
@@ -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
+ ]);