1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-21 15:04:11 -05:00

fix(ext/node): fix Decipheriv when autoPadding disabled (#25598)

This change fixes Decipheriv behavior when autoPadding disabled and enabled.

By this change, the example given in
https://github.com/denoland/deno/issues/20924#issuecomment-2345931295
works in the same way as Node.

closes #20924
This commit is contained in:
Yoshiya Hinosawa 2024-09-13 01:13:56 +09:00 committed by GitHub
parent 0a4a8c730b
commit 3f15e30062
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 44 additions and 1 deletions

View file

@ -306,6 +306,10 @@ class BlockModeCache {
this.cache = this.cache.subarray(len);
return out;
}
set lastChunkIsNonZero(value: boolean) {
this.#lastChunkIsNonZero = value;
}
}
export class Decipheriv extends Transform implements Cipher {
@ -338,7 +342,7 @@ export class Decipheriv extends Transform implements Cipher {
},
...options,
});
this.#cache = new BlockModeCache(true);
this.#cache = new BlockModeCache(this.#autoPadding);
this.#context = op_node_create_decipheriv(cipher, toU8(key), toU8(iv));
this.#needsBlockCache =
!(cipher == "aes-128-gcm" || cipher == "aes-256-gcm");
@ -386,6 +390,7 @@ export class Decipheriv extends Transform implements Cipher {
setAutoPadding(autoPadding?: boolean): this {
this.#autoPadding = Boolean(autoPadding);
this.#cache.lastChunkIsNonZero = this.#autoPadding;
return this;
}

View file

@ -378,3 +378,41 @@ Deno.test({
assertEquals(info2.ivLength, 16);
},
});
Deno.test({
name:
"createDecipheriv - handling of the last chunk when auto padding enabled/disabled",
fn() {
const algorithm = "aes-256-cbc";
const key = Buffer.from(
"84dcdd964968734fdf0de4a2cba471c2e0a753930b841c014b1e77f456b5797b",
"hex",
);
const val = Buffer.from(
"feabbdf66e2c71cc780d0cd2765dcce283e8ae7e58fcc1a9acafc678581e0e06",
"hex",
);
const iv = Buffer.alloc(16, 0);
{
const decipher = crypto.createDecipheriv(algorithm, key, iv);
decipher.setAutoPadding(false);
assertEquals(
decipher.update(val, undefined, "hex"),
"ed2c908f26571bf8e50d60b77fb9c25f95b933b59111543c6fac41ad6b47e681",
);
assertEquals(decipher.final("hex"), "");
}
{
const decipher = crypto.createDecipheriv(algorithm, key, iv);
assertEquals(
decipher.update(val, undefined, "hex"),
"ed2c908f26571bf8e50d60b77fb9c25f",
);
assertThrows(() => {
decipher.final();
});
}
},
});