Telegram Web K with changes to work inside I2P
https://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.3 KiB
54 lines
1.3 KiB
/* |
|
* 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<number, K> = 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); |
|
}
|
|
|