CyberChef/src/core/operations/Shake.mjs

71 lines
1.7 KiB
JavaScript

/**
* @author n1474335 [n1474335@gmail.com]
* @copyright Crown Copyright 2016
* @license Apache-2.0
*/
import Operation from "../Operation.mjs";
import OperationError from "../errors/OperationError.mjs";
import JSSHA3 from "js-sha3";
/**
* Shake operation
*/
class Shake extends Operation {
/**
* Shake constructor
*/
constructor() {
super();
this.name = "Shake";
this.module = "Crypto";
this.description = "Shake is an Extendable Output Function (XOF) of the SHA-3 hash algorithm, part of the Keccak family, allowing for variable output length/size.";
this.infoURL = "https://wikipedia.org/wiki/SHA-3#Instances";
this.inputType = "ArrayBuffer";
this.outputType = "string";
this.args = [
{
"name": "Capacity",
"type": "option",
"value": ["256", "128"]
},
{
"name": "Size",
"type": "number",
"value": 512
}
];
}
/**
* @param {ArrayBuffer} input
* @param {Object[]} args
* @returns {string}
*/
run(input, args) {
const capacity = parseInt(args[0], 10),
size = args[1];
let algo;
if (size < 0)
throw new OperationError("Size must be greater than 0");
switch (capacity) {
case 128:
algo = JSSHA3.shake128;
break;
case 256:
algo = JSSHA3.shake256;
break;
default:
throw new OperationError("Invalid size");
}
return algo(input, size);
}
}
export default Shake;