feat: Get AES IV from input (QoL) (#2471)
This commit is contained in:
@@ -39,41 +39,46 @@ class AESDecrypt extends Operation {
|
||||
"value": "",
|
||||
"toggleValues": ["Hex", "UTF8", "Latin1", "Base64"]
|
||||
},
|
||||
{
|
||||
"name": "IV Length",
|
||||
"type": "number",
|
||||
"value": 16
|
||||
},
|
||||
{
|
||||
"name": "Mode",
|
||||
"type": "argSelector",
|
||||
"value": [
|
||||
{
|
||||
name: "CBC",
|
||||
off: [5, 6]
|
||||
off: [6, 7]
|
||||
},
|
||||
{
|
||||
name: "CFB",
|
||||
off: [5, 6]
|
||||
off: [6, 7]
|
||||
},
|
||||
{
|
||||
name: "OFB",
|
||||
off: [5, 6]
|
||||
off: [6, 7]
|
||||
},
|
||||
{
|
||||
name: "CTR",
|
||||
off: [5, 6]
|
||||
off: [6, 7]
|
||||
},
|
||||
{
|
||||
name: "GCM",
|
||||
on: [5, 6]
|
||||
on: [6, 7]
|
||||
},
|
||||
{
|
||||
name: "ECB",
|
||||
off: [5, 6]
|
||||
off: [6, 7]
|
||||
},
|
||||
{
|
||||
name: "CBC/NoPadding",
|
||||
off: [5, 6]
|
||||
off: [6, 7]
|
||||
},
|
||||
{
|
||||
name: "ECB/NoPadding",
|
||||
off: [5, 6]
|
||||
off: [6, 7]
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -98,6 +103,26 @@ class AESDecrypt extends Operation {
|
||||
"type": "toggleString",
|
||||
"value": "",
|
||||
"toggleValues": ["Hex", "UTF8", "Latin1", "Base64"]
|
||||
},
|
||||
{
|
||||
"name": "IV from input",
|
||||
"type": "argSelector",
|
||||
"value": [
|
||||
{
|
||||
name: "Off",
|
||||
on: [1],
|
||||
off: [2]
|
||||
},
|
||||
{
|
||||
name: "From start",
|
||||
on: [2],
|
||||
off: [1]
|
||||
}, {
|
||||
name: "From end",
|
||||
on: [2],
|
||||
off: [1]
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
}
|
||||
@@ -110,14 +135,18 @@ class AESDecrypt extends Operation {
|
||||
* @throws {OperationError} if cannot decrypt input or invalid key length
|
||||
*/
|
||||
run(input, args) {
|
||||
let iv;
|
||||
|
||||
const key = Utils.convertToByteString(args[0].string, args[0].option),
|
||||
iv = Utils.convertToByteString(args[1].string, args[1].option),
|
||||
mode = args[2].split("/")[0],
|
||||
noPadding = args[2].endsWith("NoPadding"),
|
||||
inputType = args[3],
|
||||
outputType = args[4],
|
||||
gcmTag = Utils.convertToByteString(args[5].string, args[5].option),
|
||||
aad = Utils.convertToByteString(args[6].string, args[6].option);
|
||||
ivLength = args[2],
|
||||
mode = args[3].split("/")[0],
|
||||
noPadding = args[3].endsWith("NoPadding"),
|
||||
inputType = args[4],
|
||||
outputType = args[5],
|
||||
gcmTag = Utils.convertToByteString(args[6].string, args[6].option),
|
||||
aad = Utils.convertToByteString(args[7].string, args[7].option),
|
||||
ivFromInput = args[8];
|
||||
|
||||
|
||||
if ([16, 24, 32].indexOf(key.length) < 0) {
|
||||
throw new OperationError(`Invalid key length: ${key.length} bytes
|
||||
@@ -130,11 +159,27 @@ The following algorithms will be used based on the size of the key:
|
||||
|
||||
input = Utils.convertToByteString(input, inputType);
|
||||
|
||||
if (ivFromInput !== "Off") {
|
||||
if (input.length <= ivLength) {
|
||||
throw new OperationError(`Input is too short to contain an IV of ${ivLength} bytes.`);
|
||||
}
|
||||
|
||||
if (ivFromInput === "From start") {
|
||||
iv = input.substr(0, ivLength);
|
||||
input = input.substr(ivLength);
|
||||
} else {
|
||||
iv = input.substr(input.length - ivLength);
|
||||
input = input.substr(0, input.length - ivLength);
|
||||
}
|
||||
} else {
|
||||
iv = Utils.convertToByteString(args[1].string, args[1].option);
|
||||
}
|
||||
|
||||
const decipher = forge.cipher.createDecipher("AES-" + mode, key);
|
||||
|
||||
/* Allow for a "no padding" mode */
|
||||
if (noPadding) {
|
||||
decipher.mode.unpad = function(output, options) {
|
||||
decipher.mode.unpad = function (output, options) {
|
||||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user