UNPKG

pooja-docucomb-tink-crypto

Version:

A multi-language, cross-platform library that provides cryptographic APIs that are secure, easy to use correctly, and hard(er) to misuse.

56 lines (47 loc) 1.67 kB
/** * @license * Copyright 2020 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import {Aead} from '../aead/internal/aead'; import {InsecureIvAesGcm, IV_SIZE_IN_BYTES} from '../aead/internal/insecure_iv_aes_gcm'; import {randBytes} from './random'; import * as validators from './validators'; /** * Implementation of AES-GCM, wrapped around InsecureIvAesGcm. * * @final */ export class AesGcm extends Aead { private readonly insecureIvAesGcm: InsecureIvAesGcm; constructor(readonly key: CryptoKey) { super(); this.insecureIvAesGcm = new InsecureIvAesGcm({key, prependIv: true}); } async encrypt(plaintext: Uint8Array, associatedData?: Uint8Array): Promise<Uint8Array> { const iv: Uint8Array = randBytes(IV_SIZE_IN_BYTES); return this.insecureIvAesGcm.encrypt(iv, plaintext, associatedData); } async decrypt(ciphertext: Uint8Array, associatedData?: Uint8Array): Promise<Uint8Array> { const iv = new Uint8Array(IV_SIZE_IN_BYTES); iv.set(ciphertext.subarray(0, IV_SIZE_IN_BYTES)); return this.insecureIvAesGcm.decrypt(iv, ciphertext, associatedData); } } /** Returns an AEAD instantiation genererated from a given raw `key` */ export async function fromRawKey(key: Uint8Array): Promise<Aead> { validators.validateAesKeySize(key.length); const webCryptoKey = await self.crypto.subtle.importKey( /* format */ 'raw', key, /* keyData */ {'name': 'AES-GCM', 'length': key.length}, /* algo */ false, /* extractable*/ ['encrypt', 'decrypt']); /* usage */ return new AesGcm(webCryptoKey); }