From 545ce26e3946fc81c728e1435e93cdb9ed3a5e18 Mon Sep 17 00:00:00 2001 From: Lukas Lihotzki Date: Mon, 12 Apr 2021 14:43:57 +0200 Subject: [PATCH] style: fix format and lint --- lib/encryption/ssss.dart | 15 ++- lib/src/utils/crypto/encrypted_file.dart | 3 +- lib/src/utils/crypto/ffi.dart | 122 ++++++++++++++--------- lib/src/utils/crypto/js.dart | 24 +++-- lib/src/utils/crypto/native.dart | 23 +++-- lib/src/utils/crypto/subtle.dart | 15 ++- test/fake_database.dart | 3 +- 7 files changed, 131 insertions(+), 74 deletions(-) diff --git a/lib/encryption/ssss.dart b/lib/encryption/ssss.dart index 8828b6b2..ed14dda1 100644 --- a/lib/encryption/ssss.dart +++ b/lib/encryption/ssss.dart @@ -101,7 +101,8 @@ class SSSS { mac: base64.encode(hmac.bytes)); } - static Future decryptAes(_Encrypted data, Uint8List key, String name) async { + static Future decryptAes( + _Encrypted data, Uint8List key, String name) async { final keys = deriveKeys(key, name); final cipher = base64.decode(data.ciphertext); final hmac = base64 @@ -110,7 +111,8 @@ class SSSS { if (hmac != data.mac.replaceAll(RegExp(r'=+$'), '')) { throw Exception('Bad MAC'); } - final decipher = await uc.aesCtr.encrypt(cipher, keys.aesKey, base64.decode(data.iv)); + final decipher = + await uc.aesCtr.encrypt(cipher, keys.aesKey, base64.decode(data.iv)); return String.fromCharCodes(decipher); } @@ -147,11 +149,13 @@ class SSSS { .trim(); } - static Future keyFromPassphrase(String passphrase, PassphraseInfo info) async { + static Future keyFromPassphrase( + String passphrase, PassphraseInfo info) async { if (info.algorithm != AlgorithmTypes.pbkdf2) { throw Exception('Unknown algorithm'); } - return await uc.pbkdf2(utf8.encode(passphrase), utf8.encode(info.salt), uc.sha512, info.iterations, info.bits ?? 256); + return await uc.pbkdf2(utf8.encode(passphrase), utf8.encode(info.salt), + uc.sha512, info.iterations, info.bits ?? 256); } void setValidator(String type, FutureOr Function(String) validator) { @@ -194,7 +198,8 @@ class SSSS { content.passphrase.algorithm = AlgorithmTypes.pbkdf2; content.passphrase.salt = base64 .encode(uc.secureRandomBytes(pbkdf2SaltLength)); // generate salt - content.passphrase.iterations = pbkdf2DefaultIterations;; + content.passphrase.iterations = pbkdf2DefaultIterations; + ; content.passphrase.bits = ssssKeyLength * 8; privateKey = await runInBackground( _keyFromPassphrase, diff --git a/lib/src/utils/crypto/encrypted_file.dart b/lib/src/utils/crypto/encrypted_file.dart index 9f48a00a..82528a79 100644 --- a/lib/src/utils/crypto/encrypted_file.dart +++ b/lib/src/utils/crypto/encrypted_file.dart @@ -30,7 +30,8 @@ Future encryptFile(Uint8List input) async { } Future decryptFile(EncryptedFile input) async { - if (base64.encode(await sha256(input.data)) != base64.normalize(input.sha256)) { + if (base64.encode(await sha256(input.data)) != + base64.normalize(input.sha256)) { return null; } diff --git a/lib/src/utils/crypto/ffi.dart b/lib/src/utils/crypto/ffi.dart index a04d9b9f..7b6a9d1f 100644 --- a/lib/src/utils/crypto/ffi.dart +++ b/lib/src/utils/crypto/ffi.dart @@ -7,70 +7,100 @@ final libcrypto = Platform.isIOS ? 'libcrypto.so' : Platform.isWindows ? 'libcrypto.dll' - : Platform.isMacOS ? 'libcrypto.1.1.dylib' : 'libcrypto.so.1.1'); + : Platform.isMacOS + ? 'libcrypto.1.1.dylib' + : 'libcrypto.so.1.1'); final PKCS5_PBKDF2_HMAC = libcrypto.lookupFunction< - IntPtr Function(Pointer pass, IntPtr passlen, Pointer salt, IntPtr saltlen, IntPtr iter, Pointer digest, IntPtr keylen, Pointer out), - int Function(Pointer pass, int passlen, Pointer salt, int saltlen, int iter, Pointer digest, int keylen, Pointer out) ->('PKCS5_PBKDF2_HMAC'); + IntPtr Function( + Pointer pass, + IntPtr passlen, + Pointer salt, + IntPtr saltlen, + IntPtr iter, + Pointer digest, + IntPtr keylen, + Pointer out), + int Function( + Pointer pass, + int passlen, + Pointer salt, + int saltlen, + int iter, + Pointer digest, + int keylen, + Pointer out)>('PKCS5_PBKDF2_HMAC'); -final EVP_sha1 = libcrypto.lookupFunction< - Pointer Function(), - Pointer Function() ->('EVP_sha1'); +final EVP_sha1 = libcrypto.lookupFunction Function(), + Pointer Function()>('EVP_sha1'); -final EVP_sha256 = libcrypto.lookupFunction< - Pointer Function(), - Pointer Function() ->('EVP_sha256'); +final EVP_sha256 = libcrypto.lookupFunction Function(), + Pointer Function()>('EVP_sha256'); -final EVP_sha512 = libcrypto.lookupFunction< - Pointer Function(), - Pointer Function() ->('EVP_sha512'); +final EVP_sha512 = libcrypto.lookupFunction Function(), + Pointer Function()>('EVP_sha512'); -final EVP_aes_128_ctr = libcrypto.lookupFunction< - Pointer Function(), - Pointer Function() ->('EVP_aes_128_ctr'); +final EVP_aes_128_ctr = libcrypto.lookupFunction Function(), + Pointer Function()>('EVP_aes_128_ctr'); -final EVP_aes_256_ctr = libcrypto.lookupFunction< - Pointer Function(), - Pointer Function() ->('EVP_aes_256_ctr'); +final EVP_aes_256_ctr = libcrypto.lookupFunction Function(), + Pointer Function()>('EVP_aes_256_ctr'); final EVP_CIPHER_CTX_new = libcrypto.lookupFunction< - Pointer Function(), - Pointer Function() ->('EVP_CIPHER_CTX_new'); + Pointer Function(), + Pointer Function()>('EVP_CIPHER_CTX_new'); final EVP_EncryptInit_ex = libcrypto.lookupFunction< - Pointer Function(Pointer ctx, Pointer alg, Pointer some, Pointer key, Pointer iv), - Pointer Function(Pointer ctx, Pointer alg, Pointer some, Pointer key, Pointer iv) ->('EVP_EncryptInit_ex'); + Pointer Function( + Pointer ctx, + Pointer alg, + Pointer some, + Pointer key, + Pointer iv), + Pointer Function( + Pointer ctx, + Pointer alg, + Pointer some, + Pointer key, + Pointer iv)>('EVP_EncryptInit_ex'); final EVP_EncryptUpdate = libcrypto.lookupFunction< - Pointer Function(Pointer ctx, Pointer output, Pointer outputLen, Pointer input, IntPtr inputLen), - Pointer Function(Pointer ctx, Pointer output, Pointer outputLen, Pointer input, int inputLen) ->('EVP_EncryptUpdate'); + Pointer Function(Pointer ctx, Pointer output, + Pointer outputLen, Pointer input, IntPtr inputLen), + Pointer Function( + Pointer ctx, + Pointer output, + Pointer outputLen, + Pointer input, + int inputLen)>('EVP_EncryptUpdate'); final EVP_EncryptFinal_ex = libcrypto.lookupFunction< - Pointer Function(Pointer ctx, Pointer data, Pointer len), - Pointer Function(Pointer ctx, Pointer data, Pointer len) ->('EVP_EncryptFinal_ex'); + Pointer Function( + Pointer ctx, Pointer data, Pointer len), + Pointer Function(Pointer ctx, Pointer data, + Pointer len)>('EVP_EncryptFinal_ex'); final EVP_CIPHER_CTX_free = libcrypto.lookupFunction< - Pointer Function(Pointer ctx), - Pointer Function(Pointer ctx) ->('EVP_CIPHER_CTX_free'); + Pointer Function(Pointer ctx), + Pointer Function( + Pointer ctx)>('EVP_CIPHER_CTX_free'); final EVP_Digest = libcrypto.lookupFunction< - IntPtr Function(Pointer data, IntPtr len, Pointer hash, Pointer hsize, Pointer alg, Pointer engine), - int Function(Pointer data, int len, Pointer hash, Pointer hsize, Pointer alg, Pointer engine) ->('EVP_Digest'); + IntPtr Function( + Pointer data, + IntPtr len, + Pointer hash, + Pointer hsize, + Pointer alg, + Pointer engine), + int Function( + Pointer data, + int len, + Pointer hash, + Pointer hsize, + Pointer alg, + Pointer engine)>('EVP_Digest'); final EVP_MD_size = libcrypto.lookupFunction< - IntPtr Function(Pointer ctx), - int Function(Pointer ctx) ->('EVP_MD_size'); - + IntPtr Function(Pointer ctx), + int Function(Pointer ctx)>('EVP_MD_size'); diff --git a/lib/src/utils/crypto/js.dart b/lib/src/utils/crypto/js.dart index 798b4064..b889720a 100644 --- a/lib/src/utils/crypto/js.dart +++ b/lib/src/utils/crypto/js.dart @@ -10,7 +10,8 @@ abstract class Hash { Hash._(this.name); String name; - Future call(Uint8List input) async => Uint8List.view(await digest(name, input)); + Future call(Uint8List input) async => + Uint8List.view(await digest(name, input)); } final Hash sha1 = _Sha1(); @@ -33,10 +34,10 @@ abstract class Cipher { Cipher._(this.name); String name; Object params(Uint8List iv); - Future encrypt(Uint8List input, Uint8List key, Uint8List iv) async { + 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(); + return (await subtle.encrypt(params(iv), subtleKey, input)).asUint8List(); } } @@ -46,11 +47,18 @@ class _AesCtr extends Cipher { _AesCtr() : super._('AES-CTR'); @override - Object params(Uint8List iv) => AesCtrParams(name: name, counter: iv, length: 64); + 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); +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); } diff --git a/lib/src/utils/crypto/native.dart b/lib/src/utils/crypto/native.dart index 6406af23..ce317859 100644 --- a/lib/src/utils/crypto/native.dart +++ b/lib/src/utils/crypto/native.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:typed_data'; import 'dart:ffi'; import 'package:ffi/ffi.dart'; @@ -8,7 +9,7 @@ abstract class Hash { Hash._(this.ptr); Pointer ptr; - Uint8List call(Uint8List data) { + FutureOr call(Uint8List data) { final outSize = EVP_MD_size(ptr); final mem = malloc.call(outSize + data.length); final dataMem = mem.elementAt(outSize); @@ -41,9 +42,10 @@ class _Sha512 extends Hash { abstract class Cipher { Cipher._(); Pointer getAlg(int keysize); - Uint8List encrypt(Uint8List input, Uint8List key, Uint8List iv) { + FutureOr encrypt(Uint8List input, Uint8List key, Uint8List iv) { final alg = getAlg(key.length * 8); - final mem = malloc.call(sizeOf() + key.length + iv.length + input.length); + final mem = malloc + .call(sizeOf() + key.length + iv.length + input.length); final lenMem = mem.cast(); final keyMem = mem.elementAt(sizeOf()); final ivMem = keyMem.elementAt(key.length); @@ -72,14 +74,18 @@ class _AesCtr extends Cipher { @override Pointer getAlg(int keysize) { switch (keysize) { - case 128: return EVP_aes_128_ctr(); - case 256: return EVP_aes_256_ctr(); - default: throw ArgumentError('invalid key size'); + case 128: + return EVP_aes_128_ctr(); + case 256: + return EVP_aes_256_ctr(); + default: + throw ArgumentError('invalid key size'); } } } -Uint8List pbkdf2(Uint8List passphrase, Uint8List salt, Hash hash, int iterations, int bits) { +FutureOr pbkdf2( + Uint8List passphrase, Uint8List salt, Hash hash, int iterations, int bits) { final outLen = bits ~/ 8; final mem = malloc.call(passphrase.length + salt.length + outLen); final saltMem = mem.elementAt(passphrase.length); @@ -87,7 +93,8 @@ Uint8List pbkdf2(Uint8List passphrase, Uint8List salt, Hash hash, int iterations try { mem.asTypedList(passphrase.length).setAll(0, passphrase); saltMem.asTypedList(salt.length).setAll(0, salt); - PKCS5_PBKDF2_HMAC(mem, passphrase.length, saltMem, salt.length, iterations, hash.ptr, outLen, outMem); + PKCS5_PBKDF2_HMAC(mem, passphrase.length, saltMem, salt.length, iterations, + hash.ptr, outLen, outMem); return Uint8List.fromList(outMem.asTypedList(outLen)); } finally { malloc.free(mem); diff --git a/lib/src/utils/crypto/subtle.dart b/lib/src/utils/crypto/subtle.dart index d2427ed3..7654b71d 100644 --- a/lib/src/utils/crypto/subtle.dart +++ b/lib/src/utils/crypto/subtle.dart @@ -15,7 +15,8 @@ class CryptoKey {} @JS() @anonymous class Pbkdf2Params { - external factory Pbkdf2Params({String name, String hash, Uint8List salt, int iterations}); + external factory Pbkdf2Params( + {String name, String hash, Uint8List salt, int iterations}); String name; String hash; Uint8List salt; @@ -63,16 +64,20 @@ Future exportKey(String algorithm, CryptoKey key) { } @JS('crypto.subtle.deriveKey') -external dynamic _deriveKey(dynamic algorithm, CryptoKey baseKey, dynamic derivedKeyAlgorithm, bool extractable, List keyUsages); +external dynamic _deriveKey(dynamic algorithm, CryptoKey baseKey, + dynamic derivedKeyAlgorithm, bool extractable, List keyUsages); -Future deriveKey(dynamic algorithm, CryptoKey baseKey, dynamic derivedKeyAlgorithm, bool extractable, List keyUsages) { - return promiseToFuture(_deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages)); +Future deriveKey(dynamic algorithm, CryptoKey baseKey, + dynamic derivedKeyAlgorithm, bool extractable, List keyUsages) { + return promiseToFuture(_deriveKey( + algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages)); } @JS('crypto.subtle.deriveBits') external dynamic _deriveBits(dynamic algorithm, CryptoKey baseKey, int length); -Future deriveBits(dynamic algorithm, CryptoKey baseKey, int length) { +Future deriveBits( + dynamic algorithm, CryptoKey baseKey, int length) { return promiseToFuture(_deriveBits(algorithm, baseKey, length)); } diff --git a/test/fake_database.dart b/test/fake_database.dart index 4f21574c..f6f09d8e 100644 --- a/test/fake_database.dart +++ b/test/fake_database.dart @@ -16,4 +16,5 @@ * along with this program. If not, see . */ -export 'fake_database_native.dart' if (dart.library.js) 'fake_database_web.dart'; +export 'fake_database_native.dart' + if (dart.library.js) 'fake_database_web.dart';