Fix/Update #1
							
								
								
									
										17
									
								
								.drone.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,17 @@ | ||||
| kind: pipeline | ||||
| type: docker | ||||
| name: default | ||||
| 
 | ||||
| steps: | ||||
| - name: test:all | ||||
|   image: cirrusci/flutter:stable | ||||
|   commands: | ||||
|     - PATH=$PATH:$HOME/.pub-cache/bin | ||||
|     - flutter doctor | ||||
|     - flutter pub global activate melos | ||||
|     - melos bs | ||||
|     - melos run test:all | ||||
| 
 | ||||
| trigger: | ||||
|   branch: | ||||
|   - master | ||||
							
								
								
									
										169
									
								
								native_crypto/.gitignore → .gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -1,7 +1,7 @@ | ||||
| # File created using '.gitignore Generator' for Visual Studio Code: https://bit.ly/vscode-gig | ||||
| 
 | ||||
| # Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,macos,dart,flutter,intellij+all,kotlin,linux,swift,windows | ||||
| # Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,macos,dart,flutter,intellij+all,kotlin,linux,swift,windows | ||||
| # Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,macos,dart,flutter,java,jetbrains+all,kotlin,linux,objective-c,rust,swift,windows,xcode | ||||
| # Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,macos,dart,flutter,java,jetbrains+all,kotlin,linux,objective-c,rust,swift,windows,xcode | ||||
| 
 | ||||
| ### Dart ### | ||||
| # See https://www.dartlang.org/guides/libraries/private-files | ||||
| @ -95,7 +95,33 @@ lib/generated_plugin_registrant.dart | ||||
| !**/ios/**/default.perspectivev3 | ||||
| !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages | ||||
| 
 | ||||
| ### Intellij+all ### | ||||
| ### Java ### | ||||
| # Compiled class file | ||||
| *.class | ||||
| 
 | ||||
| # Log file | ||||
| *.log | ||||
| 
 | ||||
| # BlueJ files | ||||
| *.ctxt | ||||
| 
 | ||||
| # Mobile Tools for Java (J2ME) | ||||
| .mtj.tmp/ | ||||
| 
 | ||||
| # Package Files # | ||||
| *.jar | ||||
| *.war | ||||
| *.nar | ||||
| *.ear | ||||
| *.zip | ||||
| *.tar.gz | ||||
| *.rar | ||||
| 
 | ||||
| # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml | ||||
| hs_err_pid* | ||||
| replay_pid* | ||||
| 
 | ||||
| ### JetBrains+all ### | ||||
| # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider | ||||
| # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 | ||||
| 
 | ||||
| @ -159,6 +185,9 @@ atlassian-ide-plugin.xml | ||||
| # Cursive Clojure plugin | ||||
| .idea/replstate.xml | ||||
| 
 | ||||
| # SonarLint plugin | ||||
| .idea/sonarlint/ | ||||
| 
 | ||||
| # Crashlytics plugin (for Android Studio and IntelliJ) | ||||
| com_crashlytics_export_strings.xml | ||||
| crashlytics.properties | ||||
| @ -171,46 +200,27 @@ fabric.properties | ||||
| # Android studio 3.1+ serialized cache file | ||||
| .idea/caches/build_file_checksums.ser | ||||
| 
 | ||||
| ### Intellij+all Patch ### | ||||
| # Ignores the whole .idea folder and all .iml files | ||||
| # See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 | ||||
| ### JetBrains+all Patch ### | ||||
| # Ignore everything but code style settings and run configurations | ||||
| # that are supposed to be shared within teams. | ||||
| 
 | ||||
| .idea/ | ||||
| .idea/* | ||||
| 
 | ||||
| # Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 | ||||
| 
 | ||||
| *.iml | ||||
| modules.xml | ||||
| .idea/misc.xml | ||||
| *.ipr | ||||
| 
 | ||||
| # Sonarlint plugin | ||||
| .idea/sonarlint | ||||
| !.idea/codeStyles | ||||
| !.idea/runConfigurations | ||||
| 
 | ||||
| ### Kotlin ### | ||||
| # Compiled class file | ||||
| *.class | ||||
| 
 | ||||
| # Log file | ||||
| *.log | ||||
| 
 | ||||
| # BlueJ files | ||||
| *.ctxt | ||||
| 
 | ||||
| # Mobile Tools for Java (J2ME) | ||||
| .mtj.tmp/ | ||||
| 
 | ||||
| # Package Files # | ||||
| *.jar | ||||
| *.war | ||||
| *.nar | ||||
| *.ear | ||||
| *.zip | ||||
| *.tar.gz | ||||
| *.rar | ||||
| 
 | ||||
| # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml | ||||
| hs_err_pid* | ||||
| 
 | ||||
| ### Linux ### | ||||
| *~ | ||||
| @ -236,6 +246,7 @@ hs_err_pid* | ||||
| # Icon must end with two \r | ||||
| Icon | ||||
| 
 | ||||
| 
 | ||||
| # Thumbnails | ||||
| ._* | ||||
| 
 | ||||
| @ -255,7 +266,11 @@ Network Trash Folder | ||||
| Temporary Items | ||||
| .apdisk | ||||
| 
 | ||||
| ### Swift ### | ||||
| ### macOS Patch ### | ||||
| # iCloud generated files | ||||
| *.icloud | ||||
| 
 | ||||
| ### Objective-C ### | ||||
| # Xcode | ||||
| # | ||||
| # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore | ||||
| @ -287,6 +302,64 @@ DerivedData/ | ||||
| *.dSYM.zip | ||||
| *.dSYM | ||||
| 
 | ||||
| # CocoaPods | ||||
| # We recommend against adding the Pods directory to your .gitignore. However | ||||
| # you should judge for yourself, the pros and cons are mentioned at: | ||||
| # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control | ||||
| # Pods/ | ||||
| # Add this line if you want to avoid checking in source code from the Xcode workspace | ||||
| # *.xcworkspace | ||||
| 
 | ||||
| # Carthage | ||||
| # Add this line if you want to avoid checking in source code from Carthage dependencies. | ||||
| # Carthage/Checkouts | ||||
| 
 | ||||
| Carthage/Build/ | ||||
| 
 | ||||
| # fastlane | ||||
| # It is recommended to not store the screenshots in the git repo. | ||||
| # Instead, use fastlane to re-generate the screenshots whenever they are needed. | ||||
| # For more information about the recommended setup visit: | ||||
| # https://docs.fastlane.tools/best-practices/source-control/#source-control | ||||
| 
 | ||||
| fastlane/report.xml | ||||
| fastlane/Preview.html | ||||
| fastlane/screenshots/**/*.png | ||||
| fastlane/test_output | ||||
| 
 | ||||
| # Code Injection | ||||
| # After new code Injection tools there's a generated folder /iOSInjectionProject | ||||
| # https://github.com/johnno1962/injectionforxcode | ||||
| 
 | ||||
| iOSInjectionProject/ | ||||
| 
 | ||||
| ### Objective-C Patch ### | ||||
| 
 | ||||
| ### Rust ### | ||||
| # Generated by Cargo | ||||
| # will have compiled files and executables | ||||
| debug/ | ||||
| target/ | ||||
| 
 | ||||
| # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries | ||||
| # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html | ||||
| Cargo.lock | ||||
| 
 | ||||
| # These are backup files generated by rustfmt | ||||
| **/*.rs.bk | ||||
| 
 | ||||
| # MSVC Windows builds of rustc generate these, which store debugging information | ||||
| *.pdb | ||||
| 
 | ||||
| ### Swift ### | ||||
| # Xcode | ||||
| # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ## Playgrounds | ||||
| timeline.xctimeline | ||||
| playground.xcworkspace | ||||
| @ -315,7 +388,6 @@ playground.xcworkspace | ||||
| # Add this line if you want to avoid checking in source code from Carthage dependencies. | ||||
| # Carthage/Checkouts | ||||
| 
 | ||||
| Carthage/Build/ | ||||
| 
 | ||||
| # Accio dependency management | ||||
| Dependencies/ | ||||
| @ -327,16 +399,11 @@ Dependencies/ | ||||
| # For more information about the recommended setup visit: | ||||
| # https://docs.fastlane.tools/best-practices/source-control/#source-control | ||||
| 
 | ||||
| fastlane/report.xml | ||||
| fastlane/Preview.html | ||||
| fastlane/screenshots/**/*.png | ||||
| fastlane/test_output | ||||
| 
 | ||||
| # Code Injection | ||||
| # After new code Injection tools there's a generated folder /iOSInjectionProject | ||||
| # https://github.com/johnno1962/injectionforxcode | ||||
| 
 | ||||
| iOSInjectionProject/ | ||||
| 
 | ||||
| ### VisualStudioCode ### | ||||
| .vscode/* | ||||
| @ -344,18 +411,24 @@ iOSInjectionProject/ | ||||
| !.vscode/tasks.json | ||||
| !.vscode/launch.json | ||||
| !.vscode/extensions.json | ||||
| *.code-workspace | ||||
| !.vscode/*.code-snippets | ||||
| 
 | ||||
| # Local History for Visual Studio Code | ||||
| .history/ | ||||
| 
 | ||||
| # Built Visual Studio Code Extensions | ||||
| *.vsix | ||||
| 
 | ||||
| ### VisualStudioCode Patch ### | ||||
| # Ignore all local history of files | ||||
| .history | ||||
| .ionide | ||||
| 
 | ||||
| # Support for Project snippet scope | ||||
| !.vscode/*.code-snippets | ||||
| .vscode/*.code-snippets | ||||
| 
 | ||||
| # Ignore code-workspaces | ||||
| *.code-workspace | ||||
| 
 | ||||
| ### Windows ### | ||||
| # Windows thumbnail cache files | ||||
| @ -383,7 +456,27 @@ $RECYCLE.BIN/ | ||||
| # Windows shortcuts | ||||
| *.lnk | ||||
| 
 | ||||
| # End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,macos,dart,flutter,intellij+all,kotlin,linux,swift,windows | ||||
| ### Xcode ### | ||||
| 
 | ||||
| ## Xcode 8 and earlier | ||||
| 
 | ||||
| ### Xcode Patch ### | ||||
| *.xcodeproj/* | ||||
| !*.xcodeproj/project.pbxproj | ||||
| !*.xcodeproj/xcshareddata/ | ||||
| !*.xcworkspace/contents.xcworkspacedata | ||||
| /*.gcno | ||||
| **/xcshareddata/WorkspaceSettings.xcsettings | ||||
| 
 | ||||
| # End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,macos,dart,flutter,java,jetbrains+all,kotlin,linux,objective-c,rust,swift,windows,xcode | ||||
| 
 | ||||
| # Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option) | ||||
| 
 | ||||
| # IntelliJ | ||||
| *.iml | ||||
| *.ipr | ||||
| *.iws | ||||
| .idea/ | ||||
| 
 | ||||
| # Mac | ||||
| .DS_Store | ||||
							
								
								
									
										28
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,28 @@ | ||||
| { | ||||
|     // Use IntelliSense to learn about possible attributes. | ||||
|     // Hover to view descriptions of existing attributes. | ||||
|     // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 | ||||
|     "version": "0.2.0", | ||||
|     "configurations": [ | ||||
|         { | ||||
|             "name": "native_crypto", | ||||
|             "cwd": "packages/native_crypto/example", | ||||
|             "request": "launch", | ||||
|             "type": "dart" | ||||
|         }, | ||||
|         { | ||||
|             "name": "native_crypto (profile mode)", | ||||
|             "cwd": "packages/native_crypto/example", | ||||
|             "request": "launch", | ||||
|             "type": "dart", | ||||
|             "flutterMode": "profile" | ||||
|         }, | ||||
|         { | ||||
|             "name": "native_crypto (release mode)", | ||||
|             "cwd": "packages/native_crypto/example", | ||||
|             "request": "launch", | ||||
|             "type": "dart", | ||||
|             "flutterMode": "release" | ||||
|         }, | ||||
|     ] | ||||
| } | ||||
							
								
								
									
										6
									
								
								AUTHORS
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,6 @@ | ||||
| # Below is a list of people and organizations that have contributed | ||||
| # to this project. Names should be added to the list like so: | ||||
| # | ||||
| #   Name/Organization <email address> | ||||
| 
 | ||||
| Hugo Pointcheval <git@pcl.ovh> | ||||
							
								
								
									
										66
									
								
								CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,66 @@ | ||||
| # Change Log | ||||
| 
 | ||||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
| 
 | ||||
| ## 2022-05-25 | ||||
| 
 | ||||
| ### Changes | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| Packages with breaking changes: | ||||
| 
 | ||||
|  - There are no breaking changes in this release. | ||||
| 
 | ||||
| Packages with other changes: | ||||
| 
 | ||||
|  - [`native_crypto` - `v0.1.1`](#native_crypto---v011) | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| #### `native_crypto` - `v0.1.1` | ||||
| 
 | ||||
|  - **REFACTOR**: change file organization. | ||||
|  - **PERF**: x10 perfomance improvement on android with better list management. | ||||
|  - **FIX**: benchmark output. | ||||
|  - **FIX**: update and fix code. | ||||
|  - **FEAT**: export new exceptions. | ||||
|  - **FEAT**: add PointyCastle benchmark. | ||||
|  - **DOCS**: add link to readme file. | ||||
| 
 | ||||
| 
 | ||||
| ## 2022-05-25 | ||||
| 
 | ||||
| ### Changes | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| Packages with breaking changes: | ||||
| 
 | ||||
|  - There are no breaking changes in this release. | ||||
| 
 | ||||
| Packages with other changes: | ||||
| 
 | ||||
|  - [`native_crypto_ios` - `v0.1.1`](#native_crypto_ios---v011) | ||||
|  - [`native_crypto_android` - `v0.1.1`](#native_crypto_android---v011) | ||||
|  - [`native_crypto_platform_interface` - `v0.1.1`](#native_crypto_platform_interface---v011) | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| #### `native_crypto_ios` - `v0.1.1` | ||||
| 
 | ||||
|  - **REFACTOR**: rework swift part. | ||||
|  - **PERF**: optimize swift code. | ||||
| 
 | ||||
| #### `native_crypto_android` - `v0.1.1` | ||||
| 
 | ||||
|  - **REFACTOR**: clean and modernize kotlin code. | ||||
|  - **PERF**: x10 perfomance improvement on android with better list management. | ||||
|  - **FEAT**: export new exceptions. | ||||
| 
 | ||||
| #### `native_crypto_platform_interface` - `v0.1.1` | ||||
| 
 | ||||
|  - **PERF**: x10 perfomance improvement on android with better list management. | ||||
|  - **FEAT**: export new exceptions. | ||||
| 
 | ||||
							
								
								
									
										21
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,21 @@ | ||||
| MIT License | ||||
| 
 | ||||
| Copyright (c) 2022 Hugo Pointcheval | ||||
| 
 | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
| 
 | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
| 
 | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
							
								
								
									
										133
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,133 @@ | ||||
| <p align="center"> | ||||
| <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"> | ||||
| <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); | ||||
| ``` | ||||
							
								
								
									
										57
									
								
								melos.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,57 @@ | ||||
| name: NativeCrypto | ||||
| # repository: https://git.pointcheval.fr/NativeCrypto/native-crypto-flutter | ||||
| 
 | ||||
| packages: | ||||
|   - packages/** | ||||
| 
 | ||||
| command: | ||||
|   version: | ||||
|     updateGitTagRefs: true | ||||
|     linkToCommits: false # Gitea not support this | ||||
|     workspaceChangelog: true | ||||
|     # branch: master | ||||
| 
 | ||||
| scripts: | ||||
|   lint:all: | ||||
|     run: melos run analyze && melos run format | ||||
|     description: Run all static analysis checks. | ||||
|    | ||||
|   test:all: | ||||
|     run: | | ||||
|       melos run test --no-select | ||||
|     description: | | ||||
|       Run all tests available. | ||||
|    | ||||
|   test: | ||||
|     run: | | ||||
|       melos exec -c 6 --fail-fast -- \ | ||||
|         "flutter test --no-pub --no-test-assets" | ||||
|     description: Run `flutter test` for a specific package. | ||||
|     select-package: | ||||
|       dir-exists: | ||||
|         - test | ||||
|       ignore: | ||||
|         - "*web*" | ||||
|         - "*example*" | ||||
| 
 | ||||
|   analyze: | ||||
|     run: | | ||||
|       melos exec -c 10 -- \ | ||||
|         flutter analyze --fatal-infos       | ||||
|     description: Run `flutter analyze` for all packages. | ||||
| 
 | ||||
|   format: | ||||
|     run: melos exec flutter format . --fix | ||||
|     description: Run `flutter format` for all packages. | ||||
|    | ||||
|   format-check: | ||||
|     run: melos exec flutter format . --set-exit-if-changed | ||||
|     description: Run `flutter format` checks for all packages. | ||||
| 
 | ||||
|   clean:deep: | ||||
|     run: git clean -x -d -f -q | ||||
|     description: Clean things very deeply with `git clean`. | ||||
|    | ||||
|   # Additional cleanup lifecycle script, executed when `melos clean` is run. | ||||
|   postclean: > | ||||
|         melos exec -c 6 -- "flutter clean" | ||||
| @ -1,3 +0,0 @@ | ||||
| ## 0.0.1 | ||||
| 
 | ||||
| * TODO: Describe initial release. | ||||
| @ -1 +0,0 @@ | ||||
| TODO: Add your license here. | ||||
| @ -1,18 +0,0 @@ | ||||
| # native_crypto | ||||
| 
 | ||||
| A new flutter plugin project. | ||||
| 
 | ||||
| ## Getting Started | ||||
| 
 | ||||
| This project is a starting point for a Flutter | ||||
| [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 | ||||
| [online documentation](https://flutter.dev/docs), which offers tutorials, | ||||
| samples, guidance on mobile development, and a full API reference. | ||||
| 
 | ||||
| The plugin project was generated without specifying the `--platforms` flag, no platforms are currently supported. | ||||
| To add platforms, run `flutter create -t plugin --platforms <platforms> .` under the same | ||||
| directory. You can also find a detailed instruction on how to add platforms in the `pubspec.yaml` at https://flutter.dev/docs/development/packages-and-plugins/developing-packages#plugin-platforms. | ||||
| @ -1,4 +0,0 @@ | ||||
| include: package:flutter_lints/flutter.yaml | ||||
| 
 | ||||
| # Additional information about this file can be found at | ||||
| # https://dart.dev/guides/language/analysis-options | ||||
| @ -1,484 +0,0 @@ | ||||
| // !$*UTF8*$! | ||||
| { | ||||
| 	archiveVersion = 1; | ||||
| 	classes = { | ||||
| 	}; | ||||
| 	objectVersion = 50; | ||||
| 	objects = { | ||||
| 
 | ||||
| /* Begin PBXBuildFile section */ | ||||
| 		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; | ||||
| 		3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; | ||||
| 		74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; | ||||
| 		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; | ||||
| 		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; | ||||
| 		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; | ||||
| /* End PBXBuildFile section */ | ||||
| 
 | ||||
| /* Begin PBXCopyFilesBuildPhase section */ | ||||
| 		9705A1C41CF9048500538489 /* Embed Frameworks */ = { | ||||
| 			isa = PBXCopyFilesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			dstPath = ""; | ||||
| 			dstSubfolderSpec = 10; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			name = "Embed Frameworks"; | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXCopyFilesBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXFileReference section */ | ||||
| 		1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; | ||||
| 		1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; | ||||
| 		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; | ||||
| 		74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; | ||||
| 		74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; | ||||
| 		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; | ||||
| 		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; | ||||
| 		9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; | ||||
| 		97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; | ||||
| 		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; | ||||
| 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; | ||||
| 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | ||||
| /* End PBXFileReference section */ | ||||
| 
 | ||||
| /* Begin PBXFrameworksBuildPhase section */ | ||||
| 		97C146EB1CF9000F007C117D /* Frameworks */ = { | ||||
| 			isa = PBXFrameworksBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXFrameworksBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXGroup section */ | ||||
| 		9740EEB11CF90186004384FC /* Flutter */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, | ||||
| 				9740EEB21CF90195004384FC /* Debug.xcconfig */, | ||||
| 				7AFA3C8E1D35360C0083082E /* Release.xcconfig */, | ||||
| 				9740EEB31CF90195004384FC /* Generated.xcconfig */, | ||||
| 			); | ||||
| 			name = Flutter; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		97C146E51CF9000F007C117D = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				9740EEB11CF90186004384FC /* Flutter */, | ||||
| 				97C146F01CF9000F007C117D /* Runner */, | ||||
| 				97C146EF1CF9000F007C117D /* Products */, | ||||
| 			); | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		97C146EF1CF9000F007C117D /* Products */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				97C146EE1CF9000F007C117D /* Runner.app */, | ||||
| 			); | ||||
| 			name = Products; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		97C146F01CF9000F007C117D /* Runner */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				97C146FA1CF9000F007C117D /* Main.storyboard */, | ||||
| 				97C146FD1CF9000F007C117D /* Assets.xcassets */, | ||||
| 				97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, | ||||
| 				97C147021CF9000F007C117D /* Info.plist */, | ||||
| 				1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, | ||||
| 				1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, | ||||
| 				74858FAE1ED2DC5600515810 /* AppDelegate.swift */, | ||||
| 				74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, | ||||
| 			); | ||||
| 			path = Runner; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| /* End PBXGroup section */ | ||||
| 
 | ||||
| /* Begin PBXNativeTarget section */ | ||||
| 		97C146ED1CF9000F007C117D /* Runner */ = { | ||||
| 			isa = PBXNativeTarget; | ||||
| 			buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; | ||||
| 			buildPhases = ( | ||||
| 				9740EEB61CF901F6004384FC /* Run Script */, | ||||
| 				97C146EA1CF9000F007C117D /* Sources */, | ||||
| 				97C146EB1CF9000F007C117D /* Frameworks */, | ||||
| 				97C146EC1CF9000F007C117D /* Resources */, | ||||
| 				9705A1C41CF9048500538489 /* Embed Frameworks */, | ||||
| 				3B06AD1E1E4923F5004D2608 /* Thin Binary */, | ||||
| 			); | ||||
| 			buildRules = ( | ||||
| 			); | ||||
| 			dependencies = ( | ||||
| 			); | ||||
| 			name = Runner; | ||||
| 			productName = Runner; | ||||
| 			productReference = 97C146EE1CF9000F007C117D /* Runner.app */; | ||||
| 			productType = "com.apple.product-type.application"; | ||||
| 		}; | ||||
| /* End PBXNativeTarget section */ | ||||
| 
 | ||||
| /* Begin PBXProject section */ | ||||
| 		97C146E61CF9000F007C117D /* Project object */ = { | ||||
| 			isa = PBXProject; | ||||
| 			attributes = { | ||||
| 				LastUpgradeCheck = 1300; | ||||
| 				ORGANIZATIONNAME = ""; | ||||
| 				TargetAttributes = { | ||||
| 					97C146ED1CF9000F007C117D = { | ||||
| 						CreatedOnToolsVersion = 7.3.1; | ||||
| 						LastSwiftMigration = 1100; | ||||
| 					}; | ||||
| 				}; | ||||
| 			}; | ||||
| 			buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; | ||||
| 			compatibilityVersion = "Xcode 9.3"; | ||||
| 			developmentRegion = en; | ||||
| 			hasScannedForEncodings = 0; | ||||
| 			knownRegions = ( | ||||
| 				en, | ||||
| 				Base, | ||||
| 			); | ||||
| 			mainGroup = 97C146E51CF9000F007C117D; | ||||
| 			productRefGroup = 97C146EF1CF9000F007C117D /* Products */; | ||||
| 			projectDirPath = ""; | ||||
| 			projectRoot = ""; | ||||
| 			targets = ( | ||||
| 				97C146ED1CF9000F007C117D /* Runner */, | ||||
| 			); | ||||
| 		}; | ||||
| /* End PBXProject section */ | ||||
| 
 | ||||
| /* Begin PBXResourcesBuildPhase section */ | ||||
| 		97C146EC1CF9000F007C117D /* Resources */ = { | ||||
| 			isa = PBXResourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, | ||||
| 				3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, | ||||
| 				97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, | ||||
| 				97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXResourcesBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXShellScriptBuildPhase section */ | ||||
| 		3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputPaths = ( | ||||
| 			); | ||||
| 			name = "Thin Binary"; | ||||
| 			outputPaths = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; | ||||
| 		}; | ||||
| 		9740EEB61CF901F6004384FC /* Run Script */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputPaths = ( | ||||
| 			); | ||||
| 			name = "Run Script"; | ||||
| 			outputPaths = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; | ||||
| 		}; | ||||
| /* End PBXShellScriptBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXSourcesBuildPhase section */ | ||||
| 		97C146EA1CF9000F007C117D /* Sources */ = { | ||||
| 			isa = PBXSourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, | ||||
| 				1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXSourcesBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXVariantGroup section */ | ||||
| 		97C146FA1CF9000F007C117D /* Main.storyboard */ = { | ||||
| 			isa = PBXVariantGroup; | ||||
| 			children = ( | ||||
| 				97C146FB1CF9000F007C117D /* Base */, | ||||
| 			); | ||||
| 			name = Main.storyboard; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { | ||||
| 			isa = PBXVariantGroup; | ||||
| 			children = ( | ||||
| 				97C147001CF9000F007C117D /* Base */, | ||||
| 			); | ||||
| 			name = LaunchScreen.storyboard; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| /* End PBXVariantGroup section */ | ||||
| 
 | ||||
| /* Begin XCBuildConfiguration section */ | ||||
| 		249021D3217E4FDB00AE95B9 /* Profile */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ALWAYS_SEARCH_USER_PATHS = NO; | ||||
| 				CLANG_ANALYZER_NONNULL = YES; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||||
| 				CLANG_CXX_LIBRARY = "libc++"; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CLANG_ENABLE_OBJC_ARC = YES; | ||||
| 				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | ||||
| 				CLANG_WARN_BOOL_CONVERSION = YES; | ||||
| 				CLANG_WARN_COMMA = YES; | ||||
| 				CLANG_WARN_CONSTANT_CONVERSION = YES; | ||||
| 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||||
| 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||||
| 				CLANG_WARN_EMPTY_BODY = YES; | ||||
| 				CLANG_WARN_ENUM_CONVERSION = YES; | ||||
| 				CLANG_WARN_INFINITE_RECURSION = YES; | ||||
| 				CLANG_WARN_INT_CONVERSION = YES; | ||||
| 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||||
| 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||||
| 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | ||||
| 				CLANG_WARN_STRICT_PROTOTYPES = YES; | ||||
| 				CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||||
| 				CLANG_WARN_UNREACHABLE_CODE = YES; | ||||
| 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||||
| 				COPY_PHASE_STRIP = NO; | ||||
| 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||||
| 				ENABLE_NS_ASSERTIONS = NO; | ||||
| 				ENABLE_STRICT_OBJC_MSGSEND = YES; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu99; | ||||
| 				GCC_NO_COMMON_BLOCKS = YES; | ||||
| 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||||
| 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||||
| 				GCC_WARN_UNDECLARED_SELECTOR = YES; | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 9.0; | ||||
| 				MTL_ENABLE_DEBUG_INFO = NO; | ||||
| 				SDKROOT = iphoneos; | ||||
| 				SUPPORTED_PLATFORMS = iphoneos; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 				VALIDATE_PRODUCT = YES; | ||||
| 			}; | ||||
| 			name = Profile; | ||||
| 		}; | ||||
| 		249021D4217E4FDB00AE95B9 /* Profile */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | ||||
| 				DEVELOPMENT_TEAM = 6Z5P8GG96U; | ||||
| 				ENABLE_BITCODE = NO; | ||||
| 				INFOPLIST_FILE = Runner/Info.plist; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = fr.pointcheval.nativeCryptoExample; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				VERSIONING_SYSTEM = "apple-generic"; | ||||
| 			}; | ||||
| 			name = Profile; | ||||
| 		}; | ||||
| 		97C147031CF9000F007C117D /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ALWAYS_SEARCH_USER_PATHS = NO; | ||||
| 				CLANG_ANALYZER_NONNULL = YES; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||||
| 				CLANG_CXX_LIBRARY = "libc++"; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CLANG_ENABLE_OBJC_ARC = YES; | ||||
| 				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | ||||
| 				CLANG_WARN_BOOL_CONVERSION = YES; | ||||
| 				CLANG_WARN_COMMA = YES; | ||||
| 				CLANG_WARN_CONSTANT_CONVERSION = YES; | ||||
| 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||||
| 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||||
| 				CLANG_WARN_EMPTY_BODY = YES; | ||||
| 				CLANG_WARN_ENUM_CONVERSION = YES; | ||||
| 				CLANG_WARN_INFINITE_RECURSION = YES; | ||||
| 				CLANG_WARN_INT_CONVERSION = YES; | ||||
| 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||||
| 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||||
| 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | ||||
| 				CLANG_WARN_STRICT_PROTOTYPES = YES; | ||||
| 				CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||||
| 				CLANG_WARN_UNREACHABLE_CODE = YES; | ||||
| 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||||
| 				COPY_PHASE_STRIP = NO; | ||||
| 				DEBUG_INFORMATION_FORMAT = dwarf; | ||||
| 				ENABLE_STRICT_OBJC_MSGSEND = YES; | ||||
| 				ENABLE_TESTABILITY = YES; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu99; | ||||
| 				GCC_DYNAMIC_NO_PIC = NO; | ||||
| 				GCC_NO_COMMON_BLOCKS = YES; | ||||
| 				GCC_OPTIMIZATION_LEVEL = 0; | ||||
| 				GCC_PREPROCESSOR_DEFINITIONS = ( | ||||
| 					"DEBUG=1", | ||||
| 					"$(inherited)", | ||||
| 				); | ||||
| 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||||
| 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||||
| 				GCC_WARN_UNDECLARED_SELECTOR = YES; | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 9.0; | ||||
| 				MTL_ENABLE_DEBUG_INFO = YES; | ||||
| 				ONLY_ACTIVE_ARCH = YES; | ||||
| 				SDKROOT = iphoneos; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 			}; | ||||
| 			name = Debug; | ||||
| 		}; | ||||
| 		97C147041CF9000F007C117D /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ALWAYS_SEARCH_USER_PATHS = NO; | ||||
| 				CLANG_ANALYZER_NONNULL = YES; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||||
| 				CLANG_CXX_LIBRARY = "libc++"; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CLANG_ENABLE_OBJC_ARC = YES; | ||||
| 				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | ||||
| 				CLANG_WARN_BOOL_CONVERSION = YES; | ||||
| 				CLANG_WARN_COMMA = YES; | ||||
| 				CLANG_WARN_CONSTANT_CONVERSION = YES; | ||||
| 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||||
| 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||||
| 				CLANG_WARN_EMPTY_BODY = YES; | ||||
| 				CLANG_WARN_ENUM_CONVERSION = YES; | ||||
| 				CLANG_WARN_INFINITE_RECURSION = YES; | ||||
| 				CLANG_WARN_INT_CONVERSION = YES; | ||||
| 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||||
| 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||||
| 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | ||||
| 				CLANG_WARN_STRICT_PROTOTYPES = YES; | ||||
| 				CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||||
| 				CLANG_WARN_UNREACHABLE_CODE = YES; | ||||
| 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||||
| 				COPY_PHASE_STRIP = NO; | ||||
| 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||||
| 				ENABLE_NS_ASSERTIONS = NO; | ||||
| 				ENABLE_STRICT_OBJC_MSGSEND = YES; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu99; | ||||
| 				GCC_NO_COMMON_BLOCKS = YES; | ||||
| 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||||
| 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||||
| 				GCC_WARN_UNDECLARED_SELECTOR = YES; | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 9.0; | ||||
| 				MTL_ENABLE_DEBUG_INFO = NO; | ||||
| 				SDKROOT = iphoneos; | ||||
| 				SUPPORTED_PLATFORMS = iphoneos; | ||||
| 				SWIFT_COMPILATION_MODE = wholemodule; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-O"; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 				VALIDATE_PRODUCT = YES; | ||||
| 			}; | ||||
| 			name = Release; | ||||
| 		}; | ||||
| 		97C147061CF9000F007C117D /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | ||||
| 				DEVELOPMENT_TEAM = 6Z5P8GG96U; | ||||
| 				ENABLE_BITCODE = NO; | ||||
| 				INFOPLIST_FILE = Runner/Info.plist; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = fr.pointcheval.nativeCryptoExample; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				VERSIONING_SYSTEM = "apple-generic"; | ||||
| 			}; | ||||
| 			name = Debug; | ||||
| 		}; | ||||
| 		97C147071CF9000F007C117D /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | ||||
| 				DEVELOPMENT_TEAM = 6Z5P8GG96U; | ||||
| 				ENABLE_BITCODE = NO; | ||||
| 				INFOPLIST_FILE = Runner/Info.plist; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = fr.pointcheval.nativeCryptoExample; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				VERSIONING_SYSTEM = "apple-generic"; | ||||
| 			}; | ||||
| 			name = Release; | ||||
| 		}; | ||||
| /* End XCBuildConfiguration section */ | ||||
| 
 | ||||
| /* Begin XCConfigurationList section */ | ||||
| 		97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
| 				97C147031CF9000F007C117D /* Debug */, | ||||
| 				97C147041CF9000F007C117D /* Release */, | ||||
| 				249021D3217E4FDB00AE95B9 /* Profile */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| 		97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
| 				97C147061CF9000F007C117D /* Debug */, | ||||
| 				97C147071CF9000F007C117D /* Release */, | ||||
| 				249021D4217E4FDB00AE95B9 /* Profile */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| /* End XCConfigurationList section */ | ||||
| 	}; | ||||
| 	rootObject = 97C146E61CF9000F007C117D /* Project object */; | ||||
| } | ||||
| @ -1,7 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <Workspace | ||||
|    version = "1.0"> | ||||
|    <FileRef | ||||
|       location = "group:Runner.xcodeproj"> | ||||
|    </FileRef> | ||||
| </Workspace> | ||||
| @ -1,62 +0,0 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'dart:async'; | ||||
| 
 | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:native_crypto/native_crypto.dart'; | ||||
| 
 | ||||
| void main() { | ||||
|   runApp(const MyApp()); | ||||
| } | ||||
| 
 | ||||
| class MyApp extends StatefulWidget { | ||||
|   const MyApp({Key? key}) : super(key: key); | ||||
| 
 | ||||
|   @override | ||||
|   State<MyApp> createState() => _MyAppState(); | ||||
| } | ||||
| 
 | ||||
| class _MyAppState extends State<MyApp> { | ||||
|   String _platformVersion = 'Unknown'; | ||||
| 
 | ||||
|   @override | ||||
|   void initState() { | ||||
|     super.initState(); | ||||
|     initPlatformState(); | ||||
|   } | ||||
| 
 | ||||
|   // Platform messages are asynchronous, so we initialize in an async method. | ||||
|   Future<void> initPlatformState() async { | ||||
|     String platformVersion; | ||||
|     // Platform messages may fail, so we use a try/catch PlatformException. | ||||
|     // We also handle the message potentially returning null. | ||||
|     try { | ||||
|       platformVersion = | ||||
|           await NativeCrypto.platformVersion ?? 'Unknown platform version'; | ||||
|     } on PlatformException { | ||||
|       platformVersion = 'Failed to get platform version.'; | ||||
|     } | ||||
| 
 | ||||
|     // If the widget was removed from the tree while the asynchronous platform | ||||
|     // message was in flight, we want to discard the reply rather than calling | ||||
|     // setState to update our non-existent appearance. | ||||
|     if (!mounted) return; | ||||
| 
 | ||||
|     setState(() { | ||||
|       _platformVersion = platformVersion; | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return MaterialApp( | ||||
|       home: Scaffold( | ||||
|         appBar: AppBar( | ||||
|           title: const Text('Plugin example app'), | ||||
|         ), | ||||
|         body: Center( | ||||
|           child: Text('Running on: $_platformVersion\n'), | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @ -1,27 +0,0 @@ | ||||
| // This is a basic Flutter widget test. | ||||
| // | ||||
| // To perform an interaction with a widget in your test, use the WidgetTester | ||||
| // utility that Flutter provides. For example, you can send tap and scroll | ||||
| // gestures. You can also use WidgetTester to find child widgets in the widget | ||||
| // tree, read text, and verify that the values of widget properties are correct. | ||||
| 
 | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_test/flutter_test.dart'; | ||||
| 
 | ||||
| import 'package:native_crypto_example/main.dart'; | ||||
| 
 | ||||
| void main() { | ||||
|   testWidgets('Verify Platform version', (WidgetTester tester) async { | ||||
|     // Build our app and trigger a frame. | ||||
|     await tester.pumpWidget(const MyApp()); | ||||
| 
 | ||||
|     // Verify that platform version is retrieved. | ||||
|     expect( | ||||
|       find.byWidgetPredicate( | ||||
|         (Widget widget) => widget is Text && | ||||
|                            widget.data!.startsWith('Running on:'), | ||||
|       ), | ||||
|       findsOneWidget, | ||||
|     ); | ||||
|   }); | ||||
| } | ||||
| @ -1,17 +0,0 @@ | ||||
| // You have generated a new plugin project without | ||||
| // specifying the `--platforms` flag. A plugin project supports no platforms is generated. | ||||
| // To add platforms, run `flutter create -t plugin --platforms <platforms> .` under the same | ||||
| // directory. You can also find a detailed instruction on how to add platforms in the `pubspec.yaml` at https://flutter.dev/docs/development/packages-and-plugins/developing-packages#plugin-platforms. | ||||
| 
 | ||||
| import 'dart:async'; | ||||
| 
 | ||||
| import 'package:flutter/services.dart'; | ||||
| 
 | ||||
| class NativeCrypto { | ||||
|   static const MethodChannel _channel = MethodChannel('native_crypto'); | ||||
| 
 | ||||
|   static Future<String?> get platformVersion async { | ||||
|     final String? version = await _channel.invokeMethod('getPlatformVersion'); | ||||
|     return version; | ||||
|   } | ||||
| } | ||||
| @ -1,28 +0,0 @@ | ||||
| name: native_crypto | ||||
| description: Fast and secure cryptography for Flutter. | ||||
| version: 0.0.7 | ||||
| publish_to: 'none' | ||||
| 
 | ||||
| environment: | ||||
|   sdk: ">=2.15.0 <3.0.0" | ||||
|   flutter: ">=2.5.0" | ||||
| 
 | ||||
| dependencies: | ||||
|   flutter: | ||||
|     sdk: flutter | ||||
|    | ||||
|   native_crypto_ios: | ||||
|     path: ../native_crypto_ios | ||||
| 
 | ||||
| dev_dependencies: | ||||
|   flutter_test: | ||||
|     sdk: flutter | ||||
|   flutter_lints: ^1.0.4 | ||||
| 
 | ||||
| flutter: | ||||
|   plugin: | ||||
|     platforms: | ||||
|       # android: | ||||
|       #   default_package: native_crypto_android | ||||
|       ios: | ||||
|         default_package: native_crypto_ios | ||||
| @ -1,23 +0,0 @@ | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:flutter_test/flutter_test.dart'; | ||||
| import 'package:native_crypto/native_crypto.dart'; | ||||
| 
 | ||||
| void main() { | ||||
|   const MethodChannel channel = MethodChannel('native_crypto'); | ||||
| 
 | ||||
|   TestWidgetsFlutterBinding.ensureInitialized(); | ||||
| 
 | ||||
|   setUp(() { | ||||
|     channel.setMockMethodCallHandler((MethodCall methodCall) async { | ||||
|       return '42'; | ||||
|     }); | ||||
|   }); | ||||
| 
 | ||||
|   tearDown(() { | ||||
|     channel.setMockMethodCallHandler(null); | ||||
|   }); | ||||
| 
 | ||||
|   test('getPlatformVersion', () async { | ||||
|     expect(await NativeCrypto.platformVersion, '42'); | ||||
|   }); | ||||
| } | ||||
| @ -1,3 +0,0 @@ | ||||
| ## 0.0.1 | ||||
| 
 | ||||
| * TODO: Describe initial release. | ||||
| @ -1,16 +0,0 @@ | ||||
| # native_crypto_ios_example | ||||
| 
 | ||||
| Demonstrates how to use the native_crypto_ios plugin. | ||||
| 
 | ||||
| ## Getting Started | ||||
| 
 | ||||
| This project is a starting point for a Flutter application. | ||||
| 
 | ||||
| A few resources to get you started if this is your first Flutter project: | ||||
| 
 | ||||
| - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) | ||||
| - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) | ||||
| 
 | ||||
| For help getting started with Flutter, view our | ||||
| [online documentation](https://flutter.dev/docs), which offers tutorials, | ||||
| samples, guidance on mobile development, and a full API reference. | ||||
| @ -1,29 +0,0 @@ | ||||
| # This file configures the analyzer, which statically analyzes Dart code to | ||||
| # check for errors, warnings, and lints. | ||||
| # | ||||
| # The issues identified by the analyzer are surfaced in the UI of Dart-enabled | ||||
| # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be | ||||
| # invoked from the command line by running `flutter analyze`. | ||||
| 
 | ||||
| # The following line activates a set of recommended lints for Flutter apps, | ||||
| # packages, and plugins designed to encourage good coding practices. | ||||
| include: package:flutter_lints/flutter.yaml | ||||
| 
 | ||||
| linter: | ||||
|   # The lint rules applied to this project can be customized in the | ||||
|   # section below to disable rules from the `package:flutter_lints/flutter.yaml` | ||||
|   # included above or to enable additional rules. A list of all available lints | ||||
|   # and their documentation is published at | ||||
|   # https://dart-lang.github.io/linter/lints/index.html. | ||||
|   # | ||||
|   # Instead of disabling a lint rule for the entire project in the | ||||
|   # section below, it can also be suppressed for a single line of code | ||||
|   # or a specific dart file by using the `// ignore: name_of_lint` and | ||||
|   # `// ignore_for_file: name_of_lint` syntax on the line or in the file | ||||
|   # producing the lint. | ||||
|   rules: | ||||
|     # avoid_print: false  # Uncomment to disable the `avoid_print` rule | ||||
|     # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule | ||||
| 
 | ||||
| # Additional information about this file can be found at | ||||
| # https://dart.dev/guides/language/analysis-options | ||||
							
								
								
									
										34
									
								
								native_crypto_ios/example/ios/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -1,34 +0,0 @@ | ||||
| **/dgph | ||||
| *.mode1v3 | ||||
| *.mode2v3 | ||||
| *.moved-aside | ||||
| *.pbxuser | ||||
| *.perspectivev3 | ||||
| **/*sync/ | ||||
| .sconsign.dblite | ||||
| .tags* | ||||
| **/.vagrant/ | ||||
| **/DerivedData/ | ||||
| Icon? | ||||
| **/Pods/ | ||||
| **/.symlinks/ | ||||
| profile | ||||
| xcuserdata | ||||
| **/.generated/ | ||||
| Flutter/App.framework | ||||
| Flutter/Flutter.framework | ||||
| Flutter/Flutter.podspec | ||||
| Flutter/Generated.xcconfig | ||||
| Flutter/ephemeral/ | ||||
| Flutter/app.flx | ||||
| Flutter/app.zip | ||||
| Flutter/flutter_assets/ | ||||
| Flutter/flutter_export_environment.sh | ||||
| ServiceDefinitions.json | ||||
| Runner/GeneratedPluginRegistrant.* | ||||
| 
 | ||||
| # Exceptions to above rules. | ||||
| !default.mode1v3 | ||||
| !default.mode2v3 | ||||
| !default.pbxuser | ||||
| !default.perspectivev3 | ||||
| @ -1,26 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
|   <key>CFBundleDevelopmentRegion</key> | ||||
|   <string>en</string> | ||||
|   <key>CFBundleExecutable</key> | ||||
|   <string>App</string> | ||||
|   <key>CFBundleIdentifier</key> | ||||
|   <string>io.flutter.flutter.app</string> | ||||
|   <key>CFBundleInfoDictionaryVersion</key> | ||||
|   <string>6.0</string> | ||||
|   <key>CFBundleName</key> | ||||
|   <string>App</string> | ||||
|   <key>CFBundlePackageType</key> | ||||
|   <string>FMWK</string> | ||||
|   <key>CFBundleShortVersionString</key> | ||||
|   <string>1.0</string> | ||||
|   <key>CFBundleSignature</key> | ||||
|   <string>????</string> | ||||
|   <key>CFBundleVersion</key> | ||||
|   <string>1.0</string> | ||||
|   <key>MinimumOSVersion</key> | ||||
|   <string>9.0</string> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -1,2 +0,0 @@ | ||||
| #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" | ||||
| #include "Generated.xcconfig" | ||||
| @ -1,2 +0,0 @@ | ||||
| #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" | ||||
| #include "Generated.xcconfig" | ||||
| @ -1,41 +0,0 @@ | ||||
| # Uncomment this line to define a global platform for your project | ||||
| # platform :ios, '9.0' | ||||
| 
 | ||||
| # CocoaPods analytics sends network stats synchronously affecting flutter build latency. | ||||
| ENV['COCOAPODS_DISABLE_STATS'] = 'true' | ||||
| 
 | ||||
| project 'Runner', { | ||||
|   'Debug' => :debug, | ||||
|   'Profile' => :release, | ||||
|   'Release' => :release, | ||||
| } | ||||
| 
 | ||||
| def flutter_root | ||||
|   generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) | ||||
|   unless File.exist?(generated_xcode_build_settings_path) | ||||
|     raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" | ||||
|   end | ||||
| 
 | ||||
|   File.foreach(generated_xcode_build_settings_path) do |line| | ||||
|     matches = line.match(/FLUTTER_ROOT\=(.*)/) | ||||
|     return matches[1].strip if matches | ||||
|   end | ||||
|   raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" | ||||
| end | ||||
| 
 | ||||
| require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) | ||||
| 
 | ||||
| flutter_ios_podfile_setup | ||||
| 
 | ||||
| target 'Runner' do | ||||
|   use_frameworks! | ||||
|   use_modular_headers! | ||||
| 
 | ||||
|   flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) | ||||
| end | ||||
| 
 | ||||
| post_install do |installer| | ||||
|   installer.pods_project.targets.each do |target| | ||||
|     flutter_additional_ios_build_settings(target) | ||||
|   end | ||||
| end | ||||
| @ -1,7 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <Workspace | ||||
|    version = "1.0"> | ||||
|    <FileRef | ||||
|       location = "self:"> | ||||
|    </FileRef> | ||||
| </Workspace> | ||||
| @ -1,8 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>IDEDidComputeMac32BitWarning</key> | ||||
| 	<true/> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -1,8 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>PreviewsEnabled</key> | ||||
| 	<false/> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -1,87 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <Scheme | ||||
|    LastUpgradeVersion = "1300" | ||||
|    version = "1.3"> | ||||
|    <BuildAction | ||||
|       parallelizeBuildables = "YES" | ||||
|       buildImplicitDependencies = "YES"> | ||||
|       <BuildActionEntries> | ||||
|          <BuildActionEntry | ||||
|             buildForTesting = "YES" | ||||
|             buildForRunning = "YES" | ||||
|             buildForProfiling = "YES" | ||||
|             buildForArchiving = "YES" | ||||
|             buildForAnalyzing = "YES"> | ||||
|             <BuildableReference | ||||
|                BuildableIdentifier = "primary" | ||||
|                BlueprintIdentifier = "97C146ED1CF9000F007C117D" | ||||
|                BuildableName = "Runner.app" | ||||
|                BlueprintName = "Runner" | ||||
|                ReferencedContainer = "container:Runner.xcodeproj"> | ||||
|             </BuildableReference> | ||||
|          </BuildActionEntry> | ||||
|       </BuildActionEntries> | ||||
|    </BuildAction> | ||||
|    <TestAction | ||||
|       buildConfiguration = "Debug" | ||||
|       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||||
|       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||||
|       shouldUseLaunchSchemeArgsEnv = "YES"> | ||||
|       <MacroExpansion> | ||||
|          <BuildableReference | ||||
|             BuildableIdentifier = "primary" | ||||
|             BlueprintIdentifier = "97C146ED1CF9000F007C117D" | ||||
|             BuildableName = "Runner.app" | ||||
|             BlueprintName = "Runner" | ||||
|             ReferencedContainer = "container:Runner.xcodeproj"> | ||||
|          </BuildableReference> | ||||
|       </MacroExpansion> | ||||
|       <Testables> | ||||
|       </Testables> | ||||
|    </TestAction> | ||||
|    <LaunchAction | ||||
|       buildConfiguration = "Debug" | ||||
|       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||||
|       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||||
|       launchStyle = "0" | ||||
|       useCustomWorkingDirectory = "NO" | ||||
|       ignoresPersistentStateOnLaunch = "NO" | ||||
|       debugDocumentVersioning = "YES" | ||||
|       debugServiceExtension = "internal" | ||||
|       allowLocationSimulation = "YES"> | ||||
|       <BuildableProductRunnable | ||||
|          runnableDebuggingMode = "0"> | ||||
|          <BuildableReference | ||||
|             BuildableIdentifier = "primary" | ||||
|             BlueprintIdentifier = "97C146ED1CF9000F007C117D" | ||||
|             BuildableName = "Runner.app" | ||||
|             BlueprintName = "Runner" | ||||
|             ReferencedContainer = "container:Runner.xcodeproj"> | ||||
|          </BuildableReference> | ||||
|       </BuildableProductRunnable> | ||||
|    </LaunchAction> | ||||
|    <ProfileAction | ||||
|       buildConfiguration = "Profile" | ||||
|       shouldUseLaunchSchemeArgsEnv = "YES" | ||||
|       savedToolIdentifier = "" | ||||
|       useCustomWorkingDirectory = "NO" | ||||
|       debugDocumentVersioning = "YES"> | ||||
|       <BuildableProductRunnable | ||||
|          runnableDebuggingMode = "0"> | ||||
|          <BuildableReference | ||||
|             BuildableIdentifier = "primary" | ||||
|             BlueprintIdentifier = "97C146ED1CF9000F007C117D" | ||||
|             BuildableName = "Runner.app" | ||||
|             BlueprintName = "Runner" | ||||
|             ReferencedContainer = "container:Runner.xcodeproj"> | ||||
|          </BuildableReference> | ||||
|       </BuildableProductRunnable> | ||||
|    </ProfileAction> | ||||
|    <AnalyzeAction | ||||
|       buildConfiguration = "Debug"> | ||||
|    </AnalyzeAction> | ||||
|    <ArchiveAction | ||||
|       buildConfiguration = "Release" | ||||
|       revealArchiveInOrganizer = "YES"> | ||||
|    </ArchiveAction> | ||||
| </Scheme> | ||||
| @ -1,8 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>IDEDidComputeMac32BitWarning</key> | ||||
| 	<true/> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -1,8 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>PreviewsEnabled</key> | ||||
| 	<false/> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -1,13 +0,0 @@ | ||||
| import UIKit | ||||
| import Flutter | ||||
| 
 | ||||
| @UIApplicationMain | ||||
| @objc class AppDelegate: FlutterAppDelegate { | ||||
|   override func application( | ||||
|     _ application: UIApplication, | ||||
|     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? | ||||
|   ) -> Bool { | ||||
|     GeneratedPluginRegistrant.register(with: self) | ||||
|     return super.application(application, didFinishLaunchingWithOptions: launchOptions) | ||||
|   } | ||||
| } | ||||
| @ -1,122 +0,0 @@ | ||||
| { | ||||
|   "images" : [ | ||||
|     { | ||||
|       "size" : "20x20", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-20x20@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "20x20", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-20x20@3x.png", | ||||
|       "scale" : "3x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "29x29", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-29x29@1x.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "29x29", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-29x29@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "29x29", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-29x29@3x.png", | ||||
|       "scale" : "3x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "40x40", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-40x40@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "40x40", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-40x40@3x.png", | ||||
|       "scale" : "3x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "60x60", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-60x60@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "60x60", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-60x60@3x.png", | ||||
|       "scale" : "3x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "20x20", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-20x20@1x.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "20x20", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-20x20@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "29x29", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-29x29@1x.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "29x29", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-29x29@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "40x40", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-40x40@1x.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "40x40", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-40x40@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "76x76", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-76x76@1x.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "76x76", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-76x76@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "83.5x83.5", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-83.5x83.5@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "1024x1024", | ||||
|       "idiom" : "ios-marketing", | ||||
|       "filename" : "Icon-App-1024x1024@1x.png", | ||||
|       "scale" : "1x" | ||||
|     } | ||||
|   ], | ||||
|   "info" : { | ||||
|     "version" : 1, | ||||
|     "author" : "xcode" | ||||
|   } | ||||
| } | ||||
| Before Width: | Height: | Size: 11 KiB | 
| Before Width: | Height: | Size: 564 B | 
| Before Width: | Height: | Size: 1.3 KiB | 
| Before Width: | Height: | Size: 1.6 KiB | 
| Before Width: | Height: | Size: 1.0 KiB | 
| Before Width: | Height: | Size: 1.7 KiB | 
| Before Width: | Height: | Size: 1.9 KiB | 
| Before Width: | Height: | Size: 1.3 KiB | 
| Before Width: | Height: | Size: 1.9 KiB | 
| Before Width: | Height: | Size: 2.6 KiB | 
| Before Width: | Height: | Size: 2.6 KiB | 
| Before Width: | Height: | Size: 3.7 KiB | 
| Before Width: | Height: | Size: 1.8 KiB | 
| Before Width: | Height: | Size: 3.2 KiB | 
| Before Width: | Height: | Size: 3.5 KiB | 
| @ -1,23 +0,0 @@ | ||||
| { | ||||
|   "images" : [ | ||||
|     { | ||||
|       "idiom" : "universal", | ||||
|       "filename" : "LaunchImage.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "idiom" : "universal", | ||||
|       "filename" : "LaunchImage@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "idiom" : "universal", | ||||
|       "filename" : "LaunchImage@3x.png", | ||||
|       "scale" : "3x" | ||||
|     } | ||||
|   ], | ||||
|   "info" : { | ||||
|     "version" : 1, | ||||
|     "author" : "xcode" | ||||
|   } | ||||
| } | ||||
| Before Width: | Height: | Size: 68 B | 
| Before Width: | Height: | Size: 68 B | 
| Before Width: | Height: | Size: 68 B | 
| @ -1,5 +0,0 @@ | ||||
| # Launch Screen Assets | ||||
| 
 | ||||
| You can customize the launch screen with your own desired assets by replacing the image files in this directory. | ||||
| 
 | ||||
| You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. | ||||
| @ -1,37 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> | ||||
|     <dependencies> | ||||
|         <deployment identifier="iOS"/> | ||||
|         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/> | ||||
|     </dependencies> | ||||
|     <scenes> | ||||
|         <!--View Controller--> | ||||
|         <scene sceneID="EHf-IW-A2E"> | ||||
|             <objects> | ||||
|                 <viewController id="01J-lp-oVM" sceneMemberID="viewController"> | ||||
|                     <layoutGuides> | ||||
|                         <viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/> | ||||
|                         <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/> | ||||
|                     </layoutGuides> | ||||
|                     <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> | ||||
|                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||||
|                         <subviews> | ||||
|                             <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4"> | ||||
|                             </imageView> | ||||
|                         </subviews> | ||||
|                         <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | ||||
|                         <constraints> | ||||
|                             <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/> | ||||
|                             <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/> | ||||
|                         </constraints> | ||||
|                     </view> | ||||
|                 </viewController> | ||||
|                 <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> | ||||
|             </objects> | ||||
|             <point key="canvasLocation" x="53" y="375"/> | ||||
|         </scene> | ||||
|     </scenes> | ||||
|     <resources> | ||||
|         <image name="LaunchImage" width="168" height="185"/> | ||||
|     </resources> | ||||
| </document> | ||||
| @ -1,26 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r"> | ||||
|     <dependencies> | ||||
|         <deployment identifier="iOS"/> | ||||
|         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/> | ||||
|     </dependencies> | ||||
|     <scenes> | ||||
|         <!--Flutter View Controller--> | ||||
|         <scene sceneID="tne-QT-ifu"> | ||||
|             <objects> | ||||
|                 <viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController"> | ||||
|                     <layoutGuides> | ||||
|                         <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/> | ||||
|                         <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> | ||||
|                     </layoutGuides> | ||||
|                     <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> | ||||
|                         <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> | ||||
|                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||||
|                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> | ||||
|                     </view> | ||||
|                 </viewController> | ||||
|                 <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> | ||||
|             </objects> | ||||
|         </scene> | ||||
|     </scenes> | ||||
| </document> | ||||
| @ -1,47 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>CFBundleDevelopmentRegion</key> | ||||
| 	<string>$(DEVELOPMENT_LANGUAGE)</string> | ||||
| 	<key>CFBundleDisplayName</key> | ||||
| 	<string>Native Crypto Ios</string> | ||||
| 	<key>CFBundleExecutable</key> | ||||
| 	<string>$(EXECUTABLE_NAME)</string> | ||||
| 	<key>CFBundleIdentifier</key> | ||||
| 	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | ||||
| 	<key>CFBundleInfoDictionaryVersion</key> | ||||
| 	<string>6.0</string> | ||||
| 	<key>CFBundleName</key> | ||||
| 	<string>native_crypto_ios_example</string> | ||||
| 	<key>CFBundlePackageType</key> | ||||
| 	<string>APPL</string> | ||||
| 	<key>CFBundleShortVersionString</key> | ||||
| 	<string>$(FLUTTER_BUILD_NAME)</string> | ||||
| 	<key>CFBundleSignature</key> | ||||
| 	<string>????</string> | ||||
| 	<key>CFBundleVersion</key> | ||||
| 	<string>$(FLUTTER_BUILD_NUMBER)</string> | ||||
| 	<key>LSRequiresIPhoneOS</key> | ||||
| 	<true/> | ||||
| 	<key>UILaunchStoryboardName</key> | ||||
| 	<string>LaunchScreen</string> | ||||
| 	<key>UIMainStoryboardFile</key> | ||||
| 	<string>Main</string> | ||||
| 	<key>UISupportedInterfaceOrientations</key> | ||||
| 	<array> | ||||
| 		<string>UIInterfaceOrientationPortrait</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeLeft</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeRight</string> | ||||
| 	</array> | ||||
| 	<key>UISupportedInterfaceOrientations~ipad</key> | ||||
| 	<array> | ||||
| 		<string>UIInterfaceOrientationPortrait</string> | ||||
| 		<string>UIInterfaceOrientationPortraitUpsideDown</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeLeft</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeRight</string> | ||||
| 	</array> | ||||
| 	<key>UIViewControllerBasedStatusBarAppearance</key> | ||||
| 	<true/> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -1 +0,0 @@ | ||||
| #import "GeneratedPluginRegistrant.h" | ||||
| @ -1,79 +0,0 @@ | ||||
| import 'dart:typed_data'; | ||||
| 
 | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'dart:async'; | ||||
| 
 | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:native_crypto_platform_interface/native_crypto_platform_interface.dart'; | ||||
| 
 | ||||
| void main() { | ||||
|   runApp(const MyApp()); | ||||
| } | ||||
| 
 | ||||
| class MyApp extends StatefulWidget { | ||||
|   const MyApp({Key? key}) : super(key: key); | ||||
| 
 | ||||
|   @override | ||||
|   State<MyApp> createState() => _MyAppState(); | ||||
| } | ||||
| 
 | ||||
| class _MyAppState extends State<MyApp> { | ||||
|   String _platformVersion = 'Unknown'; | ||||
| 
 | ||||
|   @override | ||||
|   void initState() { | ||||
|     super.initState(); | ||||
|     initPlatformState(); | ||||
|   } | ||||
| 
 | ||||
|   // Platform messages are asynchronous, so we initialize in an async method. | ||||
|   Future<void> initPlatformState() async { | ||||
|     NativeCryptoPlatform _nativeCryptoPlatform = NativeCryptoPlatform.instance; | ||||
|     String platformVersion; | ||||
|     // Platform messages may fail, so we use a try/catch PlatformException. | ||||
|     // We also handle the message potentially returning null. | ||||
|     Uint8List? sk = await _nativeCryptoPlatform.generateSecretKey(256); | ||||
|     print(sk ?? 'null'); | ||||
| 
 | ||||
|     Uint8List? ciphertext = await _nativeCryptoPlatform.encrypt(Uint8List.fromList("abc".codeUnits), sk!, "aes"); | ||||
|     print(ciphertext ?? 'null'); | ||||
| 
 | ||||
|     Uint8List? plaintext = await _nativeCryptoPlatform.decrypt(ciphertext!, sk, "aes"); | ||||
|     print(plaintext ?? 'null'); | ||||
| 
 | ||||
|     Uint8List? kp = await _nativeCryptoPlatform.generateKeyPair(); | ||||
|     print(kp!.sublist(0, 31)); | ||||
|     print(kp.sublist(32).length); | ||||
| 
 | ||||
|     Uint8List? sharedSecret = await _nativeCryptoPlatform.generateSharedSecretKey(Uint8List.fromList("salt".codeUnits), 32, kp.sublist(0, 31), kp.sublist(32), "sha256"); | ||||
| 
 | ||||
|     try { | ||||
|       platformVersion = 'Unknown platform version'; | ||||
|     } on PlatformException { | ||||
|       platformVersion = 'Failed to get platform version.'; | ||||
|     } | ||||
| 
 | ||||
|     // If the widget was removed from the tree while the asynchronous platform | ||||
|     // message was in flight, we want to discard the reply rather than calling | ||||
|     // setState to update our non-existent appearance. | ||||
|     if (!mounted) return; | ||||
| 
 | ||||
|     setState(() { | ||||
|       _platformVersion = platformVersion; | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return MaterialApp( | ||||
|       home: Scaffold( | ||||
|         appBar: AppBar( | ||||
|           title: const Text('Plugin example app'), | ||||
|         ), | ||||
|         body: Center( | ||||
|           child: Text('Running on: $_platformVersion\n'), | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @ -1,87 +0,0 @@ | ||||
| name: native_crypto_ios_example | ||||
| description: Demonstrates how to use the native_crypto_ios plugin. | ||||
| 
 | ||||
| # The following line prevents the package from being accidentally published to | ||||
| # pub.dev using `flutter pub publish`. This is preferred for private packages. | ||||
| publish_to: 'none' # Remove this line if you wish to publish to pub.dev | ||||
| 
 | ||||
| environment: | ||||
|   sdk: ">=2.15.0 <3.0.0" | ||||
| 
 | ||||
| # Dependencies specify other packages that your package needs in order to work. | ||||
| # To automatically upgrade your package dependencies to the latest versions | ||||
| # consider running `flutter pub upgrade --major-versions`. Alternatively, | ||||
| # dependencies can be manually updated by changing the version numbers below to | ||||
| # the latest version available on pub.dev. To see which dependencies have newer | ||||
| # versions available, run `flutter pub outdated`. | ||||
| dependencies: | ||||
|   flutter: | ||||
|     sdk: flutter | ||||
| 
 | ||||
|   native_crypto_ios: | ||||
|     # When depending on this package from a real application you should use: | ||||
|     #   native_crypto_ios: ^x.y.z | ||||
|     # See https://dart.dev/tools/pub/dependencies#version-constraints | ||||
|     # The example app is bundled with the plugin so we use a path dependency on | ||||
|     # the parent directory to use the current plugin's version. | ||||
|     path: ../ | ||||
| 
 | ||||
|   native_crypto_platform_interface: | ||||
|     path: ../../native_crypto_platform_interface | ||||
| 
 | ||||
|   # The following adds the Cupertino Icons font to your application. | ||||
|   # Use with the CupertinoIcons class for iOS style icons. | ||||
|   cupertino_icons: ^1.0.2 | ||||
| 
 | ||||
| dev_dependencies: | ||||
|   flutter_test: | ||||
|     sdk: flutter | ||||
| 
 | ||||
|   # The "flutter_lints" package below contains a set of recommended lints to | ||||
|   # encourage good coding practices. The lint set provided by the package is | ||||
|   # activated in the `analysis_options.yaml` file located at the root of your | ||||
|   # package. See that file for information about deactivating specific lint | ||||
|   # rules and activating additional ones. | ||||
|   flutter_lints: ^1.0.0 | ||||
| 
 | ||||
| # For information on the generic Dart part of this file, see the | ||||
| # following page: https://dart.dev/tools/pub/pubspec | ||||
| 
 | ||||
| # The following section is specific to Flutter. | ||||
| flutter: | ||||
| 
 | ||||
|   # The following line ensures that the Material Icons font is | ||||
|   # included with your application, so that you can use the icons in | ||||
|   # the material Icons class. | ||||
|   uses-material-design: true | ||||
| 
 | ||||
|   # To add assets to your application, add an assets section, like this: | ||||
|   # assets: | ||||
|   #   - images/a_dot_burr.jpeg | ||||
|   #   - images/a_dot_ham.jpeg | ||||
| 
 | ||||
|   # An image asset can refer to one or more resolution-specific "variants", see | ||||
|   # https://flutter.dev/assets-and-images/#resolution-aware. | ||||
| 
 | ||||
|   # For details regarding adding assets from package dependencies, see | ||||
|   # https://flutter.dev/assets-and-images/#from-packages | ||||
| 
 | ||||
|   # To add custom fonts to your application, add a fonts section here, | ||||
|   # in this "flutter" section. Each entry in this list should have a | ||||
|   # "family" key with the font family name, and a "fonts" key with a | ||||
|   # list giving the asset and other descriptors for the font. For | ||||
|   # example: | ||||
|   # fonts: | ||||
|   #   - family: Schyler | ||||
|   #     fonts: | ||||
|   #       - asset: fonts/Schyler-Regular.ttf | ||||
|   #       - asset: fonts/Schyler-Italic.ttf | ||||
|   #         style: italic | ||||
|   #   - family: Trajan Pro | ||||
|   #     fonts: | ||||
|   #       - asset: fonts/TrajanPro.ttf | ||||
|   #       - asset: fonts/TrajanPro_Bold.ttf | ||||
|   #         weight: 700 | ||||
|   # | ||||
|   # For details regarding fonts from package dependencies, | ||||
|   # see https://flutter.dev/custom-fonts/#from-packages | ||||
| @ -1,27 +0,0 @@ | ||||
| // This is a basic Flutter widget test. | ||||
| // | ||||
| // To perform an interaction with a widget in your test, use the WidgetTester | ||||
| // utility that Flutter provides. For example, you can send tap and scroll | ||||
| // gestures. You can also use WidgetTester to find child widgets in the widget | ||||
| // tree, read text, and verify that the values of widget properties are correct. | ||||
| 
 | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_test/flutter_test.dart'; | ||||
| 
 | ||||
| import 'package:native_crypto_ios_example/main.dart'; | ||||
| 
 | ||||
| void main() { | ||||
|   testWidgets('Verify Platform version', (WidgetTester tester) async { | ||||
|     // Build our app and trigger a frame. | ||||
|     await tester.pumpWidget(const MyApp()); | ||||
| 
 | ||||
|     // Verify that platform version is retrieved. | ||||
|     expect( | ||||
|       find.byWidgetPredicate( | ||||
|         (Widget widget) => widget is Text && | ||||
|                            widget.data!.startsWith('Running on:'), | ||||
|       ), | ||||
|       findsOneWidget, | ||||
|     ); | ||||
|   }); | ||||
| } | ||||
| @ -1,53 +0,0 @@ | ||||
| /** | ||||
|  * Author: Hugo Pointcheval | ||||
|  * Email: git@pcl.ovh | ||||
|  * ----- | ||||
|  * File: Cipher.swift | ||||
|  * Created Date: 25/12/2021 18:31:28 | ||||
|  * Last Modified: 25/12/2021 18:38:53 | ||||
|  * ----- | ||||
|  * Copyright (c) 2021 | ||||
|  */ | ||||
| 
 | ||||
| import Foundation | ||||
| import CryptoKit | ||||
| 
 | ||||
| class AESCipher { | ||||
|     /// Encrypts plaintext with key using AES GCM | ||||
|     @available(iOS 13.0, *) | ||||
|     static func encrypt(plaintext: Data, key: Data) -> Data? { | ||||
|         let symmetricKey = SymmetricKey.init(data: key) | ||||
|         let encrypted = try? AES.GCM.seal(plaintext, using: symmetricKey) | ||||
|         return encrypted?.combined | ||||
|     } | ||||
|      | ||||
|     /// Decrypts ciphertext with key using AES GCM | ||||
|     @available(iOS 13.0, *) | ||||
|     static func decrypt(ciphertext: Data, key: Data) -> Data? { | ||||
|         let symmetricKey = SymmetricKey.init(data: key) | ||||
|         let sealedBox = try? AES.GCM.SealedBox(combined: ciphertext) | ||||
|         if (sealedBox == nil) { return nil } | ||||
|         let decryptedData = try? AES.GCM.open(sealedBox!, using: symmetricKey) | ||||
|         return decryptedData | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| class CHACHACipher { | ||||
|     /// Encrypts plaintext with key using CHACHAPOLY | ||||
|     @available(iOS 13.0, *) | ||||
|     static func encrypt(plaintext: Data, key: Data) -> Data? { | ||||
|         let symmetricKey = SymmetricKey.init(data: key) | ||||
|         let encrypted = try? ChaChaPoly.seal(plaintext, using: symmetricKey) | ||||
|         return encrypted?.combined | ||||
|     } | ||||
|      | ||||
|     /// Decrypts ciphertext with key using CHACHAPOLY | ||||
|     @available(iOS 13.0, *) | ||||
|     static func decrypt(ciphertext: Data, key: Data) -> Data? { | ||||
|         let symmetricKey = SymmetricKey.init(data: key) | ||||
|         let sealedBox = try? ChaChaPoly.SealedBox(combined: ciphertext) | ||||
|         if (sealedBox == nil) { return nil } | ||||
|         let decryptedData = try? ChaChaPoly.open(sealedBox!, using: symmetricKey) | ||||
|         return decryptedData | ||||
|     } | ||||
| } | ||||
| @ -1,43 +0,0 @@ | ||||
| /** | ||||
|  * Author: Hugo Pointcheval | ||||
|  * Email: git@pcl.ovh | ||||
|  * ----- | ||||
|  * File: Hash.swift | ||||
|  * Created Date: 25/12/2021 18:31:11 | ||||
|  * Last Modified: 25/12/2021 18:38:20 | ||||
|  * ----- | ||||
|  * Copyright (c) 2021 | ||||
|  */ | ||||
| 
 | ||||
| import Foundation | ||||
| import CommonCrypto | ||||
| import CryptoKit | ||||
| 
 | ||||
| enum HashAlgorithm: String { | ||||
|     case HashSHA256 = "sha256" | ||||
|     case HashSHA384 = "sha384" | ||||
|     case HashSHA512 = "sha512" | ||||
|      | ||||
|     var commonCrypto: UInt32 { | ||||
|         switch self { | ||||
|         case .HashSHA256: return CCPBKDFAlgorithm(kCCPRFHmacAlgSHA256) | ||||
|         case .HashSHA384: return CCPBKDFAlgorithm(kCCPRFHmacAlgSHA384) | ||||
|         case .HashSHA512: return CCPBKDFAlgorithm(kCCPRFHmacAlgSHA512) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @available(iOS 13.0, *) | ||||
| class Hash { | ||||
|     /// Hash a message with a specified HashAlgorithm | ||||
|     static func digest(data: Data, algorithm: HashAlgorithm) -> Data { | ||||
|         switch algorithm { | ||||
|             case .HashSHA256: | ||||
|                 return Data(SHA256.hash(data: data)) | ||||
|             case .HashSHA384: | ||||
|                 return Data(SHA384.hash(data: data)) | ||||
|             case .HashSHA512: | ||||
|                 return Data(SHA512.hash(data: data)) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,78 +0,0 @@ | ||||
| /** | ||||
|  * Author: Hugo Pointcheval | ||||
|  * Email: git@pcl.ovh | ||||
|  * ----- | ||||
|  * File: KEM.swift | ||||
|  * Created Date: 25/12/2021 18:31:48 | ||||
|  * Last Modified: 25/12/2021 18:40:00 | ||||
|  * ----- | ||||
|  * Copyright (c) 2021 | ||||
|  */ | ||||
| 
 | ||||
| import Foundation | ||||
| import CryptoKit | ||||
| 
 | ||||
| class KeyPair { | ||||
|     /// Generate a keypair. | ||||
|     @available(iOS 13.0, *) | ||||
|     static func fromCurve() -> Data { | ||||
|         let sk = P256.KeyAgreement.PrivateKey() | ||||
|         var kp = sk.rawRepresentation | ||||
|         kp.append(contentsOf: sk.publicKey.rawRepresentation) | ||||
|         return kp; | ||||
|     } | ||||
|      | ||||
|     /// Import private key from Data | ||||
|     @available(iOS 13.0, *) | ||||
|     static func importPrivateKey(privateKey: Data) throws -> P256.KeyAgreement.PrivateKey { | ||||
|         let sk = try P256.KeyAgreement.PrivateKey(rawRepresentation: privateKey) | ||||
|          | ||||
|         return sk; | ||||
|     } | ||||
|      | ||||
|     /// Import public key from Data | ||||
|     @available(iOS 13.0, *) | ||||
|     static func importPublicKey(publicKey: Data) throws -> P256.KeyAgreement.PublicKey { | ||||
|         let pk = try P256.KeyAgreement.PublicKey(rawRepresentation: publicKey) | ||||
|          | ||||
|         return pk; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| class ECDH { | ||||
|     /// Generate a shared secret with your private key and other party public key. | ||||
|     @available(iOS 13.0, *) | ||||
|     static func generateSharedSecretKey(salt: Data, hash: HashAlgorithm, keyBytesCount: Int ,privateKey: Data, publicKey: Data) -> Data? { | ||||
|         let sk = try? KeyPair.importPrivateKey(privateKey: privateKey) | ||||
|         if (sk == nil) {return nil} | ||||
|          | ||||
|         let pk = try? KeyPair.importPublicKey(publicKey: publicKey) | ||||
|         if (pk == nil) {return nil} | ||||
| 
 | ||||
|         let secret = try? sk!.sharedSecretFromKeyAgreement(with: pk!) | ||||
|          | ||||
|         switch hash { | ||||
|         case .HashSHA256: | ||||
|             let key = secret?.hkdfDerivedSymmetricKey(using: SHA256.self, salt: salt, sharedInfo: Data(), outputByteCount: keyBytesCount) | ||||
|             if (key == nil) { | ||||
|                 return nil | ||||
|             } else { | ||||
|                 return Key.toBytes(key: key!) | ||||
|             } | ||||
|         case .HashSHA384: | ||||
|             let key = secret?.hkdfDerivedSymmetricKey(using: SHA384.self, salt: salt, sharedInfo: Data(), outputByteCount: keyBytesCount) | ||||
|             if (key == nil) { | ||||
|                 return nil | ||||
|             } else { | ||||
|                 return Key.toBytes(key: key!) | ||||
|             } | ||||
|         case .HashSHA512: | ||||
|             let key = secret?.hkdfDerivedSymmetricKey(using: SHA512.self, salt: salt, sharedInfo: Data(), outputByteCount: keyBytesCount) | ||||
|             if (key == nil) { | ||||
|                 return nil | ||||
|             } else { | ||||
|                 return Key.toBytes(key: key!) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,62 +0,0 @@ | ||||
| /** | ||||
|  * Author: Hugo Pointcheval | ||||
|  * Email: git@pcl.ovh | ||||
|  * ----- | ||||
|  * File: KDF.swift | ||||
|  * Created Date: 25/12/2021 17:45:28 | ||||
|  * Last Modified: 25/12/2021 17:45:38 | ||||
|  * ----- | ||||
|  * Copyright (c) 2021 | ||||
|  */ | ||||
| 
 | ||||
| import Foundation | ||||
| import CryptoKit | ||||
| import CommonCrypto | ||||
| 
 | ||||
| class Key { | ||||
|     /// Generate secret key of a specified length | ||||
|     @available(iOS 13.0, *) | ||||
|     static func fromSecureRandom(bitsCount : Int) -> Data { | ||||
|         let symmetricKey = SymmetricKey.init(size: SymmetricKeySize(bitCount: bitsCount)) | ||||
|         return toBytes(key: symmetricKey) | ||||
|     } | ||||
|      | ||||
|     /// Encode key as Data | ||||
|     @available(iOS 13.0, *) | ||||
|     static func toBytes(key: SymmetricKey) -> Data { | ||||
|         let keyBytes = key.withUnsafeBytes | ||||
|             { | ||||
|                 return Data(Array($0)) | ||||
|             } | ||||
|         return keyBytes | ||||
|     } | ||||
|      | ||||
|     /// Derive a new secret key with PBKDF2 algorithm | ||||
|     static func fromPBKDF2(password: String, salt: String, keyBytesCount: Int, iterations: Int, algorithm: HashAlgorithm) -> Data? { | ||||
|         let passwordData = password.data(using: .utf8)! | ||||
|         let saltData = salt.data(using: .utf8)! | ||||
|          | ||||
|         var derivedKeyData = Data(repeating: 0, count: keyBytesCount) | ||||
|         let localDerivedKeyData = derivedKeyData | ||||
|          | ||||
|         let status = derivedKeyData.withUnsafeMutableBytes { (derivedKeyBytes: UnsafeMutableRawBufferPointer) in | ||||
|             saltData.withUnsafeBytes { (saltBytes: UnsafeRawBufferPointer) in | ||||
|                 CCKeyDerivationPBKDF( | ||||
|                     CCPBKDFAlgorithm(kCCPBKDF2), | ||||
|                     password, | ||||
|                     passwordData.count, | ||||
|                     saltBytes.bindMemory(to: UInt8.self).baseAddress, | ||||
|                     saltData.count, | ||||
|                     algorithm.commonCrypto, | ||||
|                     UInt32(iterations), | ||||
|                     derivedKeyBytes.bindMemory(to: UInt8.self).baseAddress, | ||||
|                     localDerivedKeyData.count) | ||||
|             } | ||||
|         } | ||||
|         if (status != kCCSuccess) { | ||||
|             return nil; | ||||
|         } | ||||
|          | ||||
|         return derivedKeyData | ||||
|     } | ||||
| } | ||||
| @ -1,95 +0,0 @@ | ||||
| import Flutter | ||||
| import UIKit | ||||
| 
 | ||||
| @available(iOS 13.0, *) | ||||
| public class SwiftNativeCryptoIosPlugin: NSObject, FlutterPlugin { | ||||
|   public static func register(with registrar: FlutterPluginRegistrar) { | ||||
|     let channel = FlutterMethodChannel(name: "plugins.hugop.cl/native_crypto", binaryMessenger: registrar.messenger()) | ||||
|     let instance = SwiftNativeCryptoIosPlugin() | ||||
|     registrar.addMethodCallDelegate(instance, channel: channel) | ||||
|   } | ||||
| 
 | ||||
|   public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { | ||||
|     switch call.method { | ||||
|     case "digest": | ||||
|         let args : NSDictionary = call.arguments as! NSDictionary | ||||
|          | ||||
|         let data : Data = (args["data"] as! FlutterStandardTypedData).data | ||||
|         let algo : String = args["algorithm"] as! String | ||||
|         let algorithm : HashAlgorithm? = HashAlgorithm.init(rawValue: algo) | ||||
|         // TODO(hpcl): check if algorithm is null | ||||
|         // TODO(hpcl): check if digest is null | ||||
|         result(FlutterStandardTypedData.init(bytes: Hash.digest(data: data, algorithm: algorithm!))) | ||||
|     case "generateSecretKey": | ||||
|         let args : NSDictionary = call.arguments as! NSDictionary | ||||
|          | ||||
|         let bitsCount : NSNumber = args["bitsCount"] as! NSNumber | ||||
|         // TODO(hpcl): check if secure random is null | ||||
|         result(FlutterStandardTypedData.init(bytes: Key.fromSecureRandom(bitsCount: bitsCount.intValue))) | ||||
|     case "generateKeyPair": | ||||
|         result(FlutterStandardTypedData.init(bytes: KeyPair.fromCurve())) | ||||
|     case "pbkdf2": | ||||
|         let args : NSDictionary = call.arguments as! NSDictionary | ||||
|          | ||||
|         let password : String = args["password"] as! String | ||||
|         let salt : String = args["salt"] as! String | ||||
|         let keyBytesCount : NSNumber = args["keyBytesCount"] as! NSNumber | ||||
|         let iterations : NSNumber = args["iterations"] as! NSNumber | ||||
|         let algo : String = args["algorithm"] as! String | ||||
|         let algorithm : HashAlgorithm? = HashAlgorithm.init(rawValue: algo) | ||||
|         // TODO(hpcl): check if algorithm is null | ||||
|         // TODO(hpcl): check if derivation is null | ||||
|         result(FlutterStandardTypedData.init(bytes: Key.fromPBKDF2(password: password, salt: salt, keyBytesCount: keyBytesCount.intValue, iterations: iterations.intValue, algorithm: algorithm!)!)) | ||||
|     case "encrypt": | ||||
|         let args : NSDictionary = call.arguments as! NSDictionary | ||||
|          | ||||
|         let data : Data = (args["data"] as! FlutterStandardTypedData).data | ||||
|         let key : Data = (args["key"] as! FlutterStandardTypedData).data | ||||
|         let algo : String = args["algorithm"] as! String | ||||
|         // TODO(hpcl): check if algorithm is null | ||||
|         // TODO(hpcl): check if ciphertext is null | ||||
|         var ciphertext : Data | ||||
|         switch algo { | ||||
|         case "aes": | ||||
|             ciphertext = AESCipher.encrypt(plaintext: data, key: key)! | ||||
|         case "chachapoly": | ||||
|             ciphertext = CHACHACipher.encrypt(plaintext: data, key: key)! | ||||
|         default: | ||||
|             ciphertext = Data.init(); | ||||
|         } | ||||
|         result(FlutterStandardTypedData.init(bytes: ciphertext)) | ||||
|     case "decrypt": | ||||
|         let args : NSDictionary = call.arguments as! NSDictionary | ||||
|          | ||||
|         let data : Data = (args["data"] as! FlutterStandardTypedData).data | ||||
|         let key : Data = (args["key"] as! FlutterStandardTypedData).data | ||||
|         let algo : String = args["algorithm"] as! String | ||||
|         // TODO(hpcl): check if algorithm is null | ||||
|         // TODO(hpcl): check if ciphertext is null | ||||
|         var ciphertext : Data | ||||
|         switch algo { | ||||
|         case "aes": | ||||
|             ciphertext = AESCipher.decrypt(ciphertext: data, key: key)! | ||||
|         case "chachapoly": | ||||
|             ciphertext = CHACHACipher.decrypt(ciphertext: data, key: key)! | ||||
|         default: | ||||
|             ciphertext = Data.init(); | ||||
|         } | ||||
|         result(FlutterStandardTypedData.init(bytes: ciphertext)) | ||||
|     case "generateSharedSecretKey": | ||||
|         let args : NSDictionary = call.arguments as! NSDictionary | ||||
|          | ||||
|         let salt : Data = (args["salt"] as! FlutterStandardTypedData).data | ||||
|         let keyBytesCount : NSNumber = args["keyBytesCount"] as! NSNumber | ||||
|         let ephemeralPrivateKey : Data = (args["ephemeralPrivateKey"] as! FlutterStandardTypedData).data | ||||
|         let otherPublicKey : Data = (args["otherPublicKey"] as! FlutterStandardTypedData).data | ||||
|         let hkdfAlgorithm : String = args["hkdfAlgorithm"] as! String | ||||
|         let algorithm : HashAlgorithm? = HashAlgorithm.init(rawValue: hkdfAlgorithm) | ||||
|         // TODO(hpcl): check if algorithm is null | ||||
|         // TODO(hpcl): check if generated key is null | ||||
|         result(FlutterStandardTypedData.init(bytes: ECDH.generateSharedSecretKey(salt: salt, hash: algorithm!, keyBytesCount: keyBytesCount.intValue, privateKey: ephemeralPrivateKey, publicKey: otherPublicKey)!)) | ||||
|      | ||||
|     default: result(FlutterMethodNotImplemented) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @ -1,3 +0,0 @@ | ||||
| ## 0.0.1 | ||||
| 
 | ||||
| * TODO: Describe initial release. | ||||
| @ -1 +0,0 @@ | ||||
| TODO: Add your license here. | ||||
| @ -1,18 +0,0 @@ | ||||
| # native_crypto_platform_interface | ||||
| 
 | ||||
| A new flutter plugin project. | ||||
| 
 | ||||
| ## Getting Started | ||||
| 
 | ||||
| This project is a starting point for a Flutter | ||||
| [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 | ||||
| [online documentation](https://flutter.dev/docs), which offers tutorials, | ||||
| samples, guidance on mobile development, and a full API reference. | ||||
| 
 | ||||
| The plugin project was generated without specifying the `--platforms` flag, no platforms are currently supported. | ||||
| To add platforms, run `flutter create -t plugin --platforms <platforms> .` under the same | ||||
| directory. You can also find a detailed instruction on how to add platforms in the `pubspec.yaml` at https://flutter.dev/docs/development/packages-and-plugins/developing-packages#plugin-platforms. | ||||
| @ -1,4 +0,0 @@ | ||||
| include: package:flutter_lints/flutter.yaml | ||||
| 
 | ||||
| # Additional information about this file can be found at | ||||
| # https://dart.dev/guides/language/analysis-options | ||||
| @ -1,107 +0,0 @@ | ||||
| // Author: Hugo Pointcheval | ||||
| // Email: git@pcl.ovh | ||||
| // ----- | ||||
| // File: native_crypto_method_channel.dart | ||||
| // Created Date: 25/12/2021 16:58:04 | ||||
| // Last Modified: 25/12/2021 18:58:53 | ||||
| // ----- | ||||
| // Copyright (c) 2021 | ||||
| 
 | ||||
| import 'dart:typed_data'; | ||||
| 
 | ||||
| import 'package:flutter/foundation.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| 
 | ||||
| import '../native_crypto_platform_interface.dart'; | ||||
| 
 | ||||
| /// An implementation of [NativeCryptoPlatform] that uses method channels. | ||||
| class MethodChannelNativeCrypto extends NativeCryptoPlatform { | ||||
|   /// The method channel used to interact with the native platform. | ||||
|   @visibleForTesting | ||||
|   MethodChannel methodChannel = | ||||
|       const MethodChannel('plugins.hugop.cl/native_crypto'); | ||||
| 
 | ||||
|   @override | ||||
|   Future<Uint8List?> digest(Uint8List data, String algorithm) { | ||||
|     return methodChannel.invokeMethod<Uint8List>( | ||||
|       'digest', | ||||
|       <String, dynamic>{ | ||||
|         'data': data, | ||||
|         'algorithm': algorithm, | ||||
|       }, | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<Uint8List?> generateSecretKey(int bitsCount) { | ||||
|     return methodChannel.invokeMethod<Uint8List>( | ||||
|       'generateSecretKey', | ||||
|       <String, dynamic>{ | ||||
|         'bitsCount': bitsCount, | ||||
|       }, | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<Uint8List?> generateKeyPair() { | ||||
|     return methodChannel.invokeMethod<Uint8List>('generateKeyPair'); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<Uint8List?> pbkdf2(String password, String salt, int keyBytesCount, | ||||
|       int iterations, String algorithm) { | ||||
|     return methodChannel.invokeMethod<Uint8List>( | ||||
|       'pbkdf2', | ||||
|       <String, dynamic>{ | ||||
|         'password': password, | ||||
|         'salt': salt, | ||||
|         'keyBytesCount': keyBytesCount, | ||||
|         'iterations': iterations, | ||||
|         'algorithm': algorithm, | ||||
|       }, | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<Uint8List?> encrypt(Uint8List data, Uint8List key, String algorithm) { | ||||
|     return methodChannel.invokeMethod<Uint8List>( | ||||
|       'encrypt', | ||||
|       <String, dynamic>{ | ||||
|         'data': data, | ||||
|         'key': key, | ||||
|         'algorithm': algorithm, | ||||
|       }, | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<Uint8List?> decrypt(Uint8List data, Uint8List key, String algorithm) { | ||||
|     return methodChannel.invokeMethod<Uint8List>( | ||||
|       'decrypt', | ||||
|       <String, dynamic>{ | ||||
|         'data': data, | ||||
|         'key': key, | ||||
|         'algorithm': algorithm, | ||||
|       }, | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<Uint8List?> generateSharedSecretKey( | ||||
|       Uint8List salt, | ||||
|       int keyBytesCount, | ||||
|       Uint8List ephemeralPrivateKey, | ||||
|       Uint8List otherPublicKey, | ||||
|       String hkdfAlgorithm) { | ||||
|     return methodChannel.invokeMethod<Uint8List>( | ||||
|       'generateSharedSecretKey', | ||||
|       <String, dynamic>{ | ||||
|         'salt': salt, | ||||
|         'keyBytesCount': keyBytesCount, | ||||
|         'ephemeralPrivateKey': ephemeralPrivateKey, | ||||
|         'otherPublicKey': otherPublicKey, | ||||
|         'hkdfAlgorithm': hkdfAlgorithm, | ||||
|       }, | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @ -1,97 +0,0 @@ | ||||
| // Author: Hugo Pointcheval | ||||
| // Email: git@pcl.ovh | ||||
| // ----- | ||||
| // File: platform_interface.dart | ||||
| // Created Date: 25/12/2021 16:52:56 | ||||
| // Last Modified: 25/12/2021 16:53:36 | ||||
| // ----- | ||||
| // Copyright (c) 2021 | ||||
| 
 | ||||
| import 'package:meta/meta.dart'; | ||||
| 
 | ||||
| /// Base class for platform interfaces. | ||||
| /// | ||||
| /// Provides a static helper method for ensuring that platform interfaces are | ||||
| /// implemented using `extends` instead of `implements`. | ||||
| /// | ||||
| /// Platform interface classes are expected to have a private static token object which will be | ||||
| /// be passed to [verifyToken] along with a platform interface object for verification. | ||||
| /// | ||||
| /// Sample usage: | ||||
| /// | ||||
| /// ```dart | ||||
| /// abstract class UrlLauncherPlatform extends PlatformInterface { | ||||
| ///   UrlLauncherPlatform() : super(token: _token); | ||||
| /// | ||||
| ///   static UrlLauncherPlatform _instance = MethodChannelUrlLauncher(); | ||||
| /// | ||||
| ///   static const Object _token = Object(); | ||||
| /// | ||||
| ///   static UrlLauncherPlatform get instance => _instance; | ||||
| /// | ||||
| ///   /// Platform-specific plugins should set this with their own platform-specific | ||||
| ///   /// class that extends [UrlLauncherPlatform] when they register themselves. | ||||
| ///   static set instance(UrlLauncherPlatform instance) { | ||||
| ///     PlatformInterface.verifyToken(instance, _token); | ||||
| ///     _instance = instance; | ||||
| ///   } | ||||
| /// | ||||
| ///  } | ||||
| /// ``` | ||||
| /// | ||||
| /// Mockito mocks of platform interfaces will fail the verification, in test code only it is possible | ||||
| /// to include the [MockPlatformInterfaceMixin] for the verification to be temporarily disabled. See | ||||
| /// [MockPlatformInterfaceMixin] for a sample of using Mockito to mock a platform interface. | ||||
| abstract class PlatformInterface { | ||||
|   /// Pass a private, class-specific `const Object()` as the `token`. | ||||
|   PlatformInterface({required Object token}) : _instanceToken = token; | ||||
| 
 | ||||
|   final Object? _instanceToken; | ||||
| 
 | ||||
|   /// Ensures that the platform instance has a token that matches the | ||||
|   /// provided token and throws [AssertionError] if not. | ||||
|   /// | ||||
|   /// This is used to ensure that implementers are using `extends` rather than | ||||
|   /// `implements`. | ||||
|   /// | ||||
|   /// Subclasses of [MockPlatformInterfaceMixin] are assumed to be valid in debug | ||||
|   /// builds. | ||||
|   /// | ||||
|   /// This is implemented as a static method so that it cannot be overridden | ||||
|   /// with `noSuchMethod`. | ||||
|   static void verifyToken(PlatformInterface instance, Object token) { | ||||
|     if (instance is MockPlatformInterfaceMixin) { | ||||
|       bool assertionsEnabled = false; | ||||
|       assert(() { | ||||
|         assertionsEnabled = true; | ||||
|         return true; | ||||
|       }()); | ||||
|       if (!assertionsEnabled) { | ||||
|         throw AssertionError( | ||||
|             '`MockPlatformInterfaceMixin` is not intended for use in release builds.'); | ||||
|       } | ||||
|       return; | ||||
|     } | ||||
|     if (!identical(token, instance._instanceToken)) { | ||||
|       throw AssertionError( | ||||
|           'Platform interfaces must not be implemented with `implements`'); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /// A [PlatformInterface] mixin that can be combined with mockito's `Mock`. | ||||
| /// | ||||
| /// It passes the [PlatformInterface.verifyToken] check even though it isn't | ||||
| /// using `extends`. | ||||
| /// | ||||
| /// This class is intended for use in tests only. | ||||
| /// | ||||
| /// Sample usage (assuming UrlLauncherPlatform extends [PlatformInterface]: | ||||
| /// | ||||
| /// ```dart | ||||
| /// class UrlLauncherPlatformMock extends Mock | ||||
| ///    with MockPlatformInterfaceMixin | ||||
| ///    implements UrlLauncherPlatform {} | ||||
| /// ``` | ||||
| @visibleForTesting | ||||
| abstract class MockPlatformInterfaceMixin implements PlatformInterface {} | ||||
| @ -1,17 +0,0 @@ | ||||
| name: native_crypto_platform_interface | ||||
| description: A common interface for NativeCrypto plugin. | ||||
| version: 0.0.7 | ||||
| 
 | ||||
| environment: | ||||
|   sdk: ">=2.15.0 <3.0.0" | ||||
|   flutter: ">=2.5.0" | ||||
| 
 | ||||
| dependencies: | ||||
|   flutter: | ||||
|     sdk: flutter | ||||
| 
 | ||||
| dev_dependencies: | ||||
|   flutter_test: | ||||
|     sdk: flutter | ||||
| 
 | ||||
|   flutter_lints: ^1.0.4 | ||||
							
								
								
									
										45
									
								
								packages/native_crypto/CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,45 @@ | ||||
| ## 0.1.1 | ||||
| 
 | ||||
|  - **REFACTOR**: change file organization. | ||||
|  - **PERF**: x10 perfomance improvement on android with better list management. | ||||
|  - **FIX**: benchmark output. | ||||
|  - **FIX**: update and fix code. | ||||
|  - **FEAT**: export new exceptions. | ||||
|  - **FEAT**: add PointyCastle benchmark. | ||||
|  - **DOCS**: add link to readme file. | ||||
| 
 | ||||
| ## 0.1.0 | ||||
| 
 | ||||
| > Breaking changes ! | ||||
| 
 | ||||
| * Follow **Federated Plugin** Flutter standard. | ||||
| 
 | ||||
| ## 0.0.6 | ||||
| 
 | ||||
| * Add KeyPair generation. | ||||
| * Rework exposed API. | ||||
| 
 | ||||
| ## 0.0.5 | ||||
| 
 | ||||
| * New API. | ||||
| * Add digest support. | ||||
| * Clean platform specific code base. | ||||
| 
 | ||||
| ## 0.0.4 | ||||
| 
 | ||||
| * Improve AES. | ||||
| 
 | ||||
| ## 0.0.3 | ||||
| 
 | ||||
| * Add PBKDF2 support. | ||||
| * Add exceptions. | ||||
| * Improve documentation. | ||||
| 
 | ||||
| ## 0.0.2 | ||||
| 
 | ||||
| * Add different key size support. | ||||
| * Improve performances. | ||||
| 
 | ||||
| ## 0.0.1 | ||||
| 
 | ||||
| * First AES cross-platform encryption & decryption implementation. | ||||
							
								
								
									
										23
									
								
								packages/native_crypto/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,23 @@ | ||||
| NativeCrypto | ||||
| 
 | ||||
| MIT License | ||||
| 
 | ||||
| Copyright (c) 2019 - 2022 Hugo Pointcheval | ||||
| 
 | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
| 
 | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
| 
 | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
							
								
								
									
										133
									
								
								packages/native_crypto/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,133 @@ | ||||
| <p align="center"> | ||||
| <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"> | ||||
| <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); | ||||
| ``` | ||||
							
								
								
									
										1
									
								
								packages/native_crypto/analysis_options.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1 @@ | ||||
| include: package:wyatt_analysis/analysis_options.flutter.experimental.yaml | ||||
| @ -44,7 +44,7 @@ android { | ||||
|     defaultConfig { | ||||
|         // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). | ||||
|         applicationId "fr.pointcheval.native_crypto_example" | ||||
|         minSdkVersion flutter.minSdkVersion | ||||
|         minSdkVersion 26 | ||||
|         targetSdkVersion flutter.targetSdkVersion | ||||
|         versionCode flutterVersionCode.toInteger() | ||||
|         versionName flutterVersionName | ||||
| Before Width: | Height: | Size: 544 B After Width: | Height: | Size: 544 B | 
| Before Width: | Height: | Size: 442 B After Width: | Height: | Size: 442 B | 
| Before Width: | Height: | Size: 721 B After Width: | Height: | Size: 721 B | 
| Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB | 
| Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB | 
| @ -1,12 +1,12 @@ | ||||
| buildscript { | ||||
|     ext.kotlin_version = '1.3.50' | ||||
|     ext.kotlin_version = "1.6.21" | ||||
|     repositories { | ||||
|         google() | ||||
|         mavenCentral() | ||||
|     } | ||||
| 
 | ||||
|     dependencies { | ||||
|         classpath 'com.android.tools.build:gradle:4.1.0' | ||||
|         classpath 'com.android.tools.build:gradle:7.2.0' | ||||
|         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" | ||||
|     } | ||||
| } | ||||