mirror of
https://github.com/gchq/CyberChef.git
synced 2025-04-24 16:56:15 -04:00
Merge branch 'master' of https://github.com/DidierStevens/CyberChef
This commit is contained in:
commit
553d47d4e5
305 changed files with 32151 additions and 19683 deletions
|
@ -6,6 +6,8 @@
|
|||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
const utils = require("./browserUtils.js");
|
||||
|
||||
module.exports = {
|
||||
before: browser => {
|
||||
browser
|
||||
|
@ -82,7 +84,7 @@ module.exports = {
|
|||
// Enter input
|
||||
browser
|
||||
.useCss()
|
||||
.setValue("#input-text", "Don't Panic.")
|
||||
.sendKeys("#input-text .cm-content", "Don't Panic.")
|
||||
.pause(1000)
|
||||
.click("#bake");
|
||||
|
||||
|
@ -90,7 +92,7 @@ module.exports = {
|
|||
browser
|
||||
.useCss()
|
||||
.waitForElementNotVisible("#stale-indicator", 1000)
|
||||
.expect.element("#output-text").to.have.property("value").that.equals("44 6f 6e 27 74 20 50 61 6e 69 63 2e");
|
||||
.expect.element("#output-text .cm-content").text.that.equals("44 6f 6e 27 74 20 50 61 6e 69 63 2e");
|
||||
|
||||
// Clear recipe
|
||||
browser
|
||||
|
@ -192,6 +194,9 @@ module.exports = {
|
|||
|
||||
// Open category
|
||||
browser
|
||||
.useCss()
|
||||
.waitForElementNotVisible("#snackbar-container", 10000)
|
||||
.useXpath()
|
||||
.click(otherCat)
|
||||
.expect.element(genUUID).to.be.visible;
|
||||
|
||||
|
@ -206,7 +211,7 @@ module.exports = {
|
|||
.useCss()
|
||||
.waitForElementVisible(".operation .op-title", 1000)
|
||||
.waitForElementNotVisible("#stale-indicator", 1000)
|
||||
.expect.element("#output-text").to.have.property("value").which.matches(/[\da-f-]{36}/);
|
||||
.expect.element("#output-text .cm-content").text.which.matches(/[\da-f-]{36}/);
|
||||
|
||||
browser.click("#clr-recipe");
|
||||
},
|
||||
|
@ -221,6 +226,25 @@ module.exports = {
|
|||
.waitForElementVisible("//ul[@id='search-results']//b[text()='MD5']", 1000);
|
||||
},
|
||||
|
||||
"Alert bar": browser => {
|
||||
// Bake nothing to create an empty output which can be copied
|
||||
utils.clear(browser);
|
||||
utils.bake(browser);
|
||||
|
||||
// Alert bar shows and contains correct content
|
||||
browser
|
||||
.waitForElementNotVisible("#snackbar-container")
|
||||
.click("#copy-output")
|
||||
.waitForElementVisible("#snackbar-container .snackbar-content")
|
||||
.expect.element("#snackbar-container .snackbar-content").text.to.equal("Copied raw output successfully.");
|
||||
|
||||
// Alert bar disappears after the correct amount of time
|
||||
// Should disappear after 2000ms
|
||||
browser
|
||||
.waitForElementNotPresent("#snackbar-container .snackbar-content", 2500)
|
||||
.waitForElementNotVisible("#snackbar-container");
|
||||
},
|
||||
|
||||
after: browser => {
|
||||
browser.end();
|
||||
}
|
753
tests/browser/01_io.js
Normal file
753
tests/browser/01_io.js
Normal file
|
@ -0,0 +1,753 @@
|
|||
/**
|
||||
* Tests for input and output of various types to ensure the editors work as expected
|
||||
* and retain data integrity, especially when it comes to special characters.
|
||||
*
|
||||
* @author n1474335 [n1474335@gmail.com]
|
||||
* @copyright Crown Copyright 2023
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
// import {
|
||||
// clear,
|
||||
// utils.setInput,
|
||||
// bake,
|
||||
// setChrEnc,
|
||||
// setEOLSeq,
|
||||
// copy,
|
||||
// paste,
|
||||
// loadRecipe,
|
||||
// expectOutput,
|
||||
// uploadFile,
|
||||
// uploadFolder
|
||||
// } from "./browserUtils.js";
|
||||
|
||||
const utils = require("./browserUtils.js");
|
||||
|
||||
const SPECIAL_CHARS = [
|
||||
"\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\u000a\u000b\u000c\u000d\u000e\u000f",
|
||||
"\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f",
|
||||
"\u007f",
|
||||
"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f",
|
||||
"\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f",
|
||||
"\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\u202d\u202e\u2066\u2067\u2069\ufeff\ufff9\ufffa\ufffb\ufffc"
|
||||
].join("");
|
||||
|
||||
const ALL_BYTES = [
|
||||
"\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",
|
||||
].join("");
|
||||
|
||||
const PUA_CHARS = "\ue000\ue001\uf8fe\uf8ff";
|
||||
|
||||
const MULTI_LINE_STRING =`"You know," said Arthur, "it's at times like this, when I'm trapped in a Vogon airlock with a man from Betelgeuse, and about to die of asphyxiation in deep space that I really wish I'd listened to what my mother told me when I was young."
|
||||
"Why, what did she tell you?"
|
||||
"I don't know, I didn't listen."`;
|
||||
|
||||
const SELECTABLE_STRING = `ONE
|
||||
two
|
||||
ONE
|
||||
three
|
||||
ONE
|
||||
four
|
||||
ONE`;
|
||||
|
||||
// Descriptions for named control characters
|
||||
const CONTROL_CHAR_NAMES = {
|
||||
0: "null",
|
||||
7: "bell",
|
||||
8: "backspace",
|
||||
10: "line feed",
|
||||
11: "vertical tab",
|
||||
13: "carriage return",
|
||||
27: "escape",
|
||||
8203: "zero width space",
|
||||
8204: "zero width non-joiner",
|
||||
8205: "zero width joiner",
|
||||
8206: "left-to-right mark",
|
||||
8207: "right-to-left mark",
|
||||
8232: "line separator",
|
||||
8237: "left-to-right override",
|
||||
8238: "right-to-left override",
|
||||
8294: "left-to-right isolate",
|
||||
8295: "right-to-left isolate",
|
||||
8297: "pop directional isolate",
|
||||
8233: "paragraph separator",
|
||||
65279: "zero width no-break space",
|
||||
65532: "object replacement"
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
before: browser => {
|
||||
browser
|
||||
.resizeWindow(1280, 800)
|
||||
.url(browser.launchUrl)
|
||||
.useCss()
|
||||
.waitForElementNotPresent("#preloader", 10000)
|
||||
.click("#auto-bake-label");
|
||||
},
|
||||
|
||||
"CodeMirror has loaded correctly": browser => {
|
||||
/* Editor has initialised */
|
||||
browser
|
||||
.useCss()
|
||||
// Input
|
||||
.waitForElementVisible("#input-text")
|
||||
.waitForElementVisible("#input-text .cm-editor")
|
||||
.waitForElementVisible("#input-text .cm-editor .cm-scroller")
|
||||
.waitForElementVisible("#input-text .cm-editor .cm-scroller .cm-content")
|
||||
.waitForElementVisible("#input-text .cm-editor .cm-scroller .cm-content .cm-line")
|
||||
// Output
|
||||
.waitForElementVisible("#output-text")
|
||||
.waitForElementVisible("#output-text .cm-editor")
|
||||
.waitForElementVisible("#output-text .cm-editor .cm-scroller")
|
||||
.waitForElementVisible("#output-text .cm-editor .cm-scroller .cm-content")
|
||||
.waitForElementVisible("#output-text .cm-editor .cm-scroller .cm-content .cm-line");
|
||||
|
||||
/* Status bar is showing and has correct values */
|
||||
browser // Input
|
||||
.waitForElementVisible("#input-text .cm-status-bar")
|
||||
.waitForElementVisible("#input-text .cm-status-bar .stats-length-value")
|
||||
.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("0");
|
||||
browser.waitForElementVisible("#input-text .cm-status-bar .stats-lines-value")
|
||||
.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("1");
|
||||
browser.waitForElementVisible("#input-text .cm-status-bar .chr-enc-value")
|
||||
.expect.element("#input-text .cm-status-bar .chr-enc-value").text.to.equal("Raw Bytes");
|
||||
browser.waitForElementVisible("#input-text .cm-status-bar .eol-value")
|
||||
.expect.element("#input-text .cm-status-bar .eol-value").text.to.equal("LF");
|
||||
|
||||
browser // Output
|
||||
.waitForElementVisible("#output-text .cm-status-bar")
|
||||
.waitForElementVisible("#output-text .cm-status-bar .stats-length-value")
|
||||
.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("0");
|
||||
browser.waitForElementVisible("#output-text .cm-status-bar .stats-lines-value")
|
||||
.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("1");
|
||||
browser.waitForElementVisible("#output-text .cm-status-bar .baking-time-info")
|
||||
.expect.element("#output-text .cm-status-bar .baking-time-info").text.to.contain("ms");
|
||||
browser.waitForElementVisible("#output-text .cm-status-bar .chr-enc-value")
|
||||
.expect.element("#output-text .cm-status-bar .chr-enc-value").text.to.equal("Raw Bytes");
|
||||
browser.waitForElementVisible("#output-text .cm-status-bar .eol-value")
|
||||
.expect.element("#output-text .cm-status-bar .eol-value").text.to.equal("LF");
|
||||
},
|
||||
|
||||
"Adding content": browser => {
|
||||
/* Status bar updates correctly */
|
||||
utils.setInput(browser, MULTI_LINE_STRING);
|
||||
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("301");
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("3");
|
||||
browser.expect.element("#input-text .cm-status-bar .chr-enc-value").text.to.equal("Raw Bytes");
|
||||
browser.expect.element("#input-text .cm-status-bar .eol-value").text.to.equal("LF");
|
||||
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("0");
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("1");
|
||||
browser.expect.element("#output-text .cm-status-bar .baking-time-info").text.to.contain("ms");
|
||||
browser.expect.element("#output-text .cm-status-bar .chr-enc-value").text.to.equal("Raw Bytes");
|
||||
browser.expect.element("#output-text .cm-status-bar .eol-value").text.to.equal("LF");
|
||||
|
||||
/* Output updates correctly */
|
||||
utils.bake(browser);
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("301");
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("3");
|
||||
browser.expect.element("#output-text .cm-status-bar .baking-time-info").text.to.contain("ms");
|
||||
browser.expect.element("#output-text .cm-status-bar .chr-enc-value").text.to.equal("Raw Bytes");
|
||||
browser.expect.element("#output-text .cm-status-bar .eol-value").text.to.equal("LF");
|
||||
},
|
||||
|
||||
"Autobaking the latest input": browser => {
|
||||
// Use the sleep recipe to simulate a long running task
|
||||
utils.loadRecipe(browser, "Sleep", "input", [2000]);
|
||||
|
||||
browser.waitForElementVisible("#stale-indicator");
|
||||
|
||||
// Enable previously disabled autobake
|
||||
browser.expect.element("#auto-bake").to.not.be.selected;
|
||||
browser.click("#auto-bake-label");
|
||||
browser.expect.element("#auto-bake").to.be.selected.before(1000);
|
||||
|
||||
// Add content to the input
|
||||
browser.pause(100);
|
||||
browser.sendKeys("#input-text .cm-content", "1");
|
||||
browser.waitForElementVisible("#output-loader");
|
||||
browser.pause(500);
|
||||
|
||||
// Make another change while the previous input is being baked
|
||||
browser
|
||||
.sendKeys("#input-text .cm-content", "2")
|
||||
.waitForElementNotVisible("#stale-indicator")
|
||||
.waitForElementNotVisible("#output-loader");
|
||||
|
||||
// Ensure we got the latest input baked
|
||||
utils.expectOutput(browser, "input12");
|
||||
|
||||
// Turn autobake off again
|
||||
browser.click("#auto-bake-label");
|
||||
browser.expect.element("#auto-bake").to.not.be.selected.before(1000);
|
||||
},
|
||||
|
||||
"Special content": browser => {
|
||||
/* Special characters are rendered correctly */
|
||||
utils.setInput(browser, SPECIAL_CHARS, false);
|
||||
|
||||
// First line
|
||||
for (let i = 0x0; i <= 0x8; i++) {
|
||||
browser.expect.element(`#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i+1})`)
|
||||
.to.have.property("title").equals(`Control character ${CONTROL_CHAR_NAMES[i] || "0x" + i.toString(16)}`);
|
||||
browser.expect.element(`#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i+1})`)
|
||||
.text.to.equal(String.fromCharCode(0x2400 + i));
|
||||
}
|
||||
|
||||
// Tab \u0009
|
||||
browser.expect.element(`#input-text .cm-line:nth-of-type(1)`).to.have.property("textContent").match(/\u0009$/);
|
||||
|
||||
// Line feed \u000a
|
||||
browser.expect.element(`#input-text .cm-line:nth-of-type(1)`).to.have.property("textContent").match(/^.{10}$/);
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
|
||||
|
||||
// Second line
|
||||
for (let i = 0x0b; i < SPECIAL_CHARS.length; i++) {
|
||||
const index = SPECIAL_CHARS.charCodeAt(i);
|
||||
const name = CONTROL_CHAR_NAMES[index] || "0x" + index.toString(16);
|
||||
const value = index >= 32 ? "\u2022" : String.fromCharCode(0x2400 + index);
|
||||
|
||||
browser.expect.element(`#input-text .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i-10})`)
|
||||
.to.have.property("title").equals(`Control character ${name}`);
|
||||
browser.expect.element(`#input-text .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i-10})`)
|
||||
.text.to.equal(value);
|
||||
}
|
||||
|
||||
/* Output renders correctly */
|
||||
utils.setChrEnc(browser, "output", "UTF-8");
|
||||
utils.bake(browser);
|
||||
|
||||
// First line
|
||||
for (let i = 0x0; i <= 0x8; i++) {
|
||||
browser.expect.element(`#output-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i+1})`)
|
||||
.to.have.property("title").equals(`Control character ${CONTROL_CHAR_NAMES[i] || "0x" + i.toString(16)}`);
|
||||
browser.expect.element(`#output-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i+1})`)
|
||||
.text.to.equal(String.fromCharCode(0x2400 + i));
|
||||
}
|
||||
|
||||
// Tab \u0009
|
||||
browser.expect.element(`#output-text .cm-line:nth-of-type(1)`).to.have.property("textContent").match(/\u0009$/);
|
||||
|
||||
// Line feed \u000a
|
||||
browser.expect.element(`#output-text .cm-line:nth-of-type(1)`).to.have.property("textContent").match(/^.{10}$/);
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("2");
|
||||
|
||||
// Second line
|
||||
for (let i = 0x0b; i < SPECIAL_CHARS.length; i++) {
|
||||
const index = SPECIAL_CHARS.charCodeAt(i);
|
||||
const name = CONTROL_CHAR_NAMES[index] || "0x" + index.toString(16);
|
||||
const value = index >= 32 ? "\u2022" : String.fromCharCode(0x2400 + index);
|
||||
|
||||
browser.expect.element(`#output-text .cm-content .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i-10})`)
|
||||
.to.have.property("title").equals(`Control character ${name}`);
|
||||
browser.expect.element(`#output-text .cm-content .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i-10})`)
|
||||
.text.to.equal(value);
|
||||
}
|
||||
|
||||
/* Bytes are rendered correctly */
|
||||
utils.setInput(browser, ALL_BYTES, false);
|
||||
// Expect length to be 255, since one character is creating a newline
|
||||
browser.expect.element(`#input-text .cm-content`).to.have.property("textContent").match(/^.{255}$/);
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("256");
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
|
||||
|
||||
|
||||
/* PUA \ue000-\uf8ff */
|
||||
utils.setInput(browser, PUA_CHARS, false);
|
||||
utils.setChrEnc(browser, "output", "UTF-8");
|
||||
utils.bake(browser);
|
||||
|
||||
// Confirm input and output as expected
|
||||
/* In order to render whitespace characters as control character pictures in the output, even
|
||||
when they are the designated line separator, CyberChef sometimes chooses to represent them
|
||||
internally using the Unicode Private Use Area (https://en.wikipedia.org/wiki/Private_Use_Areas).
|
||||
See `Utils.escapeWhitespace()` for an example of this.
|
||||
Therefore, PUA characters should be rendered normally in the Input but as control character
|
||||
pictures in the output.
|
||||
*/
|
||||
browser.expect.element(`#input-text .cm-content`).to.have.property("textContent").match(/^\ue000\ue001\uf8fe\uf8ff$/);
|
||||
browser.expect.element(`#output-text .cm-content`).to.have.property("textContent").match(/^\u2400\u2401\u3cfe\u3cff$/);
|
||||
|
||||
/* Can be copied */
|
||||
utils.setInput(browser, SPECIAL_CHARS, false);
|
||||
utils.setChrEnc(browser, "output", "UTF-8");
|
||||
utils.bake(browser);
|
||||
|
||||
// Manual copy
|
||||
browser
|
||||
.doubleClick("#output-text .cm-content .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(1)")
|
||||
.waitForElementVisible("#output-text .cm-selectionBackground");
|
||||
utils.copy(browser);
|
||||
utils.paste(browser, "#search"); // Paste into search box as this won't mess with the values
|
||||
|
||||
// Ensure that the values are as expected
|
||||
browser.expect.element("#search").to.have.value.that.equals("\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008");
|
||||
browser.clearValue("#search");
|
||||
|
||||
// Raw copy
|
||||
browser
|
||||
.click("#copy-output")
|
||||
.pause(100);
|
||||
utils.paste(browser, "#search"); // Paste into search box as this won't mess with the values
|
||||
|
||||
// Ensure that the values are as expected
|
||||
browser.expect.element("#search").to.have.value.that.matches(/^\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009/);
|
||||
browser.clearValue("#search");
|
||||
},
|
||||
|
||||
"HTML output": browser => {
|
||||
/* Displays correctly */
|
||||
utils.loadRecipe(browser, "Entropy", ALL_BYTES);
|
||||
utils.bake(browser);
|
||||
|
||||
browser
|
||||
.waitForElementVisible("#output-html")
|
||||
.waitForElementVisible("#output-html #chart-area");
|
||||
|
||||
/* Status bar widgets are disabled */
|
||||
browser.expect.element("#output-text .cm-status-bar .disabled .stats-length-value").to.be.visible;
|
||||
browser.expect.element("#output-text .cm-status-bar .disabled .stats-lines-value").to.be.visible;
|
||||
browser.expect.element("#output-text .cm-status-bar .disabled .chr-enc-value").to.be.visible;
|
||||
browser.expect.element("#output-text .cm-status-bar .disabled .eol-value").to.be.visible;
|
||||
|
||||
/* Displays special chars correctly */
|
||||
utils.loadRecipe(browser, "To Table", ",\u0000\u0001\u0002\u0003\u0004", [",", "\\r\\n", false, "HTML"]);
|
||||
utils.bake(browser);
|
||||
|
||||
for (let i = 0x0; i <= 0x4; i++) {
|
||||
browser.expect.element(`#output-html .cm-specialChar:nth-of-type(${i+1})`)
|
||||
.to.have.property("title").equals(`Control character ${CONTROL_CHAR_NAMES[i] || "0x" + i.toString(16)}`);
|
||||
browser.expect.element(`#output-html .cm-specialChar:nth-of-type(${i+1})`)
|
||||
.text.to.equal(String.fromCharCode(0x2400 + i));
|
||||
}
|
||||
|
||||
/* Can be copied */
|
||||
// Raw copy
|
||||
browser
|
||||
.click("#copy-output")
|
||||
.pause(100);
|
||||
utils.paste(browser, "#search"); // Paste into search box as this won't mess with the values
|
||||
|
||||
// Ensure that the values are as expected
|
||||
browser.expect.element("#search").to.have.value.that.matches(/\u0000\u0001\u0002\u0003\u0004/);
|
||||
browser.clearValue("#search");
|
||||
},
|
||||
|
||||
"Highlighting": browser => {
|
||||
utils.setInput(browser, SELECTABLE_STRING);
|
||||
utils.bake(browser);
|
||||
|
||||
/* Selecting input text also selects other instances in input and output */
|
||||
browser // Input
|
||||
.click("#auto-bake-label")
|
||||
.doubleClick("#input-text .cm-content .cm-line:nth-of-type(1)")
|
||||
.waitForElementVisible("#input-text .cm-selectionLayer .cm-selectionBackground")
|
||||
.waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(1) .cm-selectionMatch")
|
||||
.waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(2) .cm-selectionMatch")
|
||||
.waitForElementVisible("#input-text .cm-content .cm-line:nth-of-type(3) .cm-selectionMatch")
|
||||
.waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(4) .cm-selectionMatch")
|
||||
.waitForElementVisible("#input-text .cm-content .cm-line:nth-of-type(5) .cm-selectionMatch")
|
||||
.waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(6) .cm-selectionMatch")
|
||||
.waitForElementVisible("#input-text .cm-content .cm-line:nth-of-type(7) .cm-selectionMatch");
|
||||
|
||||
browser // Output
|
||||
.waitForElementVisible("#output-text .cm-selectionLayer .cm-selectionBackground")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(1) .cm-selectionMatch")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(2) .cm-selectionMatch")
|
||||
.waitForElementVisible("#output-text .cm-content .cm-line:nth-of-type(3) .cm-selectionMatch")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(4) .cm-selectionMatch")
|
||||
.waitForElementVisible("#output-text .cm-content .cm-line:nth-of-type(5) .cm-selectionMatch")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(6) .cm-selectionMatch")
|
||||
.waitForElementVisible("#output-text .cm-content .cm-line:nth-of-type(7) .cm-selectionMatch");
|
||||
|
||||
/* Selecting output text highlights in input */
|
||||
browser // Output
|
||||
.click("#output-text")
|
||||
.waitForElementNotPresent("#input-text .cm-selectionLayer .cm-selectionBackground")
|
||||
.waitForElementNotPresent("#output-text .cm-selectionLayer .cm-selectionBackground")
|
||||
.waitForElementNotPresent("#input-text .cm-content .cm-line .cm-selectionMatch")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-line .cm-selectionMatch")
|
||||
.doubleClick("#output-text .cm-content .cm-line:nth-of-type(7)")
|
||||
.waitForElementVisible("#output-text .cm-selectionLayer .cm-selectionBackground")
|
||||
.waitForElementVisible("#output-text .cm-content .cm-line:nth-of-type(1) .cm-selectionMatch")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(2) .cm-selectionMatch")
|
||||
.waitForElementVisible("#output-text .cm-content .cm-line:nth-of-type(3) .cm-selectionMatch")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(4) .cm-selectionMatch")
|
||||
.waitForElementVisible("#output-text .cm-content .cm-line:nth-of-type(5) .cm-selectionMatch")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(6) .cm-selectionMatch")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(7) .cm-selectionMatch");
|
||||
|
||||
browser // Input
|
||||
.waitForElementVisible("#input-text .cm-selectionLayer .cm-selectionBackground")
|
||||
.waitForElementVisible("#input-text .cm-content .cm-line:nth-of-type(1) .cm-selectionMatch")
|
||||
.waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(2) .cm-selectionMatch")
|
||||
.waitForElementVisible("#input-text .cm-content .cm-line:nth-of-type(3) .cm-selectionMatch")
|
||||
.waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(4) .cm-selectionMatch")
|
||||
.waitForElementVisible("#input-text .cm-content .cm-line:nth-of-type(5) .cm-selectionMatch")
|
||||
.waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(6) .cm-selectionMatch")
|
||||
.waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(7) .cm-selectionMatch");
|
||||
|
||||
// Turn autobake off again
|
||||
browser.click("#auto-bake-label");
|
||||
},
|
||||
|
||||
"Character encoding": browser => {
|
||||
const CHINESE_CHARS = "不要恐慌。";
|
||||
/* Dropup works */
|
||||
/* Selecting changes output correctly */
|
||||
utils.setInput(browser, CHINESE_CHARS, false);
|
||||
utils.setChrEnc(browser, "input", "UTF-8");
|
||||
utils.bake(browser);
|
||||
|
||||
/* Output encoding should be autodetected */
|
||||
browser
|
||||
.waitForElementVisible("#snackbar-container .snackbar-content", 5000)
|
||||
.expect.element("#snackbar-container .snackbar-content").text.to.equal("Output character encoding has been detected and changed to UTF-8");
|
||||
|
||||
utils.expectOutput(browser, CHINESE_CHARS);
|
||||
|
||||
/* Change the output encoding manually to test for URL presence */
|
||||
utils.setChrEnc(browser, "output", "UTF-8");
|
||||
|
||||
/* Encodings appear in the URL */
|
||||
browser.assert.urlContains("ienc=65001");
|
||||
browser.assert.urlContains("oenc=65001");
|
||||
|
||||
/* Preserved when changing tabs */
|
||||
browser
|
||||
.click("#btn-new-tab")
|
||||
.waitForElementVisible("#input-tabs li:nth-of-type(2).active-input-tab");
|
||||
browser.expect.element("#input-text .chr-enc-value").text.that.equals("Raw Bytes");
|
||||
browser.expect.element("#output-text .chr-enc-value").text.that.equals("Raw Bytes");
|
||||
|
||||
utils.setChrEnc(browser, "input", "UTF-7");
|
||||
utils.setChrEnc(browser, "output", "UTF-7");
|
||||
|
||||
browser
|
||||
.click("#input-tabs li:nth-of-type(1)")
|
||||
.waitForElementVisible("#input-tabs li:nth-of-type(1).active-input-tab");
|
||||
browser.expect.element("#input-text .chr-enc-value").text.that.equals("UTF-8");
|
||||
browser.expect.element("#output-text .chr-enc-value").text.that.equals("UTF-8");
|
||||
|
||||
/* Try various encodings */
|
||||
// These are not meant to be realistic encodings for this data
|
||||
utils.setInput(browser, CHINESE_CHARS, false);
|
||||
utils.setChrEnc(browser, "input", "UTF-8");
|
||||
utils.setChrEnc(browser, "output", "UTF-16LE");
|
||||
utils.bake(browser);
|
||||
utils.expectOutput(browser, "\uB8E4\uE88D\u81A6\u81E6\uE690\u8C85\u80E3");
|
||||
|
||||
utils.setChrEnc(browser, "output", "Simplified Chinese GBK");
|
||||
utils.bake(browser);
|
||||
utils.expectOutput(browser, "\u6D93\u5D88\uFDFF\u93AD\u612D\u53A1\u9286\u0000");
|
||||
|
||||
utils.setChrEnc(browser, "input", "UTF-7");
|
||||
utils.bake(browser);
|
||||
utils.expectOutput(browser, "+Tg0-+iYE-+YFA-+YUw-");
|
||||
|
||||
utils.setChrEnc(browser, "input", "Traditional Chinese Big5");
|
||||
utils.bake(browser);
|
||||
utils.expectOutput(browser, "\u3043\u74B6\uFDFF\u7A3A\uFDFF");
|
||||
|
||||
utils.setChrEnc(browser, "output", "Windows-1251 Cyrillic");
|
||||
utils.bake(browser);
|
||||
utils.expectOutput(browser, "\u00A4\u0408\u00ADn\u00AE\u0408\u00B7W\u040EC");
|
||||
},
|
||||
|
||||
"Line endings": browser => {
|
||||
/* Dropup works */
|
||||
/* Selecting changes view in input */
|
||||
utils.setInput(browser, MULTI_LINE_STRING);
|
||||
|
||||
// Line endings: LF
|
||||
|
||||
// Input
|
||||
browser
|
||||
.waitForElementPresent("#input-text .cm-content .cm-line:nth-of-type(3)")
|
||||
.waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(4)")
|
||||
.waitForElementNotPresent("#input-text .cm-content .cm-specialChar");
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("301");
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("3");
|
||||
|
||||
// Output
|
||||
utils.bake(browser);
|
||||
browser
|
||||
.waitForElementPresent("#output-text .cm-content .cm-line:nth-of-type(3)")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(4)")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-specialChar");
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("301");
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("3");
|
||||
|
||||
// Input EOL: VT
|
||||
utils.setEOLSeq(browser, "input", "VT");
|
||||
|
||||
// Input
|
||||
browser
|
||||
.waitForElementPresent("#input-text .cm-content .cm-line:nth-of-type(1)")
|
||||
.waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(2)")
|
||||
.waitForElementPresent("#input-text .cm-content .cm-specialChar");
|
||||
browser.expect.element("#input-text .cm-content .cm-specialChar").text.to.equal("␊");
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("301");
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("1");
|
||||
|
||||
// Output
|
||||
utils.bake(browser);
|
||||
browser
|
||||
.waitForElementPresent("#output-text .cm-content .cm-line:nth-of-type(3)")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(4)")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-specialChar");
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("301");
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("3");
|
||||
|
||||
// Output EOL: VT
|
||||
utils.setEOLSeq(browser, "output", "VT");
|
||||
|
||||
// Input
|
||||
browser
|
||||
.waitForElementPresent("#input-text .cm-content .cm-line:nth-of-type(1)")
|
||||
.waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(2)")
|
||||
.waitForElementPresent("#input-text .cm-content .cm-specialChar");
|
||||
browser.expect.element("#input-text .cm-content .cm-specialChar").text.to.equal("␊");
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("301");
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("1");
|
||||
|
||||
// Output
|
||||
browser
|
||||
.waitForElementPresent("#output-text .cm-content .cm-line:nth-of-type(1)")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(2)")
|
||||
.waitForElementPresent("#output-text .cm-content .cm-specialChar");
|
||||
browser.expect.element("#output-text .cm-content .cm-specialChar").text.to.equal("␊");
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("301");
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("1");
|
||||
|
||||
/* Adding new line ending changes output correctly */
|
||||
browser.sendKeys("#input-text .cm-content", browser.Keys.RETURN);
|
||||
|
||||
// Input
|
||||
browser
|
||||
.waitForElementPresent("#input-text .cm-content .cm-line:nth-of-type(2)")
|
||||
.waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(3)");
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("302");
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
|
||||
|
||||
// Output
|
||||
utils.bake(browser);
|
||||
browser
|
||||
.waitForElementPresent("#output-text .cm-content .cm-line:nth-of-type(2)")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(3)");
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("302");
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("2");
|
||||
|
||||
// Input EOL: CRLF
|
||||
utils.setEOLSeq(browser, "input", "CRLF");
|
||||
// Output EOL: CR
|
||||
utils.setEOLSeq(browser, "output", "CR");
|
||||
browser.sendKeys("#input-text .cm-content", browser.Keys.RETURN);
|
||||
|
||||
// Input
|
||||
browser
|
||||
.waitForElementPresent("#input-text .cm-content .cm-line:nth-of-type(2)")
|
||||
.waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(3)")
|
||||
.waitForElementPresent("#input-text .cm-content .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(3)");
|
||||
browser.expect.element("#input-text .cm-content .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(3)").text.to.equal("␋");
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("304");
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
|
||||
|
||||
// Output
|
||||
utils.bake(browser);
|
||||
browser
|
||||
.waitForElementPresent("#output-text .cm-content .cm-line:nth-of-type(2)")
|
||||
.waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(3)")
|
||||
.waitForElementPresent("#output-text .cm-content .cm-line:nth-of-type(2) .cm-specialChar");
|
||||
browser.expect.element("#output-text .cm-content .cm-line:nth-of-type(2) .cm-specialChar").text.to.equal("␊");
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("304");
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("2");
|
||||
|
||||
/* Line endings appear in the URL */
|
||||
browser.assert.urlContains("ieol=CRLF");
|
||||
browser.assert.urlContains("oeol=CR");
|
||||
|
||||
/* Preserved when changing tabs */
|
||||
browser
|
||||
.click("#btn-new-tab")
|
||||
.waitForElementVisible("#input-tabs li:nth-of-type(2).active-input-tab");
|
||||
browser.expect.element("#input-text .eol-value").text.that.equals("LF");
|
||||
browser.expect.element("#output-text .eol-value").text.that.equals("LF");
|
||||
|
||||
utils.setEOLSeq(browser, "input", "FF");
|
||||
utils.setEOLSeq(browser, "output", "LS");
|
||||
|
||||
browser
|
||||
.click("#input-tabs li:nth-of-type(1)")
|
||||
.waitForElementVisible("#input-tabs li:nth-of-type(1).active-input-tab");
|
||||
browser.expect.element("#input-text .eol-value").text.that.equals("CRLF");
|
||||
browser.expect.element("#output-text .eol-value").text.that.equals("CR");
|
||||
},
|
||||
|
||||
"File inputs": browser => {
|
||||
utils.clear(browser);
|
||||
|
||||
/* Side panel displays correct info */
|
||||
utils.uploadFile(browser, "files/TowelDay.jpeg");
|
||||
|
||||
browser
|
||||
.waitForElementVisible("#input-text .cm-file-details")
|
||||
.waitForElementVisible("#input-text .cm-file-details .file-details-toggle-shown")
|
||||
.waitForElementVisible("#input-text .cm-file-details .file-details-thumbnail")
|
||||
.waitForElementVisible("#input-text .cm-file-details .file-details-name")
|
||||
.waitForElementVisible("#input-text .cm-file-details .file-details-size")
|
||||
.waitForElementVisible("#input-text .cm-file-details .file-details-type")
|
||||
.waitForElementVisible("#input-text .cm-file-details .file-details-loaded");
|
||||
browser.expect.element("#input-text .cm-file-details .file-details-name").text.that.equals("TowelDay.jpeg");
|
||||
browser.expect.element("#input-text .cm-file-details .file-details-size").text.that.equals("61,379 bytes");
|
||||
browser.expect.element("#input-text .cm-file-details .file-details-type").text.that.equals("image/jpeg");
|
||||
browser.expect.element("#input-text .cm-file-details .file-details-loaded").text.that.equals("100%");
|
||||
|
||||
/* Side panel can be hidden */
|
||||
browser
|
||||
.click("#input-text .cm-file-details .file-details-toggle-shown")
|
||||
.waitForElementNotPresent("#input-text .cm-file-details .file-details-toggle-shown")
|
||||
.waitForElementVisible("#input-text .cm-file-details .file-details-toggle-hidden")
|
||||
.expect.element("#input-text .cm-file-details").to.have.css("width").which.equals("1px");
|
||||
|
||||
browser
|
||||
.click("#input-text .cm-file-details .file-details-toggle-hidden")
|
||||
.waitForElementNotPresent("#input-text .cm-file-details .file-details-toggle-hidden")
|
||||
.waitForElementVisible("#input-text .cm-file-details .file-details-toggle-shown")
|
||||
.expect.element("#input-text .cm-file-details").to.have.css("width").which.equals("200px");
|
||||
},
|
||||
|
||||
"Folder inputs": browser => {
|
||||
utils.clear(browser);
|
||||
|
||||
/* Side panel displays correct info */
|
||||
utils.uploadFolder(browser, "files");
|
||||
|
||||
// Loop through tabs
|
||||
for (let i = 1; i < 3; i++) {
|
||||
browser
|
||||
.click(`#input-tabs li:nth-of-type(${i})`)
|
||||
.waitForElementVisible(`#input-tabs li:nth-of-type(${i}).active-input-tab`);
|
||||
|
||||
browser
|
||||
.waitForElementVisible("#input-text .cm-file-details")
|
||||
.waitForElementVisible("#input-text .cm-file-details .file-details-toggle-shown")
|
||||
.waitForElementVisible("#input-text .cm-file-details .file-details-thumbnail")
|
||||
.waitForElementVisible("#input-text .cm-file-details .file-details-name")
|
||||
.waitForElementVisible("#input-text .cm-file-details .file-details-size")
|
||||
.waitForElementVisible("#input-text .cm-file-details .file-details-type")
|
||||
.waitForElementVisible("#input-text .cm-file-details .file-details-loaded");
|
||||
|
||||
browser.getText("#input-text .cm-file-details .file-details-name", function(result) {
|
||||
switch (result.value) {
|
||||
case "TowelDay.jpeg":
|
||||
browser.expect.element("#input-text .cm-file-details .file-details-name").text.that.equals("TowelDay.jpeg");
|
||||
browser.expect.element("#input-text .cm-file-details .file-details-size").text.that.equals("61,379 bytes");
|
||||
browser.expect.element("#input-text .cm-file-details .file-details-type").text.that.equals("image/jpeg");
|
||||
browser.expect.element("#input-text .cm-file-details .file-details-loaded").text.that.equals("100%");
|
||||
break;
|
||||
case "Hitchhikers_Guide.jpeg":
|
||||
browser.expect.element("#input-text .cm-file-details .file-details-name").text.that.equals("Hitchhikers_Guide.jpeg");
|
||||
browser.expect.element("#input-text .cm-file-details .file-details-size").text.that.equals("36,595 bytes");
|
||||
browser.expect.element("#input-text .cm-file-details .file-details-type").text.that.equals("image/jpeg");
|
||||
browser.expect.element("#input-text .cm-file-details .file-details-loaded").text.that.equals("100%");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
// "Loading from URL": browser => {
|
||||
// utils.clear(browser);
|
||||
|
||||
// /* Side panel displays correct info */
|
||||
// utils.uploadFile(browser, "files/TowelDay.jpeg");
|
||||
|
||||
// browser
|
||||
// .waitForElementVisible("#input-text .cm-file-details")
|
||||
// .waitForElementVisible("#input-text .cm-file-details .file-details-toggle-shown")
|
||||
// .waitForElementVisible("#input-text .cm-file-details .file-details-thumbnail")
|
||||
// .waitForElementVisible("#input-text .cm-file-details .file-details-name")
|
||||
// .waitForElementVisible("#input-text .cm-file-details .file-details-size")
|
||||
// .waitForElementVisible("#input-text .cm-file-details .file-details-type")
|
||||
// .waitForElementVisible("#input-text .cm-file-details .file-details-loaded");
|
||||
|
||||
// /* Complex deep link populates the input correctly (encoding, eol, input) */
|
||||
// browser
|
||||
// .urlHash("recipe=To_Base64('A-Za-z0-9%2B/%3D')&input=VGhlIHNoaXBzIGh1bmcgaW4gdGhlIHNreSBpbiBtdWNoIHRoZSBzYW1lIHdheSB0aGF0IGJyaWNrcyBkb24ndC4M&ienc=21866&oenc=1201&ieol=FF&oeol=PS")
|
||||
// .waitForElementVisible("#rec-list li.operation");
|
||||
|
||||
// browser.expect.element(`#input-text .cm-content`).to.have.property("textContent").match(/^.{65}$/);
|
||||
// browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("66");
|
||||
// browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
|
||||
|
||||
// browser.expect.element("#input-text .chr-enc-value").text.that.equals("KOI8-U Ukrainian Cyrillic");
|
||||
// browser.expect.element("#output-text .chr-enc-value").text.that.equals("UTF-16BE");
|
||||
|
||||
// browser.expect.element("#input-text .eol-value").text.that.equals("FF");
|
||||
// browser.expect.element("#output-text .eol-value").text.that.equals("PS");
|
||||
|
||||
// utils.bake(browser);
|
||||
|
||||
// browser.expect.element(`#output-text .cm-content`).to.have.property("textContent").match(/^.{44}$/);
|
||||
// browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("44");
|
||||
// browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("1");
|
||||
// },
|
||||
|
||||
"Replace input with output": browser => {
|
||||
/* Input is correctly populated */
|
||||
utils.loadRecipe(browser, "XOR", "The ships hung in the sky in much the same way that bricks don't.", [{ "option": "Hex", "string": "65" }, "Standard", false]);
|
||||
utils.setChrEnc(browser, "input", "UTF-32LE");
|
||||
utils.setChrEnc(browser, "output", "UTF-7");
|
||||
utils.setEOLSeq(browser, "input", "CRLF");
|
||||
utils.setEOLSeq(browser, "output", "LS");
|
||||
|
||||
browser
|
||||
.sendKeys("#input-text .cm-content", browser.Keys.RETURN)
|
||||
.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
|
||||
utils.bake(browser);
|
||||
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("67");
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
|
||||
browser.expect.element("#input-text .chr-enc-value").text.that.equals("UTF-32LE");
|
||||
browser.expect.element("#input-text .eol-value").text.that.equals("CRLF");
|
||||
browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("268");
|
||||
|
||||
browser
|
||||
.click("#switch")
|
||||
.waitForElementVisible("#stale-indicator");
|
||||
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("268");
|
||||
|
||||
/* Special characters, encodings and line endings all as expected */
|
||||
browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("1");
|
||||
browser.expect.element("#input-text .chr-enc-value").text.that.equals("UTF-7");
|
||||
browser.expect.element("#input-text .eol-value").text.that.equals("LS");
|
||||
browser.expect.element("#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(1)").text.to.equal("␍");
|
||||
browser.expect.element("#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(49)").text.to.equal("␑");
|
||||
browser.waitForElementNotPresent("#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(50)");
|
||||
},
|
||||
|
||||
|
||||
after: browser => {
|
||||
browser.end();
|
||||
}
|
||||
};
|
|
@ -1,11 +1,20 @@
|
|||
/**
|
||||
* Tests for operations to ensure they output something sensible where expected
|
||||
* Tests for operations.
|
||||
* The primary purpose for these test is to ensure that the operations
|
||||
* output something vaguely expected (i.e. they aren't completely broken
|
||||
* after a dependency update or changes to the UI), rather than to confirm
|
||||
* that this output is actually accurate. Accuracy of output and testing
|
||||
* of edge cases should be carried out in the operations test suite found
|
||||
* in /tests/operations as this is much faster and easier to configure
|
||||
* than the UI tests found here.
|
||||
*
|
||||
* @author n1474335 [n1474335@gmail.com]
|
||||
* @copyright Crown Copyright 2021
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
const utils = require("./browserUtils.js");
|
||||
|
||||
module.exports = {
|
||||
before: browser => {
|
||||
browser
|
||||
|
@ -28,37 +37,41 @@ module.exports = {
|
|||
testOp(browser, ["From Hex", "Add Text To Image", "To Base64"], Images.PNG_HEX, Images.PNG_CHEF_B64, [[], ["Chef", "Center", "Middle", 0, 0, 16], []]);
|
||||
testOp(browser, "Adler-32 Checksum", "test input", "16160411");
|
||||
testOp(browser, "Affine Cipher Decode", "test input", "rcqr glnsr", [1, 2]);
|
||||
testOp(browser, "Affine Cipher Encode", "test input", "njln rbfpn", [2, 1]);
|
||||
testOp(browser, "Affine Cipher Encode", "test input", "gndg zoujg", [3, 1]);
|
||||
testOp(browser, "AMF Decode", "\u000A\u0013\u0001\u0003a\u0006\u0009test", /"\$value": "test"/);
|
||||
testOp(browser, "AMF Encode", '{"a": "test"}', "\u000A\u0013\u0001\u0003a\u0006\u0009test");
|
||||
testOp(browser, "Analyse hash", "0123456789abcdef", /CRC-64/);
|
||||
testOp(browser, "Atbash Cipher", "test input", "gvhg rmkfg");
|
||||
// testOp(browser, "Avro to JSON", "test input", "test_output");
|
||||
// testOp(browser, "BLAKE2b", "test input", "test_output");
|
||||
// testOp(browser, "BLAKE2s", "test input", "test_output");
|
||||
// testOp(browser, "BSON deserialise", "test input", "test_output");
|
||||
// testOp(browser, "BSON serialise", "test input", "test_output");
|
||||
testOp(browser, "BLAKE2b", "test input", "33ebdc8f38177f3f3f334eeb117a84e11f061bbca4db6b8923e5cec85103f59f415551a5d5a933fdb6305dc7bf84671c2540b463dbfa08ee1895cfaa5bd780b5", ["512", "Hex", { "option": "UTF8", "string": "pass" }]);
|
||||
testOp(browser, "BLAKE2s", "test input", "defe73d61dfa6e5807e4f9643e159a09ccda6be3c26dcd65f8a9bb38bfc973a7", ["256", "Hex", { "option": "UTF8", "string": "pass" }]);
|
||||
testOp(browser, "BSON deserialise", "\u0011\u0000\u0000\u0000\u0002a\u0000\u0005\u0000\u0000\u0000test\u0000\u0000", '{\u000A "a": "test"\u000A}');
|
||||
testOp(browser, "BSON serialise", '{"a":"test"}', "\u0011\u0000\u0000\u0000\u0002a\u0000\u0005\u0000\u0000\u0000test\u0000\u0000");
|
||||
// testOp(browser, "Bacon Cipher Decode", "test input", "test_output");
|
||||
// testOp(browser, "Bacon Cipher Encode", "test input", "test_output");
|
||||
// testOp(browser, "Bcrypt", "test input", "test_output");
|
||||
// testOp(browser, "Bcrypt compare", "test input", "test_output");
|
||||
// testOp(browser, "Bcrypt parse", "test input", "test_output");
|
||||
// testOp(browser, "Bifid Cipher Decode", "test input", "test_output");
|
||||
// testOp(browser, "Bifid Cipher Encode", "test input", "test_output");
|
||||
// testOp(browser, "Bit shift left", "test input", "test_output");
|
||||
// testOp(browser, "Bit shift right", "test input", "test_output");
|
||||
testOp(browser, "Bcrypt", "test input", /^\$2a\$06\$.{53}$/, [6]);
|
||||
testOp(browser, "Bcrypt compare", "test input", "Match: test input", ["$2a$05$FCfBSVX7OeRkK.9kQVFCiOYu9XtwtIbePqUiroD1lkASW9q5QClzG"]);
|
||||
testOp(browser, "Bcrypt parse", "$2a$05$kXWtAIGB/R8VEzInoM5ocOTBtyc0m2YTIwFiBU/0XoW032f9QrkWW", /Rounds: 5/);
|
||||
testOp(browser, "Bifid Cipher Decode", "qblb tfovy", "test input", ["pass"]);
|
||||
testOp(browser, "Bifid Cipher Encode", "test input", "qblb tfovy", ["pass"]);
|
||||
testOp(browser, "Bit shift left", "test input", "\u00E8\u00CA\u00E6\u00E8@\u00D2\u00DC\u00E0\u00EA\u00E8");
|
||||
testOp(browser, "Bit shift right", "test input", ":29:\u0010478::");
|
||||
testOp(browser, "Blowfish Decrypt", "10884e15427dd84ec35204e9c8e921ae", "test_output", [{"option": "Hex", "string": "1234567801234567"}, {"option": "Hex", "string": "0011223344556677"}, "CBC", "Hex", "Raw"]);
|
||||
testOp(browser, "Blowfish Encrypt", "test input", "f0fadbd1d90d774f714248cf26b96410", [{"option": "Hex", "string": "1234567801234567"}, {"option": "Hex", "string": "0011223344556677"}, "CBC", "Raw", "Hex"]);
|
||||
testOp(browser, ["From Hex", "Blur Image", "To Base64"], Images.PNG_HEX, Images.PNG_BLUR_B64);
|
||||
// testOp(browser, "Bombe", "test input", "test_output");
|
||||
testOpHtml(browser, "Bombe", "XTSYN WAEUG EZALY NRQIM AMLZX MFUOD AWXLY LZCUZ QOQBQ JLCPK NDDRW F", "table tr:last-child td:first-child", "ECG", ["3-rotor", "LEYJVCNIXWPBQMDRTAKZGFUHOS", "BDFHJLCPRTXVZNYEIWGAKMUSQO<W", "AJDKSIRUXBLHWTMCQGZNPYFVOE<F", "ESOVPZJAYQUIRHXLNFTGKDCMWB<K", "AY BR CU DH EQ FS GL IP JX KN MO TZ VW", "HELLO CYBER CHEFU SER", 0, true]);
|
||||
testOp(browser, ["Bzip2 Compress", "To Hex"], "test input", "42 5a 68 39 31 41 59 26 53 59 cf 96 82 1d 00 00 03 91 80 40 00 02 21 4e 00 20 00 21 90 c2 10 c0 88 33 92 8e df 17 72 45 38 50 90 cf 96 82 1d");
|
||||
testOp(browser, ["From Hex", "Bzip2 Decompress"], "425a68393141592653597b0884b7000003038000008200ce00200021a647a4218013709517c5dc914e14241ec2212dc0", "test_output", [[], [true]]);
|
||||
// testOp(browser, "CRC-16 Checksum", "test input", "test_output");
|
||||
// testOp(browser, "CRC-32 Checksum", "test input", "test_output");
|
||||
// testOp(browser, "CRC-8 Checksum", "test input", "test_output");
|
||||
// testOp(browser, "CSS Beautify", "test input", "test_output");
|
||||
// testOp(browser, "CSS Minify", "test input", "test_output");
|
||||
// testOp(browser, "CBOR Decode", "test input", "test output");
|
||||
// testOp(browser, "CBOR Encode", "test input", "test output");
|
||||
testOp(browser, "CRC-16 Checksum", "test input", "77c7");
|
||||
testOp(browser, "CRC-32 Checksum", "test input", "29822bc8");
|
||||
testOp(browser, "CRC-8 Checksum", "test input", "9d");
|
||||
// testOp(browser, "CSS Beautify", "test input", "test_output");
|
||||
// testOp(browser, "CSS Minify", "test input", "test_output");
|
||||
// testOp(browser, "CSS selector", "test input", "test_output");
|
||||
// testOp(browser, "CSV to JSON", "test input", "test_output");
|
||||
// testOp(browser, "CTPH", "test input", "test_output");
|
||||
// testOp(browser, "CTPH", "test input", "test_output");
|
||||
// testOp(browser, "Cartesian Product", "test input", "test_output");
|
||||
// testOp(browser, "Change IP format", "test input", "test_output");
|
||||
// testOp(browser, "Chi Square", "test input", "test_output");
|
||||
|
@ -66,23 +79,24 @@ module.exports = {
|
|||
// testOp(browser, "CipherSaber2 Encrypt", "test input", "test_output");
|
||||
// testOp(browser, "Citrix CTX1 Decode", "test input", "test_output");
|
||||
// testOp(browser, "Citrix CTX1 Encode", "test input", "test_output");
|
||||
// testOp(browser, "Colossus", "test input", "test_output");
|
||||
testOpHtml(browser, "Colossus", "CTBKJUVXHZ-H3L4QV+YEZUK+SXOZ/N", "table tr:last-child td:first-child", "30", ["", "KH Pattern", "Z", "", "", "None", "Select Program", "Letter Count", "", "", "", "", "", "", false, "", "", "", "", "", "", false, "", "", "", "", "", "", false, "", false, "", false, false, false, false, false, "", false, false, "", "", 0, "", "", 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]);
|
||||
// testOp(browser, "Comment", "test input", "test_output");
|
||||
// testOp(browser, "Compare CTPH hashes", "test input", "test_output");
|
||||
// testOp(browser, "Compare SSDEEP hashes", "test input", "test_output");
|
||||
// /testOp(browser, "Conditional Jump", "test input", "test_output");
|
||||
// testOp(browser, "Contain Image", "test input", "test_output");
|
||||
// testOp(browser, "Conditional Jump", "test input", "test_output");
|
||||
testOpImage(browser, "Contain Image", "files/Hitchhikers_Guide.jpeg");
|
||||
// testOp(browser, "Convert area", "test input", "test_output");
|
||||
// /testOp(browser, "Convert co-ordinate format", "test input", "test_output");
|
||||
// testOp(browser, "Convert co-ordinate format", "test input", "test_output");
|
||||
// testOp(browser, "Convert data units", "test input", "test_output");
|
||||
// testOp(browser, "Convert distance", "test input", "test_output");
|
||||
// testOp(browser, "Convert Image Format", "test input", "test_output");
|
||||
testOpImage(browser, "Convert Image Format", "files/Hitchhikers_Guide.jpeg");
|
||||
// testOp(browser, "Convert mass", "test input", "test_output");
|
||||
// testOp(browser, "Convert speed", "test input", "test_output");
|
||||
// testOp(browser, "Convert to NATO alphabet", "test input", "test_output");
|
||||
// testOp(browser, "Count occurrences", "test input", "test_output");
|
||||
// testOp(browser, "Cover Image", "test input", "test_output");
|
||||
// testOp(browser, "Crop Image", "test input", "test_output");
|
||||
testOpImage(browser, "Cover Image", "files/Hitchhikers_Guide.jpeg");
|
||||
testOpImage(browser, "Crop Image", "files/Hitchhikers_Guide.jpeg");
|
||||
// testOp(browser, "CSS Selector", "test input", "test output");
|
||||
// testOp(browser, "DES Decrypt", "test input", "test_output");
|
||||
// testOp(browser, "DES Encrypt", "test input", "test_output");
|
||||
// testOp(browser, "DNS over HTTPS", "test input", "test_output");
|
||||
|
@ -94,25 +108,26 @@ module.exports = {
|
|||
// testOp(browser, "Derive EVP key", "test input", "test_output");
|
||||
// testOp(browser, "Derive PBKDF2 key", "test input", "test_output");
|
||||
// testOp(browser, "Detect File Type", "test input", "test_output");
|
||||
// testOp(browser, "Diff", "test input", "test_output");
|
||||
testOpHtml(browser, "Diff", "The cat sat on the mat\n\nThe mat cat on the sat", "ins:first-child", "mat", ["\\n\\n", "Word", true, true, false, false]);
|
||||
// testOp(browser, "Disassemble x86", "test input", "test_output");
|
||||
// testOp(browser, "Dither Image", "test input", "test_output");
|
||||
// testOp(browser, "Divide", "test input", "test_output");
|
||||
testOpImage(browser, "Dither Image", "files/Hitchhikers_Guide.jpeg");
|
||||
// testOp(browser, "Divide", "test input", "test_output");
|
||||
// testOp(browser, "Drop bytes", "test input", "test_output");
|
||||
// testOp(browser, "Encode NetBIOS Name", "test input", "test_output");
|
||||
// testOp(browser, "Encode text", "test input", "test_output");
|
||||
// testOp(browser, "Enigma", "test input", "test_output");
|
||||
// testOp(browser, "Entropy", "test input", "test_output");
|
||||
// testOp(browser, "Escape string", "test input", "test_output");
|
||||
testOpHtml(browser, "Entropy", "test input", "", /Shannon entropy: 2.8464393446710154/);
|
||||
// testOp(browser, "Escape string", "test input", "test_output");
|
||||
// testOp(browser, "Escape Unicode Characters", "test input", "test_output");
|
||||
// testOp(browser, "Expand alphabet range", "test input", "test_output");
|
||||
// testOp(browser, "Extract dates", "test input", "test_output");
|
||||
// testOp(browser, "Extract domains", "test input", "test_output");
|
||||
// testOp(browser, "Extract EXIF", "test input", "test_output");
|
||||
// testOp(browser, "Extract EXIF", "test input", "test_output");
|
||||
// testOp(browser, "Extract email addresses", "test input", "test_output");
|
||||
// testOp(browser, "Extract file paths", "test input", "test_output");
|
||||
// testOp(browser, "Extract Files", "test input", "test_output");
|
||||
// testOp(browser, "Extract IP addresses", "test input", "test_output");
|
||||
testOpFile(browser, "Extract Files", "files/Hitchhikers_Guide.jpeg", ".card:last-child .collapsed", "extracted_at_0x3d38.zlib");
|
||||
// This test seems unreliable on GitHub Actions, not reproducible locally.
|
||||
// testOpFile(browser, "Extract ID3", "files/mp3example.mp3", "tr:last-child td:last-child", "Kevin MacLeod"); // testOp(browser, "Extract IP addresses", "test input", "test_output");
|
||||
// testOp(browser, "Extract LSB", "test input", "test_output");
|
||||
// testOp(browser, "Extract MAC addresses", "test input", "test_output");
|
||||
// testOp(browser, "Extract RGBA", "test input", "test_output");
|
||||
|
@ -123,12 +138,12 @@ module.exports = {
|
|||
// testOp(browser, "Fletcher-32 Checksum", "test input", "test_output");
|
||||
// testOp(browser, "Fletcher-64 Checksum", "test input", "test_output");
|
||||
// testOp(browser, "Fletcher-8 Checksum", "test input", "test_output");
|
||||
// testOp(browser, "Flip Image", "test input", "test_output");
|
||||
testOpImage(browser, "Flip Image", "files/Hitchhikers_Guide.jpeg");
|
||||
// testOp(browser, "Fork", "test input", "test_output");
|
||||
// testOp(browser, "Format MAC addresses", "test input", "test_output");
|
||||
// testOp(browser, "Frequency distribution", "test input", "test_output");
|
||||
testOpHtml(browser, "Frequency distribution", "test input", "", /Number of bytes not represented: 248/);
|
||||
// testOp(browser, "From BCD", "test input", "test_output");
|
||||
// testOp(browser, "From Base", "test input", "test_output");
|
||||
// testOp(browser, "From Base", "test input", "test_output");
|
||||
// testOp(browser, "From Base32", "test input", "test_output");
|
||||
// testOp(browser, "From Base58", "test input", "test_output");
|
||||
// testOp(browser, "From Base62", "test input", "test_output");
|
||||
|
@ -143,25 +158,26 @@ module.exports = {
|
|||
// testOp(browser, "From Hex", "test input", "test_output");
|
||||
// testOp(browser, "From Hex Content", "test input", "test_output");
|
||||
// testOp(browser, "From Hexdump", "test input", "test_output");
|
||||
// testOp(browser, "From MessagePack", "test input", "test_output");
|
||||
// testOp(browser, "From MessagePack", "test input", "test_output");
|
||||
// testOp(browser, "From Morse Code", "test input", "test_output");
|
||||
// testOp(browser, "From Octal", "test input", "test_output");
|
||||
// testOp(browser, "From Punycode", "test input", "test_output");
|
||||
// testOp(browser, "From Quoted Printable", "test input", "test_output");
|
||||
// testOp(browser, "From UNIX Timestamp", "test input", "test_output");
|
||||
// testOp(browser, "From UNIX Timestamp", "test input", "test_output");
|
||||
testOpHtml(browser, "Fuzzy Match", "test input", "b:last-child", "in", ["tein", 15, 30, 30, 15, -5, -15, -1]);
|
||||
// testOp(browser, "GOST hash", "test input", "test_output");
|
||||
// testOp(browser, "Generate all hashes", "test input", "test_output");
|
||||
// testOp(browser, "Generate HOTP", "test input", "test_output");
|
||||
// testOp(browser, "Generate Image", "test input", "test_output");
|
||||
// testOp(browser, "Generate HOTP", "test input", "test_output");
|
||||
testOpHtml(browser, "Generate Image", "test input", "img", "");
|
||||
// testOp(browser, "Generate Lorem Ipsum", "test input", "test_output");
|
||||
// testOp(browser, "Generate PGP Key Pair", "test input", "test_output");
|
||||
// testOp(browser, "Generate QR Code", "test input", "test_output");
|
||||
// testOp(browser, "Generate TOTP", "test input", "test_output");
|
||||
testOpHtml(browser, "Generate QR Code", "test input", "img", "");
|
||||
// testOp(browser, "Generate TOTP", "test input", "test_output");
|
||||
// testOp(browser, "Generate UUID", "test input", "test_output");
|
||||
// testOp(browser, "Generic Code Beautify", "test input", "test_output");
|
||||
// testOp(browser, "Group IP addresses", "test input", "test_output");
|
||||
// testOp(browser, "Gunzip", "test input", "test_output");
|
||||
// testOp(browser, "Gzip", "test input", "test_output");
|
||||
// testOp(browser, "Gunzip", "test input", "test_output");
|
||||
// testOp(browser, "Gzip", "test input", "test_output");
|
||||
// testOp(browser, "HAS-160", "test input", "test_output");
|
||||
// testOp(browser, "HMAC", "test input", "test_output");
|
||||
// testOp(browser, "HTML To Text", "test input", "test_output");
|
||||
|
@ -169,35 +185,41 @@ module.exports = {
|
|||
// testOp(browser, "Hamming Distance", "test input", "test_output");
|
||||
// testOp(browser, "Haversine distance", "test input", "test_output");
|
||||
// testOp(browser, "Head", "test input", "test_output");
|
||||
// testOp(browser, "Heatmap chart", "test input", "test_output");
|
||||
// testOp(browser, "Hex Density chart", "test input", "test_output");
|
||||
testOpHtml(browser, "Heatmap chart", "X Y\n0 1\n1 2", "svg", /X/);
|
||||
testOpHtml(browser, "Hex Density chart", "X Y\n0 1\n1 2", "svg", /X/);
|
||||
// testOp(browser, "Hex to Object Identifier", "test input", "test_output");
|
||||
// testOp(browser, "Hex to PEM", "test input", "test_output");
|
||||
// testOp(browser, "Image Brightness / Contrast", "test input", "test_output");
|
||||
// testOp(browser, "Image Filter", "test input", "test_output");
|
||||
// testOp(browser, "Image Hue/Saturation/Lightness", "test input", "test_output");
|
||||
// testOp(browser, "Image Opacity", "test input", "test_output");
|
||||
// testOp(browser, "Index of Coincidence", "test input", "test_output");
|
||||
// testOp(browser, "Invert Image", "test input", "test_output");
|
||||
// testOp(browser, "JPath expression", "test input", "test_output");
|
||||
// testOp(browser, "JSON Beautify", "test input", "test_output");
|
||||
testOpImage(browser, "Image Brightness / Contrast", "files/Hitchhikers_Guide.jpeg");
|
||||
testOpImage(browser, "Image Filter", "files/Hitchhikers_Guide.jpeg");
|
||||
testOpImage(browser, "Image Hue/Saturation/Lightness", "files/Hitchhikers_Guide.jpeg");
|
||||
testOpImage(browser, "Image Opacity", "files/Hitchhikers_Guide.jpeg");
|
||||
testOpHtml(browser, "Index of Coincidence", "test input", "", /Index of Coincidence: 0.08333333333333333/);
|
||||
testOpImage(browser, "Invert Image", "files/Hitchhikers_Guide.jpeg");
|
||||
// testOp(browser, "JPath expression", "test input", "test_output");
|
||||
testOpHtml(browser, "JSON Beautify", "{a:1}", ".json-dict .json-literal", "1");
|
||||
// testOp(browser, "JSON Minify", "test input", "test_output");
|
||||
// testOp(browser, "JSON to CSV", "test input", "test_output");
|
||||
// testOp(browser, "JWT Decode", "test input", "test_output");
|
||||
// testOp(browser, "JWT Sign", "test input", "test_output");
|
||||
// testOp(browser, "JWT Verify", "test input", "test_output");
|
||||
// testOp(browser, "JavaScript Beautify", "test input", "test_output");
|
||||
// testOp(browser, "JavaScript Minify", "test input", "test_output");
|
||||
// testOp(browser, "JavaScript Parser", "test input", "test_output");
|
||||
// testOp(browser, "JSON to CSV", "test input", "test_output");
|
||||
// testOp(browser, "JWT Decode", "test input", "test_output");
|
||||
// testOp(browser, "JWT Sign", "test input", "test_output");
|
||||
// testOp(browser, "JWT Verify", "test input", "test_output");
|
||||
// testOp(browser, "JavaScript Beautify", "test input", "test_output");
|
||||
// testOp(browser, "JavaScript Minify", "test input", "test_output");
|
||||
// testOp(browser, "JavaScript Parser", "test input", "test_output");
|
||||
// testOp(browser, "Jump", "test input", "test_output");
|
||||
// testOp(browser, "Keccak", "test input", "test_output");
|
||||
// testOp(browser, "Keccak", "test input", "test_output");
|
||||
// testOp(browser, "Label", "test input", "test_output");
|
||||
// testOp(browser, "LM Hash", "test input", "test output");
|
||||
// testOp(browser, "Lorenz", "test input", "test_output");
|
||||
// testOp(browser, "Luhn Checksum", "test input", "test_output");
|
||||
// testOp(browser, "MD2", "test input", "test_output");
|
||||
// testOp(browser, "MD4", "test input", "test_output");
|
||||
// testOp(browser, "MD5", "test input", "test_output");
|
||||
// testOp(browser, "MD6", "test input", "test_output");
|
||||
// testOp(browser, "LZ String", "test input", "test output");
|
||||
// testOp(browser, "LZ4 Compress", "test input", "test output");
|
||||
// testOp(browser, "LZ4 Decompress", "test input", "test output");
|
||||
// testOp(browser, "LZMA Compress", "test input", "test output");
|
||||
// testOp(browser, "LZMA Decompress", "test input", "test output");
|
||||
// testOp(browser, "MD2", "test input", "test_output");
|
||||
// testOp(browser, "MD4", "test input", "test_output");
|
||||
// testOp(browser, "MD5", "test input", "test_output");
|
||||
// testOp(browser, "MD6", "test input", "test_output");
|
||||
testOpHtml(browser, "Magic", "dGVzdF9vdXRwdXQ=", "tr:nth-of-type(1) th:nth-of-type(2)", "Result snippet");
|
||||
testOpHtml(browser, "Magic", "dGVzdF9vdXRwdXQ=", "tr:nth-of-type(2) td:nth-of-type(2)", "test_output");
|
||||
testOpHtml(browser, "Magic", "dGVzdF9vdXRwdXQ=", "tr:nth-of-type(2) td:nth-of-type(1)", /Base64/);
|
||||
|
@ -209,91 +231,94 @@ module.exports = {
|
|||
// testOp(browser, "Multiply", "test input", "test_output");
|
||||
// testOp(browser, "NOT", "test input", "test_output");
|
||||
// testOp(browser, "Normalise Image", "test input", "test_output");
|
||||
// testOp(browser, "Normalise Unicode", "test input", "test_output");
|
||||
// testOp(browser, "Normalise Unicode", "test input", "test_output");
|
||||
// testOp(browser, "Numberwang", "test input", "test_output");
|
||||
// testOp(browser, "OR", "test input", "test_output");
|
||||
// testOp(browser, "Object Identifier to Hex", "test input", "test_output");
|
||||
// testOp(browser, "Offset checker", "test input", "test_output");
|
||||
// testOp(browser, "Optical Character Recognition", "test input", "test_output");
|
||||
testOpHtml(browser, "Offset checker", "test input\n\nbest input", ".hl5", "est input");
|
||||
testOpFile(browser, "Optical Character Recognition", "files/testocr.png", false, /This is a lot of 12 point text to test the/, [], 10000);
|
||||
// testOp(browser, "PEM to Hex", "test input", "test_output");
|
||||
// testOp(browser, "PGP Decrypt", "test input", "test_output");
|
||||
// testOp(browser, "PGP Decrypt and Verify", "test input", "test_output");
|
||||
// testOp(browser, "PGP Encrypt", "test input", "test_output");
|
||||
// testOp(browser, "PGP Encrypt and Sign", "test input", "test_output");
|
||||
// testOp(browser, "PGP Verify", "test input", "test_output");
|
||||
// testOp(browser, "PGP Decrypt", "test input", "test_output");
|
||||
// testOp(browser, "PGP Decrypt and Verify", "test input", "test_output");
|
||||
// testOp(browser, "PGP Encrypt", "test input", "test_output");
|
||||
// testOp(browser, "PGP Encrypt and Sign", "test input", "test_output");
|
||||
// testOp(browser, "PGP Verify", "test input", "test_output");
|
||||
// testOp(browser, "PHP Deserialize", "test input", "test_output");
|
||||
// testOp(browser, "Pad lines", "test input", "test_output");
|
||||
// testOp(browser, "Parse ASN.1 hex string", "test input", "test_output");
|
||||
// testOp(browser, "Parse colour code", "test input", "test_output");
|
||||
// testOp(browser, "Parse DateTime", "test input", "test_output");
|
||||
// testOp(browser, "Parse ASN.1 hex string", "test input", "test_output");
|
||||
testOpHtml(browser, "Parse colour code", "#000", ".colorpicker-preview", "rgb(0, 0, 0)");
|
||||
testOpHtml(browser, "Parse DateTime", "01/12/2000 13:00:00", "", /Date: Friday 1st December 2000/);
|
||||
// testOp(browser, "Parse IP range", "test input", "test_output");
|
||||
// testOp(browser, "Parse IPv4 header", "test input", "test_output");
|
||||
testOpHtml(browser, "Parse IPv4 header", "45 c0 00 c4 02 89 00 00 ff 11 1e 8c c0 a8 0c 01 c0 a8 0c 02", "tr:last-child td:last-child", "192.168.12.2");
|
||||
// testOp(browser, "Parse IPv6 address", "test input", "test_output");
|
||||
// testOp(browser, "Parse ObjectID timestamp", "test input", "test_output");
|
||||
// testOp(browser, "Parse QR Code", "test input", "test_output");
|
||||
// testOp(browser, "Parse ObjectID timestamp", "test input", "test_output");
|
||||
// testOp(browser, "Parse QR Code", "test input", "test_output");
|
||||
// testOp(browser, "Parse SSH Host Key", "test input", "test_output");
|
||||
testOpHtml(browser, "Parse TCP", "c2eb0050a138132e70dc9fb9501804025ea70000", "tr:nth-of-type(2) td:last-child", "49899");
|
||||
// testOp(browser, "Parse TLV", "test input", "test_output");
|
||||
// testOp(browser, "Parse UDP", "test input", "test_output");
|
||||
testOpHtml(browser, "Parse UDP", "04 89 00 35 00 2c 01 01", "tr:last-child td:last-child", "0x0101");
|
||||
// testOp(browser, "Parse UNIX file permissions", "test input", "test_output");
|
||||
// testOp(browser, "Parse URI", "test input", "test_output");
|
||||
// testOp(browser, "Parse User Agent", "test input", "test_output");
|
||||
// testOp(browser, "Parse User Agent", "test input", "test_output");
|
||||
// testOp(browser, "Parse X.509 certificate", "test input", "test_output");
|
||||
// testOp(browser, "Play Media", "test input", "test_output");
|
||||
testOpFile(browser, "Play Media", "files/mp3example.mp3", "audio", "");
|
||||
// testOp(browser, "Power Set", "test input", "test_output");
|
||||
// testOp(browser, "Protobuf Decode", "test input", "test_output");
|
||||
// testOp(browser, "Protobuf Decode", "test input", "test_output");
|
||||
// testOp(browser, "Pseudo-Random Number Generator", "test input", "test_output");
|
||||
// testOp(browser, "RC2 Decrypt", "test input", "test_output");
|
||||
// testOp(browser, "RC2 Encrypt", "test input", "test_output");
|
||||
// testOp(browser, "RC4", "test input", "test_output");
|
||||
// testOp(browser, "RC4 Drop", "test input", "test_output");
|
||||
// testOp(browser, "RC2 Decrypt", "test input", "test_output");
|
||||
// testOp(browser, "RC2 Encrypt", "test input", "test_output");
|
||||
// testOp(browser, "RC4", "test input", "test_output");
|
||||
// testOp(browser, "RC4 Drop", "test input", "test_output");
|
||||
// testOp(browser, "RIPEMD", "test input", "test_output");
|
||||
// testOp(browser, "ROT13", "test input", "test_output");
|
||||
// testOp(browser, "ROT47", "test input", "test_output");
|
||||
// testOp(browser, "ROT8000", "test input", "test_output");
|
||||
// testOp(browser, "Rail Fence Cipher Decode", "test input", "test_output");
|
||||
// testOp(browser, "Rail Fence Cipher Encode", "test input", "test_output");
|
||||
// testOp(browser, "Randomize Colour Palette", "test input", "test_output");
|
||||
// testOp(browser, "Raw Deflate", "test input", "test_output");
|
||||
// testOp(browser, "Raw Inflate", "test input", "test_output");
|
||||
testOpImage(browser, "Randomize Colour Palette", "files/Hitchhikers_Guide.jpeg");
|
||||
// testOp(browser, "Raw Deflate", "test input", "test_output");
|
||||
// testOp(browser, "Raw Inflate", "test input", "test_output");
|
||||
// testOp(browser, "Register", "test input", "test_output");
|
||||
// testOp(browser, "Regular expression", "test input", "test_output");
|
||||
testOpHtml(browser, "Regular expression", "The cat sat on the mat", ".hl2:last-child", "mat", ["User defined", ".at", true, true, false, false, false, false, "Highlight matches"]);
|
||||
// testOp(browser, "Remove Diacritics", "test input", "test_output");
|
||||
// testOp(browser, "Remove EXIF", "test input", "test_output");
|
||||
// testOp(browser, "Remove line numbers", "test input", "test_output");
|
||||
// testOp(browser, "Remove null bytes", "test input", "test_output");
|
||||
// testOp(browser, "Remove whitespace", "test input", "test_output");
|
||||
// testOp(browser, "Render Image", "test input", "test_output");
|
||||
// testOp(browser, "Render Markdown", "test input", "test_output");
|
||||
// testOp(browser, "Resize Image", "test input", "test_output");
|
||||
testOpImage(browser, "Render Image", "files/Hitchhikers_Guide.jpeg");
|
||||
testOpHtml(browser, "Render Markdown", "# test input", "h1", "test input");
|
||||
testOpImage(browser, "Resize Image", "files/Hitchhikers_Guide.jpeg");
|
||||
// testOp(browser, "Return", "test input", "test_output");
|
||||
// testOp(browser, "Reverse", "test input", "test_output");
|
||||
// testOp(browser, "Rotate Image", "test input", "test_output");
|
||||
testOpImage(browser, "Rotate Image", "files/Hitchhikers_Guide.jpeg");
|
||||
// testOp(browser, "Rotate left", "test input", "test_output");
|
||||
// testOp(browser, "Rotate right", "test input", "test_output");
|
||||
// testOp(browser, "SHA0", "test input", "test_output");
|
||||
// testOp(browser, "SHA1", "test input", "test_output");
|
||||
// testOp(browser, "SHA2", "test input", "test_output");
|
||||
// testOp(browser, "SHA3", "test input", "test_output");
|
||||
// testOp(browser, "Scrypt", "test input", "test output");
|
||||
// testOp(browser, "SHA0", "test input", "test_output");
|
||||
// testOp(browser, "SHA1", "test input", "test_output");
|
||||
// testOp(browser, "SHA2", "test input", "test_output");
|
||||
// testOp(browser, "SHA3", "test input", "test_output");
|
||||
// testOp(browser, "SQL Beautify", "test input", "test_output");
|
||||
// testOp(browser, "SQL Minify", "test input", "test_output");
|
||||
// testOp(browser, "SSDEEP", "test input", "test_output");
|
||||
// testOp(browser, "SSDEEP", "test input", "test_output");
|
||||
// testOp(browser, "SUB", "test input", "test_output");
|
||||
// testOp(browser, "Scan for Embedded Files", "test input", "test_output");
|
||||
// testOp(browser, "Scatter chart", "test input", "test_output");
|
||||
testOpHtml(browser, "Scatter chart", "a b\n1 2", "svg", /a/);
|
||||
// testOp(browser, "Scrypt", "test input", "test_output");
|
||||
// testOp(browser, "Series chart", "test input", "test_output");
|
||||
testOpHtml(browser, "Series chart", "1 2 3\n4 5 6", "svg", /3/);
|
||||
// testOp(browser, "Set Difference", "test input", "test_output");
|
||||
// testOp(browser, "Set Intersection", "test input", "test_output");
|
||||
// testOp(browser, "Set Union", "test input", "test_output");
|
||||
// testOp(browser, "Shake", "test input", "test_output");
|
||||
// testOp(browser, "Sharpen Image", "test input", "test_output");
|
||||
// testOp(browser, "Show Base64 offsets", "test input", "test_output");
|
||||
// testOp(browser, "Show on map", "test input", "test_output");
|
||||
// testOp(browser, "Shake", "test input", "test_output");
|
||||
testOpImage(browser, "Sharpen Image", "files/Hitchhikers_Guide.jpeg");
|
||||
testOpHtml(browser, "Show Base64 offsets", "test input", "span:nth-last-of-type(2)", "B");
|
||||
testOpHtml(browser, "Show on map", "51.5007° N, 0.1246° W", "#presentedMap .leaflet-popup-content", "51.5007,-0.1246");
|
||||
// testOp(browser, "Sleep", "test input", "test_output");
|
||||
// testOp(browser, "SM3", "test input", "test output");
|
||||
// testOp(browser, "Snefru", "test input", "test_output");
|
||||
// testOp(browser, "Sort", "test input", "test_output");
|
||||
// testOp(browser, "Split", "test input", "test_output");
|
||||
// testOp(browser, "Split Colour Channels", "test input", "test_output");
|
||||
// testOpImage(browser, "Split Colour Channels", "files/Hitchhikers_Guide.jpeg");
|
||||
// testOp(browser, "Standard Deviation", "test input", "test_output");
|
||||
// testOp(browser, "Streebog", "test input", "test_output");
|
||||
// testOp(browser, "Strings", "test input", "test_output");
|
||||
|
@ -302,15 +327,15 @@ module.exports = {
|
|||
// testOp(browser, "Subsection", "test input", "test_output");
|
||||
// testOp(browser, "Substitute", "test input", "test_output");
|
||||
// testOp(browser, "Subtract", "test input", "test_output");
|
||||
// testOp(browser, "Sum", "test input", "test_output");
|
||||
// testOp(browser, "Sum", "test input", "test_output");
|
||||
// testOp(browser, "Swap endianness", "test input", "test_output");
|
||||
// testOp(browser, "Symmetric Difference", "test input", "test_output");
|
||||
// testOp(browser, "Syntax highlighter", "test input", "test_output");
|
||||
testOpHtml(browser, "Syntax highlighter", "var a = [4,5,6]", ".hljs-selector-attr", "[4,5,6]");
|
||||
// testOp(browser, "TCP/IP Checksum", "test input", "test_output");
|
||||
// testOp(browser, "Tail", "test input", "test_output");
|
||||
// testOp(browser, "Take bytes", "test input", "test_output");
|
||||
// testOp(browser, "Tar", "test input", "test_output");
|
||||
// testOp(browser, "Text Encoding Brute Force", "test input", "test_output");
|
||||
testOp(browser, "Tar", "test input", /^file\.txt\x00{92}/);
|
||||
testOpHtml(browser, "Text Encoding Brute Force", "test input", "tr:nth-of-type(4) td:last-child", /t\u2400e\u2400s\u2400t\u2400/);
|
||||
// testOp(browser, "To BCD", "test input", "test_output");
|
||||
// testOp(browser, "To Base", "test input", "test_output");
|
||||
// testOp(browser, "To Base32", "test input", "test_output");
|
||||
|
@ -320,7 +345,7 @@ module.exports = {
|
|||
// testOp(browser, "To Base85", "test input", "test_output");
|
||||
// testOp(browser, "To Binary", "test input", "test_output");
|
||||
// testOp(browser, "To Braille", "test input", "test_output");
|
||||
// testOp(browser, "To Camel case", "test input", "test_output");
|
||||
// testOp(browser, "To Camel case", "test input", "test_output");
|
||||
// testOp(browser, "To Case Insensitive Regex", "test input", "test_output");
|
||||
// testOp(browser, "To Charcode", "test input", "test_output");
|
||||
// testOp(browser, "To Decimal", "test input", "test_output");
|
||||
|
@ -328,15 +353,15 @@ module.exports = {
|
|||
// testOp(browser, "To Hex", "test input", "test_output");
|
||||
// testOp(browser, "To Hex Content", "test input", "test_output");
|
||||
// testOp(browser, "To Hexdump", "test input", "test_output");
|
||||
// testOp(browser, "To Kebab case", "test input", "test_output");
|
||||
// testOp(browser, "To Kebab case", "test input", "test_output");
|
||||
// testOp(browser, "To Lower case", "test input", "test_output");
|
||||
// testOp(browser, "To MessagePack", "test input", "test_output");
|
||||
// testOp(browser, "To MessagePack", "test input", "test_output");
|
||||
// testOp(browser, "To Morse Code", "test input", "test_output");
|
||||
// testOp(browser, "To Octal", "test input", "test_output");
|
||||
// testOp(browser, "To Punycode", "test input", "test_output");
|
||||
// testOp(browser, "To Quoted Printable", "test input", "test_output");
|
||||
// testOp(browser, "To Snake case", "test input", "test_output");
|
||||
// testOp(browser, "To Table", "test input", "test_output");
|
||||
// testOp(browser, "To Snake case", "test input", "test_output");
|
||||
testOpHtml(browser, "To Table", "a,b,c\n1,2,3", "", /| a | b | c |/);
|
||||
// testOp(browser, "To UNIX Timestamp", "test input", "test_output");
|
||||
// testOp(browser, "To Upper case", "test input", "test_output");
|
||||
// testOp(browser, "Translate DateTime Format", "test input", "test_output");
|
||||
|
@ -349,23 +374,23 @@ module.exports = {
|
|||
// testOp(browser, "Unescape string", "test input", "test_output");
|
||||
// testOp(browser, "Unescape Unicode Characters", "test input", "test_output");
|
||||
// testOp(browser, "Unique", "test input", "test_output");
|
||||
// testOp(browser, "Untar", "test input", "test_output");
|
||||
// testOp(browser, "Unzip", "test input", "test_output");
|
||||
testOpHtml(browser, ["Tar", "Untar"], "test input", ".float-right", /10 bytes/);
|
||||
testOpHtml(browser, ["Zip", "Unzip"], "test input", "#files span.float-right", /10 bytes/);
|
||||
// testOp(browser, "VarInt Decode", "test input", "test_output");
|
||||
// testOp(browser, "VarInt Encode", "test input", "test_output");
|
||||
// testOp(browser, "View Bit Plane", "test input", "test_output");
|
||||
testOpImage(browser, "View Bit Plane", "files/Hitchhikers_Guide.jpeg");
|
||||
// testOp(browser, "Vigenère Decode", "test input", "test_output");
|
||||
// testOp(browser, "Vigenère Encode", "test input", "test_output");
|
||||
// testOp(browser, "Whirlpool", "test input", "test_output");
|
||||
testOp(browser, "Whirlpool", "test input", "8a0ee6885ba241353d17cbbe5f06538a7f04c8c955d376c20d6233fd4dd41aaffd13291447090ce781b5f940da266ed6d02cf8b79d4867065d10bdfc04166f38");
|
||||
// testOp(browser, "Windows Filetime to UNIX Timestamp", "test input", "test_output");
|
||||
// testOp(browser, "XKCD Random Number", "test input", "test_output");
|
||||
// testOp(browser, "XML Beautify", "test input", "test_output");
|
||||
// testOp(browser, "XML Minify", "test input", "test_output");
|
||||
testOp(browser, "XKCD Random Number", "test input", "4");
|
||||
// testOp(browser, "XML Beautify", "test input", "test_output");
|
||||
// testOp(browser, "XML Minify", "test input", "test_output");
|
||||
// testOp(browser, "XOR", "test input", "test_output");
|
||||
// testOp(browser, "XOR Brute Force", "test input", "test_output");
|
||||
// testOp(browser, "XPath expression", "test input", "test_output");
|
||||
// testOp(browser, "YARA Rules", "test input", "test_output");
|
||||
// testOp(browser, "Zip", "test input", "test_output");
|
||||
// testOp(browser, "XPath expression", "test input", "test_output");
|
||||
// testOp(browser, "YARA Rules", "test input", "test_output");
|
||||
testOp(browser, "Zip", "test input", /^PK\u0003\u0004\u0014\u0000{3}/);
|
||||
// testOp(browser, "Zlib Deflate", "test input", "test_output");
|
||||
// testOp(browser, "Zlib Inflate", "test input", "test_output");
|
||||
},
|
||||
|
@ -376,58 +401,22 @@ module.exports = {
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
/** @function
|
||||
* Clears the current recipe and bakes a new operation.
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
* @param {string|Array<string>} opName - name of operation to be tested, array for multiple ops
|
||||
* @param {string} input - input text for test
|
||||
* @param {Array<string>|Array<Array<string>>} args - aarguments, nested if multiple ops
|
||||
* @param {Array<string>|Array<Array<string>>} [args=[]] - arguments, nested if multiple ops
|
||||
*/
|
||||
function bakeOp(browser, opName, input, args=[]) {
|
||||
let recipeConfig;
|
||||
|
||||
if (typeof(opName) === "string") {
|
||||
recipeConfig = JSON.stringify([{
|
||||
"op": opName,
|
||||
"args": args
|
||||
}]);
|
||||
} else if (opName instanceof Array) {
|
||||
recipeConfig = JSON.stringify(
|
||||
opName.map((op, i) => {
|
||||
return {
|
||||
op: op,
|
||||
args: args.length ? args[i] : []
|
||||
};
|
||||
})
|
||||
);
|
||||
} else {
|
||||
throw new Error("Invalid operation type. Must be string or array of strings. Received: " + typeof(opName));
|
||||
}
|
||||
|
||||
browser
|
||||
.useCss()
|
||||
.click("#clr-recipe")
|
||||
.click("#clr-io")
|
||||
.waitForElementNotPresent("#rec-list li.operation")
|
||||
.expect.element("#input-text").to.have.property("value").that.equals("");
|
||||
|
||||
browser
|
||||
.perform(function() {
|
||||
console.log(`Current test: ${opName}`);
|
||||
})
|
||||
.urlHash("recipe=" + recipeConfig)
|
||||
.setValue("#input-text", input)
|
||||
.waitForElementPresent("#rec-list li.operation")
|
||||
.expect.element("#input-text").to.have.property("value").that.equals(input);
|
||||
|
||||
browser
|
||||
.waitForElementVisible("#stale-indicator", 5000)
|
||||
.pause(100)
|
||||
.click("#bake")
|
||||
.pause(100)
|
||||
.waitForElementPresent("#stale-indicator.hidden", 5000)
|
||||
.waitForElementNotVisible("#output-loader", 5000);
|
||||
browser.perform(function() {
|
||||
console.log(`Current test: ${opName}`);
|
||||
});
|
||||
utils.loadRecipe(browser, opName, input, args);
|
||||
browser.waitForElementVisible("#stale-indicator", 5000);
|
||||
utils.bake(browser);
|
||||
}
|
||||
|
||||
/** @function
|
||||
|
@ -436,29 +425,23 @@ function bakeOp(browser, opName, input, args=[]) {
|
|||
* @param {Browser} browser - Nightwatch client
|
||||
* @param {string|Array<string>} opName - name of operation to be tested, array for multiple ops
|
||||
* @param {string} input - input text
|
||||
* @param {string} output - expected output
|
||||
* @param {Array<string>|Array<Array<string>>} args - arguments, nested if multiple ops
|
||||
* @param {string|RegExp} output - expected output
|
||||
* @param {Array<string>|Array<Array<string>>} [args=[]] - arguments, nested if multiple ops
|
||||
*/
|
||||
function testOp(browser, opName, input, output, args=[]) {
|
||||
|
||||
bakeOp(browser, opName, input, args);
|
||||
|
||||
if (typeof output === "string") {
|
||||
browser.expect.element("#output-text").to.have.property("value").that.equals(output);
|
||||
} else if (output instanceof RegExp) {
|
||||
browser.expect.element("#output-text").to.have.property("value").that.matches(output);
|
||||
}
|
||||
utils.expectOutput(browser, output, true);
|
||||
}
|
||||
|
||||
/** @function
|
||||
* Clears the current recipe and tests a new operation.
|
||||
* Clears the current recipe and tests a new operation with HTML output.
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
* @param {string|Array<string>} opName - name of operation to be tested array for multiple ops
|
||||
* @param {string} input - input text
|
||||
* @param {string} cssSelector - CSS selector for HTML output
|
||||
* @param {string} output - expected output
|
||||
* @param {Array<string>|Array<Array<string>>} args - arguments, nested if multiple ops
|
||||
* @param {string|RegExp} output - expected output
|
||||
* @param {Array<string>|Array<Array<string>>} [args=[]] - arguments, nested if multiple ops
|
||||
*/
|
||||
function testOpHtml(browser, opName, input, cssSelector, output, args=[]) {
|
||||
bakeOp(browser, opName, input, args);
|
||||
|
@ -469,3 +452,57 @@ function testOpHtml(browser, opName, input, cssSelector, output, args=[]) {
|
|||
browser.expect.element("#output-html " + cssSelector).text.that.matches(output);
|
||||
}
|
||||
}
|
||||
|
||||
/** @function
|
||||
* Clears the current recipe and tests a new Image-based operation.
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
* @param {string|Array<string>} opName - name of operation to be tested array for multiple ops
|
||||
* @param {string} filename - filename of image file from samples directory
|
||||
* @param {Array<string>|Array<Array<string>>} [args=[]] - arguments, nested if multiple ops
|
||||
*/
|
||||
function testOpImage(browser, opName, filename, args=[]) {
|
||||
browser.perform(function() {
|
||||
console.log(`Current test: ${opName}`);
|
||||
});
|
||||
utils.loadRecipe(browser, opName, "", args);
|
||||
utils.uploadFile(browser, filename);
|
||||
browser.waitForElementVisible("#stale-indicator", 5000);
|
||||
utils.bake(browser);
|
||||
|
||||
browser
|
||||
.waitForElementVisible("#output-html img")
|
||||
.expect.element("#output-html img").to.have.css("width").which.matches(/^[^0]\d*px/);
|
||||
}
|
||||
|
||||
/** @function
|
||||
* Clears the current recipe and tests a new File-based operation.
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
* @param {string|Array<string>} opName - name of operation to be tested array for multiple ops
|
||||
* @param {string} filename - filename of file from samples directory
|
||||
* @param {string|boolean} cssSelector - CSS selector for HTML output or false for normal text output
|
||||
* @param {string|RegExp} output - expected output
|
||||
* @param {Array<string>|Array<Array<string>>} [args=[]] - arguments, nested if multiple ops
|
||||
* @param {number} [waitWindow=1000] - The number of milliseconds to wait for the output to be correct
|
||||
*/
|
||||
function testOpFile(browser, opName, filename, cssSelector, output, args=[], waitWindow=1000) {
|
||||
browser.perform(function() {
|
||||
console.log(`Current test: ${opName}`);
|
||||
});
|
||||
utils.loadRecipe(browser, opName, "", args);
|
||||
utils.uploadFile(browser, filename);
|
||||
browser.pause(100).waitForElementVisible("#stale-indicator", 5000);
|
||||
utils.bake(browser);
|
||||
|
||||
if (!cssSelector) {
|
||||
// Text output
|
||||
utils.expectOutput(browser, output, true, waitWindow);
|
||||
} else if (typeof output === "string") {
|
||||
// HTML output - string match
|
||||
browser.expect.element("#output-html " + cssSelector).text.that.equals(output);
|
||||
} else if (output instanceof RegExp) {
|
||||
// HTML output - RegEx match
|
||||
browser.expect.element("#output-html " + cssSelector).text.that.matches(output);
|
||||
}
|
||||
}
|
286
tests/browser/browserUtils.js
Normal file
286
tests/browser/browserUtils.js
Normal file
|
@ -0,0 +1,286 @@
|
|||
/**
|
||||
* Utility functions for browser tests.
|
||||
*
|
||||
* @author n1474335 [n1474335@gmail.com]
|
||||
* @copyright Crown Copyright 2023
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
/** @function
|
||||
* Clears the recipe and input
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
*/
|
||||
function clear(browser) {
|
||||
browser
|
||||
.useCss()
|
||||
.click("#clr-recipe")
|
||||
.click("#clr-io")
|
||||
.waitForElementNotPresent("#rec-list li.operation")
|
||||
.expect.element("#input-text .cm-content").text.that.equals("");
|
||||
}
|
||||
|
||||
/** @function
|
||||
* Sets the input to the desired string
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
* @param {string} input - The text to populate the input with
|
||||
* @param {boolean} [type=true] - Whether to type the characters in by using sendKeys,
|
||||
* or to set the value of the editor directly (useful for special characters)
|
||||
*/
|
||||
function setInput(browser, input, type=true) {
|
||||
clear(browser);
|
||||
if (type) {
|
||||
browser
|
||||
.useCss()
|
||||
.sendKeys("#input-text .cm-content", input)
|
||||
.pause(100);
|
||||
} else {
|
||||
browser.execute(text => {
|
||||
window.app.setInput(text);
|
||||
}, [input]);
|
||||
browser.pause(100);
|
||||
}
|
||||
expectInput(browser, input);
|
||||
}
|
||||
|
||||
/** @function
|
||||
* Triggers a bake
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
*/
|
||||
function bake(browser) {
|
||||
browser
|
||||
// Ensure we're not currently busy
|
||||
.waitForElementNotVisible("#output-loader", 5000)
|
||||
.expect.element("#bake span").text.to.equal("BAKE!");
|
||||
|
||||
browser
|
||||
.click("#bake")
|
||||
.waitForElementNotVisible("#stale-indicator", 5000)
|
||||
.waitForElementNotVisible("#output-loader", 5000);
|
||||
}
|
||||
|
||||
/** @function
|
||||
* Sets the character encoding in the input or output
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
* @param {string} io - Either "input" or "output"
|
||||
* @param {string} enc - The encoding to be set
|
||||
*/
|
||||
function setChrEnc(browser, io, enc) {
|
||||
io = `#${io}-text`;
|
||||
browser
|
||||
.useCss()
|
||||
.waitForElementNotVisible("#snackbar-container", 6000)
|
||||
.click(io + " .chr-enc-value")
|
||||
.waitForElementVisible(io + " .chr-enc-select .cm-status-bar-select-scroll")
|
||||
.click("link text", enc)
|
||||
.waitForElementNotVisible(io + " .chr-enc-select .cm-status-bar-select-scroll")
|
||||
.expect.element(io + " .chr-enc-value").text.that.equals(enc);
|
||||
}
|
||||
|
||||
/** @function
|
||||
* Sets the end of line sequence in the input or output
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
* @param {string} io - Either "input" or "output"
|
||||
* @param {string} eol - The sequence to set
|
||||
*/
|
||||
function setEOLSeq(browser, io, eol) {
|
||||
io = `#${io}-text`;
|
||||
browser
|
||||
.useCss()
|
||||
.waitForElementNotVisible("#snackbar-container", 6000)
|
||||
.click(io + " .eol-value")
|
||||
.waitForElementVisible(io + " .eol-select .cm-status-bar-select-content")
|
||||
.click(`${io} .cm-status-bar-select-content a[data-val=${eol}]`)
|
||||
.waitForElementNotVisible(io + " .eol-select .cm-status-bar-select-content")
|
||||
.expect.element(io + " .eol-value").text.that.equals(eol);
|
||||
}
|
||||
|
||||
/** @function
|
||||
* Copies whatever is currently selected
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
*/
|
||||
function copy(browser) {
|
||||
browser.perform(function() {
|
||||
const actions = this.actions({async: true});
|
||||
|
||||
// Ctrl + Ins used as this works on Windows, Linux and Mac
|
||||
return actions
|
||||
.keyDown(browser.Keys.CONTROL)
|
||||
.keyDown(browser.Keys.INSERT)
|
||||
.keyUp(browser.Keys.INSERT)
|
||||
.keyUp(browser.Keys.CONTROL);
|
||||
});
|
||||
}
|
||||
|
||||
/** @function
|
||||
* Pastes into the target element
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
* @param {string} el - Target element selector
|
||||
*/
|
||||
function paste(browser, el) {
|
||||
browser
|
||||
.click(el)
|
||||
.perform(function() {
|
||||
const actions = this.actions({async: true});
|
||||
|
||||
// Shift + Ins used as this works on Windows, Linux and Mac
|
||||
return actions
|
||||
.keyDown(browser.Keys.SHIFT)
|
||||
.keyDown(browser.Keys.INSERT)
|
||||
.keyUp(browser.Keys.INSERT)
|
||||
.keyUp(browser.Keys.SHIFT);
|
||||
})
|
||||
.pause(100);
|
||||
}
|
||||
|
||||
/** @function
|
||||
* Loads a recipe and input
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
* @param {string|Array<string>} opName - name of operation to be loaded, array for multiple ops
|
||||
* @param {string} input - input text for test
|
||||
* @param {Array<string>|Array<Array<string>>} args - arguments, nested if multiple ops
|
||||
*/
|
||||
function loadRecipe(browser, opName, input, args) {
|
||||
let recipeConfig;
|
||||
|
||||
if (typeof(opName) === "string") {
|
||||
recipeConfig = JSON.stringify([{
|
||||
"op": opName,
|
||||
"args": args
|
||||
}]);
|
||||
} else if (opName instanceof Array) {
|
||||
recipeConfig = JSON.stringify(
|
||||
opName.map((op, i) => {
|
||||
return {
|
||||
op: op,
|
||||
args: args.length ? args[i] : []
|
||||
};
|
||||
})
|
||||
);
|
||||
} else {
|
||||
throw new Error("Invalid operation type. Must be string or array of strings. Received: " + typeof(opName));
|
||||
}
|
||||
|
||||
setInput(browser, input, false);
|
||||
browser
|
||||
.urlHash("recipe=" + recipeConfig)
|
||||
.waitForElementPresent("#rec-list li.operation");
|
||||
}
|
||||
|
||||
/** @function
|
||||
* Tests whether the output matches a given value
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
* @param {string|RegExp} expected - The expected output value
|
||||
* @param {boolean} [waitNotNull=false] - Wait for the output to not be empty before testing the value
|
||||
* @param {number} [waitWindow=1000] - The number of milliseconds to wait for the output to be correct
|
||||
*/
|
||||
function expectOutput(browser, expected, waitNotNull=false, waitWindow=1000) {
|
||||
if (waitNotNull && expected !== "") {
|
||||
browser.waitUntil(async function() {
|
||||
const output = await this.execute(function() {
|
||||
return window.app.manager.output.outputEditorView.state.doc.toString();
|
||||
});
|
||||
return output.length;
|
||||
}, waitWindow);
|
||||
}
|
||||
|
||||
browser.execute(expected => {
|
||||
return window.app.manager.output.outputEditorView.state.doc.toString();
|
||||
}, [expected], function({value}) {
|
||||
if (expected instanceof RegExp) {
|
||||
browser.expect(value).match(expected);
|
||||
} else {
|
||||
browser.expect(value).to.be.equal(expected);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/** @function
|
||||
* Tests whether the input matches a given value
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
* @param {string|RegExp} expected - The expected input value
|
||||
*/
|
||||
function expectInput(browser, expected) {
|
||||
browser.execute(expected => {
|
||||
return window.app.manager.input.inputEditorView.state.doc.toString();
|
||||
}, [expected], function({value}) {
|
||||
if (expected instanceof RegExp) {
|
||||
browser.expect(value).match(expected);
|
||||
} else {
|
||||
browser.expect(value).to.be.equal(expected);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/** @function
|
||||
* Uploads a file using the #open-file input
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
* @param {string} filename - A path to a file in the samples directory
|
||||
*/
|
||||
function uploadFile(browser, filename) {
|
||||
const filepath = require("path").resolve(__dirname + "/../samples/" + filename);
|
||||
|
||||
// The file input cannot be interacted with by nightwatch while it is hidden,
|
||||
// so we temporarily expose it for the purposes of this test.
|
||||
browser.execute(() => {
|
||||
document.getElementById("open-file").style.display = "block";
|
||||
});
|
||||
browser
|
||||
.pause(100)
|
||||
.setValue("#open-file", filepath)
|
||||
.pause(100);
|
||||
browser.execute(() => {
|
||||
document.getElementById("open-file").style.display = "none";
|
||||
});
|
||||
browser.waitForElementVisible("#input-text .cm-file-details");
|
||||
}
|
||||
|
||||
/** @function
|
||||
* Uploads a folder using the #open-folder input
|
||||
*
|
||||
* @param {Browser} browser - Nightwatch client
|
||||
* @param {string} foldername - A path to a folder in the samples directory
|
||||
*/
|
||||
function uploadFolder(browser, foldername) {
|
||||
const folderpath = require("path").resolve(__dirname + "/../samples/" + foldername);
|
||||
|
||||
// The folder input cannot be interacted with by nightwatch while it is hidden,
|
||||
// so we temporarily expose it for the purposes of this test.
|
||||
browser.execute(() => {
|
||||
document.getElementById("open-folder").style.display = "block";
|
||||
});
|
||||
browser
|
||||
.pause(100)
|
||||
.setValue("#open-folder", folderpath)
|
||||
.pause(500);
|
||||
browser.execute(() => {
|
||||
document.getElementById("open-folder").style.display = "none";
|
||||
});
|
||||
browser.waitForElementVisible("#input-text .cm-file-details");
|
||||
}
|
||||
|
||||
|
||||
module.exports = {
|
||||
clear: clear,
|
||||
setInput: setInput,
|
||||
bake: bake,
|
||||
setChrEnc: setChrEnc,
|
||||
setEOLSeq: setEOLSeq,
|
||||
copy: copy,
|
||||
paste: paste,
|
||||
loadRecipe: loadRecipe,
|
||||
expectOutput: expectOutput,
|
||||
expectInput: expectInput,
|
||||
uploadFile: uploadFile,
|
||||
uploadFolder: uploadFolder
|
||||
};
|
|
@ -74,9 +74,7 @@ class TestRegister {
|
|||
const result = await chef.bake(
|
||||
test.input,
|
||||
test.recipeConfig,
|
||||
{},
|
||||
0,
|
||||
false
|
||||
{ returnType: "string" }
|
||||
);
|
||||
|
||||
const ret = {
|
||||
|
|
|
@ -119,7 +119,7 @@ TestRegister.addApiTests([
|
|||
assert.strictEqual(result[0].module, "Ciphers");
|
||||
assert.strictEqual(result[0].inputType, "string");
|
||||
assert.strictEqual(result[0].outputType, "string");
|
||||
assert.strictEqual(result[0].description, "Triple DES applies DES three times to each block to increase key size.<br><br><b>Key:</b> Triple DES uses a key length of 24 bytes (192 bits).<br>DES uses a key length of 8 bytes (64 bits).<br><br><b>IV:</b> The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.<br><br><b>Padding:</b> In CBC and ECB mode, PKCS#7 padding will be used as a default.");
|
||||
assert.strictEqual(result[0].description, "Triple DES applies DES three times to each block to increase key size.<br><br><b>Key:</b> Triple DES uses a key length of 24 bytes (192 bits).<br><br><b>IV:</b> The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.<br><br><b>Padding:</b> In CBC and ECB mode, PKCS#7 padding will be used as a default.");
|
||||
assert.strictEqual(result[0].args.length, 5);
|
||||
}),
|
||||
|
||||
|
@ -136,7 +136,7 @@ TestRegister.addApiTests([
|
|||
|
||||
it("chef.help: returns multiple results", () => {
|
||||
const result = chef.help("base 64");
|
||||
assert.strictEqual(result.length, 11);
|
||||
assert.strictEqual(result.length, 13);
|
||||
}),
|
||||
|
||||
it("chef.help: looks in description for matches too", () => {
|
||||
|
|
|
@ -432,7 +432,7 @@ color: white;
|
|||
it("Disassemble x86", () => {
|
||||
const result = chef.disassembleX86(chef.toBase64("one two three"));
|
||||
const expected = `0000000000000000 0000 ADD BYTE PTR [RAX],AL\r
|
||||
0000000000000002 0B250000000B OR ESP,DWORD PTR [0000000-F4FFFFF8]\r
|
||||
0000000000000002 0B250000000B OR ESP,DWORD PTR [000000000B000008]\r
|
||||
`;
|
||||
assert.strictEqual(result.toString(), expected);
|
||||
}),
|
||||
|
@ -575,12 +575,11 @@ Top Drawer`, {
|
|||
}),
|
||||
|
||||
it("Generate HOTP", () => {
|
||||
const result = chef.generateHOTP("Cut The Mustard", {
|
||||
name: "colonel",
|
||||
const result = chef.generateHOTP("JBSWY3DPEHPK3PXP", {
|
||||
});
|
||||
const expected = `URI: otpauth://hotp/colonel?secret=IN2XIICUNBSSATLVON2GC4TE
|
||||
const expected = `URI: otpauth://hotp/?secret=JBSWY3DPEHPK3PXP&algorithm=SHA1&digits=6&counter=0
|
||||
|
||||
Password: 034148`;
|
||||
Password: 282760`;
|
||||
assert.strictEqual(result.toString(), expected);
|
||||
}),
|
||||
|
||||
|
@ -635,6 +634,10 @@ WWFkYSBZYWRh\r
|
|||
assert.strictEqual(chef.keccak("Flea Market").toString(), "c2a06880b19e453ee5440e8bd4c2024bedc15a6630096aa3f609acfd2b8f15f27cd293e1cc73933e81432269129ce954a6138889ce87831179d55dcff1cc7587");
|
||||
}),
|
||||
|
||||
it("LZNT1 Decompress", () => {
|
||||
assert.strictEqual(chef.LZNT1Decompress("\x1a\xb0\x00compress\x00edtestda\x04ta\x07\x88alot").toString(), "compressedtestdatacompressedalot");
|
||||
}),
|
||||
|
||||
it("MD6", () => {
|
||||
assert.strictEqual(chef.MD6("Head Over Heels", {key: "arty"}).toString(), "d8f7fe4931fbaa37316f76283d5f615f50ddd54afdc794b61da522556aee99ad");
|
||||
}),
|
||||
|
|
|
@ -53,6 +53,28 @@ TestRegister.addTests([
|
|||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "To Base58 all null",
|
||||
input: "\0\0\0\0\0\0",
|
||||
expectedOutput: "111111",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "To Base58",
|
||||
args: ["123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "From Base58 all null",
|
||||
input: "111111",
|
||||
expectedOutput: "\0\0\0\0\0\0",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Base58",
|
||||
args: ["123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "To Base58 with null prefix and suffix",
|
||||
input: "\0\0\0Hello\0\0\0",
|
||||
|
|
89
tests/operations/tests/Base92.mjs
Normal file
89
tests/operations/tests/Base92.mjs
Normal file
|
@ -0,0 +1,89 @@
|
|||
/**
|
||||
* Base92 tests.
|
||||
*
|
||||
* @author sg5506844 [sg5506844@gmail.com]
|
||||
* @copyright Crown Copyright 2021
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "To Base92: nothing",
|
||||
input: "",
|
||||
expectedOutput: "",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "To Base92",
|
||||
args: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "To Base92: Spec encoding example 1",
|
||||
input: "AB",
|
||||
expectedOutput: "8y2",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "To Base92",
|
||||
args: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "To Base92: Spec encoding example 2",
|
||||
input: "Hello!!",
|
||||
expectedOutput: ";K_$aOTo&",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "To Base92",
|
||||
args: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "To Base92: Spec encoding example 3",
|
||||
input: "base-92",
|
||||
expectedOutput: "DX2?V<Y(*",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "To Base92",
|
||||
args: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "From Base92: nothing",
|
||||
input: "",
|
||||
expectedOutput: "",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Base92",
|
||||
args: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "From Base92: Spec decoding example 1",
|
||||
input: "G'_DW[B",
|
||||
expectedOutput: "ietf!",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Base92",
|
||||
args: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "From Base92: Invalid character",
|
||||
input: "~",
|
||||
expectedOutput: "~ is not a base92 character",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Base92",
|
||||
args: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
39
tests/operations/tests/CaretMdecode.mjs
Normal file
39
tests/operations/tests/CaretMdecode.mjs
Normal file
|
@ -0,0 +1,39 @@
|
|||
/**
|
||||
* Caesar Box Cipher tests.
|
||||
*
|
||||
* @author tedk [tedk@ted.do]
|
||||
*
|
||||
* @copyright Crown Copyright 2020
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Caret/M-decode: nothing",
|
||||
input: "",
|
||||
expectedOutput: "",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Caret/M-decode",
|
||||
args: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
/*
|
||||
* Tests the full range.
|
||||
* Everything except "^_" (\x5e\x5f) will decode correctly.
|
||||
*/
|
||||
name: "Caret/M-decode: Full set",
|
||||
input: "^@^A^B^C^D^E^F^G^H^I^J^K^L^M^N^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\\^]^^^_ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~^?M-^@M-^AM-^BM-^CM-^DM-^EM-^FM-^GM-^HM-^IM-^JM-^KM-^LM-^MM-^NM-^OM-^PM-^QM-^RM-^SM-^TM-^UM-^VM-^WM-^XM-^YM-^ZM-^[M-^\\M-^]M-^^M-^_M- M-!M-\"M-#M-$M-%M-&M-'M-(M-)M-*M-+M-,M--M-.M-/M-0M-1M-2M-3M-4M-5M-6M-7M-8M-9M-:M-;M-<M-=M->M-?M-@M-AM-BM-CM-DM-EM-FM-GM-HM-IM-JM-KM-LM-MM-NM-OM-PM-QM-RM-SM-TM-UM-VM-WM-XM-YM-ZM-[M-\\M-]M-^M-_M-`M-aM-bM-cM-dM-eM-fM-gM-hM-iM-jM-kM-lM-mM-nM-oM-pM-qM-rM-sM-tM-uM-vM-wM-xM-yM-zM-{M-|M-}M-~M-^?",
|
||||
expectedOutput: "\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\x1f\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\x8d\x2d\x5f\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",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Caret/M-decode",
|
||||
args: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
|
|
@ -58,6 +58,25 @@ ChaCha uses a nonce of 8 or 12 bytes (64 or 96 bits).`,
|
|||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "ChaCha: RFC8439 Raw output",
|
||||
input: "Ladies and Gentlemen of the class of '99: If I could offer you only one tip for the future, sunscreen would be it.",
|
||||
expectedOutput: "6e 2e 35 9a 25 68 f9 80 41 ba 07 28 dd 0d 69 81 e9 7e 7a ec 1d 43 60 c2 0a 27 af cc fd 9f ae 0b f9 1b 65 c5 52 47 33 ab 8f 59 3d ab cd 62 b3 57 16 39 d6 24 e6 51 52 ab 8f 53 0c 35 9f 08 61 d8 07 ca 0d bf 50 0d 6a 61 56 a3 8e 08 8a 22 b6 5e 52 bc 51 4d 16 cc f8 06 81 8c e9 1a b7 79 37 36 5a f9 0b bf 74 a3 5b e6 b4 0b 8e ed f2 78 5e 42 87 4d",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ChaCha",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "00:01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:10:11:12:13:14:15:16:17:18:19:1a:1b:1c:1d:1e:1f"},
|
||||
{"option": "Hex", "string": "00:00:00:00:00:00:00:4a:00:00:00:00"},
|
||||
1, "20", "Raw", "Raw",
|
||||
]
|
||||
},
|
||||
{
|
||||
"op": "To Hex",
|
||||
"args": []
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "ChaCha: draft-strombergson-chacha-test-vectors-01 TC7.1",
|
||||
input: "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00",
|
||||
|
|
|
@ -21,13 +21,16 @@ TestRegister.addTests([
|
|||
],
|
||||
},
|
||||
{
|
||||
// input taken from https://ciphersaber.gurus.org/
|
||||
name: "CipherSaber2 Decrypt",
|
||||
input: "\x5d\xd9\x7f\xeb\x77\x3c\x42\x9d\xfe\x9c\x3b\x21\x63\xbd\x53\x38\x18\x7c\x36\x37",
|
||||
expectedOutput: "helloworld",
|
||||
input: "\x6f\x6d\x0b\xab\xf3\xaa\x67\x19\x03\x15\x30\xed\xb6\x77" +
|
||||
"\xca\x74\xe0\x08\x9d\xd0\xe7\xb8\x85\x43\x56\xbb\x14\x48\xe3" +
|
||||
"\x7c\xdb\xef\xe7\xf3\xa8\x4f\x4f\x5f\xb3\xfd",
|
||||
expectedOutput: "This is a test of CipherSaber.",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "CipherSaber2 Decrypt",
|
||||
args: [{ "option": "Latin1", "string": "test" }, 20],
|
||||
args: [{ "option": "Latin1", "string": "asdfg" }, 1],
|
||||
},
|
||||
],
|
||||
},
|
||||
|
|
|
@ -189,7 +189,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
"op": "JPath expression",
|
||||
"args": ["", "\n", true]
|
||||
"args": ["", "\n"]
|
||||
}
|
||||
],
|
||||
},
|
||||
|
@ -205,7 +205,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
"op": "JPath expression",
|
||||
"args": ["$.store.book[*].author", "\n", true]
|
||||
"args": ["$.store.book[*].author", "\n"]
|
||||
}
|
||||
],
|
||||
},
|
||||
|
@ -223,7 +223,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
"op": "JPath expression",
|
||||
"args": ["$..title", "\n", true]
|
||||
"args": ["$..title", "\n"]
|
||||
}
|
||||
],
|
||||
},
|
||||
|
@ -238,7 +238,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
"op": "JPath expression",
|
||||
"args": ["$.store.*", "\n", true]
|
||||
"args": ["$.store.*", "\n"]
|
||||
}
|
||||
],
|
||||
},
|
||||
|
@ -249,7 +249,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
"op": "JPath expression",
|
||||
"args": ["$..book[-1:]", "\n", true]
|
||||
"args": ["$..book[-1:]", "\n"]
|
||||
}
|
||||
],
|
||||
},
|
||||
|
@ -263,7 +263,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
"op": "JPath expression",
|
||||
"args": ["$..book[:2]", "\n", true]
|
||||
"args": ["$..book[:2]", "\n"]
|
||||
}
|
||||
],
|
||||
},
|
||||
|
@ -277,7 +277,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
"op": "JPath expression",
|
||||
"args": ["$..book[?(@.isbn)]", "\n", false]
|
||||
"args": ["$..book[?(@.isbn)]", "\n"]
|
||||
}
|
||||
],
|
||||
},
|
||||
|
@ -292,7 +292,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
"op": "JPath expression",
|
||||
"args": ["$..book[?(@.price<30 && @.category==\"fiction\")]", "\n", false]
|
||||
"args": ["$..book[?(@.price<30 && @.category==\"fiction\")]", "\n"]
|
||||
}
|
||||
],
|
||||
},
|
||||
|
@ -306,7 +306,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
"op": "JPath expression",
|
||||
"args": ["$..book[?(@.price<10)]", "\n", false]
|
||||
"args": ["$..book[?(@.price<10)]", "\n"]
|
||||
}
|
||||
],
|
||||
},
|
||||
|
@ -318,12 +318,11 @@ TestRegister.addTests([
|
|||
"op": "JPath expression",
|
||||
"args": [
|
||||
"$..[?(({__proto__:[].constructor}).constructor(\"self.postMessage({action:'bakeComplete',data:{bakeId:1,dish:{type:1,value:''},duration:1,error:false,id:undefined,inputNum:2,progress:1,result:'<iframe/onload=debugger>',type: 'html'}});\")();)]",
|
||||
"\n",
|
||||
true
|
||||
"\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
expectedOutput: "Invalid JPath expression: Eval [?(expr)] prevented in JSONPath expression."
|
||||
expectedMatch: /^Invalid JPath expression: jsonPath: self is not defined:/
|
||||
},
|
||||
{
|
||||
name: "CSS selector",
|
||||
|
|
33
tests/operations/tests/ConvertLeetSpeak.mjs
Normal file
33
tests/operations/tests/ConvertLeetSpeak.mjs
Normal file
|
@ -0,0 +1,33 @@
|
|||
/**
|
||||
* @author bartblaze []
|
||||
* @copyright Crown Copyright 2025
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Convert to Leet Speak: basic text",
|
||||
input: "leet",
|
||||
expectedOutput: "l337",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Convert Leet Speak",
|
||||
args: ["To Leet Speak"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Convert from Leet Speak: basic leet",
|
||||
input: "l337",
|
||||
expectedOutput: "leet",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Convert Leet Speak",
|
||||
args: ["From Leet Speak"]
|
||||
}
|
||||
]
|
||||
}
|
||||
]);
|
||||
|
|
@ -580,8 +580,7 @@ Tag: a8f04c4d93bbef82bef61a103371aef9`,
|
|||
input: "",
|
||||
expectedOutput: `Invalid key length: 0 bytes
|
||||
|
||||
DES uses a key length of 8 bytes (64 bits).
|
||||
Triple DES uses a key length of 24 bytes (192 bits).`,
|
||||
DES uses a key length of 8 bytes (64 bits).`,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "DES Encrypt",
|
||||
|
@ -674,8 +673,7 @@ Triple DES uses a key length of 24 bytes (192 bits).`,
|
|||
input: "",
|
||||
expectedOutput: `Invalid key length: 0 bytes
|
||||
|
||||
Triple DES uses a key length of 24 bytes (192 bits).
|
||||
DES uses a key length of 8 bytes (64 bits).`,
|
||||
Triple DES uses a key length of 24 bytes (192 bits).`,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Triple DES Encrypt",
|
||||
|
@ -1300,8 +1298,7 @@ The following algorithms will be used based on the size of the key:
|
|||
input: "",
|
||||
expectedOutput: `Invalid key length: 0 bytes
|
||||
|
||||
DES uses a key length of 8 bytes (64 bits).
|
||||
Triple DES uses a key length of 24 bytes (192 bits).`,
|
||||
DES uses a key length of 8 bytes (64 bits).`,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "DES Decrypt",
|
||||
|
@ -1394,8 +1391,7 @@ Triple DES uses a key length of 24 bytes (192 bits).`,
|
|||
input: "",
|
||||
expectedOutput: `Invalid key length: 0 bytes
|
||||
|
||||
Triple DES uses a key length of 24 bytes (192 bits).
|
||||
DES uses a key length of 8 bytes (64 bits).`,
|
||||
Triple DES uses a key length of 24 bytes (192 bits).`,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Triple DES Decrypt",
|
||||
|
@ -1579,19 +1575,31 @@ DES uses a key length of 8 bytes (64 bits).`,
|
|||
from Crypto.Cipher import Blowfish
|
||||
import binascii
|
||||
|
||||
input_data = b"The quick brown fox jumps over the lazy dog."
|
||||
# Blowfish cipher parameters - key, mode, iv, segment_size, nonce
|
||||
key = binascii.unhexlify("0011223344556677")
|
||||
iv = binascii.unhexlify("0000000000000000")
|
||||
mode = Blowfish.MODE_CBC
|
||||
kwargs = {}
|
||||
iv = binascii.unhexlify("ffeeddccbbaa9988")
|
||||
if mode in [Blowfish.MODE_CBC, Blowfish.MODE_CFB, Blowfish.MODE_OFB]:
|
||||
kwargs = {"iv": iv}
|
||||
if mode == Blowfish.MODE_CFB:
|
||||
kwargs["segment_size"] = 64
|
||||
if mode == Blowfish.MODE_CTR:
|
||||
nonce = binascii.unhexlify("0000000000000000")
|
||||
nonce = nonce[:7]
|
||||
kwargs["nonce"] = nonce
|
||||
|
||||
cipher = Blowfish.new(key, mode, **kwargs)
|
||||
|
||||
# Input data and padding
|
||||
input_data = b"The quick brown fox jumps over the lazy dog."
|
||||
if mode == Blowfish.MODE_ECB or mode == Blowfish.MODE_CBC:
|
||||
padding_len = 8-(len(input_data) & 7)
|
||||
for i in range(padding_len):
|
||||
input_data += bytes([padding_len])
|
||||
|
||||
cipher = Blowfish.new(key, mode) # set iv, nonce, segment_size etc. here
|
||||
# Encrypted text
|
||||
cipher_text = cipher.encrypt(input_data)
|
||||
|
||||
cipher_text = binascii.hexlify(cipher_text).decode("UTF-8")
|
||||
|
||||
print("Encrypted: {}".format(cipher_text))
|
||||
|
@ -1948,4 +1956,38 @@ DES uses a key length of 8 bytes (64 bits).`,
|
|||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Blowfish Encrypt with variable key length: CBC, ASCII, 4 bytes",
|
||||
input: "The quick brown fox jumps over the lazy dog.",
|
||||
expectedOutput: "823f337a53ecf121aa9ec1b111bd5064d1d7586abbdaaa0c8fd0c6cc43c831c88bf088ee3e07287e3f36cf2e45f9c7e6",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Blowfish Encrypt",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "00112233"}, // Key
|
||||
{"option": "Hex", "string": "0000000000000000"}, // IV
|
||||
"CBC", // Mode
|
||||
"Raw", // Input
|
||||
"Hex" // Output
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Blowfish Encrypt with variable key length: CBC, ASCII, 42 bytes",
|
||||
input: "The quick brown fox jumps over the lazy dog.",
|
||||
expectedOutput: "19f5a68145b34321cfba72226b0f33922ce44dd6e7869fe328db64faae156471216f12ed2a37fd0bdd7cebf867b3cff0",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Blowfish Encrypt",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdead"}, // Key
|
||||
{"option": "Hex", "string": "0000000000000000"}, // IV
|
||||
"CBC", // Mode
|
||||
"Raw", // Input
|
||||
"Hex" // Output
|
||||
]
|
||||
}
|
||||
],
|
||||
}
|
||||
]);
|
||||
|
|
|
@ -31,4 +31,26 @@ TestRegister.addTests([
|
|||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "DateTime Delta Positive",
|
||||
input: "20/02/2024 13:36:00",
|
||||
expectedOutput: "20/02/2024 13:37:00",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "DateTime Delta",
|
||||
args: ["Standard date and time", "DD/MM/YYYY HH:mm:ss", "Add", 0, 0, 1, 0],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "DateTime Delta Negative",
|
||||
input: "20/02/2024 14:37:00",
|
||||
expectedOutput: "20/02/2024 13:37:00",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "DateTime Delta",
|
||||
args: ["Standard date and time", "DD/MM/YYYY HH:mm:ss", "Subtract", 0, 1, 0, 0],
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
|
|
123
tests/operations/tests/DropNthBytes.mjs
Normal file
123
tests/operations/tests/DropNthBytes.mjs
Normal file
|
@ -0,0 +1,123 @@
|
|||
/**
|
||||
* @author Oshawk [oshawk@protonmail.com]
|
||||
* @copyright Crown Copyright 2019
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
/**
|
||||
* Drop nth bytes tests
|
||||
*/
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Drop nth bytes: Nothing",
|
||||
input: "",
|
||||
expectedOutput: "",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Drop nth bytes",
|
||||
args: [4, 0, false],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Drop nth bytes: Nothing (apply to each line)",
|
||||
input: "",
|
||||
expectedOutput: "",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Drop nth bytes",
|
||||
args: [4, 0, true],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Drop nth bytes: Basic single line",
|
||||
input: "0123456789",
|
||||
expectedOutput: "1235679",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Drop nth bytes",
|
||||
args: [4, 0, false],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Drop nth bytes: Basic single line (apply to each line)",
|
||||
input: "0123456789",
|
||||
expectedOutput: "1235679",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Drop nth bytes",
|
||||
args: [4, 0, true],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Drop nth bytes: Complex single line",
|
||||
input: "0123456789",
|
||||
expectedOutput: "01234678",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Drop nth bytes",
|
||||
args: [4, 5, false],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Drop nth bytes: Complex single line (apply to each line)",
|
||||
input: "0123456789",
|
||||
expectedOutput: "01234678",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Drop nth bytes",
|
||||
args: [4, 5, true],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Drop nth bytes: Basic multi line",
|
||||
input: "01234\n56789",
|
||||
expectedOutput: "123\n5689",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Drop nth bytes",
|
||||
args: [4, 0, false],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Drop nth bytes: Basic multi line (apply to each line)",
|
||||
input: "01234\n56789",
|
||||
expectedOutput: "123\n678",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Drop nth bytes",
|
||||
args: [4, 0, true],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Drop nth bytes: Complex multi line",
|
||||
input: "01234\n56789",
|
||||
expectedOutput: "012345679",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Drop nth bytes",
|
||||
args: [4, 5, false],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Drop nth bytes: Complex multi line (apply to each line)",
|
||||
input: "012345\n6789ab",
|
||||
expectedOutput: "01234\n6789a",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Drop nth bytes",
|
||||
args: [4, 5, true],
|
||||
},
|
||||
],
|
||||
}
|
||||
]);
|
464
tests/operations/tests/ECDSA.mjs
Normal file
464
tests/operations/tests/ECDSA.mjs
Normal file
|
@ -0,0 +1,464 @@
|
|||
/**
|
||||
* ECDSA tests.
|
||||
*
|
||||
* @author cplussharp
|
||||
* @copyright Crown Copyright 2021
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
import { ASCII_TEXT } from "../../samples/Ciphers.mjs";
|
||||
|
||||
const P256 = {
|
||||
// openssl ecparam -name prime256v1 -genkey -noout -out p256.priv.key
|
||||
privateKeyPkcs1: `-----BEGIN EC PRIVATE KEY-----
|
||||
MHcCAQEEINtTjwUkgfAiSwqgcGAXWyE0ueIW6n2k395dmQZ3vGr4oAoGCCqGSM49
|
||||
AwEHoUQDQgAEDUc8A0EDNKoCYIPWMHz1yUzqE5mJgusgcAE8H6810fkJ8ZmTNiCC
|
||||
a6sLgR2vD1VNh2diirWgKPH4PVMKav5e6Q==
|
||||
-----END EC PRIVATE KEY-----`,
|
||||
privateKeyPkcs8: `-----BEGIN PRIVATE KEY-----
|
||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg21OPBSSB8CJLCqBw
|
||||
YBdbITS54hbqfaTf3l2ZBne8avihRANCAAQNRzwDQQM0qgJgg9YwfPXJTOoTmYmC
|
||||
6yBwATwfrzXR+QnxmZM2IIJrqwuBHa8PVU2HZ2KKtaAo8fg9Uwpq/l7p
|
||||
-----END PRIVATE KEY-----`,
|
||||
|
||||
// openssl ec -in p256.priv.key -pubout -out p256.pub.key
|
||||
publicKey: `-----BEGIN PUBLIC KEY-----
|
||||
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDUc8A0EDNKoCYIPWMHz1yUzqE5mJ
|
||||
gusgcAE8H6810fkJ8ZmTNiCCa6sLgR2vD1VNh2diirWgKPH4PVMKav5e6Q==
|
||||
-----END PUBLIC KEY-----`,
|
||||
|
||||
signature: {
|
||||
sha256: {
|
||||
asn1: "3046022100e06905608a2fa7dbda9e284c2a7959dfb68fb527a5f003b2d7975ff135145127022100b6baa253793334f8b93ea1dd622bc600124d8090babd807efe3f77b8b324388d",
|
||||
p1363: "e06905608a2fa7dbda9e284c2a7959dfb68fb527a5f003b2d7975ff135145127b6baa253793334f8b93ea1dd622bc600124d8090babd807efe3f77b8b324388d",
|
||||
jws: "4GkFYIovp9vanihMKnlZ37aPtSel8AOy15df8TUUUSe2uqJTeTM0-Lk-od1iK8YAEk2AkLq9gH7-P3e4syQ4jQ",
|
||||
json: `{"r":"00e06905608a2fa7dbda9e284c2a7959dfb68fb527a5f003b2d7975ff135145127","s":"00b6baa253793334f8b93ea1dd622bc600124d8090babd807efe3f77b8b324388d"}`
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// openssl pkcs8 -topk8 -in p256.priv.key -out p256.enc-priv.key -v2 des3 -v2prf hmacWithSHA1 -passout pass:Test1234
|
||||
/* const PEM_PRIV_P256_ENCRYPTED_PASS = "Test1234";
|
||||
const PEM_PRIV_P256_ENCRYPTED = `-----BEGIN ENCRYPTED PRIVATE KEY-----
|
||||
MIHsMFcGCSqGSIb3DQEFDTBKMCkGCSqGSIb3DQEFDDAcBAg+4ckqI9Q9ZAICCAAw
|
||||
DAYIKoZIhvcNAgkFADAdBglghkgBZQMEASoEEOnMUW15Hn/ub0OcCCj9lksEgZCk
|
||||
kxaK4d430lZHovcA4ZeKTt94QcfjnIHRk65aZt93l17l52pv6n/srs3aRo/n5RV+
|
||||
wZ5sTLF0925ZQWJB5cIhzc8KQIvguGCX1znLQJJaRHyYOUXIN77AKEfALKAinBit
|
||||
25paDnbXAqGn1CR3UwFWUZZW+c3UEhWhmpghQpS1tIl0KI6IAvnrGIdw2kKIouo=
|
||||
-----END ENCRYPTED PRIVATE KEY-----`;*/
|
||||
|
||||
const P384 = {
|
||||
privateKeyPkcs8: `-----BEGIN PRIVATE KEY-----
|
||||
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDAYo22xn2kZjN8MInom
|
||||
NDsgD/zhpUwnCYch634jUgO59fN9m2lR5ekaI1XABHz39rihZANiAAQwXoCsPOLv
|
||||
Nn2STUs/hpL41CQveSL3WUmJ4QdtD7UFCl1mBO6ME0xSUgIQTUNkHt5k9CpOq3x9
|
||||
r+LG5+GcisoLn7R54R+bRoGp/p1ZBeuBXoCgthvs+RFoT3OewUmA8oQ=
|
||||
-----END PRIVATE KEY-----`,
|
||||
publicKey: `-----BEGIN PUBLIC KEY-----
|
||||
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEMF6ArDzi7zZ9kk1LP4aS+NQkL3ki91lJ
|
||||
ieEHbQ+1BQpdZgTujBNMUlICEE1DZB7eZPQqTqt8fa/ixufhnIrKC5+0eeEfm0aB
|
||||
qf6dWQXrgV6AoLYb7PkRaE9znsFJgPKE
|
||||
-----END PUBLIC KEY-----`
|
||||
};
|
||||
|
||||
const P521 = {
|
||||
privateKeyPkcs8: `-----BEGIN PRIVATE KEY-----
|
||||
MIHuAgEAMBAGByqGSM49AgEGBSuBBAAjBIHWMIHTAgEBBEIAifBaJDqNwOtKgThc
|
||||
FU34GzPQ73ubOQg9dnighpVGwA3b/KwCifimCNKDmKnXJaE04mEcxg8yzcFKausF
|
||||
5I8o206hgYkDgYYABAGwpkwrBBlZOdx4u9mxqYxJvtzAHaFFAzl21WQVbAjyrqXe
|
||||
nFPMkhbFpEEWr1ualPYKQkHe14AX33iU3fQ9MlBkgAAripsPbiKggAaog74cUERo
|
||||
qbrUFZwMbptGgovpE6pU93h7A1wb3Vtw9DZQCgiNbwzMbdsft+p2RJ8iSxWEC6Gd
|
||||
mw==
|
||||
-----END PRIVATE KEY-----`,
|
||||
publicKey: `-----BEGIN PUBLIC KEY-----
|
||||
MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBsKZMKwQZWTnceLvZsamMSb7cwB2h
|
||||
RQM5dtVkFWwI8q6l3pxTzJIWxaRBFq9bmpT2CkJB3teAF994lN30PTJQZIAAK4qb
|
||||
D24ioIAGqIO+HFBEaKm61BWcDG6bRoKL6ROqVPd4ewNcG91bcPQ2UAoIjW8MzG3b
|
||||
H7fqdkSfIksVhAuhnZs=
|
||||
-----END PUBLIC KEY-----`
|
||||
};
|
||||
|
||||
const PEM_PPRIV_RSA512 = `-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIBOQIBAAJBAPKr0Dp6YdItzOfk6a7ma7L4BF4LnelMYKtboGLrk6ihtqFPZFRL
|
||||
NcJi68Hvnt8stMrP50t6jqwWQ2EjMdkj6fsCAwEAAQJAOJUpM0lv36MAQR3WAwsF
|
||||
F7DOy+LnigteCvaNWiNVxZ6jByB5Qb7sall/Qlu9sFI0ZwrlVcKS0kldee7JTYlL
|
||||
WQIhAP3UKEfOtpTgT1tYmdhaqjxqMfxBom0Ri+rt9ajlzs6vAiEA9L85B8/Gnb7p
|
||||
6Af7/wpmafL277OV4X4xBfzMR+TUzHUCIBq+VLQkInaTH6lXL3ZtLwyIf9W9MJjf
|
||||
RWeuRLjT5bM/AiBF7Kw6kx5Hy1fAtydEApCoDIaIjWJw/kC7WTJ0B+jUUQIgV6dw
|
||||
NSyj0feakeD890gmId+lvl/w/3oUXiczqvl/N9o=
|
||||
-----END RSA PRIVATE KEY-----`;
|
||||
const PEM_PUB_RSA512 = `-----BEGIN PUBLIC KEY-----
|
||||
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAPKr0Dp6YdItzOfk6a7ma7L4BF4LnelM
|
||||
YKtboGLrk6ihtqFPZFRLNcJi68Hvnt8stMrP50t6jqwWQ2EjMdkj6fsCAwEAAQ==
|
||||
-----END PUBLIC KEY-----`;
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "ECDSA Sign/Verify: P-256 with MD5",
|
||||
input: ASCII_TEXT,
|
||||
expectedOutput: "Verified OK",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Sign",
|
||||
"args": [P256.privateKeyPkcs1, "MD5", "ASN.1 HEX"]
|
||||
},
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["ASN.1 HEX", "MD5", P256.publicKey, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Sign/Verify: P-256 with SHA1",
|
||||
input: ASCII_TEXT,
|
||||
expectedOutput: "Verified OK",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Sign",
|
||||
"args": [P256.privateKeyPkcs1, "SHA-1", "ASN.1 HEX"]
|
||||
},
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["ASN.1 HEX", "SHA-1", P256.publicKey, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Sign/Verify: P-256 with SHA256",
|
||||
input: ASCII_TEXT,
|
||||
expectedOutput: "Verified OK",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Sign",
|
||||
"args": [P256.privateKeyPkcs1, "SHA-256", "ASN.1 HEX"]
|
||||
},
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["ASN.1 HEX", "SHA-256", P256.publicKey, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Sign/Verify: P-256 with SHA384",
|
||||
input: ASCII_TEXT,
|
||||
expectedOutput: "Verified OK",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Sign",
|
||||
"args": [P256.privateKeyPkcs1, "SHA-384", "ASN.1 HEX"]
|
||||
},
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["ASN.1 HEX", "SHA-384", P256.publicKey, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Sign/Verify: P-256 with SHA512",
|
||||
input: ASCII_TEXT,
|
||||
expectedOutput: "Verified OK",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Sign",
|
||||
"args": [P256.privateKeyPkcs1, "SHA-512", "ASN.1 HEX"]
|
||||
},
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["ASN.1 HEX", "SHA-512", P256.publicKey, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Sign/Verify:: Using a private key in PKCS#8 format works",
|
||||
input: ASCII_TEXT,
|
||||
expectedOutput: "Verified OK",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Sign",
|
||||
"args": [P256.privateKeyPkcs8, "SHA-256", "ASN.1 HEX"]
|
||||
},
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["ASN.1 HEX", "SHA-256", P256.publicKey, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Sign/Verify: P-384 with SHA384",
|
||||
input: ASCII_TEXT,
|
||||
expectedOutput: "Verified OK",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Sign",
|
||||
"args": [P384.privateKeyPkcs8, "SHA-384", "ASN.1 HEX"]
|
||||
},
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["ASN.1 HEX", "SHA-384", P384.publicKey, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Sign/Verify: P-521 with SHA512",
|
||||
input: ASCII_TEXT,
|
||||
expectedOutput: "Verified OK",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Sign",
|
||||
"args": [P521.privateKeyPkcs8, "SHA-512", "ASN.1 HEX"]
|
||||
},
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["ASN.1 HEX", "SHA-512", P521.publicKey, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
// ECDSA Sign
|
||||
{
|
||||
name: "ECDSA Sign: Using public key fails",
|
||||
input: ASCII_TEXT,
|
||||
expectedOutput: "Provided key is not a private key.",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Sign",
|
||||
"args": [P256.publicKey, "SHA-256", "ASN.1 HEX"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Sign: Using an RSA key fails",
|
||||
input: ASCII_TEXT,
|
||||
expectedOutput: "Provided key is not an EC key.",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Sign",
|
||||
"args": [PEM_PPRIV_RSA512, "SHA-256", "ASN.1 HEX"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
// ECDSA Verify
|
||||
{
|
||||
name: "ECDSA Verify: P-256 with SHA256 (ASN.1 signature)",
|
||||
input: P256.signature.sha256.asn1,
|
||||
expectedOutput: "Verified OK",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["Auto", "SHA-256", P256.publicKey, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Verify: P-256 with SHA256 (P1363 signature)",
|
||||
input: P256.signature.sha256.p1363,
|
||||
expectedOutput: "Verified OK",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["Auto", "SHA-256", P256.publicKey, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Verify: P-256 with SHA256 (JWS signature)",
|
||||
input: P256.signature.sha256.jws,
|
||||
expectedOutput: "Verified OK",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["Auto", "SHA-256", P256.publicKey, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Verify: P-256 with SHA256 (JSON signature)",
|
||||
input: P256.signature.sha256.json,
|
||||
expectedOutput: "Verified OK",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["Auto", "SHA-256", P256.publicKey, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Verify: JSON signature missing r",
|
||||
input: JSON.stringify({s: JSON.parse(P256.signature.sha256.json).s}),
|
||||
expectedOutput: 'No "r" value in the signature JSON',
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["Auto", "SHA-256", P256.publicKey, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Verify: JSON signature missing s",
|
||||
input: JSON.stringify({r: JSON.parse(P256.signature.sha256.json).r}),
|
||||
expectedOutput: 'No "s" value in the signature JSON',
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["Auto", "SHA-256", P256.publicKey, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Verify: Using private key fails",
|
||||
input: P256.signature.sha256.asn1,
|
||||
expectedOutput: "Provided key is not a public key.",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["ASN.1 HEX", "SHA-256", P256.privateKeyPkcs1, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Verify: Using an RSA key fails",
|
||||
input: P256.signature.sha256.asn1,
|
||||
expectedOutput: "Provided key is not an EC key.",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Verify",
|
||||
"args": ["ASN.1 HEX", "SHA-256", PEM_PUB_RSA512, ASCII_TEXT]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
// ECDSA Signatur Conversion
|
||||
{
|
||||
name: "ECDSA Signature Conversion: ASN.1 To ASN.1",
|
||||
input: P256.signature.sha256.asn1,
|
||||
expectedOutput: P256.signature.sha256.asn1,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Signature Conversion",
|
||||
"args": ["Auto", "ASN.1 HEX"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Signature Conversion: ASN.1 To P1363",
|
||||
input: P256.signature.sha256.asn1,
|
||||
expectedOutput: P256.signature.sha256.p1363,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Signature Conversion",
|
||||
"args": ["Auto", "P1363 HEX"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Signature Conversion: ASN.1 To JWS",
|
||||
input: P256.signature.sha256.asn1,
|
||||
expectedOutput: P256.signature.sha256.jws,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Signature Conversion",
|
||||
"args": ["Auto", "JSON Web Signature"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Signature Conversion: ASN.1 To JSON",
|
||||
input: P256.signature.sha256.asn1,
|
||||
expectedOutput: P256.signature.sha256.json,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Signature Conversion",
|
||||
"args": ["Auto", "Raw JSON"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Signature Conversion: P1363 To ASN.1",
|
||||
input: P256.signature.sha256.p1363,
|
||||
expectedOutput: P256.signature.sha256.asn1,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Signature Conversion",
|
||||
"args": ["Auto", "ASN.1 HEX"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Signature Conversion: P1363 To P1363",
|
||||
input: P256.signature.sha256.p1363,
|
||||
expectedOutput: P256.signature.sha256.p1363,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Signature Conversion",
|
||||
"args": ["Auto", "P1363 HEX"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Signature Conversion: P1363 To JWS",
|
||||
input: P256.signature.sha256.p1363,
|
||||
expectedOutput: P256.signature.sha256.jws,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Signature Conversion",
|
||||
"args": ["Auto", "JSON Web Signature"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Signature Conversion: P1363 To JSON",
|
||||
input: P256.signature.sha256.p1363,
|
||||
expectedOutput: P256.signature.sha256.json,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Signature Conversion",
|
||||
"args": ["Auto", "Raw JSON"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Signature Conversion: JSON To ASN.1",
|
||||
input: P256.signature.sha256.json,
|
||||
expectedOutput: P256.signature.sha256.asn1,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Signature Conversion",
|
||||
"args": ["Auto", "ASN.1 HEX"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Signature Conversion: JSON To P1363",
|
||||
input: P256.signature.sha256.json,
|
||||
expectedOutput: P256.signature.sha256.p1363,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Signature Conversion",
|
||||
"args": ["Auto", "P1363 HEX"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Signature Conversion: JSON To JWS",
|
||||
input: P256.signature.sha256.json,
|
||||
expectedOutput: P256.signature.sha256.jws,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Signature Conversion",
|
||||
"args": ["Auto", "JSON Web Signature"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ECDSA Signature Conversion: JSON To JSON",
|
||||
input: P256.signature.sha256.json,
|
||||
expectedOutput: P256.signature.sha256.json,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "ECDSA Signature Conversion",
|
||||
"args": ["Auto", "Raw JSON"]
|
||||
}
|
||||
]
|
||||
}
|
||||
]);
|
77
tests/operations/tests/ExtractHashes.mjs
Normal file
77
tests/operations/tests/ExtractHashes.mjs
Normal file
|
@ -0,0 +1,77 @@
|
|||
/**
|
||||
* ExtractHashes tests.
|
||||
*
|
||||
* @author mshwed [m@ttshwed.com]
|
||||
* @copyright Crown Copyright 2024
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Extract MD5 hash",
|
||||
input: "The quick brown fox jumps over the lazy dog\n\nMD5: 9e107d9d372bb6826bd81d3542a419d6",
|
||||
expectedOutput: "9e107d9d372bb6826bd81d3542a419d6",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Extract hashes",
|
||||
"args": [32, false, false]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Extract SHA1 hash",
|
||||
input: "The quick brown fox jumps over the lazy dog\n\nSHA1: 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12",
|
||||
expectedOutput: "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Extract hashes",
|
||||
"args": [40, false, false]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Extract SHA256 hash",
|
||||
input: "The quick brown fox jumps over the lazy dog\n\nSHA256: d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592",
|
||||
expectedOutput: "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Extract hashes",
|
||||
"args": [64, false, false]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Extract SHA512 hash",
|
||||
input: "The quick brown fox jumps over the lazy dog\n\nSHA512: 07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6",
|
||||
expectedOutput: "07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Extract hashes",
|
||||
"args": [128, false, false]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Extract all hashes",
|
||||
input: "The quick brown fox jumps over the lazy dog\n\nMD5: 9e107d9d372bb6826bd81d3542a419d6\nSHA1: 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12\nSHA256: d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592",
|
||||
expectedOutput: "9e107d9d372bb6826bd81d3542a419d6\n2fd4e1c67a2d28fced849ee1bb76e7391b93eb12\nd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Extract hashes",
|
||||
"args": [0, true, false]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Extract hashes with total count",
|
||||
input: "The quick brown fox jumps over the lazy dog\n\nMD5: 9e107d9d372bb6826bd81d3542a419d6\nSHA1: 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12\nSHA256: d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592",
|
||||
expectedOutput: "Total Results: 3\n\n9e107d9d372bb6826bd81d3542a419d6\n2fd4e1c67a2d28fced849ee1bb76e7391b93eb12\nd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Extract hashes",
|
||||
"args": [0, true, true]
|
||||
},
|
||||
],
|
||||
}
|
||||
]);
|
80
tests/operations/tests/Fernet.mjs
Normal file
80
tests/operations/tests/Fernet.mjs
Normal file
|
@ -0,0 +1,80 @@
|
|||
/**
|
||||
* Fernet tests.
|
||||
*
|
||||
* @author Karsten Silkenbäumer [github.com/kassi]
|
||||
* @copyright Karsten Silkenbäumer 2019
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../TestRegister";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Fernet Decrypt: no input",
|
||||
input: "",
|
||||
expectedOutput: "Error: Invalid version",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Fernet Decrypt",
|
||||
args: ["MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Fernet Decrypt: no secret",
|
||||
input: "gAAAAABce-Tycae8klRxhDX2uenJ-uwV8-A1XZ2HRnfOXlNzkKKfRxviNLlgtemhT_fd1Fw5P_zFUAjd69zaJBQyWppAxVV00SExe77ql8c5n62HYJOnoIU=",
|
||||
expectedOutput: "Error: Secret must be 32 url-safe base64-encoded bytes.",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Fernet Decrypt",
|
||||
args: [""]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Fernet Decrypt: valid arguments",
|
||||
input: "gAAAAABce-Tycae8klRxhDX2uenJ-uwV8-A1XZ2HRnfOXlNzkKKfRxviNLlgtemhT_fd1Fw5P_zFUAjd69zaJBQyWppAxVV00SExe77ql8c5n62HYJOnoIU=",
|
||||
expectedOutput: "This is a secret message.\n",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Fernet Decrypt",
|
||||
args: ["VGhpc0lzVGhpcnR5VHdvQ2hhcmFjdGVyc0xvbmdLZXk="]
|
||||
}
|
||||
],
|
||||
}
|
||||
]);
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Fernet Encrypt: no input",
|
||||
input: "",
|
||||
expectedMatch: /^gAAAAABce-[\w-]+={0,2}$/,
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Fernet Encrypt",
|
||||
args: ["MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Fernet Encrypt: no secret",
|
||||
input: "This is a secret message.\n",
|
||||
expectedOutput: "Error: Secret must be 32 url-safe base64-encoded bytes.",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Fernet Encrypt",
|
||||
args: [""]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Fernet Encrypt: valid arguments",
|
||||
input: "This is a secret message.\n",
|
||||
expectedMatch: /^gAAAAABce-[\w-]+={0,2}$/,
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Fernet Encrypt",
|
||||
args: ["MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="]
|
||||
}
|
||||
],
|
||||
}
|
||||
]);
|
22
tests/operations/tests/FileTree.mjs
Normal file
22
tests/operations/tests/FileTree.mjs
Normal file
|
@ -0,0 +1,22 @@
|
|||
/**
|
||||
* File tree tests.
|
||||
*
|
||||
* @author sw5678
|
||||
* @copyright Crown Copyright 2023
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
"name": "File Tree: basic example",
|
||||
"input": "/test_dir1/test_file1.txt\n/test_dir1/test_file2.txt\n/test_dir2/test_file1.txt",
|
||||
"expectedOutput": "test_dir1\n|---test_file1.txt\n|---test_file2.txt\ntest_dir2\n|---test_file1.txt",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "File Tree",
|
||||
"args": ["/", "Line feed"],
|
||||
},
|
||||
],
|
||||
}
|
||||
]);
|
164
tests/operations/tests/Float.mjs
Normal file
164
tests/operations/tests/Float.mjs
Normal file
|
@ -0,0 +1,164 @@
|
|||
/**
|
||||
* Float tests.
|
||||
*
|
||||
* @author tcode2k16 [tcode2k16@gmail.com]
|
||||
*
|
||||
* @copyright Crown Copyright 2019
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "To Float: nothing",
|
||||
input: "",
|
||||
expectedOutput: "",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["Auto"]
|
||||
},
|
||||
{
|
||||
op: "To Float",
|
||||
args: ["Big Endian", "Float (4 bytes)", "Space"]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "To Float (Big Endian, 4 bytes): 0.5",
|
||||
input: "3f0000003f000000",
|
||||
expectedOutput: "0.5 0.5",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["Auto"]
|
||||
},
|
||||
{
|
||||
op: "To Float",
|
||||
args: ["Big Endian", "Float (4 bytes)", "Space"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "To Float (Little Endian, 4 bytes): 0.5",
|
||||
input: "0000003f0000003f",
|
||||
expectedOutput: "0.5 0.5",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["Auto"]
|
||||
},
|
||||
{
|
||||
op: "To Float",
|
||||
args: ["Little Endian", "Float (4 bytes)", "Space"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "To Float (Big Endian, 8 bytes): 0.5",
|
||||
input: "3fe00000000000003fe0000000000000",
|
||||
expectedOutput: "0.5 0.5",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["Auto"]
|
||||
},
|
||||
{
|
||||
op: "To Float",
|
||||
args: ["Big Endian", "Double (8 bytes)", "Space"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "To Float (Little Endian, 8 bytes): 0.5",
|
||||
input: "000000000000e03f000000000000e03f",
|
||||
expectedOutput: "0.5 0.5",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["Auto"]
|
||||
},
|
||||
{
|
||||
op: "To Float",
|
||||
args: ["Little Endian", "Double (8 bytes)", "Space"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "From Float: nothing",
|
||||
input: "",
|
||||
expectedOutput: "",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Float",
|
||||
args: ["Big Endian", "Float (4 bytes)", "Space"]
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "From Float (Big Endian, 4 bytes): 0.5",
|
||||
input: "0.5 0.5",
|
||||
expectedOutput: "3f0000003f000000",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Float",
|
||||
args: ["Big Endian", "Float (4 bytes)", "Space"]
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "From Float (Little Endian, 4 bytes): 0.5",
|
||||
input: "0.5 0.5",
|
||||
expectedOutput: "0000003f0000003f",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Float",
|
||||
args: ["Little Endian", "Float (4 bytes)", "Space"]
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "From Float (Big Endian, 8 bytes): 0.5",
|
||||
input: "0.5 0.5",
|
||||
expectedOutput: "3fe00000000000003fe0000000000000",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Float",
|
||||
args: ["Big Endian", "Double (8 bytes)", "Space"]
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "From Float (Little Endian, 8 bytes): 0.5",
|
||||
input: "0.5 0.5",
|
||||
expectedOutput: "000000000000e03f000000000000e03f",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Float",
|
||||
args: ["Little Endian", "Double (8 bytes)", "Space"]
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None"]
|
||||
}
|
||||
]
|
||||
}
|
||||
]);
|
|
@ -1,55 +0,0 @@
|
|||
/**
|
||||
* To Geohash tests
|
||||
*
|
||||
* @author gchq77703
|
||||
* @copyright Crown Copyright 2018
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "From Geohash",
|
||||
input: "ww8p1r4t8",
|
||||
expectedOutput: "37.83238649368286,112.55838632583618",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Geohash",
|
||||
args: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "From Geohash",
|
||||
input: "ww8p1r",
|
||||
expectedOutput: "37.83416748046875,112.5604248046875",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Geohash",
|
||||
args: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "From Geohash",
|
||||
input: "ww8",
|
||||
expectedOutput: "37.265625,113.203125",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Geohash",
|
||||
args: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "From Geohash",
|
||||
input: "w",
|
||||
expectedOutput: "22.5,112.5",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Geohash",
|
||||
args: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
175
tests/operations/tests/GOST.mjs
Normal file
175
tests/operations/tests/GOST.mjs
Normal file
|
@ -0,0 +1,175 @@
|
|||
/**
|
||||
* GOST tests.
|
||||
*
|
||||
* The GOST library already includes a range of tests for the correctness of
|
||||
* the algorithms. These tests are intended only to confirm that the library
|
||||
* has been correctly integrated into CyberChef.
|
||||
*
|
||||
* @author n1474335 [n1474335@gmail.com]
|
||||
*
|
||||
* @copyright Crown Copyright 2023
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "GOST Encrypt: 1989",
|
||||
input: "Hello, World!",
|
||||
expectedOutput: "f124ac5c0853870906dbaf9b56",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "GOST Encrypt",
|
||||
args: [
|
||||
{ "option": "Hex", "string": "00112233" },
|
||||
{ "option": "Hex", "string": "0011223344556677" },
|
||||
"Raw",
|
||||
"Hex",
|
||||
"GOST 28147 (1989)",
|
||||
"E-SC",
|
||||
"OFB",
|
||||
"CP",
|
||||
"ZERO"
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "GOST Encrypt: Kuznyechik",
|
||||
input: "Hello, World!",
|
||||
expectedOutput: "8673d490dfa4a66d5e3ff00ba316724f",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "GOST Encrypt",
|
||||
args: [
|
||||
{ "option": "Hex", "string": "00112233" },
|
||||
{ "option": "Hex", "string": "00112233445566778899aabbccddeeff" },
|
||||
"Raw",
|
||||
"Hex",
|
||||
"GOST R 34.12 (Kuznyechik, 2015)",
|
||||
"E-SC",
|
||||
"CBC",
|
||||
"CP",
|
||||
"PKCS5"
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "GOST Decrypt: 1989",
|
||||
input: "f124ac5c0853870906dbaf9b56",
|
||||
expectedOutput: "Hello, World!",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "GOST Decrypt",
|
||||
args: [
|
||||
{ "option": "Hex", "string": "00112233" },
|
||||
{ "option": "Hex", "string": "0011223344556677" },
|
||||
"Hex",
|
||||
"Raw",
|
||||
"GOST 28147 (1989)",
|
||||
"E-SC",
|
||||
"OFB",
|
||||
"CP",
|
||||
"ZERO"
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "GOST Decrypt: Kuznyechik",
|
||||
input: "8673d490dfa4a66d5e3ff00ba316724f",
|
||||
expectedOutput: "Hello, World!\0\0\0",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "GOST Decrypt",
|
||||
args: [
|
||||
{ "option": "Hex", "string": "00112233" },
|
||||
{ "option": "Hex", "string": "00112233445566778899aabbccddeeff" },
|
||||
"Hex",
|
||||
"Raw",
|
||||
"GOST R 34.12 (Kuznyechik, 2015)",
|
||||
"E-TEST",
|
||||
"CBC",
|
||||
"CP",
|
||||
"PKCS5"
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "GOST Sign",
|
||||
input: "Hello, World!",
|
||||
expectedOutput: "810d0c40e965",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "GOST Sign",
|
||||
args: [
|
||||
{ "option": "Hex", "string": "00112233" },
|
||||
{ "option": "Hex", "string": "0011223344556677" },
|
||||
"Raw",
|
||||
"Hex",
|
||||
"GOST 28147 (1989)",
|
||||
"E-C",
|
||||
48
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "GOST Verify",
|
||||
input: "Hello, World!",
|
||||
expectedOutput: "The signature matches",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "GOST Verify",
|
||||
args: [
|
||||
{ "option": "Hex", "string": "00112233" },
|
||||
{ "option": "Hex", "string": "00112233445566778899aabbccddeeff" },
|
||||
{ "option": "Hex", "string": "42b77fb3d6f6bf04" },
|
||||
"Raw",
|
||||
"GOST R 34.12 (Kuznyechik, 2015)",
|
||||
"E-TEST"
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "GOST Key Wrap",
|
||||
input: "Hello, World!123",
|
||||
expectedOutput: "0bb706e92487fceef97589911faeb28200000000000000000000000000000000\r\n6b7bfd16",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "GOST Key Wrap",
|
||||
args: [
|
||||
{ "option": "Hex", "string": "00112233" },
|
||||
{ "option": "Hex", "string": "0011223344556677" },
|
||||
"Raw",
|
||||
"Hex",
|
||||
"GOST R 34.12 (Magma, 2015)",
|
||||
"E-TEST",
|
||||
"CP"
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "GOST Key Unwrap",
|
||||
input: "c8e58458a42d21974d50103d59b469f2c8e58458a42d21974d50103d59b469f2\r\na32a1575",
|
||||
expectedOutput: "0123456789abcdef0123456789abcdef",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "GOST Key Unwrap",
|
||||
args: [
|
||||
{ "option": "Hex", "string": "" },
|
||||
{ "option": "Latin1", "string": "00112233" },
|
||||
"Hex",
|
||||
"Raw",
|
||||
"GOST 28147 (1989)",
|
||||
"E-Z",
|
||||
"CP"
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
]);
|
33
tests/operations/tests/GenerateDeBruijnSequence.mjs
Normal file
33
tests/operations/tests/GenerateDeBruijnSequence.mjs
Normal file
|
@ -0,0 +1,33 @@
|
|||
/**
|
||||
* De Brujin Sequence tests.
|
||||
*
|
||||
* @author gchq77703 [gchq77703@gchq.gov.uk]
|
||||
* @copyright Crown Copyright 2017
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Generate De Bruijn Sequence: Small Sequence",
|
||||
input: "",
|
||||
expectedOutput: "00010111",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Generate De Bruijn Sequence",
|
||||
"args": [2, 3]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Generate De Bruijn Sequence: Long Sequence",
|
||||
input: "",
|
||||
expectedOutput: "0000010000200003000110001200013000210002200023000310003200033001010010200103001110011200113001210012200123001310013200133002010020200203002110021200213002210022200223002310023200233003010030200303003110031200313003210032200323003310033200333010110101201013010210102201023010310103201033011020110301111011120111301121011220112301131011320113301202012030121101212012130122101222012230123101232012330130201303013110131201313013210132201323013310133201333020210202202023020310203202033021030211102112021130212102122021230213102132021330220302211022120221302221022220222302231022320223302303023110231202313023210232202323023310233202333030310303203033031110311203113031210312203123031310313203133032110321203213032210322203223032310323203233033110331203313033210332203323033310333203333111112111131112211123111321113311212112131122211223112321123311312113131132211323113321133312122121231213212133122131222212223122321223312313123221232312332123331313213133132221322313232132331332213323133321333322222322233223232233323233233333",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Generate De Bruijn Sequence",
|
||||
"args": [4, 5]
|
||||
}
|
||||
]
|
||||
}
|
||||
]);
|
180
tests/operations/tests/HKDF.mjs
Normal file
180
tests/operations/tests/HKDF.mjs
Normal file
|
@ -0,0 +1,180 @@
|
|||
/**
|
||||
* @author mikecat
|
||||
* @copyright Crown Copyright 2023
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
"name": "HKDF: RFC5869 Test Case 1",
|
||||
"input": "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
|
||||
"expectedOutput": "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "From Hex",
|
||||
"args": ["None"],
|
||||
},
|
||||
{
|
||||
"op": "Derive HKDF key",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "000102030405060708090a0b0c"},
|
||||
{"option": "Hex", "string": "f0f1f2f3f4f5f6f7f8f9"},
|
||||
"SHA256", "with salt", 42,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "HKDF: RFC5869 Test Case 2",
|
||||
"input": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f",
|
||||
"expectedOutput": "b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec3e87c14c01d5c1f3434f1d87",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "From Hex",
|
||||
"args": ["None"],
|
||||
},
|
||||
{
|
||||
"op": "Derive HKDF key",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf"},
|
||||
{"option": "Hex", "string": "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"},
|
||||
"SHA256", "with salt", 82,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "HKDF: RFC5869 Test Case 3",
|
||||
"input": "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
|
||||
"expectedOutput": "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "From Hex",
|
||||
"args": ["None"],
|
||||
},
|
||||
{
|
||||
"op": "Derive HKDF key",
|
||||
"args": [
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""},
|
||||
"SHA256", "with salt", 42,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "HKDF: RFC5869 Test Case 4",
|
||||
"input": "0b0b0b0b0b0b0b0b0b0b0b",
|
||||
"expectedOutput": "085a01ea1b10f36933068b56efa5ad81a4f14b822f5b091568a9cdd4f155fda2c22e422478d305f3f896",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "From Hex",
|
||||
"args": ["None"],
|
||||
},
|
||||
{
|
||||
"op": "Derive HKDF key",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "000102030405060708090a0b0c"},
|
||||
{"option": "Hex", "string": "f0f1f2f3f4f5f6f7f8f9"},
|
||||
"SHA1", "with salt", 42,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "HKDF: RFC5869 Test Case 5",
|
||||
"input": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f",
|
||||
"expectedOutput": "0bd770a74d1160f7c9f12cd5912a06ebff6adcae899d92191fe4305673ba2ffe8fa3f1a4e5ad79f3f334b3b202b2173c486ea37ce3d397ed034c7f9dfeb15c5e927336d0441f4c4300e2cff0d0900b52d3b4",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "From Hex",
|
||||
"args": ["None"],
|
||||
},
|
||||
{
|
||||
"op": "Derive HKDF key",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf"},
|
||||
{"option": "Hex", "string": "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"},
|
||||
"SHA1", "with salt", 82,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "HKDF: RFC5869 Test Case 6",
|
||||
"input": "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
|
||||
"expectedOutput": "0ac1af7002b3d761d1e55298da9d0506b9ae52057220a306e07b6b87e8df21d0ea00033de03984d34918",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "From Hex",
|
||||
"args": ["None"],
|
||||
},
|
||||
{
|
||||
"op": "Derive HKDF key",
|
||||
"args": [
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""},
|
||||
"SHA1", "with salt", 42,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "HKDF: RFC5869 Test Case 7",
|
||||
"input": "0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c",
|
||||
"expectedOutput": "2c91117204d745f3500d636a62f64f0ab3bae548aa53d423b0d1f27ebba6f5e5673a081d70cce7acfc48",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "From Hex",
|
||||
"args": ["None"],
|
||||
},
|
||||
{
|
||||
"op": "Derive HKDF key",
|
||||
"args": [
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""},
|
||||
"SHA1", "no salt", 42,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "HKDF: RFC5869 Test Case 1 with skip extract",
|
||||
"input": "077709362c2e32df0ddc3f0dc47bba6390b6c73bb50f9c3122ec844ad7c2b3e5",
|
||||
"expectedOutput": "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "From Hex",
|
||||
"args": ["None"],
|
||||
},
|
||||
{
|
||||
"op": "Derive HKDF key",
|
||||
"args": [
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": "f0f1f2f3f4f5f6f7f8f9"},
|
||||
"SHA256", "skip", 42,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "HKDF: too large L",
|
||||
"input": "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
|
||||
"expectedOutput": "L too large (maximum length for SHA256 is 8160)",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "From Hex",
|
||||
"args": ["None"],
|
||||
},
|
||||
{
|
||||
"op": "Derive HKDF key",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "000102030405060708090a0b0c"},
|
||||
{"option": "Hex", "string": "f0f1f2f3f4f5f6f7f8f9"},
|
||||
"SHA256", "with salt", 8161,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
|
@ -1094,8 +1094,8 @@ TestRegister.addTests([
|
|||
expectedOutput: "981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "GOST hash",
|
||||
args: ["D-A"]
|
||||
op: "GOST Hash",
|
||||
args: ["GOST 28147 (1994)", "256", "D-A"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@ -1105,11 +1105,11 @@ TestRegister.addTests([
|
|||
expectedOutput: "2cefc2f7b7bdc514e18ea57fa74ff357e7fa17d652c75f69cb1be7893ede48eb",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "GOST hash",
|
||||
args: ["D-A"]
|
||||
op: "GOST Hash",
|
||||
args: ["GOST 28147 (1994)", "256", "D-A"]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
/* { // This takes a LONG time to run (over a minute usually).
|
||||
name: "Scrypt: RFC test vector 4",
|
||||
input: "pleaseletmein",
|
||||
|
@ -1127,4 +1127,36 @@ TestRegister.addTests([
|
|||
}
|
||||
]
|
||||
}, */
|
||||
{
|
||||
name: "Argon2",
|
||||
input: "argon2password",
|
||||
expectedOutput: "$argon2i$v=19$m=4096,t=3,p=1$c29tZXNhbHQ$s43my9eBljQADuF/LWCG8vGqwAJzOorKQ0Yog8jFvbw",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Argon2",
|
||||
args: [
|
||||
{"option": "UTF8", "string": "somesalt"},
|
||||
3,
|
||||
4096,
|
||||
1,
|
||||
32,
|
||||
"Argon2i",
|
||||
"Encoded hash"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Argon2 compare",
|
||||
input: "argon2password",
|
||||
expectedOutput: "Match: argon2password",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Argon2 compare",
|
||||
args: [
|
||||
"$argon2i$v=19$m=4096,t=3,p=1$c29tZXNhbHQ$s43my9eBljQADuF/LWCG8vGqwAJzOorKQ0Yog8jFvbw"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]);
|
||||
|
|
63
tests/operations/tests/IPv6Transition.mjs
Normal file
63
tests/operations/tests/IPv6Transition.mjs
Normal file
|
@ -0,0 +1,63 @@
|
|||
/**
|
||||
* IPv6Transition tests.
|
||||
*
|
||||
* @author jb30795
|
||||
*
|
||||
* @copyright Crown Copyright 2024
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "IPv6 Transition: IPv4 to IPv6",
|
||||
input: "198.51.100.7",
|
||||
expectedOutput: "6to4: 2002:c633:6407::/48\nIPv4 Mapped: ::ffff:c633:6407\nIPv4 Translated: ::ffff:0:c633:6407\nNat 64: 64:ff9b::c633:6407",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "IPv6 Transition Addresses",
|
||||
args: [true, false],
|
||||
},
|
||||
],
|
||||
}, {
|
||||
name: "IPv6 Transition: IPv4 /24 Range to IPv6",
|
||||
input: "198.51.100.0/24",
|
||||
expectedOutput: "6to4: 2002:c633:6400::/40\nIPv4 Mapped: ::ffff:c633:6400/120\nIPv4 Translated: ::ffff:0:c633:6400/120\nNat 64: 64:ff9b::c633:6400/120",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "IPv6 Transition Addresses",
|
||||
args: [false, false],
|
||||
},
|
||||
],
|
||||
}, {
|
||||
name: "IPv6 Transition: IPv4 to IPv6 Remove headers",
|
||||
input: "198.51.100.7",
|
||||
expectedOutput: "2002:c633:6407::/48\n::ffff:c633:6407\n::ffff:0:c633:6407\n64:ff9b::c633:6407",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "IPv6 Transition Addresses",
|
||||
args: [true, true],
|
||||
},
|
||||
],
|
||||
}, {
|
||||
name: "IPv6 Transition: IPv6 to IPv4",
|
||||
input: "64:ff9b::c633:6407",
|
||||
expectedOutput: "IPv4: 198.51.100.7",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "IPv6 Transition Addresses",
|
||||
args: [true, false],
|
||||
},
|
||||
],
|
||||
}, {
|
||||
name: "IPv6 Transition: MAC to EUI-64",
|
||||
input: "a1:b2:c3:d4:e5:f6",
|
||||
expectedOutput: "EUI-64 Interface ID: a3b2:c3ff:fed4:e5f6",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "IPv6 Transition Addresses",
|
||||
args: [true, false],
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
121
tests/operations/tests/JA4.mjs
Normal file
121
tests/operations/tests/JA4.mjs
Normal file
|
@ -0,0 +1,121 @@
|
|||
/**
|
||||
* JA4 tests.
|
||||
*
|
||||
* @author n1474335 [n1474335@gmail.com]
|
||||
* @copyright Crown Copyright 2024
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "JA4 Fingerprint: TLS 1.3",
|
||||
input: "1603010200010001fc0303b2c03e7ba990ef540c316a665d4d925f8e9079ac4b15687e587dc99016e75a6c20d0b0099243c9296a0c84153ea4ada7d87ad017f4211c2ea1350b0b3cc5514d5f00205a5a130113021303c02bc02fc02cc030cca9cca8c013c014009c009d002f003501000193fafa000000000024002200001f636f6e74656e742d6175746f66696c6c2e676f6f676c65617069732e636f6d0033002b00293a3a000100001d0020fb2cd8ef3d605b96ab03119ec4f30a6e2088cb1af86c41a81feace8706068c50000d001200100403080404010503080505010806060100230000000b00020100ff01000100000a000a00083a3a001d00170018001b000302000244690005000302683200120000002d000201010010000e000c02683208687474702f312e31000500050100000000002b0007060a0a03040303001700001a1a000100001500b800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
expectedOutput: "t13d1516h2_8daaf6152771_e5627efa2ab1",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "JA4 Fingerprint",
|
||||
"args": ["Hex", "JA4"]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "JA4 Fingerprint: TLS 1.3 Original Rendering",
|
||||
input: "1603010200010001fc0303b2c03e7ba990ef540c316a665d4d925f8e9079ac4b15687e587dc99016e75a6c20d0b0099243c9296a0c84153ea4ada7d87ad017f4211c2ea1350b0b3cc5514d5f00205a5a130113021303c02bc02fc02cc030cca9cca8c013c014009c009d002f003501000193fafa000000000024002200001f636f6e74656e742d6175746f66696c6c2e676f6f676c65617069732e636f6d0033002b00293a3a000100001d0020fb2cd8ef3d605b96ab03119ec4f30a6e2088cb1af86c41a81feace8706068c50000d001200100403080404010503080505010806060100230000000b00020100ff01000100000a000a00083a3a001d00170018001b000302000244690005000302683200120000002d000201010010000e000c02683208687474702f312e31000500050100000000002b0007060a0a03040303001700001a1a000100001500b800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
expectedOutput: "t13d1516h2_acb858a92679_5276cb03a33b",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "JA4 Fingerprint",
|
||||
"args": ["Hex", "JA4 Original Rendering"]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "JA4 Fingerprint: TLS 1.2",
|
||||
input: "1603010200010001fc0303ecb2691addb2bf6c599c7aaae23de5f42561cc04eb41029acc6fc050a16ac1d22046f8617b580ac9358e2aa44e306d52466bcc989c87c8ca64309f5faf50ba7b4d0022130113031302c02bc02fcca9cca8c02cc030c00ac009c013c014009c009d002f00350100019100000021001f00001c636f6e74696c652e73657276696365732e6d6f7a696c6c612e636f6d00170000ff01000100000a000e000c001d00170018001901000101000b00020100002300000010000e000c02683208687474702f312e310005000501000000000022000a000804030503060302030033006b0069001d00208909858fbeb6ed2f1248ba5b9e2978bead0e840110192c61daed0096798b184400170041044d183d91f5eed35791fa982464e3b0214aaa5f5d1b78616d9b9fbebc22d11f535b2f94c686143136aa795e6e5a875d6c08064ad5b76d44caad766e2483012748002b00050403040303000d0018001604030503060308040805080604010501060102030201002d00020101001c000240010015007a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
expectedOutput: "t13d1715h2_5b57614c22b0_3d5424432f57",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "JA4 Fingerprint",
|
||||
"args": ["Hex", "JA4"]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "JA4 Fingerprint: TLS 1.2 Original Rendering",
|
||||
input: "1603010200010001fc0303ecb2691addb2bf6c599c7aaae23de5f42561cc04eb41029acc6fc050a16ac1d22046f8617b580ac9358e2aa44e306d52466bcc989c87c8ca64309f5faf50ba7b4d0022130113031302c02bc02fcca9cca8c02cc030c00ac009c013c014009c009d002f00350100019100000021001f00001c636f6e74696c652e73657276696365732e6d6f7a696c6c612e636f6d00170000ff01000100000a000e000c001d00170018001901000101000b00020100002300000010000e000c02683208687474702f312e310005000501000000000022000a000804030503060302030033006b0069001d00208909858fbeb6ed2f1248ba5b9e2978bead0e840110192c61daed0096798b184400170041044d183d91f5eed35791fa982464e3b0214aaa5f5d1b78616d9b9fbebc22d11f535b2f94c686143136aa795e6e5a875d6c08064ad5b76d44caad766e2483012748002b00050403040303000d0018001604030503060308040805080604010501060102030201002d00020101001c000240010015007a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
expectedOutput: "t13d1715h2_5b234860e130_014157ec0da2",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "JA4 Fingerprint",
|
||||
"args": ["Hex", "JA4 Original Rendering"]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "JA4Server Fingerprint: TLS 1.2 h2 ALPN",
|
||||
input: "16030300640200006003035f0236c07f47bfb12dc2da706ecb3fe7f9eeac9968cc2ddf444f574e4752440120b89ff1ab695278c69b8a73f76242ef755e0b13dc6d459aaaa784fec9c2dfce34cca900001800000000ff01000100000b00020100001000050003026832",
|
||||
expectedOutput: "t1204h2_cca9_1428ce7b4018",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "JA4Server Fingerprint",
|
||||
"args": ["Hex", "JA4S"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "JA4Server Fingerprint: TLS 1.2 h2 ALPN Raw",
|
||||
input: "16030300640200006003035f0236c07f47bfb12dc2da706ecb3fe7f9eeac9968cc2ddf444f574e4752440120b89ff1ab695278c69b8a73f76242ef755e0b13dc6d459aaaa784fec9c2dfce34cca900001800000000ff01000100000b00020100001000050003026832",
|
||||
expectedOutput: "t1204h2_cca9_0000,ff01,000b,0010",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "JA4Server Fingerprint",
|
||||
"args": ["Hex", "JA4S Raw"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "JA4Server Fingerprint: TLS 1.3",
|
||||
input: "160303007a020000760303236d214556452c55a0754487e64b1a8b0262c50ba23004c9d504166a6de3439920d0b0099243c9296a0c84153ea4ada7d87ad017f4211c2ea1350b0b3cc5514d5f130100002e00330024001d002099e3cc43a2c9941ae75af1b2c7a629bee3ee7031973cad85c82f2f23677fb244002b00020304",
|
||||
expectedOutput: "t130200_1301_234ea6891581",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "JA4Server Fingerprint",
|
||||
"args": ["Hex", "JA4S"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "JA4Server Fingerprint: TLS 1.3 Raw",
|
||||
input: "160303007a020000760303236d214556452c55a0754487e64b1a8b0262c50ba23004c9d504166a6de3439920d0b0099243c9296a0c84153ea4ada7d87ad017f4211c2ea1350b0b3cc5514d5f130100002e00330024001d002099e3cc43a2c9941ae75af1b2c7a629bee3ee7031973cad85c82f2f23677fb244002b00020304",
|
||||
expectedOutput: "t130200_1301_0033,002b",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "JA4Server Fingerprint",
|
||||
"args": ["Hex", "JA4S Raw"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "JA4Server Fingerprint: TLS 1.3 non-ascii ALPN",
|
||||
input: "160303007a020000760303897c232e3ee313314f2b662307ff4f7e2cf1caeec1b27711bca77f469519168520bc58b92f865e6b9aa4a6371cadcb0afe1da1c0f705209a11d52357f56d5dd962130100002e00330024001d002076b8b7ed0f96b63a773d85ab6f3a87a151c130529785b41a4defb53184055957002b00020304",
|
||||
expectedOutput: "t130200_1301_234ea6891581",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "JA4Server Fingerprint",
|
||||
"args": ["Hex", "JA4S"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "JA4Server Fingerprint: TLS 1.3 non-ascii ALPN Raw",
|
||||
input: "160303007a020000760303897c232e3ee313314f2b662307ff4f7e2cf1caeec1b27711bca77f469519168520bc58b92f865e6b9aa4a6371cadcb0afe1da1c0f705209a11d52357f56d5dd962130100002e00330024001d002076b8b7ed0f96b63a773d85ab6f3a87a151c130529785b41a4defb53184055957002b00020304",
|
||||
expectedOutput: "t130200_1301_0033,002b",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "JA4Server Fingerprint",
|
||||
"args": ["Hex", "JA4S Raw"]
|
||||
}
|
||||
]
|
||||
},
|
||||
]);
|
359
tests/operations/tests/JWK.mjs
Normal file
359
tests/operations/tests/JWK.mjs
Normal file
|
@ -0,0 +1,359 @@
|
|||
/**
|
||||
* JWK conversion
|
||||
*
|
||||
* @author cplussharp
|
||||
* @copyright Crown Copyright 2021
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
// test data for RSA key pair
|
||||
const RSA_512 = {
|
||||
private: {
|
||||
pem1: `-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIBOQIBAAJBAPKr0Dp6YdItzOfk6a7ma7L4BF4LnelMYKtboGLrk6ihtqFPZFRL
|
||||
NcJi68Hvnt8stMrP50t6jqwWQ2EjMdkj6fsCAwEAAQJAOJUpM0lv36MAQR3WAwsF
|
||||
F7DOy+LnigteCvaNWiNVxZ6jByB5Qb7sall/Qlu9sFI0ZwrlVcKS0kldee7JTYlL
|
||||
WQIhAP3UKEfOtpTgT1tYmdhaqjxqMfxBom0Ri+rt9ajlzs6vAiEA9L85B8/Gnb7p
|
||||
6Af7/wpmafL277OV4X4xBfzMR+TUzHUCIBq+VLQkInaTH6lXL3ZtLwyIf9W9MJjf
|
||||
RWeuRLjT5bM/AiBF7Kw6kx5Hy1fAtydEApCoDIaIjWJw/kC7WTJ0B+jUUQIgV6dw
|
||||
NSyj0feakeD890gmId+lvl/w/3oUXiczqvl/N9o=
|
||||
-----END RSA PRIVATE KEY-----`,
|
||||
pem8: `-----BEGIN PRIVATE KEY-----
|
||||
MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA8qvQOnph0i3M5+Tp
|
||||
ruZrsvgEXgud6Uxgq1ugYuuTqKG2oU9kVEs1wmLrwe+e3yy0ys/nS3qOrBZDYSMx
|
||||
2SPp+wIDAQABAkA4lSkzSW/fowBBHdYDCwUXsM7L4ueKC14K9o1aI1XFnqMHIHlB
|
||||
vuxqWX9CW72wUjRnCuVVwpLSSV157slNiUtZAiEA/dQoR862lOBPW1iZ2FqqPGox
|
||||
/EGibRGL6u31qOXOzq8CIQD0vzkHz8advunoB/v/CmZp8vbvs5XhfjEF/MxH5NTM
|
||||
dQIgGr5UtCQidpMfqVcvdm0vDIh/1b0wmN9FZ65EuNPlsz8CIEXsrDqTHkfLV8C3
|
||||
J0QCkKgMhoiNYnD+QLtZMnQH6NRRAiBXp3A1LKPR95qR4Pz3SCYh36W+X/D/ehRe
|
||||
JzOq+X832g==
|
||||
-----END PRIVATE KEY-----`,
|
||||
jwk: {
|
||||
"kty": "RSA",
|
||||
"n": "8qvQOnph0i3M5-TpruZrsvgEXgud6Uxgq1ugYuuTqKG2oU9kVEs1wmLrwe-e3yy0ys_nS3qOrBZDYSMx2SPp-w",
|
||||
"e": "AQAB",
|
||||
"d": "OJUpM0lv36MAQR3WAwsFF7DOy-LnigteCvaNWiNVxZ6jByB5Qb7sall_Qlu9sFI0ZwrlVcKS0kldee7JTYlLWQ",
|
||||
"p": "_dQoR862lOBPW1iZ2FqqPGox_EGibRGL6u31qOXOzq8",
|
||||
"q": "9L85B8_Gnb7p6Af7_wpmafL277OV4X4xBfzMR-TUzHU",
|
||||
"dp": "Gr5UtCQidpMfqVcvdm0vDIh_1b0wmN9FZ65EuNPlsz8",
|
||||
"dq": "ReysOpMeR8tXwLcnRAKQqAyGiI1icP5Au1kydAfo1FE",
|
||||
"qi": "V6dwNSyj0feakeD890gmId-lvl_w_3oUXiczqvl_N9o"
|
||||
}
|
||||
},
|
||||
public: {
|
||||
pem1: `-----BEGIN RSA PUBLIC KEY-----
|
||||
MEgCQQDyq9A6emHSLczn5Omu5muy+AReC53pTGCrW6Bi65OoobahT2RUSzXCYuvB
|
||||
757fLLTKz+dLeo6sFkNhIzHZI+n7AgMBAAE=
|
||||
-----END RSA PUBLIC KEY-----`,
|
||||
pem8: `-----BEGIN PUBLIC KEY-----
|
||||
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAPKr0Dp6YdItzOfk6a7ma7L4BF4LnelM
|
||||
YKtboGLrk6ihtqFPZFRLNcJi68Hvnt8stMrP50t6jqwWQ2EjMdkj6fsCAwEAAQ==
|
||||
-----END PUBLIC KEY-----`,
|
||||
cert: `-----BEGIN CERTIFICATE-----
|
||||
MIIBfTCCASegAwIBAgIUeisK5Nwss2DGg5PCs4uSxxXyyNkwDQYJKoZIhvcNAQEL
|
||||
BQAwEzERMA8GA1UEAwwIUlNBIHRlc3QwHhcNMjExMTE5MTcyMDI2WhcNMzExMTE3
|
||||
MTcyMDI2WjATMREwDwYDVQQDDAhSU0EgdGVzdDBcMA0GCSqGSIb3DQEBAQUAA0sA
|
||||
MEgCQQDyq9A6emHSLczn5Omu5muy+AReC53pTGCrW6Bi65OoobahT2RUSzXCYuvB
|
||||
757fLLTKz+dLeo6sFkNhIzHZI+n7AgMBAAGjUzBRMB0GA1UdDgQWBBRO+jvkqq5p
|
||||
pnQgwMMnRoun6e7eiTAfBgNVHSMEGDAWgBRO+jvkqq5ppnQgwMMnRoun6e7eiTAP
|
||||
BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA0EAR/5HAZM5qBhU/ezDUIFx
|
||||
gmUGoFbIb5kJD41YCnaSdrgWglh4He4melSs42G/oxBBjuCJ0bUpqWnLl+lJkv1z
|
||||
IA==
|
||||
-----END CERTIFICATE-----`,
|
||||
jwk: {
|
||||
"kty": "RSA",
|
||||
"n": "8qvQOnph0i3M5-TpruZrsvgEXgud6Uxgq1ugYuuTqKG2oU9kVEs1wmLrwe-e3yy0ys_nS3qOrBZDYSMx2SPp-w",
|
||||
"e": "AQAB"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// test data for EC key pair
|
||||
const EC_P256 = {
|
||||
private: {
|
||||
pem1: `-----BEGIN EC PRIVATE KEY-----
|
||||
MHcCAQEEINtTjwUkgfAiSwqgcGAXWyE0ueIW6n2k395dmQZ3vGr4oAoGCCqGSM49
|
||||
AwEHoUQDQgAEDUc8A0EDNKoCYIPWMHz1yUzqE5mJgusgcAE8H6810fkJ8ZmTNiCC
|
||||
a6sLgR2vD1VNh2diirWgKPH4PVMKav5e6Q==
|
||||
-----END EC PRIVATE KEY-----`,
|
||||
pem8: `-----BEGIN PRIVATE KEY-----
|
||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg21OPBSSB8CJLCqBw
|
||||
YBdbITS54hbqfaTf3l2ZBne8avihRANCAAQNRzwDQQM0qgJgg9YwfPXJTOoTmYmC
|
||||
6yBwATwfrzXR+QnxmZM2IIJrqwuBHa8PVU2HZ2KKtaAo8fg9Uwpq/l7p
|
||||
-----END PRIVATE KEY-----`,
|
||||
jwk: {
|
||||
"kty": "EC",
|
||||
"crv": "P-256",
|
||||
"x": "DUc8A0EDNKoCYIPWMHz1yUzqE5mJgusgcAE8H6810fk",
|
||||
"y": "CfGZkzYggmurC4Edrw9VTYdnYoq1oCjx-D1TCmr-Xuk",
|
||||
"d": "21OPBSSB8CJLCqBwYBdbITS54hbqfaTf3l2ZBne8avg"
|
||||
}
|
||||
},
|
||||
public: {
|
||||
pem8: `-----BEGIN PUBLIC KEY-----
|
||||
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDUc8A0EDNKoCYIPWMHz1yUzqE5mJ
|
||||
gusgcAE8H6810fkJ8ZmTNiCCa6sLgR2vD1VNh2diirWgKPH4PVMKav5e6Q==
|
||||
-----END PUBLIC KEY-----`,
|
||||
cert: `-----BEGIN CERTIFICATE-----
|
||||
MIIBfzCCASWgAwIBAgIUK4H8J3Hr7NpRLPrACj8Pje4JJJ0wCgYIKoZIzj0EAwIw
|
||||
FTETMBEGA1UEAwwKUC0yNTYgdGVzdDAeFw0yMTExMTkxNzE5NDVaFw0zMTExMTcx
|
||||
NzE5NDVaMBUxEzARBgNVBAMMClAtMjU2IHRlc3QwWTATBgcqhkjOPQIBBggqhkjO
|
||||
PQMBBwNCAAQNRzwDQQM0qgJgg9YwfPXJTOoTmYmC6yBwATwfrzXR+QnxmZM2IIJr
|
||||
qwuBHa8PVU2HZ2KKtaAo8fg9Uwpq/l7po1MwUTAdBgNVHQ4EFgQU/SxodXrpkybM
|
||||
gcIgkxnRKd7HMzowHwYDVR0jBBgwFoAU/SxodXrpkybMgcIgkxnRKd7HMzowDwYD
|
||||
VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNIADBFAiBU9PrOa/kXCpTTBInRf/sN
|
||||
ac2iDHmbdpWzcXI+xLKNYAIhAIRR1LRSHVwOTLQ/iBXd+8LCkm5aTB27RW46LN80
|
||||
ylxt
|
||||
-----END CERTIFICATE-----`,
|
||||
jwk: {
|
||||
"kty": "EC",
|
||||
"crv": "P-256",
|
||||
"x": "DUc8A0EDNKoCYIPWMHz1yUzqE5mJgusgcAE8H6810fk",
|
||||
"y": "CfGZkzYggmurC4Edrw9VTYdnYoq1oCjx-D1TCmr-Xuk"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const PEM_PRIV_DSA1024 = `-----BEGIN DSA PRIVATE KEY-----
|
||||
MIIBuwIBAAKBgQCkFEttBrPHEJRgcvaT8HbZs9h1pVQLHhn2F452izusRox1czMM
|
||||
IC8Z7YQiM1pt6bgEmf0h8ldx6UFT0YL9JWSbyBy1U5pHKfnz/xjeg7ZMReL4F0/T
|
||||
Gwmu4ercqfM//TmEg9nL3nDxb4WmF2al/SmHN3qlzYmYaIDEFfEuu8vWbwIVAMOq
|
||||
7pqQiMGUu6uJY/nQTWW0c3IfAoGARWryStp2AElj538qN9tWRuyobRA93Q1ujrdM
|
||||
EqsqVpMZd1a8qtRyMaZVVdB7N3EweNUuFOoSAp10s/SQEH9qhVo6NwvzhB7lEtm4
|
||||
5FjWW9+9WCuuFOGZpTy8PSFAvQcfUqunP/DeaDliNmgKci+n0nfIBakuQn10Zmqk
|
||||
vGu8NZICgYBUsoQeXSJ19e6XZenk6G8wVI3yXFqnRAwb6s7sAVoPwfDCsOXTxC7W
|
||||
Mlfz0HcYMiifFKEd28NnuAZ2e0ngyPHsb9s5phzTgRfO3GFzOjsjwgx3DmQI2Ck2
|
||||
yOWHSAtaNhH4DoBZEyNsb1akiB50vx9b09EHN4weqbgAu743NMDHRQIVAIG5uiiO
|
||||
OnWUYieHAiVIPkBCrYUd
|
||||
-----END DSA PRIVATE KEY-----`;
|
||||
|
||||
// https://datatracker.ietf.org/doc/html/rfc8037#appendix-A.2
|
||||
const JWK_PUB_ED25591 = {
|
||||
"kty": "OKP",
|
||||
"crv": "Ed25519",
|
||||
"x": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo"
|
||||
};
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "PEM to JWK: Missing footer",
|
||||
input: RSA_512.private.pem1.substring(0, RSA_512.private.pem1.length / 2),
|
||||
expectedOutput: "PEM footer '-----END RSA PRIVATE KEY-----' not found",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "PEM to JWK",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "PEM to JWK: DSA not supported",
|
||||
input: PEM_PRIV_DSA1024,
|
||||
expectedOutput: "DSA keys are not supported for JWK",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "PEM to JWK",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
// test RSA key convertion
|
||||
{
|
||||
name: "PEM to JWK: RSA Private Key PKCS1",
|
||||
input: RSA_512.private.pem1,
|
||||
expectedOutput: JSON.stringify(RSA_512.private.jwk),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "PEM to JWK",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "PEM to JWK: RSA Private Key PKCS8",
|
||||
input: RSA_512.private.pem8,
|
||||
expectedOutput: JSON.stringify(RSA_512.private.jwk),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "PEM to JWK",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "PEM to JWK: RSA Public Key PKCS1",
|
||||
input: RSA_512.public.pem1,
|
||||
expectedOutput: "Unsupported RSA public key format. Only PKCS#8 is supported.",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "PEM to JWK",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "PEM to JWK: RSA Public Key PKCS8",
|
||||
input: RSA_512.public.pem8,
|
||||
expectedOutput: JSON.stringify(RSA_512.public.jwk),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "PEM to JWK",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "PEM to JWK: Certificate with RSA Public Key",
|
||||
input: RSA_512.public.cert,
|
||||
expectedOutput: JSON.stringify(RSA_512.public.jwk),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "PEM to JWK",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
// test EC key conversion
|
||||
{
|
||||
name: "PEM to JWK: EC Private Key PKCS1",
|
||||
input: EC_P256.private.pem1,
|
||||
expectedOutput: JSON.stringify(EC_P256.private.jwk),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "PEM to JWK",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "PEM to JWK: EC Private Key PKCS8",
|
||||
input: EC_P256.private.pem8,
|
||||
expectedOutput: JSON.stringify(EC_P256.private.jwk),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "PEM to JWK",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "PEM to JWK: EC Public Key",
|
||||
input: EC_P256.public.pem8,
|
||||
expectedOutput: JSON.stringify(EC_P256.public.jwk),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "PEM to JWK",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "PEM to JWK: Certificate with EC Public Key",
|
||||
input: EC_P256.public.cert,
|
||||
expectedOutput: JSON.stringify(EC_P256.public.jwk),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "PEM to JWK",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
name: "JWK to PEM: not a JWK",
|
||||
input: "\"foobar\"",
|
||||
expectedOutput: "Input is not a JSON Web Key",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "JWK to PEM",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "JWK to PEM: unsupported key type",
|
||||
input: JSON.stringify(JWK_PUB_ED25591),
|
||||
expectedOutput: "Unsupported JWK key type 'OKP'",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "JWK to PEM",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
// test RSA key conversion
|
||||
{
|
||||
name: "JWK to PEM: RSA Private Key",
|
||||
input: JSON.stringify(RSA_512.private.jwk),
|
||||
expectedOutput: RSA_512.private.pem8.replace(/\r/g, "").replace(/\n/g, "\r\n")+"\r\n",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "JWK to PEM",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "JWK to PEM: RSA Public Key",
|
||||
input: JSON.stringify(RSA_512.public.jwk),
|
||||
expectedOutput: RSA_512.public.pem8.replace(/\r/g, "").replace(/\n/g, "\r\n")+"\r\n",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "JWK to PEM",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
// test EC key conversion
|
||||
{
|
||||
name: "JWK to PEM: EC Private Key",
|
||||
input: JSON.stringify(EC_P256.private.jwk),
|
||||
expectedOutput: EC_P256.private.pem8.replace(/\r/g, "").replace(/\n/g, "\r\n")+"\r\n",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "JWK to PEM",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "JWK to PEM: EC Public Key",
|
||||
input: JSON.stringify(EC_P256.public.jwk),
|
||||
expectedOutput: EC_P256.public.pem8.replace(/\r/g, "").replace(/\n/g, "\r\n")+"\r\n",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "JWK to PEM",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
{
|
||||
name: "JWK to PEM: Array of keys",
|
||||
input: JSON.stringify([RSA_512.public.jwk, EC_P256.public.jwk]),
|
||||
expectedOutput: (RSA_512.public.pem8 + "\n" + EC_P256.public.pem8 + "\n").replace(/\r/g, "").replace(/\n/g, "\r\n"),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "JWK to PEM",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "JWK to PEM: JSON Web Key Set",
|
||||
input: JSON.stringify({"keys": [RSA_512.public.jwk, EC_P256.public.jwk]}),
|
||||
expectedOutput: (RSA_512.public.pem8 + "\n" + EC_P256.public.pem8 + "\n").replace(/\r/g, "").replace(/\n/g, "\r\n"),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "JWK to PEM",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
}
|
||||
]);
|
|
@ -44,7 +44,18 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "JWT Sign",
|
||||
args: [hsKey, "HS256"],
|
||||
args: [hsKey, "HS256", "{}"],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "JWT Sign: HS256 with custom header",
|
||||
input: inputObject,
|
||||
expectedOutput: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImN1c3RvbS5rZXkifQ.eyJTdHJpbmciOiJTb21lU3RyaW5nIiwiTnVtYmVyIjo0MiwiaWF0IjoxfQ.kXln8btJburfRlND8IDZAQ8NZGFFZhvHyooHa6N9za8",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "JWT Sign",
|
||||
args: [hsKey, "HS256", `{"kid":"custom.key"}`],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
@ -55,7 +66,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "JWT Sign",
|
||||
args: [hsKey, "HS384"],
|
||||
args: [hsKey, "HS384", "{}"],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
@ -66,7 +77,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "JWT Sign",
|
||||
args: [hsKey, "HS512"],
|
||||
args: [hsKey, "HS512", "{}"],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
@ -77,7 +88,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "JWT Sign",
|
||||
args: [esKey, "ES256"],
|
||||
args: [esKey, "ES256", "{}"],
|
||||
},
|
||||
{
|
||||
op: "JWT Decode",
|
||||
|
@ -92,7 +103,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "JWT Sign",
|
||||
args: [esKey, "ES384"],
|
||||
args: [esKey, "ES384", "{}"],
|
||||
},
|
||||
{
|
||||
op: "JWT Decode",
|
||||
|
@ -107,7 +118,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "JWT Sign",
|
||||
args: [esKey, "ES512"],
|
||||
args: [esKey, "ES512", "{}"],
|
||||
},
|
||||
{
|
||||
op: "JWT Decode",
|
||||
|
@ -122,7 +133,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "JWT Sign",
|
||||
args: [rsKey, "RS256"],
|
||||
args: [rsKey, "RS256", "{}"],
|
||||
},
|
||||
{
|
||||
op: "JWT Decode",
|
||||
|
@ -137,7 +148,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "JWT Sign",
|
||||
args: [rsKey, "RS384"],
|
||||
args: [rsKey, "RS384", "{}"],
|
||||
},
|
||||
{
|
||||
op: "JWT Decode",
|
||||
|
@ -152,7 +163,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "JWT Sign",
|
||||
args: [esKey, "RS512"],
|
||||
args: [esKey, "RS512", "{}"],
|
||||
},
|
||||
{
|
||||
op: "JWT Decode",
|
||||
|
|
22
tests/operations/tests/LZNT1Decompress.mjs
Normal file
22
tests/operations/tests/LZNT1Decompress.mjs
Normal file
|
@ -0,0 +1,22 @@
|
|||
/**
|
||||
* LZNT1 Decompress tests.
|
||||
*
|
||||
* @author 0xThiebaut [thiebaut.dev]
|
||||
* @copyright Crown Copyright 2023
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "LZNT1 Decompress",
|
||||
input: "\x1a\xb0\x00compress\x00edtestda\x04ta\x07\x88alot",
|
||||
expectedOutput: "compressedtestdatacompressedalot",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "LZNT1 Decompress",
|
||||
args: []
|
||||
}
|
||||
],
|
||||
}
|
||||
]);
|
165
tests/operations/tests/LevenshteinDistance.mjs
Normal file
165
tests/operations/tests/LevenshteinDistance.mjs
Normal file
|
@ -0,0 +1,165 @@
|
|||
/**
|
||||
* @author mikecat
|
||||
* @copyright Crown Copyright 2023
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
"name": "Levenshtein Distance: Wikipedia example 1",
|
||||
"input": "kitten\nsitting",
|
||||
"expectedOutput": "3",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Levenshtein Distance",
|
||||
"args": [
|
||||
"\\n", 1, 1, 1,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "Levenshtein Distance: Wikipedia example 2",
|
||||
"input": "saturday\nsunday",
|
||||
"expectedOutput": "3",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Levenshtein Distance",
|
||||
"args": [
|
||||
"\\n", 1, 1, 1,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "Levenshtein Distance: Wikipedia example 1 with substitution cost 2",
|
||||
"input": "kitten\nsitting",
|
||||
"expectedOutput": "5",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Levenshtein Distance",
|
||||
"args": [
|
||||
"\\n", 1, 1, 2,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "Levenshtein Distance: varied costs 1",
|
||||
"input": "kitten\nsitting",
|
||||
"expectedOutput": "230",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Levenshtein Distance",
|
||||
"args": [
|
||||
"\\n", 10, 100, 1000,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "Levenshtein Distance: varied costs 2",
|
||||
"input": "kitten\nsitting",
|
||||
"expectedOutput": "1020",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Levenshtein Distance",
|
||||
"args": [
|
||||
"\\n", 1000, 100, 10,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "Levenshtein Distance: another delimiter",
|
||||
"input": "kitten sitting",
|
||||
"expectedOutput": "3",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Levenshtein Distance",
|
||||
"args": [
|
||||
" ", 1, 1, 1,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "Levenshtein Distance: too few samples",
|
||||
"input": "kitten",
|
||||
"expectedOutput": "Incorrect number of samples. Check your input and/or delimiter.",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Levenshtein Distance",
|
||||
"args": [
|
||||
"\\n", 1, 1, 1,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "Levenshtein Distance: too many samples",
|
||||
"input": "kitten\nsitting\nkitchen",
|
||||
"expectedOutput": "Incorrect number of samples. Check your input and/or delimiter.",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Levenshtein Distance",
|
||||
"args": [
|
||||
"\\n", 1, 1, 1,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "Levenshtein Distance: negative insertion cost",
|
||||
"input": "kitten\nsitting",
|
||||
"expectedOutput": "Negative costs are not allowed.",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Levenshtein Distance",
|
||||
"args": [
|
||||
"\\n", -1, 1, 1,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "Levenshtein Distance: negative deletion cost",
|
||||
"input": "kitten\nsitting",
|
||||
"expectedOutput": "Negative costs are not allowed.",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Levenshtein Distance",
|
||||
"args": [
|
||||
"\\n", 1, -1, 1,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "Levenshtein Distance: negative substitution cost",
|
||||
"input": "kitten\nsitting",
|
||||
"expectedOutput": "Negative costs are not allowed.",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Levenshtein Distance",
|
||||
"args": [
|
||||
"\\n", 1, 1, -1,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "Levenshtein Distance: cost zero",
|
||||
"input": "kitten\nsitting",
|
||||
"expectedOutput": "0",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Levenshtein Distance",
|
||||
"args": [
|
||||
"\\n", 0, 0, 0,
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
|
@ -2,11 +2,392 @@
|
|||
* From Decimal tests
|
||||
*
|
||||
* @author n1073645 [n1073645@gmail.com]
|
||||
* @author k3ach [k3ach@proton.me]
|
||||
* @copyright Crown Copyright 2020
|
||||
* @licence Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
const testCases = [
|
||||
{
|
||||
radix: 2,
|
||||
input: "01",
|
||||
checksum: "1",
|
||||
checkdigit: "1",
|
||||
}, {
|
||||
radix: 2,
|
||||
input: "001111",
|
||||
checksum: "0",
|
||||
checkdigit: "0",
|
||||
}, {
|
||||
radix: 2,
|
||||
input: "00011101",
|
||||
checksum: "0",
|
||||
checkdigit: "0",
|
||||
}, {
|
||||
radix: 2,
|
||||
input: "0100101101",
|
||||
checksum: "1",
|
||||
checkdigit: "1",
|
||||
}, {
|
||||
radix: 4,
|
||||
input: "0123",
|
||||
checksum: "1",
|
||||
checkdigit: "1",
|
||||
}, {
|
||||
radix: 4,
|
||||
input: "130100",
|
||||
checksum: "2",
|
||||
checkdigit: "2",
|
||||
}, {
|
||||
radix: 4,
|
||||
input: "32020313",
|
||||
checksum: "3",
|
||||
checkdigit: "0",
|
||||
}, {
|
||||
radix: 4,
|
||||
input: "302233210112",
|
||||
checksum: "3",
|
||||
checkdigit: "0",
|
||||
}, {
|
||||
radix: 6,
|
||||
input: "012345",
|
||||
checksum: "4",
|
||||
checkdigit: "4",
|
||||
}, {
|
||||
radix: 6,
|
||||
input: "134255",
|
||||
checksum: "2",
|
||||
checkdigit: "4",
|
||||
}, {
|
||||
radix: 6,
|
||||
input: "15021453",
|
||||
checksum: "5",
|
||||
checkdigit: "4",
|
||||
}, {
|
||||
radix: 6,
|
||||
input: "211450230513",
|
||||
checksum: "3",
|
||||
checkdigit: "1",
|
||||
}, {
|
||||
radix: 8,
|
||||
input: "01234567",
|
||||
checksum: "2",
|
||||
checkdigit: "2",
|
||||
}, {
|
||||
radix: 8,
|
||||
input: "340624",
|
||||
checksum: "0",
|
||||
checkdigit: "4",
|
||||
}, {
|
||||
radix: 8,
|
||||
input: "07260247",
|
||||
checksum: "3",
|
||||
checkdigit: "3",
|
||||
}, {
|
||||
radix: 8,
|
||||
input: "026742114675",
|
||||
checksum: "7",
|
||||
checkdigit: "1",
|
||||
}, {
|
||||
radix: 10,
|
||||
input: "0123456789",
|
||||
checksum: "7",
|
||||
checkdigit: "7",
|
||||
}, {
|
||||
radix: 10,
|
||||
input: "468543",
|
||||
checksum: "7",
|
||||
checkdigit: "4",
|
||||
}, {
|
||||
radix: 10,
|
||||
input: "59377601",
|
||||
checksum: "5",
|
||||
checkdigit: "6",
|
||||
}, {
|
||||
radix: 10,
|
||||
input: "013909981254",
|
||||
checksum: "1",
|
||||
checkdigit: "3",
|
||||
}, {
|
||||
radix: 12,
|
||||
input: "0123456789ab",
|
||||
checksum: "3",
|
||||
checkdigit: "3",
|
||||
}, {
|
||||
radix: 12,
|
||||
input: "284685",
|
||||
checksum: "0",
|
||||
checkdigit: "6",
|
||||
}, {
|
||||
radix: 12,
|
||||
input: "951a2661",
|
||||
checksum: "0",
|
||||
checkdigit: "8",
|
||||
}, {
|
||||
radix: 12,
|
||||
input: "898202676387",
|
||||
checksum: "b",
|
||||
checkdigit: "9",
|
||||
}, {
|
||||
radix: 14,
|
||||
input: "0123456789abcd",
|
||||
checksum: "a",
|
||||
checkdigit: "a",
|
||||
}, {
|
||||
radix: 14,
|
||||
input: "33db25",
|
||||
checksum: "0",
|
||||
checkdigit: "d",
|
||||
}, {
|
||||
radix: 14,
|
||||
input: "0b4ac128",
|
||||
checksum: "b",
|
||||
checkdigit: "3",
|
||||
}, {
|
||||
radix: 14,
|
||||
input: "3d1c6d16160d",
|
||||
checksum: "3",
|
||||
checkdigit: "c",
|
||||
}, {
|
||||
radix: 16,
|
||||
input: "0123456789abcdef",
|
||||
checksum: "4",
|
||||
checkdigit: "4",
|
||||
}, {
|
||||
radix: 16,
|
||||
input: "e1fe64",
|
||||
checksum: "b",
|
||||
checkdigit: "6",
|
||||
}, {
|
||||
radix: 16,
|
||||
input: "241a5dcd",
|
||||
checksum: "1",
|
||||
checkdigit: "9",
|
||||
}, {
|
||||
radix: 16,
|
||||
input: "1fea740e0e1f",
|
||||
checksum: "7",
|
||||
checkdigit: "4",
|
||||
}, {
|
||||
radix: 18,
|
||||
input: "0123456789abcdefgh",
|
||||
checksum: "d",
|
||||
checkdigit: "d",
|
||||
}, {
|
||||
radix: 18,
|
||||
input: "995dgf",
|
||||
checksum: "9",
|
||||
checkdigit: "1",
|
||||
}, {
|
||||
radix: 18,
|
||||
input: "9f80h32h",
|
||||
checksum: "1",
|
||||
checkdigit: "0",
|
||||
}, {
|
||||
radix: 18,
|
||||
input: "5f9428e493g4",
|
||||
checksum: "8",
|
||||
checkdigit: "c",
|
||||
}, {
|
||||
radix: 20,
|
||||
input: "0123456789abcdefghij",
|
||||
checksum: "5",
|
||||
checkdigit: "5",
|
||||
}, {
|
||||
radix: 20,
|
||||
input: "918jci",
|
||||
checksum: "h",
|
||||
checkdigit: "d",
|
||||
}, {
|
||||
radix: 20,
|
||||
input: "jab7j50d",
|
||||
checksum: "g",
|
||||
checkdigit: "j",
|
||||
}, {
|
||||
radix: 20,
|
||||
input: "c56fe85eb6gg",
|
||||
checksum: "g",
|
||||
checkdigit: "5",
|
||||
}, {
|
||||
radix: 22,
|
||||
input: "0123456789abcdefghijkl",
|
||||
checksum: "g",
|
||||
checkdigit: "g",
|
||||
}, {
|
||||
radix: 22,
|
||||
input: "de57le",
|
||||
checksum: "5",
|
||||
checkdigit: "l",
|
||||
}, {
|
||||
radix: 22,
|
||||
input: "e3fg6dfc",
|
||||
checksum: "f",
|
||||
checkdigit: "d",
|
||||
}, {
|
||||
radix: 22,
|
||||
input: "1f8l80ai4kbg",
|
||||
checksum: "l",
|
||||
checkdigit: "f",
|
||||
}, {
|
||||
radix: 24,
|
||||
input: "0123456789abcdefghijklmn",
|
||||
checksum: "6",
|
||||
checkdigit: "6",
|
||||
}, {
|
||||
radix: 24,
|
||||
input: "agne7d",
|
||||
checksum: "4",
|
||||
checkdigit: "f",
|
||||
}, {
|
||||
radix: 24,
|
||||
input: "1l4d9cf4",
|
||||
checksum: "d",
|
||||
checkdigit: "c",
|
||||
}, {
|
||||
radix: 24,
|
||||
input: "blc1j09i3296",
|
||||
checksum: "8",
|
||||
checkdigit: "7",
|
||||
}, {
|
||||
radix: 26,
|
||||
input: "0123456789abcdefghijklmnop",
|
||||
checksum: "j",
|
||||
checkdigit: "j",
|
||||
}, {
|
||||
radix: 26,
|
||||
input: "82n9op",
|
||||
checksum: "i",
|
||||
checkdigit: "2",
|
||||
}, {
|
||||
radix: 26,
|
||||
input: "e9cddn70",
|
||||
checksum: "9",
|
||||
checkdigit: "i",
|
||||
}, {
|
||||
radix: 26,
|
||||
input: "ck0ep419knom",
|
||||
checksum: "p",
|
||||
checkdigit: "g",
|
||||
}, {
|
||||
radix: 28,
|
||||
input: "0123456789abcdefghijklmnopqr",
|
||||
checksum: "7",
|
||||
checkdigit: "7",
|
||||
}, {
|
||||
radix: 28,
|
||||
input: "a6hnoo",
|
||||
checksum: "h",
|
||||
checkdigit: "9",
|
||||
}, {
|
||||
radix: 28,
|
||||
input: "lblc7kh0",
|
||||
checksum: "a",
|
||||
checkdigit: "f",
|
||||
}, {
|
||||
radix: 28,
|
||||
input: "64k5piod3lmf",
|
||||
checksum: "0",
|
||||
checkdigit: "p",
|
||||
}, {
|
||||
radix: 30,
|
||||
input: "0123456789abcdefghijklmnopqrst",
|
||||
checksum: "m",
|
||||
checkdigit: "m",
|
||||
}, {
|
||||
radix: 30,
|
||||
input: "t69j7d",
|
||||
checksum: "9",
|
||||
checkdigit: "s",
|
||||
}, {
|
||||
radix: 30,
|
||||
input: "p54o9ig3",
|
||||
checksum: "a",
|
||||
checkdigit: "o",
|
||||
}, {
|
||||
radix: 30,
|
||||
input: "gc1njrt55030",
|
||||
checksum: "6",
|
||||
checkdigit: "1",
|
||||
}, {
|
||||
radix: 32,
|
||||
input: "0123456789abcdefghijklmnopqrstuv",
|
||||
checksum: "8",
|
||||
checkdigit: "8",
|
||||
}, {
|
||||
radix: 32,
|
||||
input: "rdou19",
|
||||
checksum: "u",
|
||||
checkdigit: "3",
|
||||
}, {
|
||||
radix: 32,
|
||||
input: "ighj0pc7",
|
||||
checksum: "3",
|
||||
checkdigit: "8",
|
||||
}, {
|
||||
radix: 32,
|
||||
input: "op4nn5fvjsrs",
|
||||
checksum: "g",
|
||||
checkdigit: "j",
|
||||
}, {
|
||||
radix: 34,
|
||||
input: "0123456789abcdefghijklmnopqrstuvwx",
|
||||
checksum: "p",
|
||||
checkdigit: "p",
|
||||
}, {
|
||||
radix: 34,
|
||||
input: "nvftj5",
|
||||
checksum: "b",
|
||||
checkdigit: "f",
|
||||
}, {
|
||||
radix: 34,
|
||||
input: "u9v9g162",
|
||||
checksum: "j",
|
||||
checkdigit: "b",
|
||||
}, {
|
||||
radix: 34,
|
||||
input: "o5gqg5d7gjh9",
|
||||
checksum: "5",
|
||||
checkdigit: "q",
|
||||
}, {
|
||||
radix: 36,
|
||||
input: "0123456789abcdefghijklmnopqrstuvwxyz",
|
||||
checksum: "9",
|
||||
checkdigit: "9",
|
||||
}, {
|
||||
radix: 36,
|
||||
input: "29zehu",
|
||||
checksum: "i",
|
||||
checkdigit: "j",
|
||||
}, {
|
||||
radix: 36,
|
||||
input: "1snmikbu",
|
||||
checksum: "s",
|
||||
checkdigit: "v",
|
||||
}, {
|
||||
radix: 36,
|
||||
input: "jpkar545q7gb",
|
||||
checksum: "3",
|
||||
checkdigit: "d",
|
||||
},
|
||||
];
|
||||
|
||||
testCases.forEach(element => {
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Luhn Checksum Mod " + element.radix + " on " + element.input,
|
||||
input: element.input,
|
||||
expectedOutput: "Checksum: " + element.checksum + "\nCheckdigit: " + element.checkdigit + "\nLuhn Validated String: " + element.input + element.checkdigit,
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Luhn Checksum",
|
||||
args: [element.radix]
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Luhn Checksum on standard data",
|
||||
|
@ -15,7 +396,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "Luhn Checksum",
|
||||
args: []
|
||||
args: [10]
|
||||
},
|
||||
],
|
||||
},
|
||||
|
@ -26,7 +407,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "Luhn Checksum",
|
||||
args: []
|
||||
args: [10]
|
||||
},
|
||||
],
|
||||
},
|
||||
|
@ -37,18 +418,7 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "Luhn Checksum",
|
||||
args: []
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Luhn Checksum on invalid data",
|
||||
input: "35641709b012469",
|
||||
expectedOutput: "Character: b is not a digit.",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Luhn Checksum",
|
||||
args: []
|
||||
args: [10]
|
||||
},
|
||||
],
|
||||
},
|
||||
|
@ -59,8 +429,8 @@ TestRegister.addTests([
|
|||
recipeConfig: [
|
||||
{
|
||||
op: "Luhn Checksum",
|
||||
args: []
|
||||
args: [10]
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
]);
|
||||
|
|
89
tests/operations/tests/MIMEDecoding.mjs
Normal file
89
tests/operations/tests/MIMEDecoding.mjs
Normal file
|
@ -0,0 +1,89 @@
|
|||
/**
|
||||
* MIME Header Decoding tests
|
||||
*
|
||||
* @author mshwed [m@ttshwed.com]
|
||||
* @copyright Crown Copyright 2019
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Encoded comments",
|
||||
input: "(=?ISO-8859-1?Q?a?=)",
|
||||
expectedOutput: "(a)",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "MIME Decoding",
|
||||
"args": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Encoded adjacent comments whitespace",
|
||||
input: "(=?ISO-8859-1?Q?a?= b)",
|
||||
expectedOutput: "(a b)",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "MIME Decoding",
|
||||
"args": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Encoded adjacent single whitespace ignored",
|
||||
input: "(=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=)",
|
||||
expectedOutput: "(ab)",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "MIME Decoding",
|
||||
"args": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Encoded adjacent double whitespace ignored",
|
||||
input: "(=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=)",
|
||||
expectedOutput: "(ab)",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "MIME Decoding",
|
||||
"args": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Encoded adjacent CRLF whitespace ignored",
|
||||
input: "(=?ISO-8859-1?Q?a?=\r\n =?ISO-8859-1?Q?b?=)",
|
||||
expectedOutput: "(ab)",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "MIME Decoding",
|
||||
"args": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "UTF-8 Encodings Multiple Headers",
|
||||
input: "=?utf-8?q?=C3=89ric?= <eric@example.org>, =?utf-8?q?Ana=C3=AFs?= <anais@example.org>",
|
||||
expectedOutput: "Éric <eric@example.org>, Anaïs <anais@example.org>",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "MIME Decoding",
|
||||
"args": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ISO Decoding",
|
||||
input: "From: =?US-ASCII?Q?Keith_Moore?= <moore@cs.utk.edu>\nTo: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>\nCC: =?ISO-8859-1?Q?Andr=E9?= Pirard <PIRARD@vm1.ulg.ac.be>\nSubject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?=\n=?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?=",
|
||||
expectedOutput: "From: Keith Moore <moore@cs.utk.edu>\nTo: Keld Jørn Simonsen <keld@dkuug.dk>\nCC: André Pirard <PIRARD@vm1.ulg.ac.be>\nSubject: If you can read this you understand the example.",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "MIME Decoding",
|
||||
"args": []
|
||||
}
|
||||
]
|
||||
}
|
||||
]);
|
150
tests/operations/tests/Modhex.mjs
Normal file
150
tests/operations/tests/Modhex.mjs
Normal file
|
@ -0,0 +1,150 @@
|
|||
/**
|
||||
* Modhex operation tests.
|
||||
* @author linuxgemini [ilteris@asenkron.com.tr]
|
||||
* @copyright Crown Copyright 2024
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "ASCII to Modhex stream",
|
||||
input: "aberystwyth",
|
||||
expectedOutput: "hbhdhgidikieifiiikifhj",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "To Modhex",
|
||||
"args": [
|
||||
"None",
|
||||
0
|
||||
]
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "ASCII to Modhex with colon deliminator",
|
||||
input: "aberystwyth",
|
||||
expectedOutput: "hb:hd:hg:id:ik:ie:if:ii:ik:if:hj",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "To Modhex",
|
||||
"args": [
|
||||
"Colon",
|
||||
0
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Modhex stream to UTF-8",
|
||||
input: "uhkgkbuhkgkbugltlkugltkc",
|
||||
expectedOutput: "救救孩子",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "From Modhex",
|
||||
"args": [
|
||||
"Auto"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
},
|
||||
{
|
||||
name: "Mixed case Modhex stream to UTF-8",
|
||||
input: "uhKGkbUHkgkBUGltlkugltkc",
|
||||
expectedOutput: "救救孩子",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "From Modhex",
|
||||
"args": [
|
||||
"Auto"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
},
|
||||
{
|
||||
name: "Mutiline Modhex with comma to ASCII (Auto Mode)",
|
||||
input: "fk,dc,ie,hb,ii,dc,ht,ik,ie,hg,hr,hh,dc,ie,hk,\n\
|
||||
if,if,hk,hu,hi,dc,hk,hu,dc,if,hj,hg,dc,he,id,\n\
|
||||
hv,if,he,hj,dc,hv,hh,dc,if,hj,hg,dc,if,hj,hk,\n\
|
||||
ie,dc,hh,hk,hi,dc,if,id,hg,hg,dr,dc,ie,if,hb,\n\
|
||||
id,ih,hk,hu,hi,dc,if,hv,dc,hf,hg,hb,if,hj,dr,\n\
|
||||
dc,hl,ig,ie,if,dc,hd,hg,he,hb,ig,ie,hg,dc,fk,\n\
|
||||
dc,he,hv,ig,hr,hf,hu,di,if,dc,ht,hb,hn,hg,dc,\n\
|
||||
ig,ic,dc,ht,ik,dc,ht,hk,hu,hf,dc,ii,hj,hk,he,\n\
|
||||
hj,dc,hv,hh,dc,if,hj,hg,dc,hh,hk,hi,ie,dc,fk,\n\
|
||||
dc,ii,hv,ig,hr,hf,dc,he,hj,hv,hv,ie,hg,du",
|
||||
expectedOutput: "I saw myself sitting in the crotch of the this fig tree, starving to death, just because I couldn't make up my mind which of the figs I would choose.",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "From Modhex",
|
||||
"args": [
|
||||
"Auto"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
},
|
||||
{
|
||||
name: "Mutiline Modhex with percent to ASCII (Percent Mode)",
|
||||
input: "fk%dc%ie%hb%ii%dc%ht%ik%ie%hg%hr%hh%dc%ie%hk%\n\
|
||||
if%if%hk%hu%hi%dc%hk%hu%dc%if%hj%hg%dc%he%id%\n\
|
||||
hv%if%he%hj%dc%hv%hh%dc%if%hj%hg%dc%if%hj%hk%\n\
|
||||
ie%dc%hh%hk%hi%dc%if%id%hg%hg%dr%dc%ie%if%hb%\n\
|
||||
id%ih%hk%hu%hi%dc%if%hv%dc%hf%hg%hb%if%hj%dr%\n\
|
||||
dc%hl%ig%ie%if%dc%hd%hg%he%hb%ig%ie%hg%dc%fk%\n\
|
||||
dc%he%hv%ig%hr%hf%hu%di%if%dc%ht%hb%hn%hg%dc%\n\
|
||||
ig%ic%dc%ht%ik%dc%ht%hk%hu%hf%dc%ii%hj%hk%he%\n\
|
||||
hj%dc%hv%hh%dc%if%hj%hg%dc%hh%hk%hi%ie%dc%fk%\n\
|
||||
dc%ii%hv%ig%hr%hf%dc%he%hj%hv%hv%ie%hg%du",
|
||||
expectedOutput: "I saw myself sitting in the crotch of the this fig tree, starving to death, just because I couldn't make up my mind which of the figs I would choose.",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "From Modhex",
|
||||
"args": [
|
||||
"Percent"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
},
|
||||
{
|
||||
name: "Mutiline Modhex with semicolon to ASCII (Semi-colon Mode)",
|
||||
input: "fk;dc;ie;hb;ii;dc;ht;ik;ie;hg;hr;hh;dc;ie;hk;\n\
|
||||
if;if;hk;hu;hi;dc;hk;hu;dc;if;hj;hg;dc;he;id;\n\
|
||||
hv;if;he;hj;dc;hv;hh;dc;if;hj;hg;dc;if;hj;hk;\n\
|
||||
ie;dc;hh;hk;hi;dc;if;id;hg;hg;dr;dc;ie;if;hb;\n\
|
||||
id;ih;hk;hu;hi;dc;if;hv;dc;hf;hg;hb;if;hj;dr;\n\
|
||||
dc;hl;ig;ie;if;dc;hd;hg;he;hb;ig;ie;hg;dc;fk;\n\
|
||||
dc;he;hv;ig;hr;hf;hu;di;if;dc;ht;hb;hn;hg;dc;\n\
|
||||
ig;ic;dc;ht;ik;dc;ht;hk;hu;hf;dc;ii;hj;hk;he;\n\
|
||||
hj;dc;hv;hh;dc;if;hj;hg;dc;hh;hk;hi;ie;dc;fk;\n\
|
||||
dc;ii;hv;ig;hr;hf;dc;he;hj;hv;hv;ie;hg;du",
|
||||
expectedOutput: "I saw myself sitting in the crotch of the this fig tree, starving to death, just because I couldn't make up my mind which of the figs I would choose.",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "From Modhex",
|
||||
"args": [
|
||||
"Semi-colon"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
},
|
||||
{
|
||||
name: "ASCII to Modhex with comma and line breaks",
|
||||
input: "aberystwyth",
|
||||
expectedOutput: "hb,hd,hg,id,\nik,ie,if,ii,\nik,if,hj",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "To Modhex",
|
||||
"args": [
|
||||
"Comma",
|
||||
4
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
]);
|
77
tests/operations/tests/MurmurHash3.mjs
Normal file
77
tests/operations/tests/MurmurHash3.mjs
Normal file
|
@ -0,0 +1,77 @@
|
|||
/**
|
||||
* MurmurHash3 tests
|
||||
* @author AliceGrey [alice@grey.systems]
|
||||
* @copyright Crown Copyright 2024
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "To MurmurHash3: nothing",
|
||||
input: "",
|
||||
expectedOutput: "0",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "MurmurHash3",
|
||||
args: [0],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "To MurmurHash3: 1",
|
||||
input: "1",
|
||||
expectedOutput: "2484513939",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "MurmurHash3",
|
||||
args: [0],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "To MurmurHash3: Hello World!",
|
||||
input: "Hello World!",
|
||||
expectedOutput: "3691591037",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "MurmurHash3",
|
||||
args: [0],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "To MurmurHash3: Hello World! with seed",
|
||||
input: "Hello World!",
|
||||
expectedOutput: "1148600031",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "MurmurHash3",
|
||||
args: [1337],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "To MurmurHash3: foo",
|
||||
input: "foo",
|
||||
expectedOutput: "4138058784",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "MurmurHash3",
|
||||
args: [0],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "To MurmurHash3: foo signed",
|
||||
input: "foo",
|
||||
expectedOutput: "-156908512",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "MurmurHash3",
|
||||
args: [0, true],
|
||||
},
|
||||
],
|
||||
}
|
||||
]);
|
|
@ -11,12 +11,12 @@ import TestRegister from "../../lib/TestRegister.mjs";
|
|||
TestRegister.addTests([
|
||||
{
|
||||
name: "Generate HOTP",
|
||||
input: "12345678901234567890",
|
||||
expectedOutput: "URI: otpauth://hotp/OTPAuthentication?secret=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ\n\nPassword: 755224",
|
||||
input: "JBSWY3DPEHPK3PXP",
|
||||
expectedOutput: `URI: otpauth://hotp/?secret=JBSWY3DPEHPK3PXP&algorithm=SHA1&digits=6&counter=0\n\nPassword: 282760`,
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Generate HOTP",
|
||||
args: ["", 32, 6, 0],
|
||||
args: ["", 6, 0], // [Name, Code length, Counter]
|
||||
},
|
||||
],
|
||||
},
|
||||
|
|
984
tests/operations/tests/ParseCSR.mjs
Normal file
984
tests/operations/tests/ParseCSR.mjs
Normal file
|
@ -0,0 +1,984 @@
|
|||
/**
|
||||
* Parse CSR tests.
|
||||
*
|
||||
* @author jkataja
|
||||
* @copyright Crown Copyright 2023
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
// openssl req -newkey rsa:1024 -keyout test-rsa-1024.key -out test-rsa-1024.csr \
|
||||
// -subj "/C=CH/ST=Zurich/L=Zurich/O=Example RE/OU=IT Department/CN=example.com" \
|
||||
// -addext "subjectAltName = DNS:example.com,DNS:www.example.com" \
|
||||
// -addext "basicConstraints = critical,CA:FALSE" \
|
||||
// -addext "keyUsage = critical,digitalSignature,keyEncipherment" \
|
||||
// -addext "extendedKeyUsage = serverAuth"
|
||||
const IN_EXAMPLE_COM_RSA_1024 = `-----BEGIN CERTIFICATE REQUEST-----
|
||||
MIICHzCCAYgCAQAwcjELMAkGA1UEBhMCQ0gxDzANBgNVBAgMBlp1cmljaDEPMA0G
|
||||
A1UEBwwGWnVyaWNoMRMwEQYDVQQKDApFeGFtcGxlIFJFMRYwFAYDVQQLDA1JVCBE
|
||||
ZXBhcnRtZW50MRQwEgYDVQQDDAtleGFtcGxlLmNvbTCBnzANBgkqhkiG9w0BAQEF
|
||||
AAOBjQAwgYkCgYEArrTrLI6FkzjX8FZfclt2ox1Dz7KRwt5f6ffZic7twLAKJ4ao
|
||||
/H3APjwoFVUXGjiNj/XF2RlId4UxB1b6CgWjujBb9W51rTdvfWLyAHsrLcptpVz+
|
||||
V9Y8X9kEFCRGGDyG5+X+Nu6COzTpUPDj4bIIX/uPk3fDYDEqLClVy8/VS48CAwEA
|
||||
AaBtMGsGCSqGSIb3DQEJDjFeMFwwJwYDVR0RBCAwHoILZXhhbXBsZS5jb22CD3d3
|
||||
dy5leGFtcGxlLmNvbTAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIFoDATBgNV
|
||||
HSUEDDAKBggrBgEFBQcDATANBgkqhkiG9w0BAQsFAAOBgQB0mUlPgt6pt/kjD0pz
|
||||
OUNk5e9nBFQYQGuGIHGYbPX3mi4Wd9vUCdPixtPSTunHWs2cxX2nM8+MdcNTY+7Q
|
||||
NFgFNIvSXhbqMYoHAAApMHJOxiWpBFdYKp3tESnlgh2lUh7lQtmOjD4a1dzfU8PU
|
||||
oViyp+UJGasN2WRd+4VtaPw64w==
|
||||
-----END CERTIFICATE REQUEST-----`;
|
||||
|
||||
const OUT_EXAMPLE_COM_RSA_1024 = `Subject
|
||||
C = CH
|
||||
ST = Zurich
|
||||
L = Zurich
|
||||
O = Example RE
|
||||
OU = IT Department
|
||||
CN = example.com
|
||||
Public Key
|
||||
Algorithm: RSA
|
||||
Length: 1024 bits
|
||||
Modulus: 00:ae:b4:eb:2c:8e:85:93:38:d7:f0:56:5f:72:5b:76:
|
||||
a3:1d:43:cf:b2:91:c2:de:5f:e9:f7:d9:89:ce:ed:c0:
|
||||
b0:0a:27:86:a8:fc:7d:c0:3e:3c:28:15:55:17:1a:38:
|
||||
8d:8f:f5:c5:d9:19:48:77:85:31:07:56:fa:0a:05:a3:
|
||||
ba:30:5b:f5:6e:75:ad:37:6f:7d:62:f2:00:7b:2b:2d:
|
||||
ca:6d:a5:5c:fe:57:d6:3c:5f:d9:04:14:24:46:18:3c:
|
||||
86:e7:e5:fe:36:ee:82:3b:34:e9:50:f0:e3:e1:b2:08:
|
||||
5f:fb:8f:93:77:c3:60:31:2a:2c:29:55:cb:cf:d5:4b:
|
||||
8f
|
||||
Exponent: 65537 (0x10001)
|
||||
Signature
|
||||
Algorithm: SHA256withRSA
|
||||
Signature: 74:99:49:4f:82:de:a9:b7:f9:23:0f:4a:73:39:43:64:
|
||||
e5:ef:67:04:54:18:40:6b:86:20:71:98:6c:f5:f7:9a:
|
||||
2e:16:77:db:d4:09:d3:e2:c6:d3:d2:4e:e9:c7:5a:cd:
|
||||
9c:c5:7d:a7:33:cf:8c:75:c3:53:63:ee:d0:34:58:05:
|
||||
34:8b:d2:5e:16:ea:31:8a:07:00:00:29:30:72:4e:c6:
|
||||
25:a9:04:57:58:2a:9d:ed:11:29:e5:82:1d:a5:52:1e:
|
||||
e5:42:d9:8e:8c:3e:1a:d5:dc:df:53:c3:d4:a1:58:b2:
|
||||
a7:e5:09:19:ab:0d:d9:64:5d:fb:85:6d:68:fc:3a:e3
|
||||
Requested Extensions
|
||||
Basic Constraints: critical
|
||||
CA = false
|
||||
Key Usage: critical
|
||||
Digital Signature
|
||||
Key encipherment
|
||||
Extended Key Usage:
|
||||
TLS Web Server Authentication
|
||||
Subject Alternative Name:
|
||||
DNS: example.com
|
||||
DNS: www.example.com`;
|
||||
|
||||
// openssl req -newkey rsa:2048 -keyout test-rsa-2048.key -out test-rsa-2048.csr \
|
||||
// -subj "/C=CH/ST=Zurich/L=Zurich/O=Example RE/OU=IT Department/CN=example.com" \
|
||||
// -addext "subjectAltName = DNS:example.com,DNS:www.example.com" \
|
||||
// -addext "basicConstraints = critical,CA:FALSE" \
|
||||
// -addext "keyUsage = critical,digitalSignature,keyEncipherment" \
|
||||
// -addext "extendedKeyUsage = serverAuth"
|
||||
const IN_EXAMPLE_COM_RSA_2048 = `-----BEGIN CERTIFICATE REQUEST-----
|
||||
MIIDJDCCAgwCAQAwcjELMAkGA1UEBhMCQ0gxDzANBgNVBAgMBlp1cmljaDEPMA0G
|
||||
A1UEBwwGWnVyaWNoMRMwEQYDVQQKDApFeGFtcGxlIFJFMRYwFAYDVQQLDA1JVCBE
|
||||
ZXBhcnRtZW50MRQwEgYDVQQDDAtleGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEB
|
||||
BQADggEPADCCAQoCggEBAKPogLmWPuK/IGdct2v/3MFKVaVeKp2Hl5at/zDFLCAe
|
||||
51bwh7BqNVJEci4ApwlXA1WVmQPBFBJlYwQZVjz5UAN2CmNHxud5nV03YmZ2/Iml
|
||||
RzpKcZMPqU+liJCC04L+XIbOdx+Vz52dF++Cc+FuSFq803yW+qefK8JsJNO9KuPx
|
||||
RLYKSAADa9MIJisru1PzcBAOcimOmNnFWuo+LKsd4lU30OExDdKHwtyt62Mj1c3o
|
||||
lO1JjvkjtWWjwHI+0EgTjvkeXlcUYZvvLlysdKERMRozvMTGqqoHWCgWl+Rq9Z6P
|
||||
TgNsRO4CKug1Zwmh8y6acZ7sYb/dar8HOeqJnc0pCv8CAwEAAaBtMGsGCSqGSIb3
|
||||
DQEJDjFeMFwwJwYDVR0RBCAwHoILZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLmNv
|
||||
bTAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEF
|
||||
BQcDATANBgkqhkiG9w0BAQsFAAOCAQEAG0cjfRBY1pBzu+jf7yMQrK5mQrh72air
|
||||
VuXHmochmyUxyt0G7ovnNhKEr+X9snShJLi5qlyvnb2roiwlCmuwGIZxErN1svQL
|
||||
Z3kQNZgH+Vyu5IRL2DlPs5AAxVmzPpbnbXNhMHyAK/ziLcU031O1PoCpxwfvPsjW
|
||||
HWOCjbZUVaJnxdp8AHqImoGAiVhJwc37feFvb2UQlLedUypQkPg/poNWduaRDoj8
|
||||
m9cpVxuxGLtONBnohzohnFECytSXWEXPIj8L9SpYK97G02nJYYCAcb5BF11Alfux
|
||||
sNxtsr6zgPaLRrvOBT11WxJVKerbhfezAJ3naem1eM3VLxCGWwMwxg==
|
||||
-----END CERTIFICATE REQUEST-----`;
|
||||
|
||||
const OUT_EXAMPLE_COM_RSA_2048 = `Subject
|
||||
C = CH
|
||||
ST = Zurich
|
||||
L = Zurich
|
||||
O = Example RE
|
||||
OU = IT Department
|
||||
CN = example.com
|
||||
Public Key
|
||||
Algorithm: RSA
|
||||
Length: 2048 bits
|
||||
Modulus: 00:a3:e8:80:b9:96:3e:e2:bf:20:67:5c:b7:6b:ff:dc:
|
||||
c1:4a:55:a5:5e:2a:9d:87:97:96:ad:ff:30:c5:2c:20:
|
||||
1e:e7:56:f0:87:b0:6a:35:52:44:72:2e:00:a7:09:57:
|
||||
03:55:95:99:03:c1:14:12:65:63:04:19:56:3c:f9:50:
|
||||
03:76:0a:63:47:c6:e7:79:9d:5d:37:62:66:76:fc:89:
|
||||
a5:47:3a:4a:71:93:0f:a9:4f:a5:88:90:82:d3:82:fe:
|
||||
5c:86:ce:77:1f:95:cf:9d:9d:17:ef:82:73:e1:6e:48:
|
||||
5a:bc:d3:7c:96:fa:a7:9f:2b:c2:6c:24:d3:bd:2a:e3:
|
||||
f1:44:b6:0a:48:00:03:6b:d3:08:26:2b:2b:bb:53:f3:
|
||||
70:10:0e:72:29:8e:98:d9:c5:5a:ea:3e:2c:ab:1d:e2:
|
||||
55:37:d0:e1:31:0d:d2:87:c2:dc:ad:eb:63:23:d5:cd:
|
||||
e8:94:ed:49:8e:f9:23:b5:65:a3:c0:72:3e:d0:48:13:
|
||||
8e:f9:1e:5e:57:14:61:9b:ef:2e:5c:ac:74:a1:11:31:
|
||||
1a:33:bc:c4:c6:aa:aa:07:58:28:16:97:e4:6a:f5:9e:
|
||||
8f:4e:03:6c:44:ee:02:2a:e8:35:67:09:a1:f3:2e:9a:
|
||||
71:9e:ec:61:bf:dd:6a:bf:07:39:ea:89:9d:cd:29:0a:
|
||||
ff
|
||||
Exponent: 65537 (0x10001)
|
||||
Signature
|
||||
Algorithm: SHA256withRSA
|
||||
Signature: 1b:47:23:7d:10:58:d6:90:73:bb:e8:df:ef:23:10:ac:
|
||||
ae:66:42:b8:7b:d9:a8:ab:56:e5:c7:9a:87:21:9b:25:
|
||||
31:ca:dd:06:ee:8b:e7:36:12:84:af:e5:fd:b2:74:a1:
|
||||
24:b8:b9:aa:5c:af:9d:bd:ab:a2:2c:25:0a:6b:b0:18:
|
||||
86:71:12:b3:75:b2:f4:0b:67:79:10:35:98:07:f9:5c:
|
||||
ae:e4:84:4b:d8:39:4f:b3:90:00:c5:59:b3:3e:96:e7:
|
||||
6d:73:61:30:7c:80:2b:fc:e2:2d:c5:34:df:53:b5:3e:
|
||||
80:a9:c7:07:ef:3e:c8:d6:1d:63:82:8d:b6:54:55:a2:
|
||||
67:c5:da:7c:00:7a:88:9a:81:80:89:58:49:c1:cd:fb:
|
||||
7d:e1:6f:6f:65:10:94:b7:9d:53:2a:50:90:f8:3f:a6:
|
||||
83:56:76:e6:91:0e:88:fc:9b:d7:29:57:1b:b1:18:bb:
|
||||
4e:34:19:e8:87:3a:21:9c:51:02:ca:d4:97:58:45:cf:
|
||||
22:3f:0b:f5:2a:58:2b:de:c6:d3:69:c9:61:80:80:71:
|
||||
be:41:17:5d:40:95:fb:b1:b0:dc:6d:b2:be:b3:80:f6:
|
||||
8b:46:bb:ce:05:3d:75:5b:12:55:29:ea:db:85:f7:b3:
|
||||
00:9d:e7:69:e9:b5:78:cd:d5:2f:10:86:5b:03:30:c6
|
||||
Requested Extensions
|
||||
Basic Constraints: critical
|
||||
CA = false
|
||||
Key Usage: critical
|
||||
Digital Signature
|
||||
Key encipherment
|
||||
Extended Key Usage:
|
||||
TLS Web Server Authentication
|
||||
Subject Alternative Name:
|
||||
DNS: example.com
|
||||
DNS: www.example.com`;
|
||||
|
||||
// openssl genpkey -genparam -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out test-ec-param.pem
|
||||
// openssl req -newkey ec:test-ec-param.pem -keyout test-ec.key -out test-ec.csr \
|
||||
// -subj "/C=CH/ST=Zurich/L=Zurich/O=Example RE/OU=IT Department/CN=example.com" \
|
||||
// -addext "subjectAltName = DNS:example.com,DNS:www.example.com" \
|
||||
// -addext "basicConstraints = critical,CA:FALSE" \
|
||||
// -addext "keyUsage = critical,digitalSignature,keyEncipherment" \
|
||||
// -addext "extendedKeyUsage = serverAuth"
|
||||
const IN_EXAMPLE_COM_EC_P256 = `-----BEGIN CERTIFICATE REQUEST-----
|
||||
MIIBmzCCAUECAQAwcjELMAkGA1UEBhMCQ0gxDzANBgNVBAgMBlp1cmljaDEPMA0G
|
||||
A1UEBwwGWnVyaWNoMRMwEQYDVQQKDApFeGFtcGxlIFJFMRYwFAYDVQQLDA1JVCBE
|
||||
ZXBhcnRtZW50MRQwEgYDVQQDDAtleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqG
|
||||
SM49AwEHA0IABAmpYXNh+L9E0Q3sLhrO+MF1XgKCfqJntrOyIkrGwoiQftHbJWTA
|
||||
6duxQhU/3d9B+SN/ibeKY+xeiNBrs2eTYZ6gbTBrBgkqhkiG9w0BCQ4xXjBcMCcG
|
||||
A1UdEQQgMB6CC2V4YW1wbGUuY29tgg93d3cuZXhhbXBsZS5jb20wDAYDVR0TAQH/
|
||||
BAIwADAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZI
|
||||
zj0EAwIDSAAwRQIgQkum/qaLzE3QZ3WD00uLpalUn113FObd7rM5Mr3HQwQCIQCr
|
||||
7OjzYI9v7qIJp/E9N16XfJN87G2ZVIZ4FuPXVjokCQ==
|
||||
-----END CERTIFICATE REQUEST-----`;
|
||||
|
||||
const OUT_EXAMPLE_COM_EC_P256 = `Subject
|
||||
C = CH
|
||||
ST = Zurich
|
||||
L = Zurich
|
||||
O = Example RE
|
||||
OU = IT Department
|
||||
CN = example.com
|
||||
Public Key
|
||||
Algorithm: ECDSA
|
||||
Length: 256 bits
|
||||
Pub: 04:09:a9:61:73:61:f8:bf:44:d1:0d:ec:2e:1a:ce:f8:
|
||||
c1:75:5e:02:82:7e:a2:67:b6:b3:b2:22:4a:c6:c2:88:
|
||||
90:7e:d1:db:25:64:c0:e9:db:b1:42:15:3f:dd:df:41:
|
||||
f9:23:7f:89:b7:8a:63:ec:5e:88:d0:6b:b3:67:93:61:
|
||||
9e
|
||||
ASN1 OID: secp256r1
|
||||
NIST CURVE: P-256
|
||||
Signature
|
||||
Algorithm: SHA256withECDSA
|
||||
Signature: 30:45:02:20:42:4b:a6:fe:a6:8b:cc:4d:d0:67:75:83:
|
||||
d3:4b:8b:a5:a9:54:9f:5d:77:14:e6:dd:ee:b3:39:32:
|
||||
bd:c7:43:04:02:21:00:ab:ec:e8:f3:60:8f:6f:ee:a2:
|
||||
09:a7:f1:3d:37:5e:97:7c:93:7c:ec:6d:99:54:86:78:
|
||||
16:e3:d7:56:3a:24:09
|
||||
Requested Extensions
|
||||
Basic Constraints: critical
|
||||
CA = false
|
||||
Key Usage: critical
|
||||
Digital Signature
|
||||
Key encipherment
|
||||
Extended Key Usage:
|
||||
TLS Web Server Authentication
|
||||
Subject Alternative Name:
|
||||
DNS: example.com
|
||||
DNS: www.example.com`;
|
||||
|
||||
// openssl ecparam -name secp384r1 -genkey -noout -out test-ec-key.pem
|
||||
// openssl req -new -key test-ec-key.pem -out test-ec.csr
|
||||
// -subj "/C=CH/ST=Zurich/L=Zurich/O=Example RE/OU=IT Department/CN=example.com"
|
||||
// -addext "subjectAltName = DNS:example.com,DNS:www.example.com"
|
||||
// -addext "basicConstraints = critical,CA:FALSE"
|
||||
// -addext "keyUsage = critical,digitalSignature,keyEncipherment"
|
||||
// -addext "extendedKeyUsage = serverAuth"
|
||||
const IN_EXAMPLE_COM_EC_P384 = `-----BEGIN CERTIFICATE REQUEST-----
|
||||
MIIB2TCCAV4CAQAwcjELMAkGA1UEBhMCQ0gxDzANBgNVBAgMBlp1cmljaDEPMA0G
|
||||
A1UEBwwGWnVyaWNoMRMwEQYDVQQKDApFeGFtcGxlIFJFMRYwFAYDVQQLDA1JVCBE
|
||||
ZXBhcnRtZW50MRQwEgYDVQQDDAtleGFtcGxlLmNvbTB2MBAGByqGSM49AgEGBSuB
|
||||
BAAiA2IABE3rpRO164NtXx2kYMP1zlN7YgHEincO4YgwoyAYyJm3LwcbR+XyKg6A
|
||||
/i+DUaGWa2FQ+f8w8VmEUFAgLozVxwnntPOCSODrXAQwJFPLCqs7m3o8OuzU3t07
|
||||
POGhPtj7f6BtMGsGCSqGSIb3DQEJDjFeMFwwJwYDVR0RBCAwHoILZXhhbXBsZS5j
|
||||
b22CD3d3dy5leGFtcGxlLmNvbTAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIF
|
||||
oDATBgNVHSUEDDAKBggrBgEFBQcDATAKBggqhkjOPQQDAgNpADBmAjEAlq7RaEXU
|
||||
aNHEC+qfuIitonWHOatm+qiiaNSh80QjLw5P1rszg9yQQigHd8cD7I4DAjEAzmo1
|
||||
DLpcESwZCBrh3sPflDA38TZjoedRNeWcVxdn1QmwDWMeprD/zgPAey8GOmyj
|
||||
-----END CERTIFICATE REQUEST-----`;
|
||||
|
||||
const OUT_EXAMPLE_COM_EC_P384 = `Subject
|
||||
C = CH
|
||||
ST = Zurich
|
||||
L = Zurich
|
||||
O = Example RE
|
||||
OU = IT Department
|
||||
CN = example.com
|
||||
Public Key
|
||||
Algorithm: ECDSA
|
||||
Length: 384 bits
|
||||
Pub: 04:4d:eb:a5:13:b5:eb:83:6d:5f:1d:a4:60:c3:f5:ce:
|
||||
53:7b:62:01:c4:8a:77:0e:e1:88:30:a3:20:18:c8:99:
|
||||
b7:2f:07:1b:47:e5:f2:2a:0e:80:fe:2f:83:51:a1:96:
|
||||
6b:61:50:f9:ff:30:f1:59:84:50:50:20:2e:8c:d5:c7:
|
||||
09:e7:b4:f3:82:48:e0:eb:5c:04:30:24:53:cb:0a:ab:
|
||||
3b:9b:7a:3c:3a:ec:d4:de:dd:3b:3c:e1:a1:3e:d8:fb:
|
||||
7f
|
||||
ASN1 OID: secp384r1
|
||||
NIST CURVE: P-384
|
||||
Signature
|
||||
Algorithm: SHA256withECDSA
|
||||
Signature: 30:66:02:31:00:96:ae:d1:68:45:d4:68:d1:c4:0b:ea:
|
||||
9f:b8:88:ad:a2:75:87:39:ab:66:fa:a8:a2:68:d4:a1:
|
||||
f3:44:23:2f:0e:4f:d6:bb:33:83:dc:90:42:28:07:77:
|
||||
c7:03:ec:8e:03:02:31:00:ce:6a:35:0c:ba:5c:11:2c:
|
||||
19:08:1a:e1:de:c3:df:94:30:37:f1:36:63:a1:e7:51:
|
||||
35:e5:9c:57:17:67:d5:09:b0:0d:63:1e:a6:b0:ff:ce:
|
||||
03:c0:7b:2f:06:3a:6c:a3
|
||||
Requested Extensions
|
||||
Basic Constraints: critical
|
||||
CA = false
|
||||
Key Usage: critical
|
||||
Digital Signature
|
||||
Key encipherment
|
||||
Extended Key Usage:
|
||||
TLS Web Server Authentication
|
||||
Subject Alternative Name:
|
||||
DNS: example.com
|
||||
DNS: www.example.com`;
|
||||
|
||||
// openssl ecparam -name secp521r1 -genkey -noout -out test-ec-key.pem
|
||||
// openssl req -new -key test-ec-key.pem -out test-ec.csr
|
||||
// -subj "/C=CH/ST=Zurich/L=Zurich/O=Example RE/OU=IT Department/CN=example.com"
|
||||
// -addext "subjectAltName = DNS:example.com,DNS:www.example.com"
|
||||
// -addext "basicConstraints = critical,CA:FALSE"
|
||||
// -addext "keyUsage = critical,digitalSignature,keyEncipherment"
|
||||
// -addext "extendedKeyUsage = serverAuth"
|
||||
const IN_EXAMPLE_COM_EC_P521 = `-----BEGIN CERTIFICATE REQUEST-----
|
||||
MIICIjCCAYQCAQAwcjELMAkGA1UEBhMCQ0gxDzANBgNVBAgMBlp1cmljaDEPMA0G
|
||||
A1UEBwwGWnVyaWNoMRMwEQYDVQQKDApFeGFtcGxlIFJFMRYwFAYDVQQLDA1JVCBE
|
||||
ZXBhcnRtZW50MRQwEgYDVQQDDAtleGFtcGxlLmNvbTCBmzAQBgcqhkjOPQIBBgUr
|
||||
gQQAIwOBhgAEAKf5BRB57svfglRz5dM0bnJAnieMFjNjOFca5/pJ2bOpORkp9Uol
|
||||
x//mHY5WOMYYC/xvM5lJRcmUnL791zQ6rf6pAD/CrEpDF2svae6e5nA/fN2XsB98
|
||||
xjmkTpYZVC5nFT83Ceo9J0kHbvliYlAMsEOO60qGghyWV7myiDgORfE+POU3oG0w
|
||||
awYJKoZIhvcNAQkOMV4wXDAnBgNVHREEIDAeggtleGFtcGxlLmNvbYIPd3d3LmV4
|
||||
YW1wbGUuY29tMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQM
|
||||
MAoGCCsGAQUFBwMBMAoGCCqGSM49BAMCA4GLADCBhwJBDeIpSuvIT+kiE0ZnJwPS
|
||||
DVik93CLqjFm5Ieq02d81GwusSgAA82WlZZVZRsTEjkZXtk96zMBnh5/uxk+wN+j
|
||||
+PoCQgEDmXREwi0BPkHj6QlktE+7SLELVkrd75D9mfw/SV6ZJiLiLIT9yeoA0Zon
|
||||
uhcl2rK/DLQutuJF6JIBe5s7lieKfQ==
|
||||
-----END CERTIFICATE REQUEST-----`;
|
||||
|
||||
const OUT_EXAMPLE_COM_EC_P521 = `Subject
|
||||
C = CH
|
||||
ST = Zurich
|
||||
L = Zurich
|
||||
O = Example RE
|
||||
OU = IT Department
|
||||
CN = example.com
|
||||
Public Key
|
||||
Algorithm: ECDSA
|
||||
Length: 521 bits
|
||||
Pub: 04:00:a7:f9:05:10:79:ee:cb:df:82:54:73:e5:d3:34:
|
||||
6e:72:40:9e:27:8c:16:33:63:38:57:1a:e7:fa:49:d9:
|
||||
b3:a9:39:19:29:f5:4a:25:c7:ff:e6:1d:8e:56:38:c6:
|
||||
18:0b:fc:6f:33:99:49:45:c9:94:9c:be:fd:d7:34:3a:
|
||||
ad:fe:a9:00:3f:c2:ac:4a:43:17:6b:2f:69:ee:9e:e6:
|
||||
70:3f:7c:dd:97:b0:1f:7c:c6:39:a4:4e:96:19:54:2e:
|
||||
67:15:3f:37:09:ea:3d:27:49:07:6e:f9:62:62:50:0c:
|
||||
b0:43:8e:eb:4a:86:82:1c:96:57:b9:b2:88:38:0e:45:
|
||||
f1:3e:3c:e5:37
|
||||
ASN1 OID: secp521r1
|
||||
NIST CURVE: P-521
|
||||
Signature
|
||||
Algorithm: SHA256withECDSA
|
||||
Signature: 30:81:87:02:41:0d:e2:29:4a:eb:c8:4f:e9:22:13:46:
|
||||
67:27:03:d2:0d:58:a4:f7:70:8b:aa:31:66:e4:87:aa:
|
||||
d3:67:7c:d4:6c:2e:b1:28:00:03:cd:96:95:96:55:65:
|
||||
1b:13:12:39:19:5e:d9:3d:eb:33:01:9e:1e:7f:bb:19:
|
||||
3e:c0:df:a3:f8:fa:02:42:01:03:99:74:44:c2:2d:01:
|
||||
3e:41:e3:e9:09:64:b4:4f:bb:48:b1:0b:56:4a:dd:ef:
|
||||
90:fd:99:fc:3f:49:5e:99:26:22:e2:2c:84:fd:c9:ea:
|
||||
00:d1:9a:27:ba:17:25:da:b2:bf:0c:b4:2e:b6:e2:45:
|
||||
e8:92:01:7b:9b:3b:96:27:8a:7d
|
||||
Requested Extensions
|
||||
Basic Constraints: critical
|
||||
CA = false
|
||||
Key Usage: critical
|
||||
Digital Signature
|
||||
Key encipherment
|
||||
Extended Key Usage:
|
||||
TLS Web Server Authentication
|
||||
Subject Alternative Name:
|
||||
DNS: example.com
|
||||
DNS: www.example.com`;
|
||||
|
||||
// openssl dsaparam -out dsaparam.pem 1024
|
||||
// openssl gendsa -out dsakey.pem dsaparam.pem
|
||||
// openssl req -new -key dsakey.pem -out test-dsa.csr \
|
||||
// -subj "/C=CH/ST=Zurich/L=Zurich/O=Example RE/OU=IT Department/CN=example.com" \
|
||||
// -addext "subjectAltName = DNS:example.com,DNS:www.example.com" \
|
||||
// -addext "basicConstraints = critical,CA:FALSE" \
|
||||
// -addext "keyUsage = critical,digitalSignature,keyEncipherment" \
|
||||
// -addext "extendedKeyUsage = serverAuth"
|
||||
const IN_EXAMPLE_COM_DSA_1024 = `-----BEGIN CERTIFICATE REQUEST-----
|
||||
MIIC/jCCAqoCAQAwcjELMAkGA1UEBhMCQ0gxDzANBgNVBAgMBlp1cmljaDEPMA0G
|
||||
A1UEBwwGWnVyaWNoMRMwEQYDVQQKDApFeGFtcGxlIFJFMRYwFAYDVQQLDA1JVCBE
|
||||
ZXBhcnRtZW50MRQwEgYDVQQDDAtleGFtcGxlLmNvbTCCAcAwggE0BgcqhkjOOAQB
|
||||
MIIBJwKBgQD8vvCmdM8wttdbq3kWigTEnnug4+2SLMl2RNXrlCQjmuZc7tGMyP1u
|
||||
gsSc9Pxd/tMrPKRawFP5SvUOkZ4cIrujdJVTb/hlfnGH4cWACe8EupwRzoqwZB1x
|
||||
awiHFzL9G6Go0HOy7bSbRdxBIYu46fnxNsDFf7lMlcBOKdq4Y12kvwIdAN4/vtK9
|
||||
KxhQfcrrzHsPXW+/xW0CMfr+NQir8PkCgYEAiNdM7IRZhXPaGRtGDpepSoRAf4uQ
|
||||
LWY9q+vFUx4fVRSSgwKBKLjW+BvzE2eJq0pXv7O09QHOghtcwzY3UrdN952sjUkJ
|
||||
LItt+5FxB7/JqCBPRrrVsyGEjR3+WbeI3wl6OvQFxm/OTNTTkemFdAfpT/YDSw+n
|
||||
1xLODTfegT/oyOoDgYUAAoGBAMz15lRPVAj8cje3ShbuACHPVE85d0Tk0Dw9qUcQ
|
||||
NCNS6A3STSbUiLGKeiRMGg2v/HM9ivV8tq1rywmgBAwtidcQ6P5yqYSZs6z3x9xZ
|
||||
OzeQ5jXftBQ1GXeU8zi1fC99inFGNixbPFVIz4/KiV0+So44n9ki2ylhbz0YQtpU
|
||||
wMF+oG0wawYJKoZIhvcNAQkOMV4wXDAnBgNVHREEIDAeggtleGFtcGxlLmNvbYIP
|
||||
d3d3LmV4YW1wbGUuY29tMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgWgMBMG
|
||||
A1UdJQQMMAoGCCsGAQUFBwMBMAsGCWCGSAFlAwQDAgNBADA+Ah0AkTogUUyKE5v9
|
||||
ezKrOKpP07i2E9Zz0n/yjIvw4wIdAMB5yVMOEgI877vOFQ7zzf7oDR9eJMYlf4QV
|
||||
2sQ=
|
||||
-----END CERTIFICATE REQUEST-----`;
|
||||
|
||||
const OUT_EXAMPLE_COM_DSA_1024 = `Subject
|
||||
C = CH
|
||||
ST = Zurich
|
||||
L = Zurich
|
||||
O = Example RE
|
||||
OU = IT Department
|
||||
CN = example.com
|
||||
Public Key
|
||||
Algorithm: DSA
|
||||
Length: 1024 bits
|
||||
Pub: 00:cc:f5:e6:54:4f:54:08:fc:72:37:b7:4a:16:ee:00:
|
||||
21:cf:54:4f:39:77:44:e4:d0:3c:3d:a9:47:10:34:23:
|
||||
52:e8:0d:d2:4d:26:d4:88:b1:8a:7a:24:4c:1a:0d:af:
|
||||
fc:73:3d:8a:f5:7c:b6:ad:6b:cb:09:a0:04:0c:2d:89:
|
||||
d7:10:e8:fe:72:a9:84:99:b3:ac:f7:c7:dc:59:3b:37:
|
||||
90:e6:35:df:b4:14:35:19:77:94:f3:38:b5:7c:2f:7d:
|
||||
8a:71:46:36:2c:5b:3c:55:48:cf:8f:ca:89:5d:3e:4a:
|
||||
8e:38:9f:d9:22:db:29:61:6f:3d:18:42:da:54:c0:c1:
|
||||
7e
|
||||
P: 00:fc:be:f0:a6:74:cf:30:b6:d7:5b:ab:79:16:8a:04:
|
||||
c4:9e:7b:a0:e3:ed:92:2c:c9:76:44:d5:eb:94:24:23:
|
||||
9a:e6:5c:ee:d1:8c:c8:fd:6e:82:c4:9c:f4:fc:5d:fe:
|
||||
d3:2b:3c:a4:5a:c0:53:f9:4a:f5:0e:91:9e:1c:22:bb:
|
||||
a3:74:95:53:6f:f8:65:7e:71:87:e1:c5:80:09:ef:04:
|
||||
ba:9c:11:ce:8a:b0:64:1d:71:6b:08:87:17:32:fd:1b:
|
||||
a1:a8:d0:73:b2:ed:b4:9b:45:dc:41:21:8b:b8:e9:f9:
|
||||
f1:36:c0:c5:7f:b9:4c:95:c0:4e:29:da:b8:63:5d:a4:
|
||||
bf
|
||||
Q: 00:de:3f:be:d2:bd:2b:18:50:7d:ca:eb:cc:7b:0f:5d:
|
||||
6f:bf:c5:6d:02:31:fa:fe:35:08:ab:f0:f9
|
||||
G: 00:88:d7:4c:ec:84:59:85:73:da:19:1b:46:0e:97:a9:
|
||||
4a:84:40:7f:8b:90:2d:66:3d:ab:eb:c5:53:1e:1f:55:
|
||||
14:92:83:02:81:28:b8:d6:f8:1b:f3:13:67:89:ab:4a:
|
||||
57:bf:b3:b4:f5:01:ce:82:1b:5c:c3:36:37:52:b7:4d:
|
||||
f7:9d:ac:8d:49:09:2c:8b:6d:fb:91:71:07:bf:c9:a8:
|
||||
20:4f:46:ba:d5:b3:21:84:8d:1d:fe:59:b7:88:df:09:
|
||||
7a:3a:f4:05:c6:6f:ce:4c:d4:d3:91:e9:85:74:07:e9:
|
||||
4f:f6:03:4b:0f:a7:d7:12:ce:0d:37:de:81:3f:e8:c8:
|
||||
ea
|
||||
Signature
|
||||
Algorithm: SHA256withDSA
|
||||
Signature:
|
||||
R: 00:91:3a:20:51:4c:8a:13:9b:fd:7b:32:ab:38:aa:4f:
|
||||
d3:b8:b6:13:d6:73:d2:7f:f2:8c:8b:f0:e3
|
||||
S: 00:c0:79:c9:53:0e:12:02:3c:ef:bb:ce:15:0e:f3:cd:
|
||||
fe:e8:0d:1f:5e:24:c6:25:7f:84:15:da:c4
|
||||
Requested Extensions
|
||||
Basic Constraints: critical
|
||||
CA = false
|
||||
Key Usage: critical
|
||||
Digital Signature
|
||||
Key encipherment
|
||||
Extended Key Usage:
|
||||
TLS Web Server Authentication
|
||||
Subject Alternative Name:
|
||||
DNS: example.com
|
||||
DNS: www.example.com`;
|
||||
|
||||
// openssl dsaparam -out dsaparam.pem 2048
|
||||
// openssl gendsa -out dsakey.pem dsaparam.pem
|
||||
// openssl req -new -key dsakey.pem -out test-dsa.csr \
|
||||
// -subj "/C=CH/ST=Zurich/L=Zurich/O=Example RE/OU=IT Department/CN=example.com" \
|
||||
// -addext "subjectAltName = DNS:example.com,DNS:www.example.com" \
|
||||
// -addext "basicConstraints = critical,CA:FALSE" \
|
||||
// -addext "keyUsage = critical,digitalSignature,keyEncipherment" \
|
||||
// -addext "extendedKeyUsage = serverAuth"
|
||||
const IN_EXAMPLE_COM_DSA_2048 = `-----BEGIN CERTIFICATE REQUEST-----
|
||||
MIIEfzCCBCwCAQAwcjELMAkGA1UEBhMCQ0gxDzANBgNVBAgMBlp1cmljaDEPMA0G
|
||||
A1UEBwwGWnVyaWNoMRMwEQYDVQQKDApFeGFtcGxlIFJFMRYwFAYDVQQLDA1JVCBE
|
||||
ZXBhcnRtZW50MRQwEgYDVQQDDAtleGFtcGxlLmNvbTCCA0IwggI1BgcqhkjOOAQB
|
||||
MIICKAKCAQEAsvoKmCHcR2y8qQ/kpBHOvlaGifq//F/0zhWSpfjvwqI3g2EjqXL7
|
||||
rCYyu9wxoogODo6Dnenxfw1xp3ZIJNCtfrSJyt0AudjOedtVWMSnTndoQVQtYSI0
|
||||
mmrBAqFL26i1bmEMxsd6pz2nU3p8yGY/wpYiWwyy+/TZv8a2t58owpw9Qkm4cX4E
|
||||
Po3ih/XbN6eooOx9ZaErcS9mg3UvwQDm0VYD3ZjSeqwP7YWGyhq7gPJsEiMrft12
|
||||
1SjyNz8rkhXzqZFRujjmfTT5dpCC/Z4d7/ZE30tbqHaNDM+YwBrb/aL7PnoWs847
|
||||
VpjCVxmVmgIPoMHlTbg29RsIUoFlFScaUQIdAMGwwpzilrReaEqcoX7PY5u4vtV0
|
||||
5zuiVIqkdBMCggEAQZhk5qdAYoMvZhPi5TOgysTzQE1FeAEtgypxZI65TpwO/JOr
|
||||
AX9vYZ/qCYX/ncj455qiPZenl59lo/iQPzhJUubuCevPWJ3dsKRbAyL/5NCwifnf
|
||||
YBMJGj0UFGL4ekVV0emLL9H5eqYz64w0eV2Sp40O8yCu0qr7QTi3zpqzJZ43E+26
|
||||
Z9bgR6c1lmgKW2QN72PHwMlTlq0O6mN+eikEWoGr09JWpXMThZemAO2mHLAiq6ju
|
||||
0+zduzWZyjZPZA1B4XUlTgCtzHveYpUzZ1NhZyM8jcGFOmmZWAFNwt03bq9/Ma0q
|
||||
3jB0Dyz7IDGm8D6Y770wJRP3jf7iCVYt8jB49gOCAQUAAoIBACnVv+1ROrUiHAwn
|
||||
xXGlsZdTEYZfWbE8Cter15JNNqh/Z1cdIp9m1t/rVF69nSWQvrvLeFo5p5mGxK8r
|
||||
IKHTZTaAn6uO6PcNJc6iB7fS15L4uiB7p73MdjE+3PcYMbhttDlexdm6QxsmCP1F
|
||||
3LYW3Uh879AURWZwPH3z4NZL2u1AFSyS1vQhtiCmztq94QwhjoDf9anFR8q05dAC
|
||||
juPlKYEIhMsoq+r/l/kOM1UghhXX6BmeF8R9hhW1p4Rv+gyAgbYjowJFtZnwE5p0
|
||||
OYLJzSQWjFMYEzHAoH8J4+D5okt4IXEd0BDxLBkm1WonIxYL/NL95p3qXpgUXqRX
|
||||
M9spEzWgbTBrBgkqhkiG9w0BCQ4xXjBcMCcGA1UdEQQgMB6CC2V4YW1wbGUuY29t
|
||||
gg93d3cuZXhhbXBsZS5jb20wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBaAw
|
||||
EwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYJYIZIAWUDBAMCA0AAMD0CHQCyrstoqfvs
|
||||
MCfsZUeycKrKQmAJAHxuoGPCKl7yAhwhNH9RNxBm5roO2U901BeF2p0pT410ghH8
|
||||
oA+F
|
||||
-----END CERTIFICATE REQUEST-----`;
|
||||
|
||||
const OUT_EXAMPLE_COM_DSA_2048 = `Subject
|
||||
C = CH
|
||||
ST = Zurich
|
||||
L = Zurich
|
||||
O = Example RE
|
||||
OU = IT Department
|
||||
CN = example.com
|
||||
Public Key
|
||||
Algorithm: DSA
|
||||
Length: 2048 bits
|
||||
Pub: 29:d5:bf:ed:51:3a:b5:22:1c:0c:27:c5:71:a5:b1:97:
|
||||
53:11:86:5f:59:b1:3c:0a:d7:ab:d7:92:4d:36:a8:7f:
|
||||
67:57:1d:22:9f:66:d6:df:eb:54:5e:bd:9d:25:90:be:
|
||||
bb:cb:78:5a:39:a7:99:86:c4:af:2b:20:a1:d3:65:36:
|
||||
80:9f:ab:8e:e8:f7:0d:25:ce:a2:07:b7:d2:d7:92:f8:
|
||||
ba:20:7b:a7:bd:cc:76:31:3e:dc:f7:18:31:b8:6d:b4:
|
||||
39:5e:c5:d9:ba:43:1b:26:08:fd:45:dc:b6:16:dd:48:
|
||||
7c:ef:d0:14:45:66:70:3c:7d:f3:e0:d6:4b:da:ed:40:
|
||||
15:2c:92:d6:f4:21:b6:20:a6:ce:da:bd:e1:0c:21:8e:
|
||||
80:df:f5:a9:c5:47:ca:b4:e5:d0:02:8e:e3:e5:29:81:
|
||||
08:84:cb:28:ab:ea:ff:97:f9:0e:33:55:20:86:15:d7:
|
||||
e8:19:9e:17:c4:7d:86:15:b5:a7:84:6f:fa:0c:80:81:
|
||||
b6:23:a3:02:45:b5:99:f0:13:9a:74:39:82:c9:cd:24:
|
||||
16:8c:53:18:13:31:c0:a0:7f:09:e3:e0:f9:a2:4b:78:
|
||||
21:71:1d:d0:10:f1:2c:19:26:d5:6a:27:23:16:0b:fc:
|
||||
d2:fd:e6:9d:ea:5e:98:14:5e:a4:57:33:db:29:13:35
|
||||
P: 00:b2:fa:0a:98:21:dc:47:6c:bc:a9:0f:e4:a4:11:ce:
|
||||
be:56:86:89:fa:bf:fc:5f:f4:ce:15:92:a5:f8:ef:c2:
|
||||
a2:37:83:61:23:a9:72:fb:ac:26:32:bb:dc:31:a2:88:
|
||||
0e:0e:8e:83:9d:e9:f1:7f:0d:71:a7:76:48:24:d0:ad:
|
||||
7e:b4:89:ca:dd:00:b9:d8:ce:79:db:55:58:c4:a7:4e:
|
||||
77:68:41:54:2d:61:22:34:9a:6a:c1:02:a1:4b:db:a8:
|
||||
b5:6e:61:0c:c6:c7:7a:a7:3d:a7:53:7a:7c:c8:66:3f:
|
||||
c2:96:22:5b:0c:b2:fb:f4:d9:bf:c6:b6:b7:9f:28:c2:
|
||||
9c:3d:42:49:b8:71:7e:04:3e:8d:e2:87:f5:db:37:a7:
|
||||
a8:a0:ec:7d:65:a1:2b:71:2f:66:83:75:2f:c1:00:e6:
|
||||
d1:56:03:dd:98:d2:7a:ac:0f:ed:85:86:ca:1a:bb:80:
|
||||
f2:6c:12:23:2b:7e:dd:76:d5:28:f2:37:3f:2b:92:15:
|
||||
f3:a9:91:51:ba:38:e6:7d:34:f9:76:90:82:fd:9e:1d:
|
||||
ef:f6:44:df:4b:5b:a8:76:8d:0c:cf:98:c0:1a:db:fd:
|
||||
a2:fb:3e:7a:16:b3:ce:3b:56:98:c2:57:19:95:9a:02:
|
||||
0f:a0:c1:e5:4d:b8:36:f5:1b:08:52:81:65:15:27:1a:
|
||||
51
|
||||
Q: 00:c1:b0:c2:9c:e2:96:b4:5e:68:4a:9c:a1:7e:cf:63:
|
||||
9b:b8:be:d5:74:e7:3b:a2:54:8a:a4:74:13
|
||||
G: 41:98:64:e6:a7:40:62:83:2f:66:13:e2:e5:33:a0:ca:
|
||||
c4:f3:40:4d:45:78:01:2d:83:2a:71:64:8e:b9:4e:9c:
|
||||
0e:fc:93:ab:01:7f:6f:61:9f:ea:09:85:ff:9d:c8:f8:
|
||||
e7:9a:a2:3d:97:a7:97:9f:65:a3:f8:90:3f:38:49:52:
|
||||
e6:ee:09:eb:cf:58:9d:dd:b0:a4:5b:03:22:ff:e4:d0:
|
||||
b0:89:f9:df:60:13:09:1a:3d:14:14:62:f8:7a:45:55:
|
||||
d1:e9:8b:2f:d1:f9:7a:a6:33:eb:8c:34:79:5d:92:a7:
|
||||
8d:0e:f3:20:ae:d2:aa:fb:41:38:b7:ce:9a:b3:25:9e:
|
||||
37:13:ed:ba:67:d6:e0:47:a7:35:96:68:0a:5b:64:0d:
|
||||
ef:63:c7:c0:c9:53:96:ad:0e:ea:63:7e:7a:29:04:5a:
|
||||
81:ab:d3:d2:56:a5:73:13:85:97:a6:00:ed:a6:1c:b0:
|
||||
22:ab:a8:ee:d3:ec:dd:bb:35:99:ca:36:4f:64:0d:41:
|
||||
e1:75:25:4e:00:ad:cc:7b:de:62:95:33:67:53:61:67:
|
||||
23:3c:8d:c1:85:3a:69:99:58:01:4d:c2:dd:37:6e:af:
|
||||
7f:31:ad:2a:de:30:74:0f:2c:fb:20:31:a6:f0:3e:98:
|
||||
ef:bd:30:25:13:f7:8d:fe:e2:09:56:2d:f2:30:78:f6
|
||||
Signature
|
||||
Algorithm: SHA256withDSA
|
||||
Signature:
|
||||
R: 00:b2:ae:cb:68:a9:fb:ec:30:27:ec:65:47:b2:70:aa:
|
||||
ca:42:60:09:00:7c:6e:a0:63:c2:2a:5e:f2
|
||||
S: 21:34:7f:51:37:10:66:e6:ba:0e:d9:4f:74:d4:17:85:
|
||||
da:9d:29:4f:8d:74:82:11:fc:a0:0f:85
|
||||
Requested Extensions
|
||||
Basic Constraints: critical
|
||||
CA = false
|
||||
Key Usage: critical
|
||||
Digital Signature
|
||||
Key encipherment
|
||||
Extended Key Usage:
|
||||
TLS Web Server Authentication
|
||||
Subject Alternative Name:
|
||||
DNS: example.com
|
||||
DNS: www.example.com`;
|
||||
|
||||
// openssl req -newkey rsa:4096 -keyout test-rsa-4096.key -out test-rsa-4096.csr
|
||||
// -subj "/C=CH/ST=Zurich/L=Zurich/O=Example RE/OU=IT Department/CN=example.com"
|
||||
// -addext "subjectAltName = DNS:example.com,DNS:www.example.com,IP:127.0.0.1, \
|
||||
// email:user@example.com,URI:http://example.com/api,otherName:1.2.3.4;UTF8:some value"
|
||||
// -addext "basicConstraints = critical,CA:FALSE"
|
||||
// -addext "keyUsage = critical,digitalSignature,keyEncipherment"
|
||||
// -addext "extendedKeyUsage = serverAuth"
|
||||
const IN_EXAMPLE_COM_SAN = `-----BEGIN CERTIFICATE REQUEST-----
|
||||
MIIFbTCCA1UCAQAwcjELMAkGA1UEBhMCQ0gxDzANBgNVBAgMBlp1cmljaDEPMA0G
|
||||
A1UEBwwGWnVyaWNoMRMwEQYDVQQKDApFeGFtcGxlIFJFMRYwFAYDVQQLDA1JVCBE
|
||||
ZXBhcnRtZW50MRQwEgYDVQQDDAtleGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEB
|
||||
BQADggIPADCCAgoCggIBAJf8uQDFcQfj6qCuPa4hNyDWr3Lwzfc3qQZdOgNJ/kym
|
||||
GxxRHUXJyBtgkmAqDoSGmg1hUWgt9eZwd/Cf4Wd3qr+Q0ppg6dwZeWgYSunseoKl
|
||||
f0E5FvUfECNyDwCSbltN9TCsom2ePNOOJJHWo4Y3E3jGXz0n1Vwa6ePR0j62Rcey
|
||||
4lHLscQ3GoNvMLcXbY1HIhnbaI25MmFPB8p4PvpPsAYgbWHbw0jIR9dSxEK0HAU3
|
||||
2VkRkm8XaF4BOEfugqT3Bc7zAvwdFZRTTTZIICYW5T3zvtxBidJ8OSej16LV6ZeE
|
||||
/4VcTzXYTzIUXbNaev3XN1r5ZodkbZvxxk/EZmfes2OtedPulW4TW27HSl6XBos/
|
||||
8VQohelUXiyCLPrtbnjeHKSz47+ZAm23jMAFYWkTVdWvAa+G74UstuRRXfLAKCNv
|
||||
7VeA3l8IgEkfj48u+EenV6cJ3ZJJ5/qvZo7OUjhAtYJmNtlRYE4r3uWRmaNXYwrD
|
||||
7vJuMiZafaVC+74/UHLGGm7sHVJdo4KBO/LUbHJ/SKZIYMc14kJLOf6TPZXSGm9N
|
||||
TxbOV9Vzcjzivq1HxaYirLAM+nyVApVwwpVq/uiEFz579yrwySvBuwnewfdfZ6EZ
|
||||
iNAKiBwQ8diFMnFfd/28hJ8TrIlq+5bkVo1ODuhyRIw9YB19IrmytaVvkR8624Ld
|
||||
AgMBAAGggbUwgbIGCSqGSIb3DQEJDjGBpDCBoTBsBgNVHREEZTBjggtleGFtcGxl
|
||||
LmNvbYIPd3d3LmV4YW1wbGUuY29thwR/AAABgRB1c2VyQGV4YW1wbGUuY29thhZo
|
||||
dHRwOi8vZXhhbXBsZS5jb20vYXBpoBMGAyoDBKAMDApzb21lIHZhbHVlMAwGA1Ud
|
||||
EwEB/wQCMAAwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA0G
|
||||
CSqGSIb3DQEBCwUAA4ICAQAtOuh6MEralwgChJHBaGJavBxpCQ0p5K77RlAPIk5Q
|
||||
Mv5086DxiZEFBKCRiZRtkOvo0aCHUn3awDrlEOgECiAYQqMIBUWeNwImtmpDopuI
|
||||
ZMmVmzc2ojf9nUlPrPV+B6P2jTxTIQYpDQocbOgxDkcdZVSvLyMEFnHIMNQV7GS2
|
||||
gBmUnPp+4z2d8X9XaRspkuEt2nbA1NoXekWaG46jG56VoBycepOiNkwL4AsqunLa
|
||||
T0urcHq34g+HRQWwOA+q/72qP4oaj2ZO0fFJQl2ZsGRT/IuM1g2YsnVSpBOGY/J6
|
||||
Qi2hDr6EEqphg501ny+FZE1BouQ/lSykafYyauwNq1puu/VyuF8grFmL0SoxWWfP
|
||||
h6viblGM/Vu69Bhl4gkWKtufWpOVpCA4vHzes8IVMFg7vhpwm33Xjo0lCPcIUin6
|
||||
0CqHZQCsWtj2yIAF66WHB0I1DHL5FNCWRPnQCo54qRZIYqtSP20QRr6GWC2d+ZgX
|
||||
wDxRpmzr8T8owBYWw3j+RK9CtZoWO4O586UR4J1Bn5PQfoR78Z/4mzv2sxVi9Fdf
|
||||
sJzlG6/nhmMaCqneIn97gkguvSgpOuKSeo/fjbpnthufgilrpDQoGrhZaXic0GVZ
|
||||
6JmbOh3tLMVf4ooyyaLfOCfV2FN12rDa3pdWhQ4MVN4gg9U3Cq0x7yRQKiSBlBnw
|
||||
oA==
|
||||
-----END CERTIFICATE REQUEST-----`;
|
||||
|
||||
const OUT_EXAMPLE_COM_SAN = `Subject
|
||||
C = CH
|
||||
ST = Zurich
|
||||
L = Zurich
|
||||
O = Example RE
|
||||
OU = IT Department
|
||||
CN = example.com
|
||||
Public Key
|
||||
Algorithm: RSA
|
||||
Length: 4096 bits
|
||||
Modulus: 00:97:fc:b9:00:c5:71:07:e3:ea:a0:ae:3d:ae:21:37:
|
||||
20:d6:af:72:f0:cd:f7:37:a9:06:5d:3a:03:49:fe:4c:
|
||||
a6:1b:1c:51:1d:45:c9:c8:1b:60:92:60:2a:0e:84:86:
|
||||
9a:0d:61:51:68:2d:f5:e6:70:77:f0:9f:e1:67:77:aa:
|
||||
bf:90:d2:9a:60:e9:dc:19:79:68:18:4a:e9:ec:7a:82:
|
||||
a5:7f:41:39:16:f5:1f:10:23:72:0f:00:92:6e:5b:4d:
|
||||
f5:30:ac:a2:6d:9e:3c:d3:8e:24:91:d6:a3:86:37:13:
|
||||
78:c6:5f:3d:27:d5:5c:1a:e9:e3:d1:d2:3e:b6:45:c7:
|
||||
b2:e2:51:cb:b1:c4:37:1a:83:6f:30:b7:17:6d:8d:47:
|
||||
22:19:db:68:8d:b9:32:61:4f:07:ca:78:3e:fa:4f:b0:
|
||||
06:20:6d:61:db:c3:48:c8:47:d7:52:c4:42:b4:1c:05:
|
||||
37:d9:59:11:92:6f:17:68:5e:01:38:47:ee:82:a4:f7:
|
||||
05:ce:f3:02:fc:1d:15:94:53:4d:36:48:20:26:16:e5:
|
||||
3d:f3:be:dc:41:89:d2:7c:39:27:a3:d7:a2:d5:e9:97:
|
||||
84:ff:85:5c:4f:35:d8:4f:32:14:5d:b3:5a:7a:fd:d7:
|
||||
37:5a:f9:66:87:64:6d:9b:f1:c6:4f:c4:66:67:de:b3:
|
||||
63:ad:79:d3:ee:95:6e:13:5b:6e:c7:4a:5e:97:06:8b:
|
||||
3f:f1:54:28:85:e9:54:5e:2c:82:2c:fa:ed:6e:78:de:
|
||||
1c:a4:b3:e3:bf:99:02:6d:b7:8c:c0:05:61:69:13:55:
|
||||
d5:af:01:af:86:ef:85:2c:b6:e4:51:5d:f2:c0:28:23:
|
||||
6f:ed:57:80:de:5f:08:80:49:1f:8f:8f:2e:f8:47:a7:
|
||||
57:a7:09:dd:92:49:e7:fa:af:66:8e:ce:52:38:40:b5:
|
||||
82:66:36:d9:51:60:4e:2b:de:e5:91:99:a3:57:63:0a:
|
||||
c3:ee:f2:6e:32:26:5a:7d:a5:42:fb:be:3f:50:72:c6:
|
||||
1a:6e:ec:1d:52:5d:a3:82:81:3b:f2:d4:6c:72:7f:48:
|
||||
a6:48:60:c7:35:e2:42:4b:39:fe:93:3d:95:d2:1a:6f:
|
||||
4d:4f:16:ce:57:d5:73:72:3c:e2:be:ad:47:c5:a6:22:
|
||||
ac:b0:0c:fa:7c:95:02:95:70:c2:95:6a:fe:e8:84:17:
|
||||
3e:7b:f7:2a:f0:c9:2b:c1:bb:09:de:c1:f7:5f:67:a1:
|
||||
19:88:d0:0a:88:1c:10:f1:d8:85:32:71:5f:77:fd:bc:
|
||||
84:9f:13:ac:89:6a:fb:96:e4:56:8d:4e:0e:e8:72:44:
|
||||
8c:3d:60:1d:7d:22:b9:b2:b5:a5:6f:91:1f:3a:db:82:
|
||||
dd
|
||||
Exponent: 65537 (0x10001)
|
||||
Signature
|
||||
Algorithm: SHA256withRSA
|
||||
Signature: 2d:3a:e8:7a:30:4a:da:97:08:02:84:91:c1:68:62:5a:
|
||||
bc:1c:69:09:0d:29:e4:ae:fb:46:50:0f:22:4e:50:32:
|
||||
fe:74:f3:a0:f1:89:91:05:04:a0:91:89:94:6d:90:eb:
|
||||
e8:d1:a0:87:52:7d:da:c0:3a:e5:10:e8:04:0a:20:18:
|
||||
42:a3:08:05:45:9e:37:02:26:b6:6a:43:a2:9b:88:64:
|
||||
c9:95:9b:37:36:a2:37:fd:9d:49:4f:ac:f5:7e:07:a3:
|
||||
f6:8d:3c:53:21:06:29:0d:0a:1c:6c:e8:31:0e:47:1d:
|
||||
65:54:af:2f:23:04:16:71:c8:30:d4:15:ec:64:b6:80:
|
||||
19:94:9c:fa:7e:e3:3d:9d:f1:7f:57:69:1b:29:92:e1:
|
||||
2d:da:76:c0:d4:da:17:7a:45:9a:1b:8e:a3:1b:9e:95:
|
||||
a0:1c:9c:7a:93:a2:36:4c:0b:e0:0b:2a:ba:72:da:4f:
|
||||
4b:ab:70:7a:b7:e2:0f:87:45:05:b0:38:0f:aa:ff:bd:
|
||||
aa:3f:8a:1a:8f:66:4e:d1:f1:49:42:5d:99:b0:64:53:
|
||||
fc:8b:8c:d6:0d:98:b2:75:52:a4:13:86:63:f2:7a:42:
|
||||
2d:a1:0e:be:84:12:aa:61:83:9d:35:9f:2f:85:64:4d:
|
||||
41:a2:e4:3f:95:2c:a4:69:f6:32:6a:ec:0d:ab:5a:6e:
|
||||
bb:f5:72:b8:5f:20:ac:59:8b:d1:2a:31:59:67:cf:87:
|
||||
ab:e2:6e:51:8c:fd:5b:ba:f4:18:65:e2:09:16:2a:db:
|
||||
9f:5a:93:95:a4:20:38:bc:7c:de:b3:c2:15:30:58:3b:
|
||||
be:1a:70:9b:7d:d7:8e:8d:25:08:f7:08:52:29:fa:d0:
|
||||
2a:87:65:00:ac:5a:d8:f6:c8:80:05:eb:a5:87:07:42:
|
||||
35:0c:72:f9:14:d0:96:44:f9:d0:0a:8e:78:a9:16:48:
|
||||
62:ab:52:3f:6d:10:46:be:86:58:2d:9d:f9:98:17:c0:
|
||||
3c:51:a6:6c:eb:f1:3f:28:c0:16:16:c3:78:fe:44:af:
|
||||
42:b5:9a:16:3b:83:b9:f3:a5:11:e0:9d:41:9f:93:d0:
|
||||
7e:84:7b:f1:9f:f8:9b:3b:f6:b3:15:62:f4:57:5f:b0:
|
||||
9c:e5:1b:af:e7:86:63:1a:0a:a9:de:22:7f:7b:82:48:
|
||||
2e:bd:28:29:3a:e2:92:7a:8f:df:8d:ba:67:b6:1b:9f:
|
||||
82:29:6b:a4:34:28:1a:b8:59:69:78:9c:d0:65:59:e8:
|
||||
99:9b:3a:1d:ed:2c:c5:5f:e2:8a:32:c9:a2:df:38:27:
|
||||
d5:d8:53:75:da:b0:da:de:97:56:85:0e:0c:54:de:20:
|
||||
83:d5:37:0a:ad:31:ef:24:50:2a:24:81:94:19:f0:a0
|
||||
Requested Extensions
|
||||
Basic Constraints: critical
|
||||
CA = false
|
||||
Key Usage: critical
|
||||
Digital Signature
|
||||
Key encipherment
|
||||
Extended Key Usage:
|
||||
TLS Web Server Authentication
|
||||
Subject Alternative Name:
|
||||
DNS: example.com
|
||||
DNS: www.example.com
|
||||
IP: 127.0.0.1
|
||||
EMAIL: user@example.com
|
||||
URI: http://example.com/api
|
||||
Other: 1.2.3.4::some value`;
|
||||
|
||||
// openssl req -newkey rsa:2048 -keyout test-rsa-2048.key -out test-rsa-2048.csr \
|
||||
// -subj "/C=CH/ST=Zurich/L=Zurich/O=Example RE/OU=IT Department/CN=example.com" \
|
||||
// -addext "subjectAltName = DNS:example.com,DNS:www.example.com" \
|
||||
// -addext "basicConstraints = critical,CA:FALSE" \
|
||||
// -addext "keyUsage = critical,digitalSignature,keyEncipherment," \
|
||||
// -addext "extendedKeyUsage = serverAuth"
|
||||
const IN_EXAMPLE_COM_KEY_USAGE = `-----BEGIN CERTIFICATE REQUEST-----
|
||||
MIIDJDCCAgwCAQAwcjELMAkGA1UEBhMCQ0gxDzANBgNVBAgMBlp1cmljaDEPMA0G
|
||||
A1UEBwwGWnVyaWNoMRMwEQYDVQQKDApFeGFtcGxlIFJFMRYwFAYDVQQLDA1JVCBE
|
||||
ZXBhcnRtZW50MRQwEgYDVQQDDAtleGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEB
|
||||
BQADggEPADCCAQoCggEBAKHQWxqtdJQ1l7ApTgwgsyrN/kRDrog/DsUlZQg3YodY
|
||||
4RRAgPr+AeQ1BhuWDVxaXein0XmXOESHgK9Z7X/hLgRy2ifK+n20Ij3+k6VSh6Lt
|
||||
lpjUPwK7PWBtZ969DukBIvq64XrJTNWIJPvXXQxkL4dk5NcDY4TjXWt0GgDVR+GH
|
||||
OU1JwfzviGVRdOmY8+Ckfxc+3QytTdP6KBQaiUk5sBEniovDpKfImtql72JsCRbA
|
||||
9Wue7X4EbXi2zvoAlJ5NXF3Ps1q2XsVJeIx/mMDcgRW7s5AVM9NQW0O1JLoA7dY+
|
||||
vSrKZj+ssuKCIWM7u9Big2I0miEl5AXrDlwZPBhM9FMCAwEAAaBtMGsGCSqGSIb3
|
||||
DQEJDjFeMFwwJwYDVR0RBCAwHoILZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLmNv
|
||||
bTAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIB/jATBgNVHSUEDDAKBggrBgEF
|
||||
BQcDATANBgkqhkiG9w0BAQsFAAOCAQEAPOr6jfq/mXilqXA11CTza69Ydd4fvp6q
|
||||
UG47PefzQqSmYtpUytwZRLGQ1IFRlYeXwbazVLkRmLNwpbB8C5fh9FPp55JCpM/O
|
||||
tgCW2uqLkCtkQMUCaSdRX/Y+9ypYhdBkSNv1Q+3QXi2jmi5QMqwerAwNmeXmH6AZ
|
||||
swMgAhuoLS9OrIqHjFoHGoXsgXMkbLr6m6hgyFt8ZbbwK4WpVcgCZfhtBiLilCJN
|
||||
Xr9GUXL3FqUb7sIaYKAaghr2haqKhFsIH57XVK3DZYhOkLd9uC8TLdl2e+t9Hcy9
|
||||
ymLwiIGMUfuBQMP8nVu3jGXAQ5N4VV+IZfF8UaBFW8tG+Ms2TeW68Q==
|
||||
-----END CERTIFICATE REQUEST-----`;
|
||||
|
||||
const OUT_EXAMPLE_COM_KEY_USAGE = `Subject
|
||||
C = CH
|
||||
ST = Zurich
|
||||
L = Zurich
|
||||
O = Example RE
|
||||
OU = IT Department
|
||||
CN = example.com
|
||||
Public Key
|
||||
Algorithm: RSA
|
||||
Length: 2048 bits
|
||||
Modulus: 00:a1:d0:5b:1a:ad:74:94:35:97:b0:29:4e:0c:20:b3:
|
||||
2a:cd:fe:44:43:ae:88:3f:0e:c5:25:65:08:37:62:87:
|
||||
58:e1:14:40:80:fa:fe:01:e4:35:06:1b:96:0d:5c:5a:
|
||||
5d:e8:a7:d1:79:97:38:44:87:80:af:59:ed:7f:e1:2e:
|
||||
04:72:da:27:ca:fa:7d:b4:22:3d:fe:93:a5:52:87:a2:
|
||||
ed:96:98:d4:3f:02:bb:3d:60:6d:67:de:bd:0e:e9:01:
|
||||
22:fa:ba:e1:7a:c9:4c:d5:88:24:fb:d7:5d:0c:64:2f:
|
||||
87:64:e4:d7:03:63:84:e3:5d:6b:74:1a:00:d5:47:e1:
|
||||
87:39:4d:49:c1:fc:ef:88:65:51:74:e9:98:f3:e0:a4:
|
||||
7f:17:3e:dd:0c:ad:4d:d3:fa:28:14:1a:89:49:39:b0:
|
||||
11:27:8a:8b:c3:a4:a7:c8:9a:da:a5:ef:62:6c:09:16:
|
||||
c0:f5:6b:9e:ed:7e:04:6d:78:b6:ce:fa:00:94:9e:4d:
|
||||
5c:5d:cf:b3:5a:b6:5e:c5:49:78:8c:7f:98:c0:dc:81:
|
||||
15:bb:b3:90:15:33:d3:50:5b:43:b5:24:ba:00:ed:d6:
|
||||
3e:bd:2a:ca:66:3f:ac:b2:e2:82:21:63:3b:bb:d0:62:
|
||||
83:62:34:9a:21:25:e4:05:eb:0e:5c:19:3c:18:4c:f4:
|
||||
53
|
||||
Exponent: 65537 (0x10001)
|
||||
Signature
|
||||
Algorithm: SHA256withRSA
|
||||
Signature: 3c:ea:fa:8d:fa:bf:99:78:a5:a9:70:35:d4:24:f3:6b:
|
||||
af:58:75:de:1f:be:9e:aa:50:6e:3b:3d:e7:f3:42:a4:
|
||||
a6:62:da:54:ca:dc:19:44:b1:90:d4:81:51:95:87:97:
|
||||
c1:b6:b3:54:b9:11:98:b3:70:a5:b0:7c:0b:97:e1:f4:
|
||||
53:e9:e7:92:42:a4:cf:ce:b6:00:96:da:ea:8b:90:2b:
|
||||
64:40:c5:02:69:27:51:5f:f6:3e:f7:2a:58:85:d0:64:
|
||||
48:db:f5:43:ed:d0:5e:2d:a3:9a:2e:50:32:ac:1e:ac:
|
||||
0c:0d:99:e5:e6:1f:a0:19:b3:03:20:02:1b:a8:2d:2f:
|
||||
4e:ac:8a:87:8c:5a:07:1a:85:ec:81:73:24:6c:ba:fa:
|
||||
9b:a8:60:c8:5b:7c:65:b6:f0:2b:85:a9:55:c8:02:65:
|
||||
f8:6d:06:22:e2:94:22:4d:5e:bf:46:51:72:f7:16:a5:
|
||||
1b:ee:c2:1a:60:a0:1a:82:1a:f6:85:aa:8a:84:5b:08:
|
||||
1f:9e:d7:54:ad:c3:65:88:4e:90:b7:7d:b8:2f:13:2d:
|
||||
d9:76:7b:eb:7d:1d:cc:bd:ca:62:f0:88:81:8c:51:fb:
|
||||
81:40:c3:fc:9d:5b:b7:8c:65:c0:43:93:78:55:5f:88:
|
||||
65:f1:7c:51:a0:45:5b:cb:46:f8:cb:36:4d:e5:ba:f1
|
||||
Requested Extensions
|
||||
Basic Constraints: critical
|
||||
CA = false
|
||||
Key Usage: critical
|
||||
Digital Signature
|
||||
Non-repudiation
|
||||
Key encipherment
|
||||
Data encipherment
|
||||
Key agreement
|
||||
Key certificate signing
|
||||
CRL signing
|
||||
Extended Key Usage:
|
||||
TLS Web Server Authentication
|
||||
Subject Alternative Name:
|
||||
DNS: example.com
|
||||
DNS: www.example.com`;
|
||||
|
||||
// openssl req -newkey rsa:2048 -keyout test-rsa-2048.key -out test-rsa-2048.csr \
|
||||
// -subj "/C=CH/ST=Zurich/L=Zurich/O=Example RE/OU=IT Department/CN=example.com" \
|
||||
// -addext "subjectAltName = DNS:example.com,DNS:www.example.com" \
|
||||
// -addext "basicConstraints = critical,CA:FALSE" \
|
||||
// -addext "keyUsage = critical,digitalSignature,keyEncipherment" \
|
||||
// -addext "extendedKeyUsage = serverAuth"
|
||||
const IN_EXAMPLE_COM_EXTENDED_KEY_USAGE = `-----BEGIN CERTIFICATE REQUEST-----
|
||||
MIIDpzCCAo8CAQAwcjELMAkGA1UEBhMCQ0gxDzANBgNVBAgMBlp1cmljaDEPMA0G
|
||||
A1UEBwwGWnVyaWNoMRMwEQYDVQQKDApFeGFtcGxlIFJFMRYwFAYDVQQLDA1JVCBE
|
||||
ZXBhcnRtZW50MRQwEgYDVQQDDAtleGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEB
|
||||
BQADggEPADCCAQoCggEBAMjQ/Bz+CzA/WaS+Nyp3ijWzYlKY7GmA/a2FuzNSPQlr
|
||||
WuGyZJcfb0CpLIpRF8qcDllAe+hFQnVGnk3svQIhfEOD7qwzBRMHVhe59jkv2kER
|
||||
s+u88KBCNfIAS6m5d45y4xH338aXq4lZexiEASWHS7SsWAR3kL3c9p14U9EHOaym
|
||||
ZWPO/SCfCJyhxszDLM2eG5S2rviuu9nY+rk0Oo7z8x8PZF9Wl1NamLl1tWPqsznS
|
||||
3bfjdJYeUlm7XvTzC6EMAT6K/5ker0chl7Hg0mcEO9w4c2cSTAHvZ2b2sRYbxNQZ
|
||||
49byQsRAXW8TNnOaK9Phmvwy/irEXU9PEl3u7KvSnNcCAwEAAaCB7zCB7AYJKoZI
|
||||
hvcNAQkOMYHeMIHbMCcGA1UdEQQgMB6CC2V4YW1wbGUuY29tgg93d3cuZXhhbXBs
|
||||
ZS5jb20wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBaAwgZEGA1UdJQSBiTCB
|
||||
hgYIKwYBBQUHAwEGCCsGAQUFBwMCBggrBgEFBQcDAwYIKwYBBQUHAwQGCCsGAQUF
|
||||
BwMIBgorBgEEAYI3AgEVBgorBgEEAYI3AgEWBgorBgEEAYI3CgMBBgorBgEEAYI3
|
||||
CgMDBgorBgEEAYI3CgMEBgorBgEEAYI3FAICBgorBgEEAYI3CgMDMA0GCSqGSIb3
|
||||
DQEBCwUAA4IBAQCcYWj1eIxj/FUEhhm2lZr06Pq4GEtIVsMWw5IrUn2FIFb/yY8x
|
||||
GHuB5v7XNA/8zhRWvIAXGaa8Bnajk4mR0rkxy1MXpd2YevdrF/XFa2Totv4E4/I6
|
||||
pvrFefYTSGpmCu5zQTuoanM7JjE81vvbTLFdaHMdLOekpuK5v5kbuNdtDpEiAkd0
|
||||
vmV4BQ0BV3b3zhIRQqBB60pSBHYvMhHNn/80RhVUQxaPTS7/AMHRZGRc1lD9/bjA
|
||||
pMBis9CL4AbXtTcztU5qy4VpB1/Ej3AbAjuJIbpbPH6XtxIEtqdM4Seqi44w9oX4
|
||||
rxQagXmvJPp+E4253EkeHwhfHh4SnJEtsibQ
|
||||
-----END CERTIFICATE REQUEST-----`;
|
||||
|
||||
const OUT_EXAMPLE_COM_EXTENDED_KEY_USAGE = `Subject
|
||||
C = CH
|
||||
ST = Zurich
|
||||
L = Zurich
|
||||
O = Example RE
|
||||
OU = IT Department
|
||||
CN = example.com
|
||||
Public Key
|
||||
Algorithm: RSA
|
||||
Length: 2048 bits
|
||||
Modulus: 00:c8:d0:fc:1c:fe:0b:30:3f:59:a4:be:37:2a:77:8a:
|
||||
35:b3:62:52:98:ec:69:80:fd:ad:85:bb:33:52:3d:09:
|
||||
6b:5a:e1:b2:64:97:1f:6f:40:a9:2c:8a:51:17:ca:9c:
|
||||
0e:59:40:7b:e8:45:42:75:46:9e:4d:ec:bd:02:21:7c:
|
||||
43:83:ee:ac:33:05:13:07:56:17:b9:f6:39:2f:da:41:
|
||||
11:b3:eb:bc:f0:a0:42:35:f2:00:4b:a9:b9:77:8e:72:
|
||||
e3:11:f7:df:c6:97:ab:89:59:7b:18:84:01:25:87:4b:
|
||||
b4:ac:58:04:77:90:bd:dc:f6:9d:78:53:d1:07:39:ac:
|
||||
a6:65:63:ce:fd:20:9f:08:9c:a1:c6:cc:c3:2c:cd:9e:
|
||||
1b:94:b6:ae:f8:ae:bb:d9:d8:fa:b9:34:3a:8e:f3:f3:
|
||||
1f:0f:64:5f:56:97:53:5a:98:b9:75:b5:63:ea:b3:39:
|
||||
d2:dd:b7:e3:74:96:1e:52:59:bb:5e:f4:f3:0b:a1:0c:
|
||||
01:3e:8a:ff:99:1e:af:47:21:97:b1:e0:d2:67:04:3b:
|
||||
dc:38:73:67:12:4c:01:ef:67:66:f6:b1:16:1b:c4:d4:
|
||||
19:e3:d6:f2:42:c4:40:5d:6f:13:36:73:9a:2b:d3:e1:
|
||||
9a:fc:32:fe:2a:c4:5d:4f:4f:12:5d:ee:ec:ab:d2:9c:
|
||||
d7
|
||||
Exponent: 65537 (0x10001)
|
||||
Signature
|
||||
Algorithm: SHA256withRSA
|
||||
Signature: 9c:61:68:f5:78:8c:63:fc:55:04:86:19:b6:95:9a:f4:
|
||||
e8:fa:b8:18:4b:48:56:c3:16:c3:92:2b:52:7d:85:20:
|
||||
56:ff:c9:8f:31:18:7b:81:e6:fe:d7:34:0f:fc:ce:14:
|
||||
56:bc:80:17:19:a6:bc:06:76:a3:93:89:91:d2:b9:31:
|
||||
cb:53:17:a5:dd:98:7a:f7:6b:17:f5:c5:6b:64:e8:b6:
|
||||
fe:04:e3:f2:3a:a6:fa:c5:79:f6:13:48:6a:66:0a:ee:
|
||||
73:41:3b:a8:6a:73:3b:26:31:3c:d6:fb:db:4c:b1:5d:
|
||||
68:73:1d:2c:e7:a4:a6:e2:b9:bf:99:1b:b8:d7:6d:0e:
|
||||
91:22:02:47:74:be:65:78:05:0d:01:57:76:f7:ce:12:
|
||||
11:42:a0:41:eb:4a:52:04:76:2f:32:11:cd:9f:ff:34:
|
||||
46:15:54:43:16:8f:4d:2e:ff:00:c1:d1:64:64:5c:d6:
|
||||
50:fd:fd:b8:c0:a4:c0:62:b3:d0:8b:e0:06:d7:b5:37:
|
||||
33:b5:4e:6a:cb:85:69:07:5f:c4:8f:70:1b:02:3b:89:
|
||||
21:ba:5b:3c:7e:97:b7:12:04:b6:a7:4c:e1:27:aa:8b:
|
||||
8e:30:f6:85:f8:af:14:1a:81:79:af:24:fa:7e:13:8d:
|
||||
b9:dc:49:1e:1f:08:5f:1e:1e:12:9c:91:2d:b2:26:d0
|
||||
Requested Extensions
|
||||
Basic Constraints: critical
|
||||
CA = false
|
||||
Key Usage: critical
|
||||
Digital Signature
|
||||
Key encipherment
|
||||
Extended Key Usage:
|
||||
TLS Web Server Authentication
|
||||
TLS Web Client Authentication
|
||||
Code signing
|
||||
E-mail Protection (S/MIME)
|
||||
Trusted Timestamping
|
||||
Microsoft Individual Code Signing
|
||||
Microsoft Commercial Code Signing
|
||||
Microsoft Trust List Signing
|
||||
Microsoft Server Gated Crypto
|
||||
Microsoft Encrypted File System
|
||||
Microsoft Smartcard Login
|
||||
Microsoft Server Gated Crypto
|
||||
Subject Alternative Name:
|
||||
DNS: example.com
|
||||
DNS: www.example.com`;
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Parse CSR: Example Certificate Signing Request (CSR) with RSA 1024",
|
||||
input: IN_EXAMPLE_COM_RSA_1024,
|
||||
expectedOutput: OUT_EXAMPLE_COM_RSA_1024,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Parse CSR",
|
||||
"args": ["PEM"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Parse CSR: Example Certificate Signing Request (CSR) with RSA 2048",
|
||||
input: IN_EXAMPLE_COM_RSA_2048,
|
||||
expectedOutput: OUT_EXAMPLE_COM_RSA_2048,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Parse CSR",
|
||||
"args": ["PEM"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Parse CSR: Example Certificate Signing Request (CSR) with EC 256",
|
||||
input: IN_EXAMPLE_COM_EC_P256,
|
||||
expectedOutput: OUT_EXAMPLE_COM_EC_P256,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Parse CSR",
|
||||
"args": ["PEM"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Parse CSR: Example Certificate Signing Request (CSR) with EC 384",
|
||||
input: IN_EXAMPLE_COM_EC_P384,
|
||||
expectedOutput: OUT_EXAMPLE_COM_EC_P384,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Parse CSR",
|
||||
"args": ["PEM"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Parse CSR: Example Certificate Signing Request (CSR) with EC 521",
|
||||
input: IN_EXAMPLE_COM_EC_P521,
|
||||
expectedOutput: OUT_EXAMPLE_COM_EC_P521,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Parse CSR",
|
||||
"args": ["PEM"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Parse CSR: Example Certificate Signing Request (CSR) with DSA 1024",
|
||||
input: IN_EXAMPLE_COM_DSA_1024,
|
||||
expectedOutput: OUT_EXAMPLE_COM_DSA_1024,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Parse CSR",
|
||||
"args": ["PEM"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Parse CSR: Example Certificate Signing Request (CSR) with DSA 2048",
|
||||
input: IN_EXAMPLE_COM_DSA_2048,
|
||||
expectedOutput: OUT_EXAMPLE_COM_DSA_2048,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Parse CSR",
|
||||
"args": ["PEM"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Parse CSR: Example Certificate Signing Request (CSR) with DSA 2048",
|
||||
input: IN_EXAMPLE_COM_DSA_2048,
|
||||
expectedOutput: OUT_EXAMPLE_COM_DSA_2048,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Parse CSR",
|
||||
"args": ["PEM"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Parse CSR: Example Certificate Signing Request (CSR) with various SAN types",
|
||||
input: IN_EXAMPLE_COM_SAN,
|
||||
expectedOutput: OUT_EXAMPLE_COM_SAN,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Parse CSR",
|
||||
"args": ["PEM"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Parse CSR: Example Certificate Signing Request (CSR) with various Key Usages",
|
||||
input: IN_EXAMPLE_COM_KEY_USAGE,
|
||||
expectedOutput: OUT_EXAMPLE_COM_KEY_USAGE,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Parse CSR",
|
||||
"args": ["PEM"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Parse CSR: Example Certificate Signing Request (CSR) with various Extended Key Usages",
|
||||
input: IN_EXAMPLE_COM_EXTENDED_KEY_USAGE,
|
||||
expectedOutput: OUT_EXAMPLE_COM_EXTENDED_KEY_USAGE,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Parse CSR",
|
||||
"args": ["PEM"]
|
||||
}
|
||||
]
|
||||
},
|
||||
]);
|
2045
tests/operations/tests/ParseTLSRecord.mjs
Normal file
2045
tests/operations/tests/ParseTLSRecord.mjs
Normal file
File diff suppressed because one or more lines are too long
331
tests/operations/tests/ParseX509CRL.mjs
Normal file
331
tests/operations/tests/ParseX509CRL.mjs
Normal file
|
@ -0,0 +1,331 @@
|
|||
/**
|
||||
* Parse X.509 CRL tests.
|
||||
*
|
||||
* @author robinsandhu
|
||||
* @copyright Crown Copyright 2024
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
const IN_CRL_PEM_RSA = `-----BEGIN X509 CRL-----
|
||||
MIID7jCCAdYCAQEwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCVUsxDzANBgNV
|
||||
BAgMBkxvbmRvbjELMAkGA1UECgwCQkIxFTATBgNVBAMMDFRlc3QgUm9vdCBDQRcN
|
||||
MjQwODI1MTE0OTEwWhcNMjQwOTI0MTE0OTEwWjA1MDMCAhAAFw0yNDA4MjUwMzIz
|
||||
MDhaMB4wCgYDVR0VBAMKAQYwEAYDVR0XBAkGByqGSM44AgOgggEnMIIBIzAJBgNV
|
||||
HRIEAjAAMH0GA1UdIwR2MHSAFLjJrf2oUFTVhW40i0xgL7BJtodGoUakRDBCMQsw
|
||||
CQYDVQQGEwJVSzEPMA0GA1UECAwGTG9uZG9uMQswCQYDVQQKDAJCQjEVMBMGA1UE
|
||||
AwwMVGVzdCBSb290IENBghQ3XUv2vXwRfMxGGv/XLywm+B5LPTAtBgNVHS4EJjAk
|
||||
MCKgIKAehhxodHRwOi8vZXhhbXBsZS5jb20vZGVsdGEtY3JsMFsGA1UdHwRUMFIw
|
||||
IaAfoB2GG2h0dHA6Ly9leGFtcGxlLmNvbS9mdWxsLWNybDAhoB+gHYYbbGRhcDov
|
||||
L2V4YW1wbGUuY29tL2Z1bGwtY3JsMAqgCKAGhwR/AAABMAsGA1UdFAQEAgIePDAN
|
||||
BgkqhkiG9w0BAQsFAAOCAgEAAxsr+9nELUVWhFekwy6GsqH8xOf6EqGjRaEdX49W
|
||||
mB40m2VajOkK8UHGoVyZzoDI2r/c8OPXUtbpK0fpvEl3SZU5j/C8JbZaZFFrEGeH
|
||||
fSEqdVHFjohpawNcG41Qs+YT21TBqH1hD5yVI7gjVvfKICRfxDpl5oGClxBCVOSV
|
||||
gVtLbe9q44uCBJ1kUkoc9Vz47Hv7JyckgqVXkORWHt2SFNALxlMEzOEQTpuC5Kcb
|
||||
4i7hTCUF+kpkIvr02LJImq0Aaqzs6cC/DcdJiRPPyfaN8fQryFv76gg9i8zZcb6c
|
||||
W42rvumiyw+7nnZfmq53webr5fCHaXhZk47ASOJD6GC5cX9rje1qGRgULXRhqcvK
|
||||
n319s2iXj3FStDDorKGgsCV2zYmotX17ExB98CcCgBE52zMtRZilwhOGeh8mx3qT
|
||||
l0W2B8uKKAq5BMmiziSBzQt700JPiruURZXbQ1fH1n7pKP6wGEh2e9TfQMlN20hE
|
||||
I+CMt+1bG0Bpt5AfiwE8UykQ/WvpVxdJrgj0JM0yA37KfC8XD+cmavJ5/grorbj3
|
||||
t0zBdK7bl+Y45VU/5/mX5ZR3O3ea1RclPM3hKMREfPneOlpan6r3dVwFqEN/TeTu
|
||||
46vuDeKaEr3yJkOFfy0lSYPhPhzhU5vDR5ibxqvwxZNznI2AdTnZLEf8LRqnTVo1
|
||||
qx0=
|
||||
-----END X509 CRL-----`;
|
||||
|
||||
const OUT_CRL_PEM_RSA = `Certificate Revocation List (CRL):
|
||||
Version: 2 (0x1)
|
||||
Signature Algorithm: SHA256withRSA
|
||||
Issuer:
|
||||
C = UK
|
||||
ST = London
|
||||
O = BB
|
||||
CN = Test Root CA
|
||||
Last Update: Sun, 25 Aug 2024 11:49:10 GMT
|
||||
Next Update: Tue, 24 Sep 2024 11:49:10 GMT
|
||||
CRL extensions:
|
||||
2.5.29.46:
|
||||
Unsupported CRL extension. Try openssl CLI.
|
||||
X509v3 Authority Key Identifier:
|
||||
keyid:B8:C9:AD:FD:A8:50:54:D5:85:6E:34:8B:4C:60:2F:B0:49:B6:87:46
|
||||
DirName:/C=UK/ST=London/O=BB/CN=Test Root CA
|
||||
serial:37:5D:4B:F6:BD:7C:11:7C:CC:46:1A:FF:D7:2F:2C:26:F8:1E:4B:3D
|
||||
X509v3 CRL Distribution Points:
|
||||
Full Name:
|
||||
URI:http://example.com/full-crl
|
||||
Full Name:
|
||||
URI:ldap://example.com/full-crl
|
||||
Full Name:
|
||||
IP:127.0.0.1
|
||||
X509v3 CRL Number:
|
||||
1E3C
|
||||
issuerAltName:
|
||||
Unsupported CRL extension. Try openssl CLI.
|
||||
Revoked Certificates:
|
||||
Serial Number: 1000
|
||||
Revocation Date: Sun, 25 Aug 2024 03:23:08 GMT
|
||||
CRL entry extensions:
|
||||
X509v3 CRL Reason Code:
|
||||
Certificate Hold
|
||||
Hold Instruction Code:
|
||||
Hold Instruction Reject
|
||||
Signature Value:
|
||||
03:1b:2b:fb:d9:c4:2d:45:56:84:57:a4:c3:2e:86:b2:a1:fc:
|
||||
c4:e7:fa:12:a1:a3:45:a1:1d:5f:8f:56:98:1e:34:9b:65:5a:
|
||||
8c:e9:0a:f1:41:c6:a1:5c:99:ce:80:c8:da:bf:dc:f0:e3:d7:
|
||||
52:d6:e9:2b:47:e9:bc:49:77:49:95:39:8f:f0:bc:25:b6:5a:
|
||||
64:51:6b:10:67:87:7d:21:2a:75:51:c5:8e:88:69:6b:03:5c:
|
||||
1b:8d:50:b3:e6:13:db:54:c1:a8:7d:61:0f:9c:95:23:b8:23:
|
||||
56:f7:ca:20:24:5f:c4:3a:65:e6:81:82:97:10:42:54:e4:95:
|
||||
81:5b:4b:6d:ef:6a:e3:8b:82:04:9d:64:52:4a:1c:f5:5c:f8:
|
||||
ec:7b:fb:27:27:24:82:a5:57:90:e4:56:1e:dd:92:14:d0:0b:
|
||||
c6:53:04:cc:e1:10:4e:9b:82:e4:a7:1b:e2:2e:e1:4c:25:05:
|
||||
fa:4a:64:22:fa:f4:d8:b2:48:9a:ad:00:6a:ac:ec:e9:c0:bf:
|
||||
0d:c7:49:89:13:cf:c9:f6:8d:f1:f4:2b:c8:5b:fb:ea:08:3d:
|
||||
8b:cc:d9:71:be:9c:5b:8d:ab:be:e9:a2:cb:0f:bb:9e:76:5f:
|
||||
9a:ae:77:c1:e6:eb:e5:f0:87:69:78:59:93:8e:c0:48:e2:43:
|
||||
e8:60:b9:71:7f:6b:8d:ed:6a:19:18:14:2d:74:61:a9:cb:ca:
|
||||
9f:7d:7d:b3:68:97:8f:71:52:b4:30:e8:ac:a1:a0:b0:25:76:
|
||||
cd:89:a8:b5:7d:7b:13:10:7d:f0:27:02:80:11:39:db:33:2d:
|
||||
45:98:a5:c2:13:86:7a:1f:26:c7:7a:93:97:45:b6:07:cb:8a:
|
||||
28:0a:b9:04:c9:a2:ce:24:81:cd:0b:7b:d3:42:4f:8a:bb:94:
|
||||
45:95:db:43:57:c7:d6:7e:e9:28:fe:b0:18:48:76:7b:d4:df:
|
||||
40:c9:4d:db:48:44:23:e0:8c:b7:ed:5b:1b:40:69:b7:90:1f:
|
||||
8b:01:3c:53:29:10:fd:6b:e9:57:17:49:ae:08:f4:24:cd:32:
|
||||
03:7e:ca:7c:2f:17:0f:e7:26:6a:f2:79:fe:0a:e8:ad:b8:f7:
|
||||
b7:4c:c1:74:ae:db:97:e6:38:e5:55:3f:e7:f9:97:e5:94:77:
|
||||
3b:77:9a:d5:17:25:3c:cd:e1:28:c4:44:7c:f9:de:3a:5a:5a:
|
||||
9f:aa:f7:75:5c:05:a8:43:7f:4d:e4:ee:e3:ab:ee:0d:e2:9a:
|
||||
12:bd:f2:26:43:85:7f:2d:25:49:83:e1:3e:1c:e1:53:9b:c3:
|
||||
47:98:9b:c6:ab:f0:c5:93:73:9c:8d:80:75:39:d9:2c:47:fc:
|
||||
2d:1a:a7:4d:5a:35:ab:1d`;
|
||||
|
||||
const IN_CRL_PEM_RSA_CRL_REASON_AND_INVALIDITY_DATE = `-----BEGIN X509 CRL-----
|
||||
MIID9jCCAd4CAQEwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCVUsxDzANBgNV
|
||||
BAgMBkxvbmRvbjELMAkGA1UECgwCQkIxFTATBgNVBAMMDFRlc3QgUm9vdCBDQRcN
|
||||
MjQwODI1MTIwODU2WhcNMjQwOTI0MTIwODU2WjA9MDsCAhAAFw0yNDA4MjUxMjA4
|
||||
NDhaMCYwCgYDVR0VBAMKAQEwGAYDVR0YBBEYDzIwMjQwODI1MDAwMDAwWqCCAScw
|
||||
ggEjMAkGA1UdEgQCMAAwfQYDVR0jBHYwdIAUuMmt/ahQVNWFbjSLTGAvsEm2h0ah
|
||||
RqREMEIxCzAJBgNVBAYTAlVLMQ8wDQYDVQQIDAZMb25kb24xCzAJBgNVBAoMAkJC
|
||||
MRUwEwYDVQQDDAxUZXN0IFJvb3QgQ0GCFDddS/a9fBF8zEYa/9cvLCb4Hks9MC0G
|
||||
A1UdLgQmMCQwIqAgoB6GHGh0dHA6Ly9leGFtcGxlLmNvbS9kZWx0YS1jcmwwWwYD
|
||||
VR0fBFQwUjAhoB+gHYYbaHR0cDovL2V4YW1wbGUuY29tL2Z1bGwtY3JsMCGgH6Ad
|
||||
hhtsZGFwOi8vZXhhbXBsZS5jb20vZnVsbC1jcmwwCqAIoAaHBH8AAAEwCwYDVR0U
|
||||
BAQCAh49MA0GCSqGSIb3DQEBCwUAA4ICAQByLp7JWQmB1NhlLACH6zFOe31yCTVy
|
||||
xJQtgujtSri1LNu6IwzBGsKBQIl3ucwMxPvoZzlujNLmshUT3nSogV0/5n1q0Gyj
|
||||
5Yiz2iw8mmKJLmGZ9Oz3QoGxgFww0/0x/VwRHuS2hw+A7JB8tO/2nW3oTclvS55l
|
||||
R+VtkDjUN58+Yl2SQksvb3qD6bHHJTCaP7Dskls0fdBIoYIDvZejrTYSSzTX/Kw4
|
||||
735P0GBMhj7zVF8azGz2PFpSISg4huJMyp7EDKZf2c2dnkuwmEUlPQEBLX25j/Il
|
||||
81OxfVVFja+wUagaGtjEPGy5gsU8zFwkWhjaD5PGBbZvnT+EDsOtJPU7Ot/sBHfz
|
||||
XqUtMrfmz/S/GsQ+QCpnBvarBy9QYuk9M0ePBGy33CUQpjPULxuJJVAHxNoetHCv
|
||||
7udng2Pi4D8vDNfzbMwHt7HurMo0CsSju+cL4rnIfsz02RrD9WC84KxBLWkqC7Hi
|
||||
IKGIpF740Yc4BliVE1HDaOKyI6FEft5asj3OgXwmBw7pVlxSNWACaA2vOFkdN/V5
|
||||
XZZjVJdRJxkgEfCvsJVenFp8ND6gmJmWum7tqM5ytmiXjPtejsPpVq4IclG+Yhnr
|
||||
tFQ9TDEuCrNsRIGGGDodyXq1+kGXY0w8RqGEb7J4Og/M6r4LMAKPkO7e0nEibTqX
|
||||
d2igvR2e5p+yKw==
|
||||
-----END X509 CRL-----`;
|
||||
|
||||
const OUT_CRL_PEM_RSA_CRL_REASON_AND_INVALIDITY_DATE = `Certificate Revocation List (CRL):
|
||||
Version: 2 (0x1)
|
||||
Signature Algorithm: SHA256withRSA
|
||||
Issuer:
|
||||
C = UK
|
||||
ST = London
|
||||
O = BB
|
||||
CN = Test Root CA
|
||||
Last Update: Sun, 25 Aug 2024 12:08:56 GMT
|
||||
Next Update: Tue, 24 Sep 2024 12:08:56 GMT
|
||||
CRL extensions:
|
||||
2.5.29.46:
|
||||
Unsupported CRL extension. Try openssl CLI.
|
||||
X509v3 Authority Key Identifier:
|
||||
keyid:B8:C9:AD:FD:A8:50:54:D5:85:6E:34:8B:4C:60:2F:B0:49:B6:87:46
|
||||
DirName:/C=UK/ST=London/O=BB/CN=Test Root CA
|
||||
serial:37:5D:4B:F6:BD:7C:11:7C:CC:46:1A:FF:D7:2F:2C:26:F8:1E:4B:3D
|
||||
X509v3 CRL Distribution Points:
|
||||
Full Name:
|
||||
URI:http://example.com/full-crl
|
||||
Full Name:
|
||||
URI:ldap://example.com/full-crl
|
||||
Full Name:
|
||||
IP:127.0.0.1
|
||||
X509v3 CRL Number:
|
||||
1E3D
|
||||
issuerAltName:
|
||||
Unsupported CRL extension. Try openssl CLI.
|
||||
Revoked Certificates:
|
||||
Serial Number: 1000
|
||||
Revocation Date: Sun, 25 Aug 2024 12:08:48 GMT
|
||||
CRL entry extensions:
|
||||
X509v3 CRL Reason Code:
|
||||
Key Compromise
|
||||
Invalidity Date:
|
||||
Sun, 25 Aug 2024 00:00:00 GMT
|
||||
Signature Value:
|
||||
72:2e:9e:c9:59:09:81:d4:d8:65:2c:00:87:eb:31:4e:7b:7d:
|
||||
72:09:35:72:c4:94:2d:82:e8:ed:4a:b8:b5:2c:db:ba:23:0c:
|
||||
c1:1a:c2:81:40:89:77:b9:cc:0c:c4:fb:e8:67:39:6e:8c:d2:
|
||||
e6:b2:15:13:de:74:a8:81:5d:3f:e6:7d:6a:d0:6c:a3:e5:88:
|
||||
b3:da:2c:3c:9a:62:89:2e:61:99:f4:ec:f7:42:81:b1:80:5c:
|
||||
30:d3:fd:31:fd:5c:11:1e:e4:b6:87:0f:80:ec:90:7c:b4:ef:
|
||||
f6:9d:6d:e8:4d:c9:6f:4b:9e:65:47:e5:6d:90:38:d4:37:9f:
|
||||
3e:62:5d:92:42:4b:2f:6f:7a:83:e9:b1:c7:25:30:9a:3f:b0:
|
||||
ec:92:5b:34:7d:d0:48:a1:82:03:bd:97:a3:ad:36:12:4b:34:
|
||||
d7:fc:ac:38:ef:7e:4f:d0:60:4c:86:3e:f3:54:5f:1a:cc:6c:
|
||||
f6:3c:5a:52:21:28:38:86:e2:4c:ca:9e:c4:0c:a6:5f:d9:cd:
|
||||
9d:9e:4b:b0:98:45:25:3d:01:01:2d:7d:b9:8f:f2:25:f3:53:
|
||||
b1:7d:55:45:8d:af:b0:51:a8:1a:1a:d8:c4:3c:6c:b9:82:c5:
|
||||
3c:cc:5c:24:5a:18:da:0f:93:c6:05:b6:6f:9d:3f:84:0e:c3:
|
||||
ad:24:f5:3b:3a:df:ec:04:77:f3:5e:a5:2d:32:b7:e6:cf:f4:
|
||||
bf:1a:c4:3e:40:2a:67:06:f6:ab:07:2f:50:62:e9:3d:33:47:
|
||||
8f:04:6c:b7:dc:25:10:a6:33:d4:2f:1b:89:25:50:07:c4:da:
|
||||
1e:b4:70:af:ee:e7:67:83:63:e2:e0:3f:2f:0c:d7:f3:6c:cc:
|
||||
07:b7:b1:ee:ac:ca:34:0a:c4:a3:bb:e7:0b:e2:b9:c8:7e:cc:
|
||||
f4:d9:1a:c3:f5:60:bc:e0:ac:41:2d:69:2a:0b:b1:e2:20:a1:
|
||||
88:a4:5e:f8:d1:87:38:06:58:95:13:51:c3:68:e2:b2:23:a1:
|
||||
44:7e:de:5a:b2:3d:ce:81:7c:26:07:0e:e9:56:5c:52:35:60:
|
||||
02:68:0d:af:38:59:1d:37:f5:79:5d:96:63:54:97:51:27:19:
|
||||
20:11:f0:af:b0:95:5e:9c:5a:7c:34:3e:a0:98:99:96:ba:6e:
|
||||
ed:a8:ce:72:b6:68:97:8c:fb:5e:8e:c3:e9:56:ae:08:72:51:
|
||||
be:62:19:eb:b4:54:3d:4c:31:2e:0a:b3:6c:44:81:86:18:3a:
|
||||
1d:c9:7a:b5:fa:41:97:63:4c:3c:46:a1:84:6f:b2:78:3a:0f:
|
||||
cc:ea:be:0b:30:02:8f:90:ee:de:d2:71:22:6d:3a:97:77:68:
|
||||
a0:bd:1d:9e:e6:9f:b2:2b`;
|
||||
|
||||
const IN_CRL_PEM_RSA_CRL_EXTENSIONS = `-----BEGIN X509 CRL-----
|
||||
MIIE0DCCArgCAQEwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCVUsxDzANBgNV
|
||||
BAgMBkxvbmRvbjELMAkGA1UECgwCQkIxFTATBgNVBAMMDFRlc3QgUm9vdCBDQRcN
|
||||
MjQwODI1MTIzNzEwWhcNMjQwOTI0MTIzNzEwWjA9MDsCAhAAFw0yNDA4MjUxMjA4
|
||||
NDhaMCYwCgYDVR0VBAMKAQEwGAYDVR0YBBEYDzIwMjQwODI1MDAwMDAwWqCCAgEw
|
||||
ggH9MIHiBgNVHRIEgdowgdegFAYEKgMEBaAMFgpDdXN0b21OYW1lgQ5jYUBleGFt
|
||||
cGxlLmNvbYYSaHR0cDovL2V4YW1wbGUuY29tgg5jYS5leGFtcGxlLmNvbYcEwKgB
|
||||
AaSBhDCBgTELMAkGA1UEBhMCVVMxFTATBgNVBAgMDEV4YW1wbGVTdGF0ZTEUMBIG
|
||||
A1UEBwwLRXhhbXBsZUNpdHkxEzARBgNVBAoMCkV4YW1wbGVPcmcxFDASBgNVBAsM
|
||||
C0V4YW1wbGVVbml0MRowGAYDVQQDDBFFeGFtcGxlQ29tbW9uTmFtZTB9BgNVHSME
|
||||
djB0gBS4ya39qFBU1YVuNItMYC+wSbaHRqFGpEQwQjELMAkGA1UEBhMCVUsxDzAN
|
||||
BgNVBAgMBkxvbmRvbjELMAkGA1UECgwCQkIxFTATBgNVBAMMDFRlc3QgUm9vdCBD
|
||||
QYIUN11L9r18EXzMRhr/1y8sJvgeSz0wLQYDVR0uBCYwJDAioCCgHoYcaHR0cDov
|
||||
L2V4YW1wbGUuY29tL2RlbHRhLWNybDBbBgNVHR8EVDBSMCGgH6AdhhtodHRwOi8v
|
||||
ZXhhbXBsZS5jb20vZnVsbC1jcmwwIaAfoB2GG2xkYXA6Ly9leGFtcGxlLmNvbS9m
|
||||
dWxsLWNybDAKoAigBocEfwAAATALBgNVHRQEBAICHkIwDQYJKoZIhvcNAQELBQAD
|
||||
ggIBAF/9L4aGmId2igw7+MfDxokevIJkJX/MkmHpXBl1b4hL85FGD7OPCmn47VzC
|
||||
Wejlc/AQB7mWyUugvrVEq/FiCO8a8Fieyjw5uCYz0eiNnuvHVRGM2mOEkiA0I/rn
|
||||
F5AFB1YfCFGXPyRkXNRbOBE91mhOzh1H9PX2qVnj5l3KsPE/7YuteacR0TkfkRJa
|
||||
BXLic+5F/CCV/J/iYR7LncuLUlhBfsosG/ucHL70EytlfX6CBWY3kBbmj7nd497T
|
||||
QG392+m9xp7MIsJAS+3qEzwJAfni6zUV0fWh/ucOl8BIjHEh97VqI3+8yzhdXfkF
|
||||
2gkfpkqJQY0+5OO1VSRYTlQNld3QjN/VVJjatfHyaXfPCx4VEKW1kWYo+0zxO4SL
|
||||
SB/+S/o99bCeNy1MXqEvy5HoDwFHePXGsAEPHWPdj7EWm7g9T/Fl1iSR6hpohvDD
|
||||
K4LaGdVhzvCraLIh8H7XW3KztvZvDQejYQAgADW0UO0rFHJ1XXhKYSqXNGnfDt+3
|
||||
cRpt2XxSxt5HJtHlatiI25PuBMNWV2Zod4RHB/8UEvs1KC7dcwkAiCEY+E3o/zkC
|
||||
rdZ/8XtNf5a4WSN/D7pPsfsO6SE+7lxkJ+UQcZLXAz8b5ArPTlWt2HdJIBEVs25K
|
||||
FAkizyldhnAcNHFk7XN94eTLNeD6hUbFL9pNHiSmKu5A9YW0
|
||||
-----END X509 CRL-----`;
|
||||
|
||||
const OUT_CRL_PEM_RSA_CRL_EXTENSIONS = `Certificate Revocation List (CRL):
|
||||
Version: 2 (0x1)
|
||||
Signature Algorithm: SHA256withRSA
|
||||
Issuer:
|
||||
C = UK
|
||||
ST = London
|
||||
O = BB
|
||||
CN = Test Root CA
|
||||
Last Update: Sun, 25 Aug 2024 12:37:10 GMT
|
||||
Next Update: Tue, 24 Sep 2024 12:37:10 GMT
|
||||
CRL extensions:
|
||||
2.5.29.46:
|
||||
Unsupported CRL extension. Try openssl CLI.
|
||||
X509v3 Authority Key Identifier:
|
||||
keyid:B8:C9:AD:FD:A8:50:54:D5:85:6E:34:8B:4C:60:2F:B0:49:B6:87:46
|
||||
DirName:/C=UK/ST=London/O=BB/CN=Test Root CA
|
||||
serial:37:5D:4B:F6:BD:7C:11:7C:CC:46:1A:FF:D7:2F:2C:26:F8:1E:4B:3D
|
||||
X509v3 CRL Distribution Points:
|
||||
Full Name:
|
||||
URI:http://example.com/full-crl
|
||||
Full Name:
|
||||
URI:ldap://example.com/full-crl
|
||||
Full Name:
|
||||
IP:127.0.0.1
|
||||
X509v3 CRL Number:
|
||||
1E42
|
||||
X509v3 Issuer Alternative Name:
|
||||
OtherName:1.2.3.4.5::CustomName
|
||||
EMAIL:ca@example.com
|
||||
URI:http://example.com
|
||||
DNS:ca.example.com
|
||||
IP:192.168.1.1
|
||||
DIR:/C=US/ST=ExampleState/L=ExampleCity/O=ExampleOrg/OU=ExampleUnit/CN=ExampleCommonName
|
||||
Revoked Certificates:
|
||||
Serial Number: 1000
|
||||
Revocation Date: Sun, 25 Aug 2024 12:08:48 GMT
|
||||
CRL entry extensions:
|
||||
X509v3 CRL Reason Code:
|
||||
Key Compromise
|
||||
Invalidity Date:
|
||||
Sun, 25 Aug 2024 00:00:00 GMT
|
||||
Signature Value:
|
||||
5f:fd:2f:86:86:98:87:76:8a:0c:3b:f8:c7:c3:c6:89:1e:bc:
|
||||
82:64:25:7f:cc:92:61:e9:5c:19:75:6f:88:4b:f3:91:46:0f:
|
||||
b3:8f:0a:69:f8:ed:5c:c2:59:e8:e5:73:f0:10:07:b9:96:c9:
|
||||
4b:a0:be:b5:44:ab:f1:62:08:ef:1a:f0:58:9e:ca:3c:39:b8:
|
||||
26:33:d1:e8:8d:9e:eb:c7:55:11:8c:da:63:84:92:20:34:23:
|
||||
fa:e7:17:90:05:07:56:1f:08:51:97:3f:24:64:5c:d4:5b:38:
|
||||
11:3d:d6:68:4e:ce:1d:47:f4:f5:f6:a9:59:e3:e6:5d:ca:b0:
|
||||
f1:3f:ed:8b:ad:79:a7:11:d1:39:1f:91:12:5a:05:72:e2:73:
|
||||
ee:45:fc:20:95:fc:9f:e2:61:1e:cb:9d:cb:8b:52:58:41:7e:
|
||||
ca:2c:1b:fb:9c:1c:be:f4:13:2b:65:7d:7e:82:05:66:37:90:
|
||||
16:e6:8f:b9:dd:e3:de:d3:40:6d:fd:db:e9:bd:c6:9e:cc:22:
|
||||
c2:40:4b:ed:ea:13:3c:09:01:f9:e2:eb:35:15:d1:f5:a1:fe:
|
||||
e7:0e:97:c0:48:8c:71:21:f7:b5:6a:23:7f:bc:cb:38:5d:5d:
|
||||
f9:05:da:09:1f:a6:4a:89:41:8d:3e:e4:e3:b5:55:24:58:4e:
|
||||
54:0d:95:dd:d0:8c:df:d5:54:98:da:b5:f1:f2:69:77:cf:0b:
|
||||
1e:15:10:a5:b5:91:66:28:fb:4c:f1:3b:84:8b:48:1f:fe:4b:
|
||||
fa:3d:f5:b0:9e:37:2d:4c:5e:a1:2f:cb:91:e8:0f:01:47:78:
|
||||
f5:c6:b0:01:0f:1d:63:dd:8f:b1:16:9b:b8:3d:4f:f1:65:d6:
|
||||
24:91:ea:1a:68:86:f0:c3:2b:82:da:19:d5:61:ce:f0:ab:68:
|
||||
b2:21:f0:7e:d7:5b:72:b3:b6:f6:6f:0d:07:a3:61:00:20:00:
|
||||
35:b4:50:ed:2b:14:72:75:5d:78:4a:61:2a:97:34:69:df:0e:
|
||||
df:b7:71:1a:6d:d9:7c:52:c6:de:47:26:d1:e5:6a:d8:88:db:
|
||||
93:ee:04:c3:56:57:66:68:77:84:47:07:ff:14:12:fb:35:28:
|
||||
2e:dd:73:09:00:88:21:18:f8:4d:e8:ff:39:02:ad:d6:7f:f1:
|
||||
7b:4d:7f:96:b8:59:23:7f:0f:ba:4f:b1:fb:0e:e9:21:3e:ee:
|
||||
5c:64:27:e5:10:71:92:d7:03:3f:1b:e4:0a:cf:4e:55:ad:d8:
|
||||
77:49:20:11:15:b3:6e:4a:14:09:22:cf:29:5d:86:70:1c:34:
|
||||
71:64:ed:73:7d:e1:e4:cb:35:e0:fa:85:46:c5:2f:da:4d:1e:
|
||||
24:a6:2a:ee:40:f5:85:b4`;
|
||||
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Parse X.509 CRL: Example PEM encoded CRL with RSA signature",
|
||||
input: IN_CRL_PEM_RSA,
|
||||
expectedOutput: OUT_CRL_PEM_RSA,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Parse X.509 CRL",
|
||||
"args": ["PEM"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Parse X.509 CRL: Example PEM encoded CRL with RSA signature, CRL Reason and Invalidity Date",
|
||||
input: IN_CRL_PEM_RSA_CRL_REASON_AND_INVALIDITY_DATE,
|
||||
expectedOutput: OUT_CRL_PEM_RSA_CRL_REASON_AND_INVALIDITY_DATE,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Parse X.509 CRL",
|
||||
"args": ["PEM"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Parse X.509 CRL: Example PEM encoded CRL with RSA signature and CRL Extensions",
|
||||
input: IN_CRL_PEM_RSA_CRL_EXTENSIONS,
|
||||
expectedOutput: OUT_CRL_PEM_RSA_CRL_EXTENSIONS,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Parse X.509 CRL",
|
||||
"args": ["PEM"]
|
||||
}
|
||||
]
|
||||
},
|
||||
]);
|
215
tests/operations/tests/PubKeyFromCert.mjs
Normal file
215
tests/operations/tests/PubKeyFromCert.mjs
Normal file
|
@ -0,0 +1,215 @@
|
|||
/**
|
||||
* Public Key from Certificate
|
||||
*
|
||||
* @author cplussharp
|
||||
* @copyright Crown Copyright 2023
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
const RSA_CERT = `-----BEGIN CERTIFICATE-----
|
||||
MIIBfTCCASegAwIBAgIUeisK5Nwss2DGg5PCs4uSxxXyyNkwDQYJKoZIhvcNAQEL
|
||||
BQAwEzERMA8GA1UEAwwIUlNBIHRlc3QwHhcNMjExMTE5MTcyMDI2WhcNMzExMTE3
|
||||
MTcyMDI2WjATMREwDwYDVQQDDAhSU0EgdGVzdDBcMA0GCSqGSIb3DQEBAQUAA0sA
|
||||
MEgCQQDyq9A6emHSLczn5Omu5muy+AReC53pTGCrW6Bi65OoobahT2RUSzXCYuvB
|
||||
757fLLTKz+dLeo6sFkNhIzHZI+n7AgMBAAGjUzBRMB0GA1UdDgQWBBRO+jvkqq5p
|
||||
pnQgwMMnRoun6e7eiTAfBgNVHSMEGDAWgBRO+jvkqq5ppnQgwMMnRoun6e7eiTAP
|
||||
BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA0EAR/5HAZM5qBhU/ezDUIFx
|
||||
gmUGoFbIb5kJD41YCnaSdrgWglh4He4melSs42G/oxBBjuCJ0bUpqWnLl+lJkv1z
|
||||
IA==
|
||||
-----END CERTIFICATE-----`;
|
||||
|
||||
const RSA_PUBKEY = `-----BEGIN PUBLIC KEY-----
|
||||
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAPKr0Dp6YdItzOfk6a7ma7L4BF4LnelM
|
||||
YKtboGLrk6ihtqFPZFRLNcJi68Hvnt8stMrP50t6jqwWQ2EjMdkj6fsCAwEAAQ==
|
||||
-----END PUBLIC KEY-----`;
|
||||
|
||||
const EC_P256_CERT = `-----BEGIN CERTIFICATE-----
|
||||
MIIBfzCCASWgAwIBAgIUK4H8J3Hr7NpRLPrACj8Pje4JJJ0wCgYIKoZIzj0EAwIw
|
||||
FTETMBEGA1UEAwwKUC0yNTYgdGVzdDAeFw0yMTExMTkxNzE5NDVaFw0zMTExMTcx
|
||||
NzE5NDVaMBUxEzARBgNVBAMMClAtMjU2IHRlc3QwWTATBgcqhkjOPQIBBggqhkjO
|
||||
PQMBBwNCAAQNRzwDQQM0qgJgg9YwfPXJTOoTmYmC6yBwATwfrzXR+QnxmZM2IIJr
|
||||
qwuBHa8PVU2HZ2KKtaAo8fg9Uwpq/l7po1MwUTAdBgNVHQ4EFgQU/SxodXrpkybM
|
||||
gcIgkxnRKd7HMzowHwYDVR0jBBgwFoAU/SxodXrpkybMgcIgkxnRKd7HMzowDwYD
|
||||
VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNIADBFAiBU9PrOa/kXCpTTBInRf/sN
|
||||
ac2iDHmbdpWzcXI+xLKNYAIhAIRR1LRSHVwOTLQ/iBXd+8LCkm5aTB27RW46LN80
|
||||
ylxt
|
||||
-----END CERTIFICATE-----`;
|
||||
|
||||
const EC_P256_PUBKEY = `-----BEGIN PUBLIC KEY-----
|
||||
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDUc8A0EDNKoCYIPWMHz1yUzqE5mJ
|
||||
gusgcAE8H6810fkJ8ZmTNiCCa6sLgR2vD1VNh2diirWgKPH4PVMKav5e6Q==
|
||||
-----END PUBLIC KEY-----`;
|
||||
|
||||
const DSA_CERT = `-----BEGIN CERTIFICATE-----
|
||||
MIIEXzCCBA2gAwIBAgIUYYcPJB8UQLzUnqkGJvs3J4RI0OgwCwYJYIZIAWUDBAMC
|
||||
MBMxETAPBgNVBAMMCERTQSBUZXN0MB4XDTIzMTAxNTAwMjEzNVoXDTMzMTAxMjAw
|
||||
MjEzNVowEzERMA8GA1UEAwwIRFNBIFRlc3QwggNCMIICNQYHKoZIzjgEATCCAigC
|
||||
ggEBALoLV+uz7vMYZCIuwXNkgZawvDgZAG1T7IiG030WgqesRNncuoUQOmAJCiuN
|
||||
zkjVNSY08rabex/RIkWILvxP91SlzhA9t9+dp87p238ecxGa1sD2re+y35RP7IxN
|
||||
T33633NtwGItZ3BqqAhoMmuwwwxau0E8zwYodTTlwTRp4QVPpMH1eJCUBeEzcWP5
|
||||
ZZ1lRNhR5M2TqzSU3ya5/4c3a9rI86h9VIVgw8yVvw3y6yclzjALm2ntD5riskdM
|
||||
Z6mMkfYQwEbIGRTELX6A7LZ0lX1CislenF9ASb2E4g2nGcMQ0uSGzA4W9mf6wwmP
|
||||
S6iwX5+Qu/i6jCm5i37fQ1H5HHUCHQDA+UnPHM6PZEgfFen8djZpl/cl05MpWk+d
|
||||
nikFAoIBADXOTpBw0WA+UihxDG+6qqM05kxVMYmz6IRZ/06ffZSGVFN6Bx1i0s3v
|
||||
kzM5V8GsKpkKkSk7V8fTQnAIIlMmt1Y7ff+ng7+TfYotMrvvEYlolYK06J2WWoUA
|
||||
8iKp8+n58vdoky+xZmuGmcvCAojVDbEeU2wEqYE1PzrHCSOoOiKB2P4fOhyuF+qx
|
||||
E8nkzURIg2RmSSkqWOkXiWyKyfpUaB+4cEisp4ThENEPmdntE1vLh2r7EOIxpE5D
|
||||
0NAy2wFKqe3ljfgE6XsPZKgVAguRDVpzdmL6WDY7DM/BcS726vx+kX55QDkszvec
|
||||
raNirnir2QrB/a0JQjF6Y62yGmG7GF8DggEFAAKCAQBpN+w0N0b5IIAspXnlJ9yu
|
||||
B6ORk3j/5rZ+DUtTzW1YAJI6xjTcFQvN7FpVLkmLtXKUXF04R+sdGJ7VFwOb0rba
|
||||
L5vQzrqNkBrbgSzuzeloiG+7OLA6VeQtNbQh6OurrZFi9gY+qA5ciT9kQXyrHudV
|
||||
Xu956NDrooRxmv6JIVFvToaNiwe2vcgdkALw8HUbLFYof4SAE9jgU8EpxTp02e8H
|
||||
zvVSVa6yj1nnGhpzLPlEqF8TZvs9pTg2kIk3/zvWojMJoPyTALfbTjbAeiFMMeKN
|
||||
K/CKOOJj23AVAZxpMSR6cUbrIcRdKDnhCTVkkxXUecAIUs6Mk10kSfkuiGl9LjKj
|
||||
o1MwUTAdBgNVHQ4EFgQUE+xZdvgiDIFWKQskMYnNaZ3iPHAwHwYDVR0jBBgwFoAU
|
||||
E+xZdvgiDIFWKQskMYnNaZ3iPHAwDwYDVR0TAQH/BAUwAwEB/zALBglghkgBZQME
|
||||
AwIDPwAwPAIcZbtf4+bjXEGQqNs6IglLrOgIjYF46q7qCNfXmQIcMKUtH3S6sDJE
|
||||
3ds9eL+oC+HPFlfUNfUiU30aDA==
|
||||
-----END CERTIFICATE-----`;
|
||||
|
||||
const DSA_PUBKEY = `-----BEGIN PUBLIC KEY-----
|
||||
MIIDQjCCAjUGByqGSM44BAEwggIoAoIBAQC6C1frs+7zGGQiLsFzZIGWsLw4GQBt
|
||||
U+yIhtN9FoKnrETZ3LqFEDpgCQorjc5I1TUmNPK2m3sf0SJFiC78T/dUpc4QPbff
|
||||
nafO6dt/HnMRmtbA9q3vst+UT+yMTU99+t9zbcBiLWdwaqgIaDJrsMMMWrtBPM8G
|
||||
KHU05cE0aeEFT6TB9XiQlAXhM3Fj+WWdZUTYUeTNk6s0lN8muf+HN2vayPOofVSF
|
||||
YMPMlb8N8usnJc4wC5tp7Q+a4rJHTGepjJH2EMBGyBkUxC1+gOy2dJV9QorJXpxf
|
||||
QEm9hOINpxnDENLkhswOFvZn+sMJj0uosF+fkLv4uowpuYt+30NR+Rx1Ah0AwPlJ
|
||||
zxzOj2RIHxXp/HY2aZf3JdOTKVpPnZ4pBQKCAQA1zk6QcNFgPlIocQxvuqqjNOZM
|
||||
VTGJs+iEWf9On32UhlRTegcdYtLN75MzOVfBrCqZCpEpO1fH00JwCCJTJrdWO33/
|
||||
p4O/k32KLTK77xGJaJWCtOidllqFAPIiqfPp+fL3aJMvsWZrhpnLwgKI1Q2xHlNs
|
||||
BKmBNT86xwkjqDoigdj+HzocrhfqsRPJ5M1ESINkZkkpKljpF4lsisn6VGgfuHBI
|
||||
rKeE4RDRD5nZ7RNby4dq+xDiMaROQ9DQMtsBSqnt5Y34BOl7D2SoFQILkQ1ac3Zi
|
||||
+lg2OwzPwXEu9ur8fpF+eUA5LM73nK2jYq54q9kKwf2tCUIxemOtshphuxhfA4IB
|
||||
BQACggEAaTfsNDdG+SCALKV55SfcrgejkZN4/+a2fg1LU81tWACSOsY03BULzexa
|
||||
VS5Ji7VylFxdOEfrHRie1RcDm9K22i+b0M66jZAa24Es7s3paIhvuziwOlXkLTW0
|
||||
Iejrq62RYvYGPqgOXIk/ZEF8qx7nVV7veejQ66KEcZr+iSFRb06GjYsHtr3IHZAC
|
||||
8PB1GyxWKH+EgBPY4FPBKcU6dNnvB871UlWuso9Z5xoacyz5RKhfE2b7PaU4NpCJ
|
||||
N/871qIzCaD8kwC32042wHohTDHijSvwijjiY9twFQGcaTEkenFG6yHEXSg54Qk1
|
||||
ZJMV1HnACFLOjJNdJEn5LohpfS4yow==
|
||||
-----END PUBLIC KEY-----`;
|
||||
|
||||
const ED25519_CERT = `-----BEGIN CERTIFICATE-----
|
||||
MIIBQjCB9aADAgECAhRjPJhrdNco5LzpsIs0vSLLaZaZ0DAFBgMrZXAwFzEVMBMG
|
||||
A1UEAwwMRWQyNTUxOSBUZXN0MB4XDTIzMTAxNTAwMjMwOFoXDTMzMTAxMjAwMjMw
|
||||
OFowFzEVMBMGA1UEAwwMRWQyNTUxOSBUZXN0MCowBQYDK2VwAyEAELP6AflXwsuZ
|
||||
5q4NDIO0LP2iCdKRvds4nwsUmRhOw3ijUzBRMB0GA1UdDgQWBBRfxS9q0IemWxkH
|
||||
4mwAwzr9dQx2xzAfBgNVHSMEGDAWgBRfxS9q0IemWxkH4mwAwzr9dQx2xzAPBgNV
|
||||
HRMBAf8EBTADAQH/MAUGAytlcANBAI/+03iVq4yJ+DaLVs61w41cVX2UxKvquSzv
|
||||
lllkpkclM9LH5dLrw4ArdTjS9zAjzY/02WkphHhICHXt3KqZTwI=
|
||||
-----END CERTIFICATE-----`;
|
||||
|
||||
/*
|
||||
const ED25519_PUBKEY = `-----BEGIN PUBLIC KEY-----
|
||||
MCowBQYDK2VwAyEAELP6AflXwsuZ5q4NDIO0LP2iCdKRvds4nwsUmRhOw3g=
|
||||
-----END PUBLIC KEY-----`;
|
||||
*/
|
||||
|
||||
const ED448_CERT = `-----BEGIN CERTIFICATE-----
|
||||
MIIBijCCAQqgAwIBAgIUZaCS7zEjOnQ7O4KUFym6fJF5vl8wBQYDK2VxMBUxEzAR
|
||||
BgNVBAMMCkVkNDQ4IFRlc3QwHhcNMjMxMDE1MDAyMzI1WhcNMzMxMDEyMDAyMzI1
|
||||
WjAVMRMwEQYDVQQDDApFZDQ0OCBUZXN0MEMwBQYDK2VxAzoAVN8kG0TMVyGOu/Ov
|
||||
BTe8H0Wi4HJrQAlSv4XLwJbkuoi4EeRlEHQwXsNYLZTtY2Jra6AWhbVYYaEAo1Mw
|
||||
UTAdBgNVHQ4EFgQUJFrepAf9YXrmDMSAzrMeYQmosd0wHwYDVR0jBBgwFoAUJFre
|
||||
pAf9YXrmDMSAzrMeYQmosd0wDwYDVR0TAQH/BAUwAwEB/zAFBgMrZXEDcwA+YiZj
|
||||
puFr2aogfV1qg/ixk7qLi25BbKVNR6+7PEUjo7+4yBn9qnLbAHUGnHn7E96pSey9
|
||||
VkLqpoDNMRcM3Eb6h3AJpQM0oxGj8q9arjDXqJkXgaO2e0tVn8KKVfy7S8qO72Kd
|
||||
rWzZowcOjnWKhXm7JgA=
|
||||
-----END CERTIFICATE-----`;
|
||||
|
||||
/*
|
||||
const ED448_PUBKEY = `-----BEGIN PUBLIC KEY-----
|
||||
MEMwBQYDK2VxAzoAVN8kG0TMVyGOu/OvBTe8H0Wi4HJrQAlSv4XLwJbkuoi4EeRl
|
||||
EHQwXsNYLZTtY2Jra6AWhbVYYaEA
|
||||
-----END PUBLIC KEY-----`
|
||||
*/
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Public Key from Certificate: Missing footer",
|
||||
input: RSA_CERT.substring(0, RSA_CERT.length / 2),
|
||||
expectedOutput: "PEM footer '-----END CERTIFICATE-----' not found",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Certificate",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
// test RSA certificate
|
||||
{
|
||||
name: "Public Key from Certificate: RSA",
|
||||
input: RSA_CERT,
|
||||
expectedOutput: (RSA_PUBKEY + "\n").replace(/\r/g, "").replace(/\n/g, "\r\n"),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Certificate",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
// test EC certificate
|
||||
{
|
||||
name: "Public Key from Certificate: EC",
|
||||
input: EC_P256_CERT,
|
||||
expectedOutput: (EC_P256_PUBKEY + "\n").replace(/\r/g, "").replace(/\n/g, "\r\n"),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Certificate",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
// test DSA certificate
|
||||
{
|
||||
name: "Public Key from Certificate: DSA",
|
||||
input: DSA_CERT,
|
||||
expectedOutput: (DSA_PUBKEY + "\n").replace(/\r/g, "").replace(/\n/g, "\r\n"),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Certificate",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
// test EdDSA certificates
|
||||
{
|
||||
name: "Public Key from Certificate: Ed25519",
|
||||
input: ED25519_CERT,
|
||||
expectedOutput: "Unsupported public key type",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Certificate",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Public Key from Certificate: Ed448",
|
||||
input: ED448_CERT,
|
||||
expectedOutput: "Unsupported public key type",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Certificate",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
// test multi-input
|
||||
{
|
||||
name: "Public Key from Certificate: Multiple certificates",
|
||||
input: RSA_CERT + "\n" + EC_P256_CERT,
|
||||
expectedOutput: (RSA_PUBKEY + "\n" + EC_P256_PUBKEY + "\n").replace(/\r/g, "").replace(/\n/g, "\r\n"),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Certificate",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
}
|
||||
]);
|
254
tests/operations/tests/PubKeyFromPrivKey.mjs
Normal file
254
tests/operations/tests/PubKeyFromPrivKey.mjs
Normal file
|
@ -0,0 +1,254 @@
|
|||
/**
|
||||
* Public Key from Private Key
|
||||
*
|
||||
* @author cplussharp
|
||||
* @copyright Crown Copyright 2023
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
const RSA_PRIVKEY_PKCS1 = `-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIBOQIBAAJBAPKr0Dp6YdItzOfk6a7ma7L4BF4LnelMYKtboGLrk6ihtqFPZFRL
|
||||
NcJi68Hvnt8stMrP50t6jqwWQ2EjMdkj6fsCAwEAAQJAOJUpM0lv36MAQR3WAwsF
|
||||
F7DOy+LnigteCvaNWiNVxZ6jByB5Qb7sall/Qlu9sFI0ZwrlVcKS0kldee7JTYlL
|
||||
WQIhAP3UKEfOtpTgT1tYmdhaqjxqMfxBom0Ri+rt9ajlzs6vAiEA9L85B8/Gnb7p
|
||||
6Af7/wpmafL277OV4X4xBfzMR+TUzHUCIBq+VLQkInaTH6lXL3ZtLwyIf9W9MJjf
|
||||
RWeuRLjT5bM/AiBF7Kw6kx5Hy1fAtydEApCoDIaIjWJw/kC7WTJ0B+jUUQIgV6dw
|
||||
NSyj0feakeD890gmId+lvl/w/3oUXiczqvl/N9o=
|
||||
-----END RSA PRIVATE KEY-----`;
|
||||
|
||||
const RSA_PRIVKEY_PKCS8 = `-----BEGIN PRIVATE KEY-----
|
||||
MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA8qvQOnph0i3M5+Tp
|
||||
ruZrsvgEXgud6Uxgq1ugYuuTqKG2oU9kVEs1wmLrwe+e3yy0ys/nS3qOrBZDYSMx
|
||||
2SPp+wIDAQABAkA4lSkzSW/fowBBHdYDCwUXsM7L4ueKC14K9o1aI1XFnqMHIHlB
|
||||
vuxqWX9CW72wUjRnCuVVwpLSSV157slNiUtZAiEA/dQoR862lOBPW1iZ2FqqPGox
|
||||
/EGibRGL6u31qOXOzq8CIQD0vzkHz8advunoB/v/CmZp8vbvs5XhfjEF/MxH5NTM
|
||||
dQIgGr5UtCQidpMfqVcvdm0vDIh/1b0wmN9FZ65EuNPlsz8CIEXsrDqTHkfLV8C3
|
||||
J0QCkKgMhoiNYnD+QLtZMnQH6NRRAiBXp3A1LKPR95qR4Pz3SCYh36W+X/D/ehRe
|
||||
JzOq+X832g==
|
||||
-----END PRIVATE KEY-----`;
|
||||
|
||||
const RSA_PUBKEY = `-----BEGIN PUBLIC KEY-----
|
||||
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAPKr0Dp6YdItzOfk6a7ma7L4BF4LnelM
|
||||
YKtboGLrk6ihtqFPZFRLNcJi68Hvnt8stMrP50t6jqwWQ2EjMdkj6fsCAwEAAQ==
|
||||
-----END PUBLIC KEY-----`;
|
||||
|
||||
const EC_P256_PRIVKEY_SEC1 = `-----BEGIN EC PRIVATE KEY-----
|
||||
MHcCAQEEINtTjwUkgfAiSwqgcGAXWyE0ueIW6n2k395dmQZ3vGr4oAoGCCqGSM49
|
||||
AwEHoUQDQgAEDUc8A0EDNKoCYIPWMHz1yUzqE5mJgusgcAE8H6810fkJ8ZmTNiCC
|
||||
a6sLgR2vD1VNh2diirWgKPH4PVMKav5e6Q==
|
||||
-----END EC PRIVATE KEY-----`;
|
||||
|
||||
const EC_P256_PRIVKEY_PKCS8 = `-----BEGIN PRIVATE KEY-----
|
||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg21OPBSSB8CJLCqBw
|
||||
YBdbITS54hbqfaTf3l2ZBne8avihRANCAAQNRzwDQQM0qgJgg9YwfPXJTOoTmYmC
|
||||
6yBwATwfrzXR+QnxmZM2IIJrqwuBHa8PVU2HZ2KKtaAo8fg9Uwpq/l7p
|
||||
-----END PRIVATE KEY-----`;
|
||||
|
||||
const EC_P256_PUBKEY = `-----BEGIN PUBLIC KEY-----
|
||||
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDUc8A0EDNKoCYIPWMHz1yUzqE5mJ
|
||||
gusgcAE8H6810fkJ8ZmTNiCCa6sLgR2vD1VNh2diirWgKPH4PVMKav5e6Q==
|
||||
-----END PUBLIC KEY-----`;
|
||||
|
||||
const DSA_PRIVKEY_TRAD = `-----BEGIN DSA PRIVATE KEY-----
|
||||
MIIDTQIBAAKCAQEAugtX67Pu8xhkIi7Bc2SBlrC8OBkAbVPsiIbTfRaCp6xE2dy6
|
||||
hRA6YAkKK43OSNU1JjTytpt7H9EiRYgu/E/3VKXOED23352nzunbfx5zEZrWwPat
|
||||
77LflE/sjE1Pffrfc23AYi1ncGqoCGgya7DDDFq7QTzPBih1NOXBNGnhBU+kwfV4
|
||||
kJQF4TNxY/llnWVE2FHkzZOrNJTfJrn/hzdr2sjzqH1UhWDDzJW/DfLrJyXOMAub
|
||||
ae0PmuKyR0xnqYyR9hDARsgZFMQtfoDstnSVfUKKyV6cX0BJvYTiDacZwxDS5IbM
|
||||
Dhb2Z/rDCY9LqLBfn5C7+LqMKbmLft9DUfkcdQIdAMD5Sc8czo9kSB8V6fx2NmmX
|
||||
9yXTkylaT52eKQUCggEANc5OkHDRYD5SKHEMb7qqozTmTFUxibPohFn/Tp99lIZU
|
||||
U3oHHWLSze+TMzlXwawqmQqRKTtXx9NCcAgiUya3Vjt9/6eDv5N9ii0yu+8RiWiV
|
||||
grTonZZahQDyIqnz6fny92iTL7Fma4aZy8ICiNUNsR5TbASpgTU/OscJI6g6IoHY
|
||||
/h86HK4X6rETyeTNREiDZGZJKSpY6ReJbIrJ+lRoH7hwSKynhOEQ0Q+Z2e0TW8uH
|
||||
avsQ4jGkTkPQ0DLbAUqp7eWN+ATpew9kqBUCC5ENWnN2YvpYNjsMz8FxLvbq/H6R
|
||||
fnlAOSzO95yto2KueKvZCsH9rQlCMXpjrbIaYbsYXwKCAQBpN+w0N0b5IIAspXnl
|
||||
J9yuB6ORk3j/5rZ+DUtTzW1YAJI6xjTcFQvN7FpVLkmLtXKUXF04R+sdGJ7VFwOb
|
||||
0rbaL5vQzrqNkBrbgSzuzeloiG+7OLA6VeQtNbQh6OurrZFi9gY+qA5ciT9kQXyr
|
||||
HudVXu956NDrooRxmv6JIVFvToaNiwe2vcgdkALw8HUbLFYof4SAE9jgU8EpxTp0
|
||||
2e8HzvVSVa6yj1nnGhpzLPlEqF8TZvs9pTg2kIk3/zvWojMJoPyTALfbTjbAeiFM
|
||||
MeKNK/CKOOJj23AVAZxpMSR6cUbrIcRdKDnhCTVkkxXUecAIUs6Mk10kSfkuiGl9
|
||||
LjKjAhwpK4MOpkKEu+y308fZ+yZXypZW2m9Y/wOT0L4g
|
||||
-----END DSA PRIVATE KEY-----`;
|
||||
|
||||
const DSA_PRIVKEY_PKCS8 = `-----BEGIN PRIVATE KEY-----
|
||||
MIICXAIBADCCAjUGByqGSM44BAEwggIoAoIBAQC6C1frs+7zGGQiLsFzZIGWsLw4
|
||||
GQBtU+yIhtN9FoKnrETZ3LqFEDpgCQorjc5I1TUmNPK2m3sf0SJFiC78T/dUpc4Q
|
||||
PbffnafO6dt/HnMRmtbA9q3vst+UT+yMTU99+t9zbcBiLWdwaqgIaDJrsMMMWrtB
|
||||
PM8GKHU05cE0aeEFT6TB9XiQlAXhM3Fj+WWdZUTYUeTNk6s0lN8muf+HN2vayPOo
|
||||
fVSFYMPMlb8N8usnJc4wC5tp7Q+a4rJHTGepjJH2EMBGyBkUxC1+gOy2dJV9QorJ
|
||||
XpxfQEm9hOINpxnDENLkhswOFvZn+sMJj0uosF+fkLv4uowpuYt+30NR+Rx1Ah0A
|
||||
wPlJzxzOj2RIHxXp/HY2aZf3JdOTKVpPnZ4pBQKCAQA1zk6QcNFgPlIocQxvuqqj
|
||||
NOZMVTGJs+iEWf9On32UhlRTegcdYtLN75MzOVfBrCqZCpEpO1fH00JwCCJTJrdW
|
||||
O33/p4O/k32KLTK77xGJaJWCtOidllqFAPIiqfPp+fL3aJMvsWZrhpnLwgKI1Q2x
|
||||
HlNsBKmBNT86xwkjqDoigdj+HzocrhfqsRPJ5M1ESINkZkkpKljpF4lsisn6VGgf
|
||||
uHBIrKeE4RDRD5nZ7RNby4dq+xDiMaROQ9DQMtsBSqnt5Y34BOl7D2SoFQILkQ1a
|
||||
c3Zi+lg2OwzPwXEu9ur8fpF+eUA5LM73nK2jYq54q9kKwf2tCUIxemOtshphuxhf
|
||||
BB4CHCkrgw6mQoS77LfTx9n7JlfKllbab1j/A5PQviA=
|
||||
-----END PRIVATE KEY-----`;
|
||||
|
||||
const DSA_PUBKEY = `-----BEGIN PUBLIC KEY-----
|
||||
MIIDQjCCAjUGByqGSM44BAEwggIoAoIBAQC6C1frs+7zGGQiLsFzZIGWsLw4GQBt
|
||||
U+yIhtN9FoKnrETZ3LqFEDpgCQorjc5I1TUmNPK2m3sf0SJFiC78T/dUpc4QPbff
|
||||
nafO6dt/HnMRmtbA9q3vst+UT+yMTU99+t9zbcBiLWdwaqgIaDJrsMMMWrtBPM8G
|
||||
KHU05cE0aeEFT6TB9XiQlAXhM3Fj+WWdZUTYUeTNk6s0lN8muf+HN2vayPOofVSF
|
||||
YMPMlb8N8usnJc4wC5tp7Q+a4rJHTGepjJH2EMBGyBkUxC1+gOy2dJV9QorJXpxf
|
||||
QEm9hOINpxnDENLkhswOFvZn+sMJj0uosF+fkLv4uowpuYt+30NR+Rx1Ah0AwPlJ
|
||||
zxzOj2RIHxXp/HY2aZf3JdOTKVpPnZ4pBQKCAQA1zk6QcNFgPlIocQxvuqqjNOZM
|
||||
VTGJs+iEWf9On32UhlRTegcdYtLN75MzOVfBrCqZCpEpO1fH00JwCCJTJrdWO33/
|
||||
p4O/k32KLTK77xGJaJWCtOidllqFAPIiqfPp+fL3aJMvsWZrhpnLwgKI1Q2xHlNs
|
||||
BKmBNT86xwkjqDoigdj+HzocrhfqsRPJ5M1ESINkZkkpKljpF4lsisn6VGgfuHBI
|
||||
rKeE4RDRD5nZ7RNby4dq+xDiMaROQ9DQMtsBSqnt5Y34BOl7D2SoFQILkQ1ac3Zi
|
||||
+lg2OwzPwXEu9ur8fpF+eUA5LM73nK2jYq54q9kKwf2tCUIxemOtshphuxhfA4IB
|
||||
BQACggEAaTfsNDdG+SCALKV55SfcrgejkZN4/+a2fg1LU81tWACSOsY03BULzexa
|
||||
VS5Ji7VylFxdOEfrHRie1RcDm9K22i+b0M66jZAa24Es7s3paIhvuziwOlXkLTW0
|
||||
Iejrq62RYvYGPqgOXIk/ZEF8qx7nVV7veejQ66KEcZr+iSFRb06GjYsHtr3IHZAC
|
||||
8PB1GyxWKH+EgBPY4FPBKcU6dNnvB871UlWuso9Z5xoacyz5RKhfE2b7PaU4NpCJ
|
||||
N/871qIzCaD8kwC32042wHohTDHijSvwijjiY9twFQGcaTEkenFG6yHEXSg54Qk1
|
||||
ZJMV1HnACFLOjJNdJEn5LohpfS4yow==
|
||||
-----END PUBLIC KEY-----`;
|
||||
|
||||
const ED25519_PRIVKEY = `-----BEGIN PRIVATE KEY-----
|
||||
MC4CAQAwBQYDK2VwBCIEIC18vtoHINC8Mo9dTIqOrBs3J28ZvHrwzRq57g2kpV98
|
||||
-----END PRIVATE KEY-----`;
|
||||
|
||||
/*
|
||||
const ED25519_PUBKEY = `-----BEGIN PUBLIC KEY-----
|
||||
MCowBQYDK2VwAyEAELP6AflXwsuZ5q4NDIO0LP2iCdKRvds4nwsUmRhOw3g=
|
||||
-----END PUBLIC KEY-----`;
|
||||
*/
|
||||
|
||||
const ED448_PRIVKEY = `-----BEGIN PRIVATE KEY-----
|
||||
MEcCAQAwBQYDK2VxBDsEOWdGJ06bDcWznJhBoQqPeTfsCe+AvBv1n7KfIGYzR4tv
|
||||
1kcwHnbxlemnCMgqvbrRXaLuFUBysUZThA==
|
||||
-----END PRIVATE KEY-----`;
|
||||
|
||||
/*
|
||||
const ED448_PUBKEY = `-----BEGIN PUBLIC KEY-----
|
||||
MEMwBQYDK2VxAzoAVN8kG0TMVyGOu/OvBTe8H0Wi4HJrQAlSv4XLwJbkuoi4EeRl
|
||||
EHQwXsNYLZTtY2Jra6AWhbVYYaEA
|
||||
-----END PUBLIC KEY-----`;
|
||||
*/
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Public Key from Private Key: Missing footer",
|
||||
input: RSA_PRIVKEY_PKCS1.substring(0, RSA_PRIVKEY_PKCS1.length / 2),
|
||||
expectedOutput: "PEM footer '-----END RSA PRIVATE KEY-----' not found",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Private Key",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
// test RSA
|
||||
{
|
||||
name: "Public Key from Private Key: RSA PKCS#1",
|
||||
input: RSA_PRIVKEY_PKCS1,
|
||||
expectedOutput: (RSA_PUBKEY + "\n").replace(/\r/g, "").replace(/\n/g, "\r\n"),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Private Key",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Public Key from Private Key: RSA PKCS#8",
|
||||
input: RSA_PRIVKEY_PKCS8,
|
||||
expectedOutput: (RSA_PUBKEY + "\n").replace(/\r/g, "").replace(/\n/g, "\r\n"),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Private Key",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
// test EC certificate
|
||||
{
|
||||
name: "Public Key from Private Key: EC SEC1",
|
||||
input: EC_P256_PRIVKEY_SEC1,
|
||||
expectedOutput: (EC_P256_PUBKEY + "\n").replace(/\r/g, "").replace(/\n/g, "\r\n"),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Private Key",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Public Key from Private Key: EC PKCS#8",
|
||||
input: EC_P256_PRIVKEY_PKCS8,
|
||||
expectedOutput: (EC_P256_PUBKEY + "\n").replace(/\r/g, "").replace(/\n/g, "\r\n"),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Private Key",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
// test DSA
|
||||
{
|
||||
name: "Public Key from Private Key: DSA Traditional",
|
||||
input: DSA_PRIVKEY_TRAD,
|
||||
expectedOutput: (DSA_PUBKEY + "\n").replace(/\r/g, "").replace(/\n/g, "\r\n"),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Private Key",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Public Key from Private Key: DSA PKCS#8",
|
||||
input: DSA_PRIVKEY_PKCS8,
|
||||
expectedOutput: "DSA Private Key in PKCS#8 is not supported",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Private Key",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
// test EdDSA
|
||||
{
|
||||
name: "Public Key from Private Key: Ed25519",
|
||||
input: ED25519_PRIVKEY,
|
||||
expectedOutput: "Unsupported key type: Error: malformed PKCS8 private key(code:004)",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Private Key",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Public Key from Private Key: Ed448",
|
||||
input: ED448_PRIVKEY,
|
||||
expectedOutput: "Unsupported key type: Error: malformed PKCS8 private key(code:004)",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Private Key",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
// test multi-input
|
||||
{
|
||||
name: "Public Key from Private Key: Multiple keys",
|
||||
input: RSA_PRIVKEY_PKCS8 + "\n" + EC_P256_PRIVKEY_PKCS8,
|
||||
expectedOutput: (RSA_PUBKEY + "\n" + EC_P256_PUBKEY + "\n").replace(/\r/g, "").replace(/\n/g, "\r\n"),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Public Key from Private Key",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
}
|
||||
]);
|
22
tests/operations/tests/RAKE.mjs
Normal file
22
tests/operations/tests/RAKE.mjs
Normal file
|
@ -0,0 +1,22 @@
|
|||
/**
|
||||
* RAKE, Rapid Automatic Keyword Extraction tests.
|
||||
*
|
||||
* @author sw5678
|
||||
* @copyright Crown Copyright 2024
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
"name": "RAKE: Basic Example",
|
||||
"input": "test1 test2. test2",
|
||||
"expectedOutput": "Scores: , Keywords: \n3.5, test1 test2\n1.5, test2",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "RAKE",
|
||||
"args": ["\\s", "\\.\\s|\\n", "i,me,my,myself,we,our"]
|
||||
},
|
||||
],
|
||||
}
|
||||
]);
|
66
tests/operations/tests/RisonEncodeDecode.mjs
Normal file
66
tests/operations/tests/RisonEncodeDecode.mjs
Normal file
|
@ -0,0 +1,66 @@
|
|||
/**
|
||||
* @author sg5506844 [sg5506844@gmail.com]
|
||||
* @copyright Crown Copyright 2021
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Rison Encode: Encoding example 1",
|
||||
input: JSON.stringify({ any: "json", yes: true }),
|
||||
expectedOutput: "(any:json,yes:!t)",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Rison Encode",
|
||||
args: ["Encode"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Rison Encode: Encoding example 2",
|
||||
input: JSON.stringify({ supportsObjects: true, ints: 435 }),
|
||||
expectedOutput: "ints:435,supportsObjects:!t",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Rison Encode",
|
||||
args: ["Encode Object"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Rison Encode: Encoding example 3",
|
||||
input: JSON.stringify(["A", "B", { supportsObjects: true }]),
|
||||
expectedOutput: "A,B,(supportsObjects:!t)",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Rison Encode",
|
||||
args: ["Encode Array"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Rison Encode: Object for an array",
|
||||
input: JSON.stringify({ supportsObjects: true, ints: 435 }),
|
||||
expectedOutput: "Rison Encode - rison.encode_array expects an array argument",
|
||||
expectedError: "Rison Encode - rison.encode_array expects an array argument",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Rison Encode",
|
||||
args: ["Encode Array"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Rison Decode: Decoding example 1",
|
||||
input: "(any:json,yes:!t)",
|
||||
expectedOutput: JSON.stringify({ any: "json", yes: true }, null, 4),
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Rison Decode",
|
||||
args: ["Decode"]
|
||||
}
|
||||
]
|
||||
}
|
||||
]);
|
|
@ -135,10 +135,21 @@ TestRegister.addTests([
|
|||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "ROT13: no shift amount",
|
||||
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
|
||||
expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "ROT13",
|
||||
args: [true, true, true, 0]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "ROT13: normal",
|
||||
input: "The Quick Brown Fox Jumped Over The Lazy Dog.",
|
||||
expectedOutput: "Gur Dhvpx Oebja Sbk Whzcrq Bire Gur Ynml Qbt.",
|
||||
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
|
||||
expectedOutput: "Gur Dhvpx Oebja Sbk Whzcrq Bire Gur Ynml Qbt. 3456789012",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "ROT13",
|
||||
|
@ -146,10 +157,21 @@ TestRegister.addTests([
|
|||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "ROT13: negative shift amount",
|
||||
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
|
||||
expectedOutput: "Gur Dhvpx Oebja Sbk Whzcrq Bire Gur Ynml Qbt. 7890123456",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "ROT13",
|
||||
args: [true, true, true, -13]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "ROT13: full loop",
|
||||
input: "The Quick Brown Fox Jumped Over The Lazy Dog.",
|
||||
expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog.",
|
||||
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
|
||||
expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog. 6789012345",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "ROT13",
|
||||
|
@ -157,10 +179,21 @@ TestRegister.addTests([
|
|||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "ROT13: full loop (negative shift amount)",
|
||||
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
|
||||
expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog. 4567890123",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "ROT13",
|
||||
args: [true, true, true, -26]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "ROT13: lowercase only",
|
||||
input: "The Quick Brown Fox Jumped Over The Lazy Dog.",
|
||||
expectedOutput: "Tur Qhvpx Bebja Fbk Jhzcrq Oire Tur Lnml Dbt.",
|
||||
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
|
||||
expectedOutput: "Tur Qhvpx Bebja Fbk Jhzcrq Oire Tur Lnml Dbt. 0123456789",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "ROT13",
|
||||
|
@ -170,8 +203,8 @@ TestRegister.addTests([
|
|||
},
|
||||
{
|
||||
name: "ROT13: uppercase only",
|
||||
input: "The Quick Brown Fox Jumped Over The Lazy Dog.",
|
||||
expectedOutput: "Ghe Duick Orown Sox Wumped Bver Ghe Yazy Qog.",
|
||||
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
|
||||
expectedOutput: "Ghe Duick Orown Sox Wumped Bver Ghe Yazy Qog. 0123456789",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "ROT13",
|
||||
|
@ -179,6 +212,50 @@ TestRegister.addTests([
|
|||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "ROT13: numbers only",
|
||||
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
|
||||
expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog. 5678901234",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "ROT13",
|
||||
args: [false, false, true, 5]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "ROT13: numbers only (negative shift amount)",
|
||||
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
|
||||
expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog. 5678901234",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "ROT13",
|
||||
args: [false, false, true, 5]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "ROT13: numbers only loop",
|
||||
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
|
||||
expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "ROT13",
|
||||
args: [false, false, true, 10]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "ROT13: numbers only loop (negative shift amount)",
|
||||
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
|
||||
expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "ROT13",
|
||||
args: [false, false, true, -10]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "ROT47: nothing",
|
||||
input: "",
|
||||
|
|
76
tests/operations/tests/Salsa20.mjs
Normal file
76
tests/operations/tests/Salsa20.mjs
Normal file
|
@ -0,0 +1,76 @@
|
|||
/**
|
||||
* Salsa20 tests.
|
||||
*
|
||||
* @author joostrijneveld [joost@joostrijneveld.nl]
|
||||
* @copyright Crown Copyright 2024
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Salsa20: no key",
|
||||
input: "",
|
||||
expectedOutput: `Invalid key length: 0 bytes.
|
||||
|
||||
Salsa20 uses a key of 16 or 32 bytes (128 or 256 bits).`,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Salsa20",
|
||||
"args": [
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""},
|
||||
0, "20", "Hex", "Hex",
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Salsa20: no nonce",
|
||||
input: "",
|
||||
expectedOutput: `Invalid nonce length: 0 bytes.
|
||||
|
||||
Salsa20 uses a nonce of 8 bytes (64 bits).`,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Salsa20",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "00000000000000000000000000000000"},
|
||||
{"option": "Hex", "string": ""},
|
||||
0, "20", "Hex", "Hex",
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Salsa20: ECRYPT Set 1 vector# 0",
|
||||
input: "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00",
|
||||
expectedOutput: "e3 be 8f dd 8b ec a2 e3 ea 8e f9 47 5b 29 a6 e7 00 39 51 e1 09 7a 5c 38 d2 3b 7a 5f ad 9f 68 44 b2 2c 97 55 9e 27 23 c7 cb bd 3f e4 fc 8d 9a 07 44 65 2a 83 e7 2a 9c 46 18 76 af 4d 7e f1 a1 17 8d a2 b7 4e ef 1b 62 83 e7 e2 01 66 ab ca e5 38 e9 71 6e 46 69 e2 81 6b 6b 20 c5 c3 56 80 20 01 cc 14 03 a9 a1 17 d1 2a 26 69 f4 56 36 6d 6e bb 0f 12 46 f1 26 51 50 f7 93 cd b4 b2 53 e3 48 ae 20 3d 89 bc 02 5e 80 2a 7e 0e 00 62 1d 70 aa 36 b7 e0 7c b1 e7 d5 b3 8d 5e 22 2b 8b 0e 4b 84 07 01 42 b1 e2 95 04 76 7d 76 82 48 50 32 0b 53 68 12 9f dd 74 e8 61 b4 98 e3 be 8d 16 f2 d7 d1 69 57 be 81 f4 7b 17 d9 ae 7c 4f f1 54 29 a7 3e 10 ac f2 50 ed 3a 90 a9 3c 71 13 08 a7 4c 62 16 a9 ed 84 cd 12 6d a7 f2 8e 8a bf 8b b6 35 17 e1 ca 98 e7 12 f4 fb 2e 1a 6a ed 9f dc 73 29 1f aa 17 95 82 11 c4 ba 2e bd 58 38 c6 35 ed b8 1f 51 3a 91 a2 94 e1 94 f1 c0 39 ae ec 65 7d ce 40 aa 7e 7c 0a f5 7c ac ef a4 0c 9f 14 b7 1a 4b 34 56 a6 3e 16 2e c7 d8 d1 0b 8f fb 18 10 d7 10 01 b6 18 2f 9f 73 da 53 b8 54 05 c1 1f 7b 2d 89 0f a8 ae 0c 7f 2e 92 6d 8a 98 c7 ec 4e 91 b6 51 20 e9 88 34 96 31 a7 00 c6 fa ce c3 47 1c b0 41 36 56 e7 5e 30 94 56 58 40 84 d7 e1 2c 5b 43 a4 1c 43 ed 9a 04 8a bd 9b 88 0d a6 5f 6a 66 5a 20 fe 7b 77 cd 29 2f e6 2c ae 64 4b 7f 7d f6 9f 32 bd b3 31 90 3e 65 05 ce 44 fd c2 93 92 0c 6a 9e c7 05 7e 23 df 7d ad 29 8f 82 dd f4 ef b7 fd c7 bf c6 22 69 6a fc fd 0c dd cc 83 c7 e7 7f 11 a6 49 d7 9a cd c3 35 4e 96 35 ff 13 7e 92 99 33 a0 bd 6f 53 77 ef a1 05 a3 a4 26 6b 7c 0d 08 9d 08 f1 e8 55 cc 32 b1 5b 93 78 4a 36 e5 6a 76 cc 64 bc 84 77",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Salsa20",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "80:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00"},
|
||||
{"option": "Hex", "string": "00:00:00:00:00:00:00:00"},
|
||||
0, "20", "Hex", "Hex",
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Salsa20: ECRYPT Set 6 vector# 3",
|
||||
input: "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00",
|
||||
expectedOutput: "71 da ee 51 42 d0 72 8b 41 b6 59 79 33 eb f4 67 e4 32 79 e3 09 78 67 70 78 94 16 02 62 9c bf 68 b7 3d 6b d2 c9 5f 11 8d 2b 3e 6e c9 55 da bb 6d c6 1c 41 43 bc 9a 9b 32 b9 9d be 68 66 16 6d c0 86 31 b7 d6 55 30 50 30 3d 72 52 c2 64 d3 a9 0d 26 c8 53 63 48 13 e0 9a d7 54 5a 6c e7 e8 4a 5d fc 75 ec 43 43 12 07 d5 31 99 70 b0 fa ad b0 e1 51 06 25 bb 54 37 2c 85 15 e2 8e 2a cc f0 a9 93 0a d1 5f 43 18 74 92 3d 2a 59 e2 0d 9f 2a 53 67 db a6 05 15 64 f1 50 28 7d eb b1 db 53 6f f9 b0 9a d9 81 f2 5e 50 10 d8 5d 76 ee 0c 30 5f 75 5b 25 e6 f0 93 41 e0 81 2f 95 c9 4f 42 ee ad 34 6e 81 f3 9c 58 c5 fa a2 c8 89 53 dc 0c ac 90 46 9d b2 06 3c b5 cd b2 2c 9e ae 22 af bf 05 06 fc a4 1d c7 10 b8 46 fb df e3 c4 68 83 dd 11 8f 3a 5e 8b 11 b6 af d9 e7 16 80 d8 66 65 57 30 1a 2d aa fb 94 96 c5 59 78 4d 35 a0 35 36 08 85 f9 b1 7b d7 19 19 77 de ea 93 2b 98 1e bd b2 90 57 ae 3c 92 cf ef f5 e6 c5 d0 cb 62 f2 09 ce 34 2d 4e 35 c6 96 46 cc d1 4e 53 35 0e 48 8b b3 10 a3 2f 8b 02 48 e7 0a cc 5b 47 3d f5 37 ce d3 f8 1a 01 4d 40 83 93 2b ed d6 2e d0 e4 47 b6 76 6c d2 60 4b 70 6e 9b 34 6c 44 68 be b4 6a 34 ec f1 61 0e bd 38 33 1d 52 bf 33 34 6a fe c1 5e ef b2 a7 69 9e 87 59 db 5a 1f 63 6a 48 a0 39 68 8e 39 de 34 d9 95 df 9f 27 ed 9e dc 8d d7 95 e3 9e 53 d9 d9 25 b2 78 01 05 65 ff 66 52 69 04 2f 05 09 6d 94 da 34 33 d9 57 ec 13 d2 fd 82 a0 06 62 83 d0 d1 ee b8 1b f0 ef 13 3b 7f d9 02 48 b8 ff b4 99 b2 41 4c d4 fa 00 30 93 ff 08 64 57 5a 43 74 9b f5 96 02 f2 6c 71 7f a9 6b 1d 05 76 97 db 08 eb c3 fa 66 4a 01 6a 67 dc ef 88 07 57 7c c3 a0 93 85 d3",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Salsa20",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "0F:62:B5:08:5B:AE:01:54:A7:FA:4D:A0:F3:46:99:EC"},
|
||||
{"option": "Hex", "string": "28:8F:F6:5D:C4:2B:92:F9"},
|
||||
0, "20", "Hex", "Hex",
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
]);
|
|
@ -11,7 +11,7 @@ TestRegister.addTests([
|
|||
{
|
||||
name: "Diff, basic usage",
|
||||
input: "testing23\n\ntesting123",
|
||||
expectedOutput: "testing<span class='hl5'>1</span>23",
|
||||
expectedOutput: "testing<ins>1</ins>23",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Diff",
|
||||
|
@ -22,7 +22,7 @@ TestRegister.addTests([
|
|||
{
|
||||
name: "Diff added with subtraction, basic usage",
|
||||
input: "testing23\n\ntesting123",
|
||||
expectedOutput: "<span class='hl5'>1</span>",
|
||||
expectedOutput: "<ins>1</ins>",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Diff",
|
||||
|
@ -33,7 +33,7 @@ TestRegister.addTests([
|
|||
{
|
||||
name: "Diff removed with subtraction, basic usage",
|
||||
input: "testing123\n\ntesting3",
|
||||
expectedOutput: "<span class='hl3'>12</span>",
|
||||
expectedOutput: "<del>12</del>",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Diff",
|
||||
|
|
126
tests/operations/tests/StripIPv4Header.mjs
Normal file
126
tests/operations/tests/StripIPv4Header.mjs
Normal file
|
@ -0,0 +1,126 @@
|
|||
/**
|
||||
* Strip IPv4 header tests.
|
||||
*
|
||||
* @author c65722 []
|
||||
* @copyright Crown Copyright 2024
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Strip IPv4 header: No options, No payload",
|
||||
input: "450000140005400080060000c0a80001c0a80002",
|
||||
expectedOutput: "",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["None"]
|
||||
},
|
||||
{
|
||||
op: "Strip IPv4 header",
|
||||
args: [],
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None", 0]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Strip IPv4 header: No options, Payload",
|
||||
input: "450000140005400080060000c0a80001c0a80002ffffffffffffffff",
|
||||
expectedOutput: "ffffffffffffffff",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["None"]
|
||||
},
|
||||
{
|
||||
op: "Strip IPv4 header",
|
||||
args: [],
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None", 0]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Strip IPv4 header: Options, No payload",
|
||||
input: "460000140005400080060000c0a80001c0a8000207000000",
|
||||
expectedOutput: "",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["None"]
|
||||
},
|
||||
{
|
||||
op: "Strip IPv4 header",
|
||||
args: [],
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None", 0]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Strip IPv4 header: Options, Payload",
|
||||
input: "460000140005400080060000c0a80001c0a8000207000000ffffffffffffffff",
|
||||
expectedOutput: "ffffffffffffffff",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["None"]
|
||||
},
|
||||
{
|
||||
op: "Strip IPv4 header",
|
||||
args: [],
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None", 0]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Strip IPv4 header: Input length lesss than minimum header length",
|
||||
input: "450000140005400080060000c0a80001c0a800",
|
||||
expectedOutput: "Input length is less than minimum IPv4 header length",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["None"]
|
||||
},
|
||||
{
|
||||
op: "Strip IPv4 header",
|
||||
args: [],
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None", 0]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Strip IPv4 header: Input length less than IHL",
|
||||
input: "460000140005400080060000c0a80001c0a80000",
|
||||
expectedOutput: "Input length is less than IHL",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["None"]
|
||||
},
|
||||
{
|
||||
op: "Strip IPv4 header",
|
||||
args: [],
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None", 0]
|
||||
}
|
||||
]
|
||||
}
|
||||
]);
|
126
tests/operations/tests/StripTCPHeader.mjs
Normal file
126
tests/operations/tests/StripTCPHeader.mjs
Normal file
|
@ -0,0 +1,126 @@
|
|||
/**
|
||||
* Strip TCP header tests.
|
||||
*
|
||||
* @author c65722 []
|
||||
* @copyright Crown Copyright 2024
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Strip TCP header: No options, No payload",
|
||||
input: "7f900050000fa4b2000cb2a45010bff100000000",
|
||||
expectedOutput: "",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["None"]
|
||||
},
|
||||
{
|
||||
op: "Strip TCP header",
|
||||
args: [],
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None", 0]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Strip TCP header: No options, Payload",
|
||||
input: "7f900050000fa4b2000cb2a45010bff100000000ffffffffffffffff",
|
||||
expectedOutput: "ffffffffffffffff",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["None"]
|
||||
},
|
||||
{
|
||||
op: "Strip TCP header",
|
||||
args: [],
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None", 0]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Strip TCP header: Options, No payload",
|
||||
input: "7f900050000fa4b2000cb2a47010bff100000000020405b404020000",
|
||||
expectedOutput: "",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["None"]
|
||||
},
|
||||
{
|
||||
op: "Strip TCP header",
|
||||
args: [],
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None", 0]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Strip TCP header: Options, Payload",
|
||||
input: "7f900050000fa4b2000cb2a47010bff100000000020405b404020000ffffffffffffffff",
|
||||
expectedOutput: "ffffffffffffffff",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["None"]
|
||||
},
|
||||
{
|
||||
op: "Strip TCP header",
|
||||
args: [],
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None", 0]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Strip TCP header: Input length less than minimum header length",
|
||||
input: "7f900050000fa4b2000cb2a45010bff1000000",
|
||||
expectedOutput: "Need at least 20 bytes for a TCP Header",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["None"]
|
||||
},
|
||||
{
|
||||
op: "Strip TCP header",
|
||||
args: [],
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None", 0]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Strip TCP header: Input length less than data offset",
|
||||
input: "7f900050000fa4b2000cb2a47010bff100000000",
|
||||
expectedOutput: "Input length is less than data offset",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["None"]
|
||||
},
|
||||
{
|
||||
op: "Strip TCP header",
|
||||
args: [],
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None", 0]
|
||||
}
|
||||
]
|
||||
}
|
||||
]);
|
69
tests/operations/tests/StripUDPHeader.mjs
Normal file
69
tests/operations/tests/StripUDPHeader.mjs
Normal file
|
@ -0,0 +1,69 @@
|
|||
/**
|
||||
* Strip UDP header tests.
|
||||
*
|
||||
* @author c65722 []
|
||||
* @copyright Crown Copyright 2024
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Strip UDP header: No payload",
|
||||
input: "8111003500000000",
|
||||
expectedOutput: "",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["None"]
|
||||
},
|
||||
{
|
||||
op: "Strip UDP header",
|
||||
args: [],
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None", 0]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Strip UDP header: Payload",
|
||||
input: "8111003500080000ffffffffffffffff",
|
||||
expectedOutput: "ffffffffffffffff",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["None"]
|
||||
},
|
||||
{
|
||||
op: "Strip UDP header",
|
||||
args: [],
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None", 0]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Strip UDP header: Input length less than header length",
|
||||
input: "81110035000000",
|
||||
expectedOutput: "Need 8 bytes for a UDP Header",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "From Hex",
|
||||
args: ["None"]
|
||||
},
|
||||
{
|
||||
op: "Strip UDP header",
|
||||
args: [],
|
||||
},
|
||||
{
|
||||
op: "To Hex",
|
||||
args: ["None", 0]
|
||||
}
|
||||
]
|
||||
}
|
||||
]);
|
33
tests/operations/tests/SwapCase.mjs
Normal file
33
tests/operations/tests/SwapCase.mjs
Normal file
|
@ -0,0 +1,33 @@
|
|||
/**
|
||||
* @author mikecat
|
||||
* @copyright Crown Copyright 2023
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
"name": "Swap Case: basic example",
|
||||
"input": "Hello, World!",
|
||||
"expectedOutput": "hELLO, wORLD!",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Swap case",
|
||||
"args": [
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "Swap Case: empty input",
|
||||
"input": "",
|
||||
"expectedOutput": "",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Swap case",
|
||||
"args": [
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
123
tests/operations/tests/TakeNthBytes.mjs
Normal file
123
tests/operations/tests/TakeNthBytes.mjs
Normal file
|
@ -0,0 +1,123 @@
|
|||
/**
|
||||
* @author Oshawk [oshawk@protonmail.com]
|
||||
* @copyright Crown Copyright 2019
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
/**
|
||||
* Take nth bytes tests
|
||||
*/
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Take nth bytes: Nothing",
|
||||
input: "",
|
||||
expectedOutput: "",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Take nth bytes",
|
||||
args: [4, 0, false],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Take nth bytes: Nothing (apply to each line)",
|
||||
input: "",
|
||||
expectedOutput: "",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Take nth bytes",
|
||||
args: [4, 0, true],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Take nth bytes: Basic single line",
|
||||
input: "0123456789",
|
||||
expectedOutput: "048",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Take nth bytes",
|
||||
args: [4, 0, false],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Take nth bytes: Basic single line (apply to each line)",
|
||||
input: "0123456789",
|
||||
expectedOutput: "048",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Take nth bytes",
|
||||
args: [4, 0, true],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Take nth bytes: Complex single line",
|
||||
input: "0123456789",
|
||||
expectedOutput: "59",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Take nth bytes",
|
||||
args: [4, 5, false],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Take nth bytes: Complex single line (apply to each line)",
|
||||
input: "0123456789",
|
||||
expectedOutput: "59",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Take nth bytes",
|
||||
args: [4, 5, true],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Take nth bytes: Basic multi line",
|
||||
input: "01234\n56789",
|
||||
expectedOutput: "047",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Take nth bytes",
|
||||
args: [4, 0, false],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Take nth bytes: Basic multi line (apply to each line)",
|
||||
input: "01234\n56789",
|
||||
expectedOutput: "04\n59",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Take nth bytes",
|
||||
args: [4, 0, true],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Take nth bytes: Complex multi line",
|
||||
input: "01234\n56789",
|
||||
expectedOutput: "\n8",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Take nth bytes",
|
||||
args: [4, 5, false],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Take nth bytes: Complex multi line (apply to each line)",
|
||||
input: "012345\n6789ab",
|
||||
expectedOutput: "5\nb",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Take nth bytes",
|
||||
args: [4, 5, true],
|
||||
},
|
||||
],
|
||||
}
|
||||
]);
|
|
@ -1,55 +0,0 @@
|
|||
/**
|
||||
* To Geohash tests
|
||||
*
|
||||
* @author gchq77703
|
||||
* @copyright Crown Copyright 2018
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "To Geohash",
|
||||
input: "37.8324,112.5584",
|
||||
expectedOutput: "ww8p1r4t8",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "To Geohash",
|
||||
args: [9],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "To Geohash",
|
||||
input: "37.9324,-112.2584",
|
||||
expectedOutput: "9w8pv3ruj",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "To Geohash",
|
||||
args: [9],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "To Geohash",
|
||||
input: "37.8324,112.5584",
|
||||
expectedOutput: "ww8",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "To Geohash",
|
||||
args: [3],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "To Geohash",
|
||||
input: "37.9324,-112.2584",
|
||||
expectedOutput: "9w8pv3rujxy5b99",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "To Geohash",
|
||||
args: [15],
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
61
tests/operations/tests/XSalsa20.mjs
Normal file
61
tests/operations/tests/XSalsa20.mjs
Normal file
|
@ -0,0 +1,61 @@
|
|||
/**
|
||||
* XSalsa20 tests.
|
||||
*
|
||||
* @author joostrijneveld [joost@joostrijneveld.nl]
|
||||
* @copyright Crown Copyright 2024
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "XSalsa20: no key",
|
||||
input: "",
|
||||
expectedOutput: `Invalid key length: 0 bytes.
|
||||
|
||||
XSalsa20 uses a key of 16 or 32 bytes (128 or 256 bits).`,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "XSalsa20",
|
||||
"args": [
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""},
|
||||
0, "20", "Hex", "Hex",
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "XSalsa20: no nonce",
|
||||
input: "",
|
||||
expectedOutput: `Invalid nonce length: 0 bytes.
|
||||
|
||||
XSalsa20 uses a nonce of 24 bytes (192 bits).`,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "XSalsa20",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "00000000000000000000000000000000"},
|
||||
{"option": "Hex", "string": ""},
|
||||
0, "20", "Hex", "Hex",
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "XSalsa20 custom vector",
|
||||
input: "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00",
|
||||
expectedOutput: "7c b6 60 af dd 9e c6 46 8f 57 dd 6d 24 33 f9 34 28 fd 82 cd 73 86 c5 47 1a 24 d8 ad 2a 52 5b 6e 5e ff 38 4f c7 ca a2 10 bb 3c 8f 3e 68 8f 4a 97 52 a5 46 df 8c 25 3f ef 17 a2 67 94 55 c7 a1 e1 83 db f5 d5 45 b0 f5 02 b9 8d e0 99 7a 66 ab 43 23 41 68 9f f3 97 dc 4f bc 1f 27 bd 1a 61 97 f5 dc 80 ff 19 05 16 c9 ed 14 f2 81 d1 ca 73 88 82 f6 d3 d2 fb 92 1e 2e f8 99 38 9e 0a 22 3b e7 ae 81 5a 04 86 5f 82 52 68 2f 6a d1 4f 98 ff 5f 08 23 cc 22 9d d2 22 9e 69 9d c2 1a 81 7d c9 54 bb 9b c9 0d ec 3b 9b d3 bf 20 9b 82 da f7 89 34 8a 5e 14 ec 54 2b 6d ee 8b 60 1e 7e 6d e3 c2 8a 2d 57 b6 25 e7 ea b3 43 d8 eb 20 85 b6 f6 82 09 58 99 35 20 44 22 60 60 61 d2 8d e9 8b ea 58 af bf ba ad 70 03 98 19 a0 c3 9a a8 63 94 47 5c d0 61 94 b0 17 ab c4 bb 28 b7 56 6d 3c 66 1c 76 f4 8a d3 a3 a2 9e d3 36 df 1f c6 8b 4f 44 2f 06 a3 58 0b ae c8 06 e2 e6 5d 39 ab 18 28 fe 80 18 12 69 2c 60 34 b5 0b f5 f3 3c 51 fc 0c fb 43 82 1e 3e 92 d6 b8 06 cf 00 16 e3 49 a0 34 83 20 f9 b0 53 7e ad ac 4a c1 36 5f cc fb be e2 ba 5a ad 1d 29 74 07 19 34 61 0e 9d ce 84 60 24 6a e6 8d ed 50 e0 20 44 26 d8 76 6d f2 da 4b 12 72 5a 85 c2 b1 07 04 f5 10 2e 3c 67 1c 5a fc 5b 46 0e 4d fb 39 b6 10 73 22 47 84 10 93 df 5f c8 92 7e 87 c3 0d 24 3a 48 b2 ad c2 56 3d a2 22 e9 02 9c 58 64 c6 d5 a5 f8 c6 54 99 1c 0f 6b f3 db ed 81 16 85 28 17 b0 eb 11 c7 05 9f f9 d8 fc 4a 1c 36 db 16 fd 38 d8 32 34 5b 8c 80 c6 51 21 1d 91 01 c5 8a 60 ad a4 39 33 d5 32 9a c1 f5 b2 ab 20 46 75 db 63 e0 bd d2 97 c0 e9 fc 1c d9 17 4a d1 3a db ea c2 8c 46 22 21 c3 5a bf 6c 1e cf 28 9c 8c 2f b2 0f",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "XSalsa20",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "00:01:02:03:04:05:06:07:08:09:0A:0B:0C:0D:0E:0F:10:11:12:13:14:15:16:17:18:19:1A:1B:1C:1D:1E:1F"},
|
||||
{"option": "Hex", "string": "00:01:02:03:04:05:06:07:08:09:0A:0B:0C:0D:0E:0F:10:11:12:13:14:15:16:17"},
|
||||
0, "20", "Hex", "Hex",
|
||||
]
|
||||
}
|
||||
],
|
||||
}
|
||||
]);
|
42
tests/operations/tests/XXTEA.mjs
Normal file
42
tests/operations/tests/XXTEA.mjs
Normal file
|
@ -0,0 +1,42 @@
|
|||
/**
|
||||
* XXTEA tests.
|
||||
*
|
||||
* @author devcydo [devcydo@gmail.com]
|
||||
* @author n1474335 [n1474335@gmail.com]
|
||||
* @copyright Crown Copyright 2024
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "XXTEA Encrypt and Decrypt",
|
||||
input: "Hello World! 你好,中国!",
|
||||
expectedOutput: "Hello World! 你好,中国!",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "XXTEA Encrypt",
|
||||
"args": [{ "option": "UTF8", "string": "1234567890" }]
|
||||
},
|
||||
{
|
||||
"op": "XXTEA Decrypt",
|
||||
"args": [{ "option": "UTF8", "string": "1234567890" }]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "XXTEA Encrypt",
|
||||
input: "ნუ პანიკას",
|
||||
expectedOutput: "3db5a39db1663fc029bb630a38635b8de5bfef62192e52cc4bf83cda8ccbc701",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "XXTEA Encrypt",
|
||||
"args": [{ "option": "UTF8", "string": "1234567890" }]
|
||||
},
|
||||
{
|
||||
"op": "To Hex",
|
||||
"args": ["None", 0]
|
||||
}
|
||||
],
|
||||
}
|
||||
]);
|
|
@ -22,7 +22,7 @@ export const PNG_HEX = "89504e470d0a1a0a0000000d49484452000000200000002008060000
|
|||
* The CyberChef logo with 'chef'
|
||||
* 32x32
|
||||
*/
|
||||
export const PNG_CHEF_B64 = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAH40lEQVR4AaXBfVAU5wEH4N/77t7ufXAnHlwE5MuK1uApVo1ppNBxgpJKKyijaewYJzRj0eokjBpbp3HQ0VpN1fqHndCxNkW4UWf8KHZaa0yR1hPH04QGGwm9Ata7KN/c5m5v9+52t8tIp1QPJOnzEHw5TF1dnTMlJWVxOBxmfD7fjY0bN34EQAVAAWgAVEwAwcQQABSAtmXLFltlZeW7iYmJqwVBQCgUogA0QRAuDg4OfuxwOEpkWW5dunRpBQAFT8FifOTcuXPPz5w5cxPP87mqqoYAmKxW63N4RMUjxGazrbBard8hOp7ncziOe7O2tnaJ0Wi0l5WVnQCgIg6CsRG3270pOzv7CCHEgDgCgYAaCoUo4pAk6T7P81Oh8/l8FStXrvwt4mAxhnPnzi3Myso6Qggx4EswGo0ZeERTVRVjoYiPzJgxYyOl1ID/kyzLPevWrbsAgCAOBvExVVVVOzmOm4pxRCIRRCIRgnGwLJvwim7NmjUZdXV17+MxLOLTdBKejmACjEZjlqIoLwCgABSMQhGfGgqFmvB0GiZAlmV/OBz2AFDxGAZjyMzMvOt0OtcyDGPFiEgkAkVRwDAMhkmSpEWjUYJxyLLcU1xcnHvixIkGABpGEEIM6enpLxCMkpOT82JpaenLHMc9IwiCv6CgoG3RokWbjUbjTOh4nofX60VGRgaGBQIBNRQKUTyFz+fbWFZW9i5GmM3m9IaGhsb8/PxsihHbtm071traeikpKYnz+/2fLFiwILu8vPwXBw4cOK+qahQ6RVGgaRomIhwOd2qapmiapuoiGKWiomJbZmbm5OTk5K+y0BUUFHx33759P8jLy1vW1tb2Z+hqa2vR3Ny87/Dhwzs7OjrgcDgwUYqiiIWFhQvq6+sLzGazY9WqVe9hlPLy8rzTp097QqFQBwPd3r17a65evfo3l8u1H6O0tbW17t69e3t7ezvsdjsopRgcHITZbEYoFMLQ0BCRJAkcx2E0SZKI3+9/0NXVNd3j8fR1dna2K4oSYxjGuH79+h8WFxcXWSwWo8Fg4BldQk1NzaHjx4//+s6dOzcwSjQaFevr6z+orKys4DgOlFLwPA+bzQZVVWGz2TB37lx4vV5wHIdhQ0NDcDqddP78+Xmpqal07dq1r5WUlKw6pSOEsOvWrdvtdDqn2e1229DQUCLL83xCcnKy2e/3P0QcXq/3I5PJFAHAQWe329HV1YXk5GQEAgH19u3b1OFwQBRFaJoGq9WKvr4+LF68+NlYLCZYrdYUj8fTunz58sqGhoZ3qqqqlsybN6/x8uXLgf3795dRAAQ6RVFUxBd2u90ftLS0QBAEeDwe+Hw+tLS0wO12w+PxIC0tDZcuXcLFixexcOFCnDp1CoqiRAkhfDAYHLxy5cq1/Pz8ZRiFUkqgY1VVVaBLSkqyIj5DTk7ODIZhYDQaYTAYkJSUhGEcx6Gvrw8Mw2DWrFkQRRGUUlRXV6O6ulrEKC6X60PEwcqyPHD37t3eaTo8JneKxfjW1jdD/X9vplMmGQHL10Gkz0EG22Gyp2uTTFbtQTQKTdPQ3t6uASDQ7dq1C263u+rmzZt/xIhYLCYjDqppWuzChQt/WLFixcuUUh7/Rb//0iLP+u17qfbwLqj3ryChASAcAPVeQ5rZTCwMQ6BTVRXNzc3k+vXriMVi0DQNZrP5YH5+PoLB4KeiKHZIktSFOCh0R48e/emcOXNSt27desxoNCZC99o3Zy158fUfO1uuN8LORPAfiqohdeEqWJKzMMxkMoFSCnmyDEIIampqsGHDBjgcDjqgW758+WKXy3WpqKhoC+Jgoevu7m4vLCz81smTJ3+zZ8+eXlEUowkWs+nTm024VrMTqzcfgsXE48N+AYMw45MBBc+lyrjf2UlgMCBGYugv70chWwj+Mx49PT2oqalhJEnq4TgObrcbN27ceBVxEIxCCGHT09Odq/JSv+ZMZk8YIgKkmIrVb52A3ZGK42fP4tqtW9j7xhuwMAyabt2CYDKhK7MLxx4ew9uOt5EdzkYwGBxobGy0chxngG5gYGCby+U6hBFTpkyZJkmSEggE/sXgf6mCIDz83mxrhZlGn4cupmqYnV8Kk8WK+bm5KCsqgsVsRkwQ0NndjR5RRK4lF6VcKRJjiRhGCPE1NTW9brFYXhEE4bjL5foJAA0jQqHQkCzLAegonkQNLJmPcciyDCPLYlh/fz8ep6oqTUhI+AZ0PM/nL1u2bBrGQPEkTVXRjXHwPI8IdIRogiBA0zSMJknSV2w223boWJZ9NiUlZTPGwOJJWm8wUmPmTKWEgEEcDKWwOByYMWcOaEoKCCF4DIlEIi2CIOy1Wq0r/H7/EYyBRRzVf/rn+z/79oxNzyRw7wCwYYSqqvALAiwmExiWxcdtbeTS1ataLBaDxWJRSkpKGB2BLhqNNp4/f/4sgLMYB4v4tB/9/h+/WjMv5XfTkkwvsZzpKIBJlFKkmEzo8XoR7u+H0t2tZWRkaGlpacjIyGCIDjqO4+77/f5DmAAW4zjT8rAbQO2rPb1yjtnyc85gmGrgeUydPRvDog8eaIm9vRSjKIrymSiKW5qamvyYAAYT8Mva2juqqr43a/r0z3mOy2YZZjJ0fcGgNiiKBDpFUXyiKB5pbm5ev2PHjhZMEMEXRCnl/nLmTG5Wenpe18DApI7e3qDuzsGDB1vu3bsXwRf0bxUQXc2aUJWHAAAAAElFTkSuQmCC";
|
||||
export const PNG_CHEF_B64 = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAHqElEQVR4AcXBfUyU9wEH8O/v9zz3PHfPvXLewXHnxYKgYCFW6ktHmXUySIdKcVlFs2ZkrRB1m6kx00XTbGJjFrvVTSexZusGviQqwsxImM5laOZclG3EisEXWK2cvBwcuYN7456XPawQb+fx4l/7fAji5Obmvrlx48ZKjUZjlyTpaXNz89nOzs42TDp37lzLwMCAcefOnWtPnz6d53A4CsPhMNPb2/v37du3/wuADIACUADImIZer3e3tLS0rVy50k2gIqo9e/b8et++fd8+ceLEqXA47Jk3b97SmpqaDTU1NT+ur68/BICeOXPmEsuyzry8vAcWi+XtQCCAYDBIASiBQOAPIyMjd+x2+7poNPpZSUnJuwAkJLFr165j1dXVlQUFBa+yUBUXF79TW1tbtWTJkrXd3d3XMam9vb325MmTH27durXc4XAwBoPh1Z6eHqSkpCzDl2R8iZhMpnKj0biBqHiez+I47v2GhoavabVaa0VFxacAZEwqLy/Pa2xsbI9EIk8YqA4ePPhJa2tre2Nj40d4hnz88cerMzMz1/T29rrS0tKcLMvC7/eDUooJg4ODBCpCCAghICqoxsfH+aqqqr2CIFTabLbykpIS74ULF24zDKPbvXv3nuLi4rUmk0mfmppqoQzDGMvKyl55+PDhdcRpampavnjx4v3d3d1wOByY4nQ6IQgCIpEIrFYrVq1aBVEUMcXv9yMjIwNOpxPp6emw2WzIz8//lUajMQNg9Xp9oSiKxvT0dLsgCF+hPM/rLRaL9tGjRwN4hmRnZ2+nlGoMBgMEQcAUk8mEkZERmM1mqORbt24hJSUFExRFgcVigc/ng9frxejoKHp6eiRRFCPl5eU7JEkaPXDgwPq+vr67p06d+lttbe0GCoBAJUmSjGcoz/N5SKKrqws2mw0TiMrv98PlcmFCIBBAQUEBBgYGEI1GEQqFwLIsA0C7Y8eOQwAIJlFKCVSsLMsSVHa73YRnFFUEsyOKooAQggmiKGJCcXExEoVCIagoAAlx2Gg0OtzR0dHndruz8YwcDAavGQyGr46NjSEQCMDlciEJBQBBgpaWFpjNZkyJRqOxYDB4DoCMBFRRFOnixYstmzdvrmQYRodJra2tx30+HxYtWgRZlpGMokIcnuchiiIcDgcEQYAgCGAYZrCysvKlioqKKgAKElCo6urqDmZnZxuOHDlyRhCEBZRSXV1dXaYgCLh//z7S09MxFwaDAbdv30ZWVhZ8Ph+i0SiCwWBqZ2enp6ys7H0kwULl8/me5OXlrTl+/PinwWDwc6gikYh49OjR39fX139w5cqVfwLQMAwDQgjiEUJAKcUUhmHQ1dWF1atXg+d5yLKMtrY2XL169beIwzAMhYogDiGE8jyfrtVqrcFgsDcWi40AMPT29g5TSrlwOAxFUSAIAib4/X55ZGSEiqIIQRAwRZKkUFFRUf6xY8c2m81mecuWLYcByJjEsqxJUUmSNMoijqIociQS8UQiEQ+S0Ol0SMRxHDiOQzxZliOxWKxv27Zth5CEKIoBTKL4P6OYnYIXRAhRAMiYAxazC9+4cePPRqPxG0jw9OlT9Pf3I1E4HL4GIIY5YDE7TVZWVjbDMEjEcRwsFgsSybK8EAADQMYsWMxgSZpeu6Uo53vMF//IIJQins46XzHrjIrH41E8Hg/iiaKYvWbNmq+3tbW1YhYE06OH38o5sfa1gmqe0+B/EWSseRdfxDi5/cED2tTUBEmSEE9RlJgq//Lly/cxA4ppvLM83WXXs9992N0DkfKYEohISF/+TehtCzAhJSUFK8pWIJoSxRSGYcBx3F99qtLS0ixGhWkwmMa3ljrWW3Ts28FwBK9t/gBpOYU4cPYKvNZcGMxpSLNa8dm9exA1GrKf7IdmqQbLVi7DG+43kJOTg6GhIafNZiuzWq0HMzMzuzs7O+8gCYoktr/uznCZ+aOYRCkDncmOFSuK8KDzHjKcToQDAYT8fjI2Nob33O/hSegJMvlM2O12aLVanyiK/+Y4bilRsSybimmwSCI3Vb+LoWQeElRv2oTqTZsgyTKC/f2YMDQ0hEJjIQoNhUAY/8Xz/LDX693rcrkuBYPB35w9e/YXmAbF86iGJQWYQTQahZZlMWF4eBiJZFmmBoOhCCqe518vLS3NwDQonqfIMgYwA57nMQ4VIUogEICiKIgXiUQyTSbTD6FiWTbX4XB8H9Ng8TzFOzb+icDp3iIEDJJgKIXebkd2fj6owwFCCBKQ8fHxjkAg8KHRaCz3eDxHMA0WSfzkcveffro+e0eqgfsIgAmTZFmGJxCAXqcDw7K409VF/tjWpoiiCL1eL61bt45REahisdhfmpubLwK4iBmwSE75UcvDk5tecVzKmKd7k+V0vwRgppTCodNh8NEjhIeHIQ0MKG63W3E6nXC73QxRQcVx3BOPx/NzzAGLGZzv6B8A0PCdQW80S9D/jNNoXBqeh+vllzEh1tenWLxeijiSJD0NhUI/uHbtmgdzwGAO6hoa7sqy/LuchQtHeY57iWWYFKiGxsaUkVCIQCVJUm8oFDpy8+bNqr1793ZgjgheEKWUu37+/JIF8+cv/dznM/d4vWOqu4cPH+54/PjxOF7QfwCiFwbr9BCaBwAAAABJRU5ErkJggg==";
|
||||
|
||||
/**
|
||||
* The CyberChef logo with blur
|
||||
|
|
BIN
tests/samples/files/Hitchhikers_Guide.jpeg
Normal file
BIN
tests/samples/files/Hitchhikers_Guide.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 36 KiB |
BIN
tests/samples/files/TowelDay.jpeg
Normal file
BIN
tests/samples/files/TowelDay.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 60 KiB |
BIN
tests/samples/files/mp3example.mp3
Normal file
BIN
tests/samples/files/mp3example.mp3
Normal file
Binary file not shown.
BIN
tests/samples/files/testocr.png
Normal file
BIN
tests/samples/files/testocr.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
Loading…
Add table
Add a link
Reference in a new issue