import * as core from "webcrypto-core"; import { setCryptoKey, getCryptoKey } from "../storage"; import { AesCrypto } from "./crypto"; import { AesCryptoKey } from "./key"; export class AesGcmProvider extends core.AesGcmProvider { public async onGenerateKey(algorithm: AesKeyGenParams, extractable: boolean, keyUsages: KeyUsage[]): Promise { const key = await AesCrypto.generateKey( { name: this.name, length: algorithm.length, }, extractable, keyUsages); return setCryptoKey(key); } public async onEncrypt(algorithm: AesGcmParams, key: AesCryptoKey, data: ArrayBuffer): Promise { return AesCrypto.encrypt(algorithm, getCryptoKey(key) as AesCryptoKey, new Uint8Array(data)); } public async onDecrypt(algorithm: AesGcmParams, key: AesCryptoKey, data: ArrayBuffer): Promise { return AesCrypto.decrypt(algorithm, getCryptoKey(key) as AesCryptoKey, new Uint8Array(data)); } public async onExportKey(format: KeyFormat, key: AesCryptoKey): Promise { return AesCrypto.exportKey(format, getCryptoKey(key) as AesCryptoKey); } public async onImportKey(format: KeyFormat, keyData: JsonWebKey | ArrayBuffer, algorithm: Algorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise { const res = await AesCrypto.importKey(format, keyData, { name: algorithm.name }, extractable, keyUsages); return setCryptoKey(res); } public override checkCryptoKey(key: CryptoKey, keyUsage?: KeyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof AesCryptoKey)) { throw new TypeError("key: Is not a AesCryptoKey"); } } }