Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | 42x | import { CipherAlgorithm, AesCipher } from './types';
export class WebCryptoAesCipher implements AesCipher {
webCrypto: Crypto;
constructor(webCrypto: Crypto) {
this.webCrypto = webCrypto;
}
async encrypt(
algorithm: CipherAlgorithm,
key: Uint8Array,
iv: Uint8Array,
data: Uint8Array
): Promise<Uint8Array> {
let algo: string;
let length: number;
if (algorithm === 'aes-128-cbc') {
algo = 'AES-CBC';
length = 128;
} else if (algorithm === 'aes-256-cbc') {
algo = 'AES-CBC';
length = 256;
} else {
throw new Error(`Unsupported cipher algorithm "${algorithm}"`);
}
const cryptoKey = await this.webCrypto.subtle.importKey(
'raw',
key,
{ name: algo, length },
false,
['encrypt']
);
const result: ArrayBuffer = await this.webCrypto.subtle.encrypt(
{ name: algo, iv },
cryptoKey,
data
);
return new Uint8Array(result);
}
async decrypt(
algorithm: CipherAlgorithm,
key: Uint8Array,
iv: Uint8Array,
data: Uint8Array
): Promise<Uint8Array> {
let algo: string;
let length: number;
if (algorithm === 'aes-128-cbc') {
algo = 'AES-CBC';
length = 128;
} else if (algorithm === 'aes-256-cbc') {
algo = 'AES-CBC';
length = 256;
} else {
throw new Error(`Unsupported cipher algorithm "${algorithm}"`);
}
const cryptoKey = await this.webCrypto.subtle.importKey(
'raw',
key,
{ name: algo, length },
false,
['decrypt']
);
const result: ArrayBuffer = await this.webCrypto.subtle.decrypt(
{ name: algo, iv },
cryptoKey,
data
);
return new Uint8Array(result);
}
}
|