28 lines
1.0 KiB
JavaScript
28 lines
1.0 KiB
JavaScript
|
import { flattenedDecrypt } from '../flattened/decrypt.js';
|
||
|
import { JWEInvalid } from '../../util/errors.js';
|
||
|
import { decoder } from '../../lib/buffer_utils.js';
|
||
|
export async function compactDecrypt(jwe, key, options) {
|
||
|
if (jwe instanceof Uint8Array) {
|
||
|
jwe = decoder.decode(jwe);
|
||
|
}
|
||
|
if (typeof jwe !== 'string') {
|
||
|
throw new JWEInvalid('Compact JWE must be a string or Uint8Array');
|
||
|
}
|
||
|
const { 0: protectedHeader, 1: encryptedKey, 2: iv, 3: ciphertext, 4: tag, length, } = jwe.split('.');
|
||
|
if (length !== 5) {
|
||
|
throw new JWEInvalid('Invalid Compact JWE');
|
||
|
}
|
||
|
const decrypted = await flattenedDecrypt({
|
||
|
ciphertext,
|
||
|
iv: (iv || undefined),
|
||
|
protected: protectedHeader || undefined,
|
||
|
tag: (tag || undefined),
|
||
|
encrypted_key: encryptedKey || undefined,
|
||
|
}, key, options);
|
||
|
const result = { plaintext: decrypted.plaintext, protectedHeader: decrypted.protectedHeader };
|
||
|
if (typeof key === 'function') {
|
||
|
return { ...result, key: decrypted.key };
|
||
|
}
|
||
|
return result;
|
||
|
}
|