v2 #12
							
								
								
									
										12
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								README.md
									
									
									
									
									
								
							| @ -102,6 +102,8 @@ Please take a look a the compatibility table below to check if your target is su | |||||||
| 
 | 
 | ||||||
| ## Usage | ## Usage | ||||||
| 
 | 
 | ||||||
|  | #### Compatibility | ||||||
|  | 
 | ||||||
| First, check compatibility with your targets. | First, check compatibility with your targets. | ||||||
| 
 | 
 | ||||||
| | iOS | Android | MacOS | Linux | Windows | Web | | | iOS | Android | MacOS | Linux | Windows | Web | | ||||||
| @ -110,6 +112,16 @@ First, check compatibility with your targets. | |||||||
| 
 | 
 | ||||||
| > Warning: NativeCrypto 0.2.0+ is not compatible with lower NativeCrypto versions. Especially, with NativeCrypto 0.0. X because the cipher mode is not the same. Now, NativeCrypto uses AES-GCM mode instead of AES-CBC mode. (See [Changelog](./CHANGELOG.md)) | > Warning: NativeCrypto 0.2.0+ is not compatible with lower NativeCrypto versions. Especially, with NativeCrypto 0.0. X because the cipher mode is not the same. Now, NativeCrypto uses AES-GCM mode instead of AES-CBC mode. (See [Changelog](./CHANGELOG.md)) | ||||||
| 
 | 
 | ||||||
|  | NativeCrypto ciphertexts are formatted as follow: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | +------------------+--------------------+------------------+ | ||||||
|  | | Nonce (12 bytes) | Cipher text (n-28) |  Tag (16 bytes)  | | ||||||
|  | +------------------+--------------------+------------------+ | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | > Warning: If your data comes from another source, make sur to use the same format. | ||||||
|  | 
 | ||||||
| #### Hash | #### Hash | ||||||
| 
 | 
 | ||||||
| To digest a message, you'll need to initialize a Hasher object implementing `Hash` . Then, you can digest your message. | To digest a message, you'll need to initialize a Hasher object implementing `Hash` . Then, you can digest your message. | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ NativeCrypto | |||||||
| 
 | 
 | ||||||
| MIT License | MIT License | ||||||
| 
 | 
 | ||||||
| Copyright (c) 2019 - 2022 Hugo Pointcheval | Copyright (c) 2019 - 2023 Hugo Pointcheval | ||||||
| 
 | 
 | ||||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
| of this software and associated documentation files (the "Software"), to deal | of this software and associated documentation files (the "Software"), to deal | ||||||
|  | |||||||
| @ -1,133 +1,3 @@ | |||||||
| <p align="center"> | # NativeCrypto | ||||||
| <img width="700px" src="resources/native_crypto.png" style="background-color: rgb(255,255,255)"> |  | ||||||
| <h5 align="center">Fast and powerful cryptographic functions for Flutter.</h5> |  | ||||||
| </p> |  | ||||||
| 
 | 
 | ||||||
| <p align="center"> | Readme available at [project root](../../README.md). | ||||||
| <a href="https://git.wyatt-studio.fr/Wyatt-FOSS/wyatt-packages/src/branch/master/packages/wyatt_analysis"> |  | ||||||
| <img src="https://img.shields.io/badge/Style-Wyatt%20Analysis-blue.svg?style=flat-square" alt="Style: Wyatt Analysis" /> |  | ||||||
| </a> |  | ||||||
| 
 |  | ||||||
| <a href="https://github.com/invertase/melos"> |  | ||||||
| <img src="https://img.shields.io/badge/Maintained%20with-melos-f700ff.svg?style=flat-square" alt="Maintained with Melos" /> |  | ||||||
| </a> |  | ||||||
| 
 |  | ||||||
| <a href="https://drone.wyatt-studio.fr/hugo/native-crypto"> |  | ||||||
| <img src="https://drone.wyatt-studio.fr/api/badges/hugo/native-crypto/status.svg" alt="Build Status" /> |  | ||||||
| </a> |  | ||||||
| </p> |  | ||||||
| 
 |  | ||||||
| --- |  | ||||||
| 
 |  | ||||||
| [[Changelog]](./CHANGELOG.md) | [[License]](./LICENSE) |  | ||||||
| 
 |  | ||||||
| --- |  | ||||||
| 
 |  | ||||||
| ## About |  | ||||||
| 
 |  | ||||||
| The goal of this plugin is to provide a fast and powerful cryptographic functions by calling native libraries. On Android, it uses [javax.cypto](https://developer.android.com/reference/javax/crypto/package-summary), and on iOS, it uses [CommonCrypto](https://opensource.apple.com/source/CommonCrypto/) and [CryptoKit](https://developer.apple.com/documentation/cryptokit/) |  | ||||||
| 
 |  | ||||||
| I started this projet because I wanted to add cryptographic functions on a Flutter app. But I faced a problem with the well-known [Pointy Castle](https://pub.dev/packages/pointycastle) library: the performance was very poor. Here some benchmarks and comparison: |  | ||||||
| 
 |  | ||||||
|  |  | ||||||
| 
 |  | ||||||
| For comparison, on a *iPhone 13*, you can encrypt/decrypt a message of **2MiB** in **~5.6s** with PointyCastle and in **~40ms** with NativeCrypto. And on an *OnePlus 5*, you can encrypt/decrypt a message of **50MiB** in **~6min30** with PointyCastle and in less than **~1s** with NativeCrypto. |  | ||||||
| 
 |  | ||||||
| In short, NativeCrypto is incomparable with PointyCastle. |  | ||||||
| 
 |  | ||||||
| ## Usage |  | ||||||
| 
 |  | ||||||
| First, check compatibility with your targets. |  | ||||||
| 
 |  | ||||||
| | iOS | Android | MacOS | Linux | Windows | Web | |  | ||||||
| | --- | ------- | ----- | ----- | ------- | --- | |  | ||||||
| | ✅  | ✅      | ❌     | ❌     | ❌      | ❌  | |  | ||||||
| 
 |  | ||||||
| #### Hash |  | ||||||
| 
 |  | ||||||
| To digest a message, you can use the following function: |  | ||||||
| 
 |  | ||||||
| ```dart |  | ||||||
| Uint8List hash = await HashAlgorithm.sha256.digest(message); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| > In NativeCrypto, you can use the following hash functions: SHA-256, SHA-384, SHA-512 |  | ||||||
| 
 |  | ||||||
| #### Keys |  | ||||||
| 
 |  | ||||||
| You can build a `SecretKey` from a utf8, base64, base16 (hex) strings or raw bytes. You can also generate a SecretKey from secure random. |  | ||||||
| 
 |  | ||||||
| ```dart |  | ||||||
| SecretKey secretKey = SecretKey(Uint8List.fromList([0x73, 0x65, 0x63, 0x72, 0x65, 0x74])); |  | ||||||
| SecretKey secretKey = SecretKey.fromUtf8('secret'); |  | ||||||
| SecretKey secretKey = SecretKey.fromBase64('c2VjcmV0'); |  | ||||||
| SecretKey secretKey = SecretKey.fromBase16('63657274'); |  | ||||||
| SecretKey secretKey = await SecretKey.fromSecureRandom(256); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Key derivation |  | ||||||
| 
 |  | ||||||
| You can derive a `SecretKey` using **PBKDF2**. |  | ||||||
| 
 |  | ||||||
| First, you need to initialize a `Pbkdf2` object. |  | ||||||
| 
 |  | ||||||
| ```dart |  | ||||||
| Pbkdf2 pbkdf2 = Pbkdf2( |  | ||||||
|     keyBytesCount: 32, |  | ||||||
|     iterations: 1000, |  | ||||||
|     algorithm: HashAlgorithm.sha512, |  | ||||||
| ); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| Then, you can derive a `SecretKey` from a password and salt. |  | ||||||
| 
 |  | ||||||
| ```dart |  | ||||||
| SecretKey secretKey = await pbkdf2.derive(password: password, salt: 'salt'); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| > In NativeCrypto, you can use the following key derivation function: PBKDF2 |  | ||||||
| 
 |  | ||||||
| #### Cipher |  | ||||||
| 
 |  | ||||||
| And now, you can use the `SecretKey` to encrypt/decrypt a message. |  | ||||||
| 
 |  | ||||||
| First, you need to initialize a `Cipher` object. |  | ||||||
| 
 |  | ||||||
| ```dart |  | ||||||
| AES cipher = AES(secretKey); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| Then, you can encrypt your message. |  | ||||||
| 
 |  | ||||||
| ```dart |  | ||||||
| CipherTextWrapper wrapper = await cipher.encrypt(message); |  | ||||||
| 
 |  | ||||||
| CipherText cipherText = wrapper.unwrap<CipherText>(); |  | ||||||
| // same as |  | ||||||
| CipherText cipherText = wrapper.single; |  | ||||||
| 
 |  | ||||||
| // or |  | ||||||
| 
 |  | ||||||
| List<CipherText> cipherTexts = wrapper.unwrap<List<CipherText>>(); |  | ||||||
| // same as |  | ||||||
| List<CipherText> cipherTexts = wrapper.list; |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| After an encryption you obtain a `CipherTextWrapper` which contains `CipherText` or `List<CipherText>` depending on the message size. It's up to you to know how to unwrap the `CipherTextWrapper` depending the chunk size you configured. |  | ||||||
| 
 |  | ||||||
| Uppon receiving encrypted message, you can decrypt it. |  | ||||||
| You have to reconstruct the wrapper before decrypting. |  | ||||||
| 
 |  | ||||||
| ```dart |  | ||||||
| CipherTextWrapper wrapper = CipherTextWrapper.fromBytes( |  | ||||||
|     data, |  | ||||||
|     ivLength: AESMode.gcm.ivLength, |  | ||||||
|     tagLength: AESMode.gcm.tagLength, |  | ||||||
| ); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| Then, you can decrypt your message. |  | ||||||
| 
 |  | ||||||
| ```dart |  | ||||||
| Uint8List message = await cipher.decrypt(wrapper); |  | ||||||
| ``` |  | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ NativeCrypto - Android Implementation | |||||||
| 
 | 
 | ||||||
| MIT License | MIT License | ||||||
| 
 | 
 | ||||||
| Copyright (c) 2019 - 2022 Hugo Pointcheval | Copyright (c) 2019 - 2023 Hugo Pointcheval | ||||||
| 
 | 
 | ||||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
| of this software and associated documentation files (the "Software"), to deal | of this software and associated documentation files (the "Software"), to deal | ||||||
|  | |||||||
| @ -1,15 +1,13 @@ | |||||||
| # native_crypto_android | # NativeCrypto - Android Implementation | ||||||
| 
 | 
 | ||||||
| A new flutter plugin project. | Android Implementation of [NativeCrypto][1] Plugin. | ||||||
| 
 | 
 | ||||||
| ## Getting Started | ## Getting Started | ||||||
| 
 | 
 | ||||||
| This project is a starting point for a Flutter | This project is a starting point for a Flutter [plug-in package][2], a specialized package that includes platform-specific implementation code for Android and/or iOS. | ||||||
| [plug-in package](https://flutter.dev/developing-packages/), |  | ||||||
| a specialized package that includes platform-specific implementation code for |  | ||||||
| Android and/or iOS. |  | ||||||
| 
 | 
 | ||||||
| For help getting started with Flutter, view our | For help getting started with Flutter, view our [online documentation][3], which offers tutorials, samples, guidance on mobile development, and a full API reference. | ||||||
| [online documentation](https://flutter.dev/docs), which offers tutorials, |  | ||||||
| samples, guidance on mobile development, and a full API reference. |  | ||||||
| 
 | 
 | ||||||
|  | [1]: ../../README.md | ||||||
|  | [2]: https://flutter.dev/developing-packages/ | ||||||
|  | [3]: https://flutter.dev/docs | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ NativeCrypto - iOS Implementation | |||||||
| 
 | 
 | ||||||
| MIT License | MIT License | ||||||
| 
 | 
 | ||||||
| Copyright (c) 2019 - 2022 Hugo Pointcheval | Copyright (c) 2019 - 2023 Hugo Pointcheval | ||||||
| 
 | 
 | ||||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
| of this software and associated documentation files (the "Software"), to deal | of this software and associated documentation files (the "Software"), to deal | ||||||
|  | |||||||
| @ -1,15 +1,13 @@ | |||||||
| # NativeCrypto - iOS Implementation | # NativeCrypto - iOS Implementation | ||||||
| 
 | 
 | ||||||
| iOS Implementation of NativeCrypto Plugin. | iOS Implementation of [NativeCrypto][1] Plugin. | ||||||
| 
 | 
 | ||||||
| ## Getting Started | ## Getting Started | ||||||
| 
 | 
 | ||||||
| This project is a starting point for a Flutter | This project is a starting point for a Flutter [plug-in package][2], a specialized package that includes platform-specific implementation code for Android and/or iOS. | ||||||
| [plug-in package](https://flutter.dev/developing-packages/), |  | ||||||
| a specialized package that includes platform-specific implementation code for |  | ||||||
| Android and/or iOS. |  | ||||||
| 
 | 
 | ||||||
| For help getting started with Flutter, view our | For help getting started with Flutter, view our [online documentation][3], which offers tutorials, samples, guidance on mobile development, and a full API reference. | ||||||
| [online documentation](https://flutter.dev/docs), which offers tutorials, |  | ||||||
| samples, guidance on mobile development, and a full API reference. |  | ||||||
| 
 | 
 | ||||||
|  | [1]: ../../README.md | ||||||
|  | [2]: https://flutter.dev/developing-packages/ | ||||||
|  | [3]: https://flutter.dev/docs | ||||||
|  | |||||||
| @ -1,12 +1,12 @@ | |||||||
| # NativeCrypto - Platform Interface | # NativeCrypto - Platform Interface | ||||||
| 
 | 
 | ||||||
| A common platform interface for the [`native_crypto`][1] plugin. | A common platform interface for the [NativeCrypto][1] plugin. | ||||||
| 
 | 
 | ||||||
| This interface allows platform-specific implementations of the `native_crypto` plugin, as well as the plugin itself, to ensure they are supporting the same interface. | This interface allows platform-specific implementations of the `native_crypto` plugin, as well as the plugin itself, to ensure they are supporting the same interface. | ||||||
| 
 | 
 | ||||||
| ## Usage | ## Usage | ||||||
| 
 | 
 | ||||||
| To implement a new platform-specific implementation of `native_crypto`, extend [`NativeCryptoPlatform`][2] with an implementation that performs the platform-specific behavior, and when you register your plugin, set the default `NativeCryptoPlatform` by calling `NativeCryptoPlatform.instance = MyNativeCryptoPlatform()`. | To implement a new platform-specific implementation of `native_crypto`, extend [`NativeCryptoPlatform`][1] with an implementation that performs the platform-specific behavior, and when you register your plugin, set the default `NativeCryptoPlatform` by calling `NativeCryptoPlatform.instance = MyNativeCryptoPlatform()`. | ||||||
| 
 | 
 | ||||||
| ## Pigeon | ## Pigeon | ||||||
| 
 | 
 | ||||||
| @ -16,5 +16,5 @@ Run generator with `flutter pub run pigeon --input pigeons/messages.dart`. | |||||||
| 
 | 
 | ||||||
| > Note: Make sure the `lib/src/gen` folder exists before running the generator. | > Note: Make sure the `lib/src/gen` folder exists before running the generator. | ||||||
| 
 | 
 | ||||||
| [1]: ../native_crypto | [1]: ../../README.md | ||||||
| [2]: lib/native_crypto_platform_interface.dart | [2]: lib/native_crypto_platform_interface.dart | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user