28 lines
1.1 KiB
TypeScript
28 lines
1.1 KiB
TypeScript
import { createDecipheriv } from 'node:crypto';
|
|
import { AES_GCM_AUTH_TAG_BYTE_LENGTH } from '../consts/crypto/aesGcmAuthTagByteLength';
|
|
import { AES_GCM_IV_BYTE_LENGTH } from '../consts/crypto/aesGcmIvByteLength';
|
|
import { AES_GCM_KEY_BYTE_LENGTH } from '../consts/crypto/aesGcmKeyByteLength';
|
|
|
|
export const decryptAesGcm = (ciphertext: Buffer, key: Buffer, iv: Buffer): Buffer => {
|
|
if (iv.length !== AES_GCM_IV_BYTE_LENGTH) {
|
|
throw new Error(`AES-GCM IV must be ${AES_GCM_IV_BYTE_LENGTH} bytes`);
|
|
}
|
|
|
|
if (key.length !== AES_GCM_KEY_BYTE_LENGTH) {
|
|
throw new Error(`AES-GCM key must be ${AES_GCM_KEY_BYTE_LENGTH} bytes`);
|
|
}
|
|
|
|
if (ciphertext.length < AES_GCM_AUTH_TAG_BYTE_LENGTH) {
|
|
throw new Error('AES-GCM ciphertext is too short');
|
|
}
|
|
|
|
const authTag = ciphertext.subarray(ciphertext.length - AES_GCM_AUTH_TAG_BYTE_LENGTH);
|
|
const encrypted = ciphertext.subarray(0, ciphertext.length - AES_GCM_AUTH_TAG_BYTE_LENGTH);
|
|
|
|
const decipher = createDecipheriv('aes-256-gcm', key, iv);
|
|
|
|
decipher.setAuthTag(authTag);
|
|
|
|
return Buffer.concat([decipher.update(encrypted), decipher.final()]);
|
|
};
|