2023-10-16 19:23:53 +03:00
|
|
|
import { MaybeAsync } from '../../types/index.js'
|
|
|
|
import { AesModeOfOperationIge } from './common.js'
|
|
|
|
import { factorizePQSync } from './factorization.js'
|
2021-04-08 12:19:38 +03:00
|
|
|
|
|
|
|
export interface IEncryptionScheme {
|
2023-10-16 19:23:53 +03:00
|
|
|
encrypt(data: Uint8Array): MaybeAsync<Uint8Array>
|
2022-06-12 19:29:38 +03:00
|
|
|
|
2023-10-16 19:23:53 +03:00
|
|
|
decrypt(data: Uint8Array): MaybeAsync<Uint8Array>
|
2021-04-08 12:19:38 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
export interface ICryptoProvider {
|
|
|
|
initialize?(): MaybeAsync<void>
|
|
|
|
|
2023-10-16 19:23:53 +03:00
|
|
|
sha1(data: Uint8Array): MaybeAsync<Uint8Array>
|
2022-06-12 19:29:38 +03:00
|
|
|
|
2023-10-16 19:23:53 +03:00
|
|
|
sha256(data: Uint8Array): MaybeAsync<Uint8Array>
|
2022-06-12 19:29:38 +03:00
|
|
|
|
2021-04-08 12:19:38 +03:00
|
|
|
pbkdf2(
|
2023-10-16 19:23:53 +03:00
|
|
|
password: Uint8Array,
|
|
|
|
salt: Uint8Array,
|
2022-06-12 19:29:38 +03:00
|
|
|
iterations: number,
|
|
|
|
keylen?: number, // = 64
|
2023-09-24 01:32:22 +03:00
|
|
|
algo?: string, // sha1 or sha512 (default sha512)
|
2023-10-16 19:23:53 +03:00
|
|
|
): MaybeAsync<Uint8Array>
|
2022-06-12 19:29:38 +03:00
|
|
|
|
2023-10-16 19:23:53 +03:00
|
|
|
hmacSha256(data: Uint8Array, key: Uint8Array): MaybeAsync<Uint8Array>
|
2021-04-08 12:19:38 +03:00
|
|
|
|
|
|
|
// in telegram, iv is always either used only once, or is the same for all calls for the key
|
2023-10-16 19:23:53 +03:00
|
|
|
createAesCtr(key: Uint8Array, iv: Uint8Array, encrypt: boolean): MaybeAsync<IEncryptionScheme>
|
2022-06-12 19:29:38 +03:00
|
|
|
|
2023-10-16 19:23:53 +03:00
|
|
|
createAesIge(key: Uint8Array, iv: Uint8Array): MaybeAsync<IEncryptionScheme>
|
2022-06-12 19:29:38 +03:00
|
|
|
|
2023-10-16 19:23:53 +03:00
|
|
|
createAesEcb(key: Uint8Array): MaybeAsync<IEncryptionScheme>
|
2021-04-08 12:19:38 +03:00
|
|
|
|
2023-10-16 19:23:53 +03:00
|
|
|
factorizePQ(pq: Uint8Array): MaybeAsync<[Uint8Array, Uint8Array]>
|
2021-04-08 12:19:38 +03:00
|
|
|
}
|
|
|
|
|
2022-08-29 16:22:57 +03:00
|
|
|
export abstract class BaseCryptoProvider {
|
2023-10-16 19:23:53 +03:00
|
|
|
createAesIge(key: Uint8Array, iv: Uint8Array): MaybeAsync<IEncryptionScheme> {
|
|
|
|
const ecb = this.createAesEcb(key)
|
|
|
|
|
|
|
|
if ('then' in ecb) {
|
|
|
|
return ecb.then((ecb) => new AesModeOfOperationIge(key, iv, ecb))
|
|
|
|
}
|
|
|
|
|
|
|
|
return new AesModeOfOperationIge(key, iv, ecb)
|
2021-04-08 12:19:38 +03:00
|
|
|
}
|
|
|
|
|
2023-10-16 19:23:53 +03:00
|
|
|
factorizePQ(pq: Uint8Array) {
|
2021-04-08 12:19:38 +03:00
|
|
|
return factorizePQSync(pq)
|
|
|
|
}
|
|
|
|
|
2023-10-16 19:23:53 +03:00
|
|
|
abstract createAesEcb(key: Uint8Array): MaybeAsync<IEncryptionScheme>
|
2021-04-08 12:19:38 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
export type CryptoProviderFactory = () => ICryptoProvider
|