feat: Get AES IV from input (QoL) (#2471)

This commit is contained in:
andreas
2026-06-05 11:23:38 +01:00
committed by GitHub
parent 20b46bf1a0
commit da202d54f1
6 changed files with 419 additions and 92 deletions
+61 -16
View File
@@ -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;
};
}