/* * https://github.com/morethanwords/tweb * Copyright (C) 2019-2021 Eduard Kuzmenko * https://github.com/morethanwords/tweb/blob/master/LICENSE */ import CTR from './utils/aesCTR'; import subtle from './subtle'; const aesCTRs: Map = new Map(); let lastCTRId = -1; type K = { enc: CTR, dec: CTR, }; export async function aesCtrPrepare({encKey, encIv, decKey, decIv}: {[k in 'encKey' | 'encIv' | 'decKey' | 'decIv']: Uint8Array}) { const id = ++lastCTRId; const a = [['encrypt', encKey], ['decrypt', decKey]] as ['encrypt' | 'decrypt', Uint8Array][]; const promises = a.map(([mode, key]) => { return subtle.importKey( 'raw', key, {name: 'AES-CTR'}, false, [mode] ) }); const [encCryptoKey, decCryptoKey] = await Promise.all(promises); const enc = new CTR('encrypt', encCryptoKey, encIv.slice()); const dec = new CTR('decrypt', decCryptoKey, decIv.slice()); const k: K = { enc, dec }; aesCTRs.set(id, k); return id; } export async function aesCtrProcess({id, data, operation}: {id: number, data: Uint8Array, operation: 'encrypt' | 'decrypt'}) { const ctrs = aesCTRs.get(id); const result = await (operation === 'encrypt' ? ctrs.enc : ctrs.dec).update(data); return result; } export function aesCtrDestroy(id: number) { aesCTRs.delete(id); }