Skip to content

Commit

Permalink
Merge pull request #25 from t-8ch/checksum/xor
Browse files Browse the repository at this point in the history
Add "XOR Checksum" operation
  • Loading branch information
bee-san authored Dec 21, 2023
2 parents 1baa439 + 3e8c5d9 commit f47dda3
Show file tree
Hide file tree
Showing 3 changed files with 150 additions and 2 deletions.
3 changes: 2 additions & 1 deletion src/core/config/Categories.json
Original file line number Diff line number Diff line change
Expand Up @@ -423,7 +423,8 @@
"CRC-8 Checksum",
"CRC-16 Checksum",
"CRC-32 Checksum",
"TCP/IP Checksum"
"TCP/IP Checksum",
"XOR Checksum"
]
},
{
Expand Down
59 changes: 59 additions & 0 deletions src/core/operations/XORChecksum.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/**
* @author Thomas Weißschuh [[email protected]]
* @copyright Crown Copyright 2023
* @license Apache-2.0
*/

import Operation from "../Operation.mjs";
import Utils from "../Utils.mjs";
import { toHex } from "../lib/Hex.mjs";

/**
* XOR Checksum operation
*/
class XORChecksum extends Operation {

/**
* XORChecksum constructor
*/
constructor() {
super();

this.name = "XOR Checksum";
this.module = "Crypto";
this.description = "XOR Checksum splits the input into blocks of a configurable size and performs the XOR operation on these blocks.";
this.infoURL = "https://wikipedia.org/wiki/XOR";
this.inputType = "ArrayBuffer";
this.outputType = "string";
this.args = [
{
name: "Blocksize",
type: "number",
value: 4
},
];
}

/**
* @param {ArrayBuffer} input
* @param {Object[]} args
* @returns {string}
*/
run(input, args) {
const blocksize = args[0];
input = new Uint8Array(input);

const res = Array(blocksize);
res.fill(0);

for (const chunk of Utils.chunked(input, blocksize)) {
for (let i = 0; i < blocksize; i++) {
res[i] ^= chunk[i];
}
}

return toHex(res, "");
}
}

export default XORChecksum;
90 changes: 89 additions & 1 deletion tests/operations/tests/Checksum.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -237,5 +237,93 @@ TestRegister.addTests([
"args": []
}
]
}
},
{
name: "XOR Checksum (1): nothing",
input: "",
expectedOutput: "00",
recipeConfig: [
{
"op": "XOR Checksum",
"args": [1]
}
]
},
{
name: "XOR Checksum (1): basic string",
input: BASIC_STRING,
expectedOutput: "08",
recipeConfig: [
{
"op": "XOR Checksum",
"args": [1]
}
]
},
{
name: "XOR Checksum (1): UTF-8",
input: UTF8_STR,
expectedOutput: "df",
recipeConfig: [
{
"op": "XOR Checksum",
"args": [1]
}
]
},
{
name: "XOR Checksum (1): all bytes",
input: ALL_BYTES,
expectedOutput: "00",
recipeConfig: [
{
"op": "XOR Checksum",
"args": [1]
}
]
},
{
name: "XOR Checksum (4): nothing",
input: "",
expectedOutput: "00000000",
recipeConfig: [
{
"op": "XOR Checksum",
"args": [4]
}
]
},
{
name: "XOR Checksum (4): basic string",
input: BASIC_STRING,
expectedOutput: "4918421b",
recipeConfig: [
{
"op": "XOR Checksum",
"args": [4]
}
]
},
{
name: "XOR Checksum (4): UTF-8",
input: UTF8_STR,
expectedOutput: "83a424dc",
recipeConfig: [
{
"op": "XOR Checksum",
"args": [4]
}
]
},
{
name: "XOR Checksum (4): all bytes",
input: ALL_BYTES,
expectedOutput: "00000000",
recipeConfig: [
{
"op": "XOR Checksum",
"args": [4]
}
]
},
]);

0 comments on commit f47dda3

Please sign in to comment.