fix: update and fix code
This commit is contained in:
		
							parent
							
								
									51f6e6aa24
								
							
						
					
					
						commit
						32106f549f
					
				| @ -1,4 +1 @@ | |||||||
| include: package:flutter_lints/flutter.yaml | include: package:wyatt_analysis/analysis_options.flutter.experimental.yaml | ||||||
| 
 |  | ||||||
| # Additional information about this file can be found at |  | ||||||
| # https://dart.dev/guides/language/analysis-options |  | ||||||
| @ -22,11 +22,7 @@ class Home extends StatefulWidget { | |||||||
| 
 | 
 | ||||||
| class _HomeState extends State<Home> { | class _HomeState extends State<Home> { | ||||||
|   int _currentIndex = 0; |   int _currentIndex = 0; | ||||||
|   final List<Widget> _children = [ |   final List<Widget> _children = [KdfPage(), CipherPage(), BenchmarkPage()]; | ||||||
|     KdfPage(), |  | ||||||
|     CipherPage(), |  | ||||||
|     BenchmarkPage() |  | ||||||
|   ]; |  | ||||||
| 
 | 
 | ||||||
|   void onTabTapped(int index) { |   void onTabTapped(int index) { | ||||||
|     setState(() { |     setState(() { | ||||||
|  | |||||||
| @ -47,7 +47,8 @@ class BenchmarkPage extends ConsumerWidget { | |||||||
|     var befored = DateTime.now(); |     var befored = DateTime.now(); | ||||||
|     await cipher.decrypt(encryptedBigFile); |     await cipher.decrypt(encryptedBigFile); | ||||||
|     var afterd = DateTime.now(); |     var afterd = DateTime.now(); | ||||||
|     var benchmarkd = afterd.millisecondsSinceEpoch - befored.millisecondsSinceEpoch; |     var benchmarkd = | ||||||
|  |         afterd.millisecondsSinceEpoch - befored.millisecondsSinceEpoch; | ||||||
|     benchmarkStatus.append('[$size MB] Decryption took $benchmarkd ms\n'); |     benchmarkStatus.append('[$size MB] Decryption took $benchmarkd ms\n'); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -16,7 +16,9 @@ class Session { | |||||||
|   SecretKey secretKey; |   SecretKey secretKey; | ||||||
|   Session() : secretKey = SecretKey(Uint8List(0)); |   Session() : secretKey = SecretKey(Uint8List(0)); | ||||||
| 
 | 
 | ||||||
|   void setKey(SecretKey sk) { secretKey = sk; } |   void setKey(SecretKey sk) { | ||||||
|  |     secretKey = sk; | ||||||
|  |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Providers | // Providers | ||||||
|  | |||||||
| @ -15,7 +15,6 @@ class Button extends StatelessWidget { | |||||||
| 
 | 
 | ||||||
|   const Button(this.onPressed, this.label, {Key? key}) : super(key: key); |   const Button(this.onPressed, this.label, {Key? key}) : super(key: key); | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     return ElevatedButton( |     return ElevatedButton( | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
| // ----- | // ----- | ||||||
| // File: native_crypto.dart | // File: native_crypto.dart | ||||||
| // Created Date: 16/12/2021 16:28:00 | // Created Date: 16/12/2021 16:28:00 | ||||||
| // Last Modified: 28/12/2021 15:06:48 | // Last Modified: 23/05/2022 21:43:54 | ||||||
| // ----- | // ----- | ||||||
| // Copyright (c) 2021 | // Copyright (c) 2021 | ||||||
| 
 | 
 | ||||||
| @ -21,7 +21,10 @@ export 'src/keyderivation.dart'; | |||||||
| export 'src/keys/secret_key.dart'; | export 'src/keys/secret_key.dart'; | ||||||
| export 'src/utils.dart'; | export 'src/utils.dart'; | ||||||
| 
 | 
 | ||||||
| const String version = "0.1.0"; | const String version = '0.1.0'; | ||||||
| const String author = "Hugo Pointcheval"; | const String author = 'Hugo Pointcheval'; | ||||||
| const String website = "https://hugo.pointcheval.fr/"; | const String website = 'https://hugo.pointcheval.fr/'; | ||||||
| const List<String> repositories = ["https://github.com/hugo-pcl/native-crypto-flutter", "https://git.pointcheval.fr/NativeCrypto/native-crypto-flutter"]; | const List<String> repositories = [ | ||||||
|  |   'https://github.com/hugo-pcl/native-crypto-flutter', | ||||||
|  |   'https://git.pointcheval.fr/NativeCrypto/native-crypto-flutter' | ||||||
|  | ]; | ||||||
|  | |||||||
| @ -3,14 +3,14 @@ | |||||||
| // ----- | // ----- | ||||||
| // File: aes_builder.dart | // File: aes_builder.dart | ||||||
| // Created Date: 28/12/2021 12:03:11 | // Created Date: 28/12/2021 12:03:11 | ||||||
| // Last Modified: 28/12/2021 13:39:23 | // Last Modified: 23/05/2022 21:46:33 | ||||||
| // ----- | // ----- | ||||||
| // Copyright (c) 2021 | // Copyright (c) 2021 | ||||||
| 
 | 
 | ||||||
| import '../builder.dart'; | import 'package:native_crypto/src/builder.dart'; | ||||||
| import '../ciphers/aes.dart'; | import 'package:native_crypto/src/ciphers/aes.dart'; | ||||||
| import '../exceptions.dart'; | import 'package:native_crypto/src/exceptions.dart'; | ||||||
| import '../keys/secret_key.dart'; | import 'package:native_crypto/src/keys/secret_key.dart'; | ||||||
| 
 | 
 | ||||||
| class AESBuilder implements Builder<AES> { | class AESBuilder implements Builder<AES> { | ||||||
|   SecretKey? _sk; |   SecretKey? _sk; | ||||||
| @ -36,7 +36,7 @@ class AESBuilder implements Builder<AES> { | |||||||
|   Future<AES> build() async { |   Future<AES> build() async { | ||||||
|     if (_sk == null) { |     if (_sk == null) { | ||||||
|       if (_fsk == null) { |       if (_fsk == null) { | ||||||
|         throw CipherInitException("You must specify or generate a secret key."); |         throw CipherInitException('You must specify or generate a secret key.'); | ||||||
|       } else { |       } else { | ||||||
|         _sk = await _fsk; |         _sk = await _fsk; | ||||||
|       } |       } | ||||||
|  | |||||||
| @ -3,14 +3,14 @@ | |||||||
| // ----- | // ----- | ||||||
| // File: byte_array.dart | // File: byte_array.dart | ||||||
| // Created Date: 16/12/2021 17:54:16 | // Created Date: 16/12/2021 17:54:16 | ||||||
| // Last Modified: 27/12/2021 21:51:36 | // Last Modified: 23/05/2022 21:44:38 | ||||||
| // ----- | // ----- | ||||||
| // Copyright (c) 2021 | // Copyright (c) 2021 | ||||||
| 
 | 
 | ||||||
|  | import 'dart:convert' as convert; | ||||||
| import 'dart:typed_data'; | import 'dart:typed_data'; | ||||||
| 
 | 
 | ||||||
| import 'utils.dart'; | import 'package:native_crypto/src/utils.dart'; | ||||||
| import 'dart:convert' as convert; |  | ||||||
| 
 | 
 | ||||||
| class ByteArray { | class ByteArray { | ||||||
|   Uint8List _bytes; |   Uint8List _bytes; | ||||||
| @ -18,7 +18,8 @@ class ByteArray { | |||||||
|   ByteArray(this._bytes); |   ByteArray(this._bytes); | ||||||
| 
 | 
 | ||||||
|   /// Creates an ByteArray object from a hexdecimal string. |   /// Creates an ByteArray object from a hexdecimal string. | ||||||
|   ByteArray.fromBase16(String encoded) : _bytes = Utils.decodeHexString(encoded); |   ByteArray.fromBase16(String encoded) | ||||||
|  |       : _bytes = Utils.decodeHexString(encoded); | ||||||
| 
 | 
 | ||||||
|   /// Creates an ByteArray object from a Base64 string. |   /// Creates an ByteArray object from a Base64 string. | ||||||
|   ByteArray.fromBase64(String encoded) |   ByteArray.fromBase64(String encoded) | ||||||
| @ -46,7 +47,7 @@ class ByteArray { | |||||||
|   String get base64 => convert.base64.encode(_bytes); |   String get base64 => convert.base64.encode(_bytes); | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   bool operator ==(other) { |   bool operator ==(Object other) { | ||||||
|     if (other is ByteArray) { |     if (other is ByteArray) { | ||||||
|       for (int i = 0; i < _bytes.length; i++) { |       for (int i = 0; i < _bytes.length; i++) { | ||||||
|         if (_bytes[i] != other._bytes[i]) { |         if (_bytes[i] != other._bytes[i]) { | ||||||
|  | |||||||
| @ -3,20 +3,24 @@ | |||||||
| // ----- | // ----- | ||||||
| // File: cipher_text.dart | // File: cipher_text.dart | ||||||
| // Created Date: 16/12/2021 16:59:53 | // Created Date: 16/12/2021 16:59:53 | ||||||
| // Last Modified: 27/12/2021 22:32:06 | // Last Modified: 23/05/2022 21:48:27 | ||||||
| // ----- | // ----- | ||||||
| // Copyright (c) 2021 | // Copyright (c) 2021 | ||||||
| 
 | 
 | ||||||
| import 'dart:typed_data'; | import 'dart:typed_data'; | ||||||
| 
 | 
 | ||||||
| import 'byte_array.dart'; | import 'package:native_crypto/src/byte_array.dart'; | ||||||
| 
 | 
 | ||||||
| class CipherText extends ByteArray { | class CipherText extends ByteArray { | ||||||
|   final int _ivLength; |   final int _ivLength; | ||||||
|   final int _dataLength; |   final int _dataLength; | ||||||
|   final int _tagLength; |   final int _tagLength; | ||||||
| 
 | 
 | ||||||
|   CipherText(Uint8List iv, Uint8List data, Uint8List tag) : _ivLength = iv.length, _dataLength = data.length, _tagLength = tag.length, super(Uint8List.fromList(iv + data + tag)); |   CipherText(Uint8List iv, Uint8List data, Uint8List tag) | ||||||
|  |       : _ivLength = iv.length, | ||||||
|  |         _dataLength = data.length, | ||||||
|  |         _tagLength = tag.length, | ||||||
|  |         super(Uint8List.fromList(iv + data + tag)); | ||||||
| 
 | 
 | ||||||
|   /// Gets the CipherText IV. |   /// Gets the CipherText IV. | ||||||
|   Uint8List get iv => bytes.sublist(0, _ivLength); |   Uint8List get iv => bytes.sublist(0, _ivLength); | ||||||
| @ -25,7 +29,10 @@ class CipherText extends ByteArray { | |||||||
|   Uint8List get data => bytes.sublist(_ivLength, _ivLength + _dataLength); |   Uint8List get data => bytes.sublist(_ivLength, _ivLength + _dataLength); | ||||||
| 
 | 
 | ||||||
|   /// Gets the CipherText tag. |   /// Gets the CipherText tag. | ||||||
|   Uint8List get tag => bytes.sublist(_ivLength + _dataLength, _ivLength + _dataLength + _tagLength); |   Uint8List get tag => bytes.sublist( | ||||||
|  |         _ivLength + _dataLength, | ||||||
|  |         _ivLength + _dataLength + _tagLength, | ||||||
|  |       ); | ||||||
| 
 | 
 | ||||||
|   /// Gets the CipherText IV length. |   /// Gets the CipherText IV length. | ||||||
|   int get ivLength => _ivLength; |   int get ivLength => _ivLength; | ||||||
| @ -41,11 +48,13 @@ class CipherTextList extends CipherText { | |||||||
|   static const int chunkSize = 33554432; |   static const int chunkSize = 33554432; | ||||||
|   final List<CipherText> _list; |   final List<CipherText> _list; | ||||||
| 
 | 
 | ||||||
|   CipherTextList() : _list = [], super(Uint8List(0), Uint8List(0), Uint8List(0)); |   CipherTextList() | ||||||
|  |       : _list = [], | ||||||
|  |         super(Uint8List(0), Uint8List(0), Uint8List(0)); | ||||||
| 
 | 
 | ||||||
|   void add(CipherText cipherText) { |   void add(CipherText cipherText) { | ||||||
|     _list.add(cipherText); |     _list.add(cipherText); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   get list => _list; |   List<CipherText> get list => _list; | ||||||
| } | } | ||||||
| @ -3,18 +3,18 @@ | |||||||
| // ----- | // ----- | ||||||
| // File: aes.dart | // File: aes.dart | ||||||
| // Created Date: 16/12/2021 16:28:00 | // Created Date: 16/12/2021 16:28:00 | ||||||
| // Last Modified: 28/12/2021 13:39:00 | // Last Modified: 23/05/2022 21:47:08 | ||||||
| // ----- | // ----- | ||||||
| // Copyright (c) 2021 | // Copyright (c) 2021 | ||||||
| 
 | 
 | ||||||
| import 'dart:typed_data'; | import 'dart:typed_data'; | ||||||
| 
 | 
 | ||||||
| import '../cipher.dart'; | import 'package:native_crypto/src/cipher.dart'; | ||||||
| import '../cipher_text.dart'; | import 'package:native_crypto/src/cipher_text.dart'; | ||||||
| import '../exceptions.dart'; | import 'package:native_crypto/src/exceptions.dart'; | ||||||
| import '../keys/secret_key.dart'; | import 'package:native_crypto/src/keys/secret_key.dart'; | ||||||
| import '../platform.dart'; | import 'package:native_crypto/src/platform.dart'; | ||||||
| import '../utils.dart'; | import 'package:native_crypto/src/utils.dart'; | ||||||
| 
 | 
 | ||||||
| /// Defines the AES modes of operation. | /// Defines the AES modes of operation. | ||||||
| enum AESMode { gcm } | enum AESMode { gcm } | ||||||
| @ -47,31 +47,37 @@ class AES implements Cipher { | |||||||
| 
 | 
 | ||||||
|   AES(this.key, this.mode, {this.padding = AESPadding.none}) { |   AES(this.key, this.mode, {this.padding = AESPadding.none}) { | ||||||
|     if (!AESKeySizeExtension.supportedSizes.contains(key.bytes.length * 8)) { |     if (!AESKeySizeExtension.supportedSizes.contains(key.bytes.length * 8)) { | ||||||
|       throw CipherInitException("Invalid key length!"); |       throw CipherInitException('Invalid key length!'); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     Map<AESMode, List<AESPadding>> _supported = { |     final Map<AESMode, List<AESPadding>> _supported = { | ||||||
|       AESMode.gcm: [AESPadding.none], |       AESMode.gcm: [AESPadding.none], | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     if (!_supported[mode]!.contains(padding)) { |     if (!_supported[mode]!.contains(padding)) { | ||||||
|       throw CipherInitException("Invalid padding!"); |       throw CipherInitException('Invalid padding!'); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   Future<Uint8List> decrypt(CipherText cipherText) async { |   Future<Uint8List> decrypt(CipherText cipherText) async { | ||||||
|     BytesBuilder decryptedData = BytesBuilder(copy: false); |     final BytesBuilder decryptedData = BytesBuilder(copy: false); | ||||||
|     if (cipherText is CipherTextList) { |     if (cipherText is CipherTextList) { | ||||||
|       for (CipherText ct in cipherText.list) { |       for (final CipherText ct in cipherText.list) { | ||||||
|         Uint8List d = await platform.decrypt( |         final Uint8List d = await platform.decrypt( | ||||||
|                 ct.bytes, key.bytes, Utils.enumToStr(algorithm)) ?? |               ct.bytes, | ||||||
|  |               key.bytes, | ||||||
|  |               Utils.enumToStr(algorithm), | ||||||
|  |             ) ?? | ||||||
|             Uint8List(0); |             Uint8List(0); | ||||||
|         decryptedData.add(d); |         decryptedData.add(d); | ||||||
|       } |       } | ||||||
|     } else { |     } else { | ||||||
|       Uint8List d = await platform.decrypt( |       final Uint8List d = await platform.decrypt( | ||||||
|               cipherText.bytes, key.bytes, Utils.enumToStr(algorithm)) ?? |             cipherText.bytes, | ||||||
|  |             key.bytes, | ||||||
|  |             Utils.enumToStr(algorithm), | ||||||
|  |           ) ?? | ||||||
|           Uint8List(0); |           Uint8List(0); | ||||||
|       decryptedData.add(d); |       decryptedData.add(d); | ||||||
|     } |     } | ||||||
| @ -82,29 +88,41 @@ class AES implements Cipher { | |||||||
|   @override |   @override | ||||||
|   Future<CipherText> encrypt(Uint8List data) async { |   Future<CipherText> encrypt(Uint8List data) async { | ||||||
|     Uint8List dataToEncrypt; |     Uint8List dataToEncrypt; | ||||||
|     CipherTextList cipherTextList = CipherTextList(); |     final CipherTextList cipherTextList = CipherTextList(); | ||||||
|     // If data is bigger than 32mB -> split in chunks |     // If data is bigger than 32mB -> split in chunks | ||||||
|     if (data.length > CipherTextList.chunkSize) { |     if (data.length > CipherTextList.chunkSize) { | ||||||
|       int chunkNb = (data.length / CipherTextList.chunkSize).ceil(); |       final int chunkNb = (data.length / CipherTextList.chunkSize).ceil(); | ||||||
|       for (var i = 0; i < chunkNb; i++) { |       for (var i = 0; i < chunkNb; i++) { | ||||||
|         dataToEncrypt = i < (chunkNb - 1) |         dataToEncrypt = i < (chunkNb - 1) | ||||||
|             ? data.sublist(i * CipherTextList.chunkSize, (i + 1) * CipherTextList.chunkSize) |             ? data.sublist( | ||||||
|  |                 i * CipherTextList.chunkSize, | ||||||
|  |                 (i + 1) * CipherTextList.chunkSize, | ||||||
|  |               ) | ||||||
|             : data.sublist(i * CipherTextList.chunkSize); |             : data.sublist(i * CipherTextList.chunkSize); | ||||||
|         Uint8List c = await platform.encrypt( |         final Uint8List c = await platform.encrypt( | ||||||
|               dataToEncrypt, |               dataToEncrypt, | ||||||
|               key.bytes, |               key.bytes, | ||||||
|           Utils.enumToStr(algorithm) |               Utils.enumToStr(algorithm), | ||||||
|         ) ?? Uint8List(0); |             ) ?? | ||||||
|         cipherTextList.add(CipherText(c.sublist(0, 12), c.sublist(12, c.length - 16), c.sublist(c.length - 16, c.length))); // TODO: generify this |             Uint8List(0); | ||||||
|  |         cipherTextList.add( | ||||||
|  |           CipherText( | ||||||
|  |             c.sublist(0, 12), | ||||||
|  |             c.sublist(12, c.length - 16), | ||||||
|  |             c.sublist(c.length - 16, c.length), | ||||||
|  |           ), | ||||||
|  |         ); // TODO(hpcl): generify this | ||||||
|       } |       } | ||||||
|     } else { |     } else { | ||||||
|       Uint8List c = await platform.encrypt( |       final Uint8List c = | ||||||
|         data, |           await platform.encrypt(data, key.bytes, Utils.enumToStr(algorithm)) ?? | ||||||
|         key.bytes, |               Uint8List(0); | ||||||
|         Utils.enumToStr(algorithm) |  | ||||||
|       ) ?? Uint8List(0); |  | ||||||
| 
 | 
 | ||||||
|       return CipherText(c.sublist(0, 12), c.sublist(12, c.length - 16), c.sublist(c.length - 16, c.length)); // TODO: generify this |       return CipherText( | ||||||
|  |         c.sublist(0, 12), | ||||||
|  |         c.sublist(12, c.length - 16), | ||||||
|  |         c.sublist(c.length - 16, c.length), | ||||||
|  |       ); // TODO(hpcl): generify this | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return cipherTextList; |     return cipherTextList; | ||||||
|  | |||||||
| @ -3,39 +3,39 @@ | |||||||
| // ----- | // ----- | ||||||
| // File: exceptions.dart | // File: exceptions.dart | ||||||
| // Created Date: 16/12/2021 16:28:00 | // Created Date: 16/12/2021 16:28:00 | ||||||
| // Last Modified: 27/12/2021 23:28:31 | // Last Modified: 23/05/2022 21:51:55 | ||||||
| // ----- | // ----- | ||||||
| // Copyright (c) 2021 | // Copyright (c) 2021 | ||||||
| 
 | 
 | ||||||
| class NativeCryptoException implements Exception { | class NativeCryptoException implements Exception { | ||||||
|   String message; |   final String message; | ||||||
|   NativeCryptoException(this.message); |   const NativeCryptoException(this.message); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class UtilsException extends NativeCryptoException { | class UtilsException extends NativeCryptoException { | ||||||
|   UtilsException(message) : super(message); |   UtilsException(String message) : super(message); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class KeyException extends NativeCryptoException { | class KeyException extends NativeCryptoException { | ||||||
|   KeyException(message) : super(message); |   KeyException(String message) : super(message); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class KeyDerivationException extends NativeCryptoException { | class KeyDerivationException extends NativeCryptoException { | ||||||
|   KeyDerivationException(message) : super(message); |   KeyDerivationException(String message) : super(message); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class CipherInitException extends NativeCryptoException { | class CipherInitException extends NativeCryptoException { | ||||||
|   CipherInitException(message) : super(message); |   CipherInitException(String message) : super(message); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class EncryptionException extends NativeCryptoException { | class EncryptionException extends NativeCryptoException { | ||||||
|   EncryptionException(message) : super(message); |   EncryptionException(String message) : super(message); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class DecryptionException extends NativeCryptoException { | class DecryptionException extends NativeCryptoException { | ||||||
|   DecryptionException(message) : super(message); |   DecryptionException(String message) : super(message); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class NotImplementedException extends NativeCryptoException { | class NotImplementedException extends NativeCryptoException { | ||||||
|   NotImplementedException(message) : super(message); |   NotImplementedException(String message) : super(message); | ||||||
| } | } | ||||||
|  | |||||||
| @ -20,7 +20,9 @@ abstract class Hasher { | |||||||
| 
 | 
 | ||||||
|   /// Hashes a message |   /// Hashes a message | ||||||
|   Future<Uint8List> digest(Uint8List data) async { |   Future<Uint8List> digest(Uint8List data) async { | ||||||
|     Uint8List hash = (await platform.digest(data, Utils.enumToStr(algorithm))) ?? Uint8List(0); |     Uint8List hash = | ||||||
|  |         (await platform.digest(data, Utils.enumToStr(algorithm))) ?? | ||||||
|  |             Uint8List(0); | ||||||
| 
 | 
 | ||||||
|     return hash; |     return hash; | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -3,13 +3,13 @@ | |||||||
| // ----- | // ----- | ||||||
| // File: sha256.dart | // File: sha256.dart | ||||||
| // Created Date: 17/12/2021 11:31:20 | // Created Date: 17/12/2021 11:31:20 | ||||||
| // Last Modified: 18/12/2021 12:09:33 | // Last Modified: 23/05/2022 21:47:23 | ||||||
| // ----- | // ----- | ||||||
| // Copyright (c) 2021 | // Copyright (c) 2021 | ||||||
| 
 | 
 | ||||||
| import '../hasher.dart'; | import 'package:native_crypto/src/hasher.dart'; | ||||||
| 
 | 
 | ||||||
| class SHA256 extends Hasher{ | class SHA256 extends Hasher { | ||||||
|   @override |   @override | ||||||
|   HashAlgorithm get algorithm => HashAlgorithm.sha256; |   HashAlgorithm get algorithm => HashAlgorithm.sha256; | ||||||
| } | } | ||||||
| @ -3,13 +3,13 @@ | |||||||
| // ----- | // ----- | ||||||
| // File: sha384.dart | // File: sha384.dart | ||||||
| // Created Date: 17/12/2021 11:31:53 | // Created Date: 17/12/2021 11:31:53 | ||||||
| // Last Modified: 18/12/2021 12:09:45 | // Last Modified: 23/05/2022 21:47:28 | ||||||
| // ----- | // ----- | ||||||
| // Copyright (c) 2021 | // Copyright (c) 2021 | ||||||
| 
 | 
 | ||||||
| import '../hasher.dart'; | import 'package:native_crypto/src/hasher.dart'; | ||||||
| 
 | 
 | ||||||
| class SHA384 extends Hasher{ | class SHA384 extends Hasher { | ||||||
|   @override |   @override | ||||||
|   HashAlgorithm get algorithm => HashAlgorithm.sha384; |   HashAlgorithm get algorithm => HashAlgorithm.sha384; | ||||||
| } | } | ||||||
| @ -3,13 +3,13 @@ | |||||||
| // ----- | // ----- | ||||||
| // File: sha512.dart | // File: sha512.dart | ||||||
| // Created Date: 17/12/2021 11:32:14 | // Created Date: 17/12/2021 11:32:14 | ||||||
| // Last Modified: 18/12/2021 12:09:58 | // Last Modified: 23/05/2022 21:47:35 | ||||||
| // ----- | // ----- | ||||||
| // Copyright (c) 2021 | // Copyright (c) 2021 | ||||||
| 
 | 
 | ||||||
| import '../hasher.dart'; | import 'package:native_crypto/src/hasher.dart'; | ||||||
| 
 | 
 | ||||||
| class SHA512 extends Hasher{ | class SHA512 extends Hasher { | ||||||
|   @override |   @override | ||||||
|   HashAlgorithm get algorithm => HashAlgorithm.sha512; |   HashAlgorithm get algorithm => HashAlgorithm.sha512; | ||||||
| } | } | ||||||
| @ -3,18 +3,18 @@ | |||||||
| // ----- | // ----- | ||||||
| // File: pbkdf2.dart | // File: pbkdf2.dart | ||||||
| // Created Date: 17/12/2021 14:50:42 | // Created Date: 17/12/2021 14:50:42 | ||||||
| // Last Modified: 28/12/2021 13:38:50 | // Last Modified: 23/05/2022 21:47:43 | ||||||
| // ----- | // ----- | ||||||
| // Copyright (c) 2021 | // Copyright (c) 2021 | ||||||
| 
 | 
 | ||||||
| import 'dart:typed_data'; | import 'dart:typed_data'; | ||||||
| 
 | 
 | ||||||
| import '../exceptions.dart'; | import 'package:native_crypto/src/exceptions.dart'; | ||||||
| import '../hasher.dart'; | import 'package:native_crypto/src/hasher.dart'; | ||||||
| import '../keyderivation.dart'; | import 'package:native_crypto/src/keyderivation.dart'; | ||||||
| import '../keys/secret_key.dart'; | import 'package:native_crypto/src/keys/secret_key.dart'; | ||||||
| import '../platform.dart'; | import 'package:native_crypto/src/platform.dart'; | ||||||
| import '../utils.dart'; | import 'package:native_crypto/src/utils.dart'; | ||||||
| 
 | 
 | ||||||
| class PBKDF2 extends KeyDerivation { | class PBKDF2 extends KeyDerivation { | ||||||
|   final int _keyBytesCount; |   final int _keyBytesCount; | ||||||
| @ -38,13 +38,14 @@ class PBKDF2 extends KeyDerivation { | |||||||
|       throw KeyDerivationException("Password or Salt can't be null!"); |       throw KeyDerivationException("Password or Salt can't be null!"); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     Uint8List derivation = (await platform.pbkdf2( |     final Uint8List derivation = (await platform.pbkdf2( | ||||||
|           password, |           password, | ||||||
|           salt, |           salt, | ||||||
|           _keyBytesCount, |           _keyBytesCount, | ||||||
|           _iterations, |           _iterations, | ||||||
|           Utils.enumToStr(_hash), |           Utils.enumToStr(_hash), | ||||||
|     )) ?? Uint8List(0); |         )) ?? | ||||||
|  |         Uint8List(0); | ||||||
| 
 | 
 | ||||||
|     return SecretKey(derivation); |     return SecretKey(derivation); | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
| // ----- | // ----- | ||||||
| // File: secret_key.dart | // File: secret_key.dart | ||||||
| // Created Date: 28/12/2021 13:36:54 | // Created Date: 28/12/2021 13:36:54 | ||||||
| // Last Modified: 28/12/2021 13:37:45 | // Last Modified: 23/05/2022 21:52:05 | ||||||
| // ----- | // ----- | ||||||
| // Copyright (c) 2021 | // Copyright (c) 2021 | ||||||
| 
 | 
 | ||||||
| @ -11,9 +11,9 @@ import 'dart:typed_data'; | |||||||
| 
 | 
 | ||||||
| import 'package:flutter/services.dart'; | import 'package:flutter/services.dart'; | ||||||
| 
 | 
 | ||||||
| import '../exceptions.dart'; | import 'package:native_crypto/src/exceptions.dart'; | ||||||
| import '../key.dart'; | import 'package:native_crypto/src/key.dart'; | ||||||
| import '../platform.dart'; | import 'package:native_crypto/src/platform.dart'; | ||||||
| 
 | 
 | ||||||
| /// A class representing a secret key. | /// A class representing a secret key. | ||||||
| /// A secret key is a key that is not accessible by anyone else. | /// A secret key is a key that is not accessible by anyone else. | ||||||
| @ -26,11 +26,12 @@ class SecretKey extends Key { | |||||||
| 
 | 
 | ||||||
|   static Future<SecretKey> fromSecureRandom(int bitsCount) async { |   static Future<SecretKey> fromSecureRandom(int bitsCount) async { | ||||||
|     try { |     try { | ||||||
|       Uint8List _key = (await platform.generateSecretKey(bitsCount)) ?? Uint8List(0); |       final Uint8List _key = | ||||||
|  |           (await platform.generateSecretKey(bitsCount)) ?? Uint8List(0); | ||||||
| 
 | 
 | ||||||
|       return SecretKey(_key); |       return SecretKey(_key); | ||||||
|     } on PlatformException catch (e) { |     } on PlatformException catch (e) { | ||||||
|       throw KeyException(e); |       throw KeyException(e.toString()); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -3,16 +3,16 @@ | |||||||
| // ----- | // ----- | ||||||
| // File: utils.dart | // File: utils.dart | ||||||
| // Created Date: 16/12/2021 16:28:00 | // Created Date: 16/12/2021 16:28:00 | ||||||
| // Last Modified: 27/12/2021 22:04:07 | // Last Modified: 23/05/2022 21:45:56 | ||||||
| // ----- | // ----- | ||||||
| // Copyright (c) 2021 | // Copyright (c) 2021 | ||||||
| 
 | 
 | ||||||
| import 'dart:typed_data'; | import 'dart:typed_data'; | ||||||
| 
 | 
 | ||||||
| import 'cipher.dart'; | import 'package:native_crypto/src/cipher.dart'; | ||||||
| import 'exceptions.dart'; | import 'package:native_crypto/src/exceptions.dart'; | ||||||
| import 'hasher.dart'; | import 'package:native_crypto/src/hasher.dart'; | ||||||
| import 'keyderivation.dart'; | import 'package:native_crypto/src/keyderivation.dart'; | ||||||
| 
 | 
 | ||||||
| class Utils { | class Utils { | ||||||
|   /// Returns enum value to string, without the enum name |   /// Returns enum value to string, without the enum name | ||||||
| @ -22,8 +22,8 @@ class Utils { | |||||||
| 
 | 
 | ||||||
|   /// Returns enum list as string list |   /// Returns enum list as string list | ||||||
|   static List<String> enumToList<T>(List<T> enumValues) { |   static List<String> enumToList<T>(List<T> enumValues) { | ||||||
|     List<String> _res = []; |     final List<String> _res = []; | ||||||
|     for (T enumValue in enumValues) { |     for (final T enumValue in enumValues) { | ||||||
|       _res.add(enumToStr(enumValue)); |       _res.add(enumToStr(enumValue)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -32,7 +32,7 @@ class Utils { | |||||||
| 
 | 
 | ||||||
|   /// Returns enum from string |   /// Returns enum from string | ||||||
|   static T strToEnum<T>(String str, List<T> enumValues) { |   static T strToEnum<T>(String str, List<T> enumValues) { | ||||||
|     for (T enumValue in enumValues) { |     for (final T enumValue in enumValues) { | ||||||
|       if (enumToStr(enumValue) == str) { |       if (enumToStr(enumValue) == str) { | ||||||
|         return enumValue; |         return enumValue; | ||||||
|       } |       } | ||||||
| @ -42,7 +42,10 @@ class Utils { | |||||||
| 
 | 
 | ||||||
|   /// Returns [HashAlgorithm] from his name. |   /// Returns [HashAlgorithm] from his name. | ||||||
|   static HashAlgorithm getHashAlgorithm(String algorithm) { |   static HashAlgorithm getHashAlgorithm(String algorithm) { | ||||||
|     return strToEnum<HashAlgorithm>(algorithm.toLowerCase(), HashAlgorithm.values); |     return strToEnum<HashAlgorithm>( | ||||||
|  |       algorithm.toLowerCase(), | ||||||
|  |       HashAlgorithm.values, | ||||||
|  |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /// Returns all available [HashAlgorithm] as String list |   /// Returns all available [HashAlgorithm] as String list | ||||||
| @ -52,7 +55,10 @@ class Utils { | |||||||
| 
 | 
 | ||||||
|   /// Returns [KdfAlgorithm] from his name. |   /// Returns [KdfAlgorithm] from his name. | ||||||
|   static KdfAlgorithm getKdfAlgorithm(String algorithm) { |   static KdfAlgorithm getKdfAlgorithm(String algorithm) { | ||||||
|     return strToEnum<KdfAlgorithm>(algorithm.toLowerCase(), KdfAlgorithm.values); |     return strToEnum<KdfAlgorithm>( | ||||||
|  |       algorithm.toLowerCase(), | ||||||
|  |       KdfAlgorithm.values, | ||||||
|  |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /// Returns all available [KdfAlgorithm] as String list |   /// Returns all available [KdfAlgorithm] as String list | ||||||
| @ -62,7 +68,10 @@ class Utils { | |||||||
| 
 | 
 | ||||||
|   /// Returns [CipherAlgorithm] from his name. |   /// Returns [CipherAlgorithm] from his name. | ||||||
|   static CipherAlgorithm getCipherAlgorithm(String algorithm) { |   static CipherAlgorithm getCipherAlgorithm(String algorithm) { | ||||||
|     return strToEnum<CipherAlgorithm>(algorithm.toLowerCase(), CipherAlgorithm.values); |     return strToEnum<CipherAlgorithm>( | ||||||
|  |       algorithm.toLowerCase(), | ||||||
|  |       CipherAlgorithm.values, | ||||||
|  |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /// Returns all available [CipherAlgorithm] as String list |   /// Returns all available [CipherAlgorithm] as String list | ||||||
| @ -71,7 +80,7 @@ class Utils { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   static Uint8List decodeHexString(String input) { |   static Uint8List decodeHexString(String input) { | ||||||
|     assert(input.length % 2 == 0, 'Input needs to be an even length.'); |     assert(input.length.isEven, 'Input needs to be an even length.'); | ||||||
| 
 | 
 | ||||||
|     return Uint8List.fromList( |     return Uint8List.fromList( | ||||||
|       List.generate( |       List.generate( | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| name: native_crypto | name: native_crypto | ||||||
| description: Fast and secure cryptography for Flutter. | description: Fast and secure cryptography for Flutter. | ||||||
| version: 0.1.0 | version: 0.1.0 | ||||||
|  | 
 | ||||||
| publish_to: 'none' | publish_to: 'none' | ||||||
| 
 | 
 | ||||||
| environment: | environment: | ||||||
| @ -12,18 +13,32 @@ dependencies: | |||||||
|     sdk: flutter |     sdk: flutter | ||||||
|    |    | ||||||
|   native_crypto_android: |   native_crypto_android: | ||||||
|     path: ../native_crypto_android |     git: | ||||||
|  |       url: https://github.com/hugo-pcl/native-crypto-flutter.git | ||||||
|  |       ref: native_crypto_android-v0.1.0 | ||||||
|  |       path: packages/native_crypto_android | ||||||
|    |    | ||||||
|   native_crypto_ios: |   native_crypto_ios: | ||||||
|     path: ../native_crypto_ios |     git: | ||||||
|  |       url: https://github.com/hugo-pcl/native-crypto-flutter.git | ||||||
|  |       ref: native_crypto_ios-v0.1.0 | ||||||
|  |       path: packages/native_crypto_ios | ||||||
| 
 | 
 | ||||||
|   native_crypto_platform_interface: |   native_crypto_platform_interface: | ||||||
|     path: ../native_crypto_platform_interface |     git: | ||||||
|  |       url: https://github.com/hugo-pcl/native-crypto-flutter.git | ||||||
|  |       ref: native_crypto_platform_interface-v0.1.0 | ||||||
|  |       path: packages/native_crypto_platform_interface | ||||||
| 
 | 
 | ||||||
| dev_dependencies: | dev_dependencies: | ||||||
|   flutter_test: |   flutter_test: | ||||||
|     sdk: flutter |     sdk: flutter | ||||||
|   flutter_lints: ^1.0.4 | 
 | ||||||
|  |   wyatt_analysis: | ||||||
|  |     git: | ||||||
|  |       url: https://git.wyatt-studio.fr/Wyatt-FOSS/wyatt-packages | ||||||
|  |       ref: wyatt_analysis-v2.1.0 | ||||||
|  |       path: packages/wyatt_analysis | ||||||
| 
 | 
 | ||||||
| flutter: | flutter: | ||||||
|   plugin: |   plugin: | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user