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 | # 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 | # 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,intellij+all,kotlin,linux,swift,windows | # 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 ### | ### Dart ### | ||||||
| # See https://www.dartlang.org/guides/libraries/private-files | # See https://www.dartlang.org/guides/libraries/private-files | ||||||
| @ -95,7 +95,33 @@ lib/generated_plugin_registrant.dart | |||||||
| !**/ios/**/default.perspectivev3 | !**/ios/**/default.perspectivev3 | ||||||
| !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages | !/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 | # 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 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 | ||||||
| 
 | 
 | ||||||
| @ -159,6 +185,9 @@ atlassian-ide-plugin.xml | |||||||
| # Cursive Clojure plugin | # Cursive Clojure plugin | ||||||
| .idea/replstate.xml | .idea/replstate.xml | ||||||
| 
 | 
 | ||||||
|  | # SonarLint plugin | ||||||
|  | .idea/sonarlint/ | ||||||
|  | 
 | ||||||
| # Crashlytics plugin (for Android Studio and IntelliJ) | # Crashlytics plugin (for Android Studio and IntelliJ) | ||||||
| com_crashlytics_export_strings.xml | com_crashlytics_export_strings.xml | ||||||
| crashlytics.properties | crashlytics.properties | ||||||
| @ -171,46 +200,27 @@ fabric.properties | |||||||
| # Android studio 3.1+ serialized cache file | # Android studio 3.1+ serialized cache file | ||||||
| .idea/caches/build_file_checksums.ser | .idea/caches/build_file_checksums.ser | ||||||
| 
 | 
 | ||||||
| ### Intellij+all Patch ### | ### JetBrains+all Patch ### | ||||||
| # Ignores the whole .idea folder and all .iml files | # Ignore everything but code style settings and run configurations | ||||||
| # See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 | # that are supposed to be shared within teams. | ||||||
| 
 | 
 | ||||||
| .idea/ | .idea/* | ||||||
| 
 | 
 | ||||||
| # Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 | !.idea/codeStyles | ||||||
| 
 | !.idea/runConfigurations | ||||||
| *.iml |  | ||||||
| modules.xml |  | ||||||
| .idea/misc.xml |  | ||||||
| *.ipr |  | ||||||
| 
 |  | ||||||
| # Sonarlint plugin |  | ||||||
| .idea/sonarlint |  | ||||||
| 
 | 
 | ||||||
| ### Kotlin ### | ### Kotlin ### | ||||||
| # Compiled class file | # Compiled class file | ||||||
| *.class |  | ||||||
| 
 | 
 | ||||||
| # Log file | # Log file | ||||||
| *.log |  | ||||||
| 
 | 
 | ||||||
| # BlueJ files | # BlueJ files | ||||||
| *.ctxt |  | ||||||
| 
 | 
 | ||||||
| # Mobile Tools for Java (J2ME) | # Mobile Tools for Java (J2ME) | ||||||
| .mtj.tmp/ |  | ||||||
| 
 | 
 | ||||||
| # Package Files # | # 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 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml | ||||||
| hs_err_pid* |  | ||||||
| 
 | 
 | ||||||
| ### Linux ### | ### Linux ### | ||||||
| *~ | *~ | ||||||
| @ -236,6 +246,7 @@ hs_err_pid* | |||||||
| # Icon must end with two \r | # Icon must end with two \r | ||||||
| Icon | Icon | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| # Thumbnails | # Thumbnails | ||||||
| ._* | ._* | ||||||
| 
 | 
 | ||||||
| @ -255,7 +266,11 @@ Network Trash Folder | |||||||
| Temporary Items | Temporary Items | ||||||
| .apdisk | .apdisk | ||||||
| 
 | 
 | ||||||
| ### Swift ### | ### macOS Patch ### | ||||||
|  | # iCloud generated files | ||||||
|  | *.icloud | ||||||
|  | 
 | ||||||
|  | ### Objective-C ### | ||||||
| # Xcode | # Xcode | ||||||
| # | # | ||||||
| # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore | ||||||
| @ -287,6 +302,64 @@ DerivedData/ | |||||||
| *.dSYM.zip | *.dSYM.zip | ||||||
| *.dSYM | *.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 | ## Playgrounds | ||||||
| timeline.xctimeline | timeline.xctimeline | ||||||
| playground.xcworkspace | playground.xcworkspace | ||||||
| @ -315,7 +388,6 @@ playground.xcworkspace | |||||||
| # Add this line if you want to avoid checking in source code from Carthage dependencies. | # Add this line if you want to avoid checking in source code from Carthage dependencies. | ||||||
| # Carthage/Checkouts | # Carthage/Checkouts | ||||||
| 
 | 
 | ||||||
| Carthage/Build/ |  | ||||||
| 
 | 
 | ||||||
| # Accio dependency management | # Accio dependency management | ||||||
| Dependencies/ | Dependencies/ | ||||||
| @ -327,16 +399,11 @@ Dependencies/ | |||||||
| # For more information about the recommended setup visit: | # For more information about the recommended setup visit: | ||||||
| # https://docs.fastlane.tools/best-practices/source-control/#source-control | # https://docs.fastlane.tools/best-practices/source-control/#source-control | ||||||
| 
 | 
 | ||||||
| fastlane/report.xml |  | ||||||
| fastlane/Preview.html |  | ||||||
| fastlane/screenshots/**/*.png |  | ||||||
| fastlane/test_output |  | ||||||
| 
 | 
 | ||||||
| # Code Injection | # Code Injection | ||||||
| # After new code Injection tools there's a generated folder /iOSInjectionProject | # After new code Injection tools there's a generated folder /iOSInjectionProject | ||||||
| # https://github.com/johnno1962/injectionforxcode | # https://github.com/johnno1962/injectionforxcode | ||||||
| 
 | 
 | ||||||
| iOSInjectionProject/ |  | ||||||
| 
 | 
 | ||||||
| ### VisualStudioCode ### | ### VisualStudioCode ### | ||||||
| .vscode/* | .vscode/* | ||||||
| @ -344,18 +411,24 @@ iOSInjectionProject/ | |||||||
| !.vscode/tasks.json | !.vscode/tasks.json | ||||||
| !.vscode/launch.json | !.vscode/launch.json | ||||||
| !.vscode/extensions.json | !.vscode/extensions.json | ||||||
| *.code-workspace | !.vscode/*.code-snippets | ||||||
| 
 | 
 | ||||||
| # Local History for Visual Studio Code | # Local History for Visual Studio Code | ||||||
| .history/ | .history/ | ||||||
| 
 | 
 | ||||||
|  | # Built Visual Studio Code Extensions | ||||||
|  | *.vsix | ||||||
|  | 
 | ||||||
| ### VisualStudioCode Patch ### | ### VisualStudioCode Patch ### | ||||||
| # Ignore all local history of files | # Ignore all local history of files | ||||||
| .history | .history | ||||||
| .ionide | .ionide | ||||||
| 
 | 
 | ||||||
| # Support for Project snippet scope | # Support for Project snippet scope | ||||||
| !.vscode/*.code-snippets | .vscode/*.code-snippets | ||||||
|  | 
 | ||||||
|  | # Ignore code-workspaces | ||||||
|  | *.code-workspace | ||||||
| 
 | 
 | ||||||
| ### Windows ### | ### Windows ### | ||||||
| # Windows thumbnail cache files | # Windows thumbnail cache files | ||||||
| @ -383,7 +456,27 @@ $RECYCLE.BIN/ | |||||||
| # Windows shortcuts | # Windows shortcuts | ||||||
| *.lnk | *.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) | # 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 { |     defaultConfig { | ||||||
|         // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). |         // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). | ||||||
|         applicationId "fr.pointcheval.native_crypto_example" |         applicationId "fr.pointcheval.native_crypto_example" | ||||||
|         minSdkVersion flutter.minSdkVersion |         minSdkVersion 26 | ||||||
|         targetSdkVersion flutter.targetSdkVersion |         targetSdkVersion flutter.targetSdkVersion | ||||||
|         versionCode flutterVersionCode.toInteger() |         versionCode flutterVersionCode.toInteger() | ||||||
|         versionName flutterVersionName |         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 { | buildscript { | ||||||
|     ext.kotlin_version = '1.3.50' |     ext.kotlin_version = "1.6.21" | ||||||
|     repositories { |     repositories { | ||||||
|         google() |         google() | ||||||
|         mavenCentral() |         mavenCentral() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     dependencies { |     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" |         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" | ||||||
|     } |     } | ||||||
| } | } | ||||||