// Copyright (c) 2020 Famedly GmbH // SPDX-License-Identifier: AGPL-3.0-or-later import 'dart:typed_data'; import 'subtle.dart'; import 'subtle.dart' as subtle; abstract class Hash { Hash._(this.name); String name; Future call(Uint8List input) async => Uint8List.view(await digest(name, input)); } final Hash sha1 = _Sha1(); final Hash sha256 = _Sha256(); final Hash sha512 = _Sha512(); class _Sha1 extends Hash { _Sha1() : super._('SHA-1'); } class _Sha256 extends Hash { _Sha256() : super._('SHA-256'); } class _Sha512 extends Hash { _Sha512() : super._('SHA-512'); } abstract class Cipher { Cipher._(this.name); String name; Object params(Uint8List iv); Future encrypt( Uint8List input, Uint8List key, Uint8List iv) async { final subtleKey = await importKey('raw', key, name, false, ['encrypt']); return (await subtle.encrypt(params(iv), subtleKey, input)).asUint8List(); } } final Cipher aesCtr = _AesCtr(); class _AesCtr extends Cipher { _AesCtr() : super._('AES-CTR'); @override Object params(Uint8List iv) => AesCtrParams(name: name, counter: iv, length: 64); } Future pbkdf2(Uint8List passphrase, Uint8List salt, Hash hash, int iterations, int bits) async { final raw = await importKey('raw', passphrase, 'PBKDF2', false, ['deriveBits']); final res = await deriveBits( Pbkdf2Params( name: 'PBKDF2', hash: hash.name, salt: salt, iterations: iterations), raw, bits); return Uint8List.view(res); }