From 6732b25b6e10b098e49e9a3d0ffd685e9f377351 Mon Sep 17 00:00:00 2001 From: drmirk Date: Mon, 1 Jun 2026 01:01:21 +0600 Subject: [PATCH 1/3] Chore: Migrated to built-in Kotlin --- cryptography_flutter/android/build.gradle | 26 +++++++++++++------ .../example/android/app/build.gradle.kts | 16 ++++++++---- .../android/app/build.gradle.kts | 16 ++++++++---- .../android/gradle.properties | 4 +++ 4 files changed, 44 insertions(+), 18 deletions(-) diff --git a/cryptography_flutter/android/build.gradle b/cryptography_flutter/android/build.gradle index a13b068..9861a8d 100644 --- a/cryptography_flutter/android/build.gradle +++ b/cryptography_flutter/android/build.gradle @@ -22,7 +22,12 @@ allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +def agpVersion = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION +def agpMajor = agpVersion.tokenize('.')[0].toInteger() +if (agpMajor < 9) { + apply plugin: "kotlin-android" +} android { namespace = "dev.dint.cryptography_flutter" @@ -34,13 +39,9 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17 - } - sourceSets { - main.java.srcDirs += "src/main/kotlin" - test.java.srcDirs += "src/test/kotlin" + main.kotlin.srcDirs += "src/main/kotlin" + test.kotlin.srcDirs += "src/test/kotlin" } defaultConfig { @@ -65,6 +66,15 @@ android { } } +// Access the extension by name to be safe in Groovy +if (project.extensions.findByName("kotlin")) { + kotlin { + compilerOptions { + jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) + } + } +} + dependencies { implementation "androidx.security:security-crypto:1.1.0" -} \ No newline at end of file +} diff --git a/cryptography_flutter/example/android/app/build.gradle.kts b/cryptography_flutter/example/android/app/build.gradle.kts index 72f259d..26b955b 100644 --- a/cryptography_flutter/example/android/app/build.gradle.kts +++ b/cryptography_flutter/example/android/app/build.gradle.kts @@ -1,10 +1,14 @@ plugins { id("com.android.application") - id("kotlin-android") // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id("dev.flutter.flutter-gradle-plugin") } +val agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.substringBefore('.').toInt() +if (agpMajor < 9) { + apply(plugin = "org.jetbrains.kotlin.android") +} + android { namespace = "dev.dint.cryptography_flutter_example" compileSdk = flutter.compileSdkVersion @@ -15,10 +19,6 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() - } - defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "dev.dint.cryptography_flutter_example" @@ -39,6 +39,12 @@ android { } } +project.extensions.configure(org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension::class.java) { + compilerOptions { + jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) + } +} + flutter { source = "../.." } diff --git a/cryptography_flutter_integration_test/android/app/build.gradle.kts b/cryptography_flutter_integration_test/android/app/build.gradle.kts index 2991108..2802890 100644 --- a/cryptography_flutter_integration_test/android/app/build.gradle.kts +++ b/cryptography_flutter_integration_test/android/app/build.gradle.kts @@ -1,10 +1,14 @@ plugins { id("com.android.application") - id("kotlin-android") // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id("dev.flutter.flutter-gradle-plugin") } +val agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.substringBefore('.').toInt() +if (agpMajor < 9) { + apply(plugin = "org.jetbrains.kotlin.android") +} + android { namespace = "com.example.cryptography_flutter_integration_test" compileSdk = flutter.compileSdkVersion @@ -15,10 +19,6 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() - } - defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "com.example.cryptography_flutter_integration_test" @@ -39,6 +39,12 @@ android { } } +project.extensions.configure(org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension::class.java) { + compilerOptions { + jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) + } +} + flutter { source = "../.." } diff --git a/cryptography_flutter_integration_test/android/gradle.properties b/cryptography_flutter_integration_test/android/gradle.properties index fbee1d8..d5da727 100644 --- a/cryptography_flutter_integration_test/android/gradle.properties +++ b/cryptography_flutter_integration_test/android/gradle.properties @@ -1,2 +1,6 @@ org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true +# This builtInKotlin flag was added automatically by Flutter migrator +android.builtInKotlin=false +# This newDsl flag was added automatically by Flutter migrator +android.newDsl=false From 16990f668e50b903a380c2e696f5024fa6d2e0fc Mon Sep 17 00:00:00 2001 From: drmirk Date: Mon, 1 Jun 2026 01:08:48 +0600 Subject: [PATCH 2/3] BugFix: Bad state: Secret key has been destroyed --- cryptography/lib/src/cryptography/secret_key.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/cryptography/lib/src/cryptography/secret_key.dart b/cryptography/lib/src/cryptography/secret_key.dart index 88f5264..7b567e0 100644 --- a/cryptography/lib/src/cryptography/secret_key.dart +++ b/cryptography/lib/src/cryptography/secret_key.dart @@ -179,6 +179,7 @@ class SecretKeyData extends SecretKey { return false; } return other is SecretKeyData && + !other.hasBeenDestroyed && constantTimeBytesEquality.equals(bytes, other.bytes); } From 01dac300737cdc6dc08d52e6c69bf0f106edc183 Mon Sep 17 00:00:00 2001 From: drmirk Date: Mon, 1 Jun 2026 01:26:04 +0600 Subject: [PATCH 3/3] BugFix: BigInteger was initialized with byte arrays, that could be interpreted as negative numbers, 1 explicitly informs to treat the byte array as positive --- .../cryptography_flutter/CryptographyFlutterPlugin.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cryptography_flutter/android/src/main/kotlin/dev/dint/cryptography_flutter/CryptographyFlutterPlugin.kt b/cryptography_flutter/android/src/main/kotlin/dev/dint/cryptography_flutter/CryptographyFlutterPlugin.kt index c920921..fc77d99 100644 --- a/cryptography_flutter/android/src/main/kotlin/dev/dint/cryptography_flutter/CryptographyFlutterPlugin.kt +++ b/cryptography_flutter/android/src/main/kotlin/dev/dint/cryptography_flutter/CryptographyFlutterPlugin.kt @@ -321,13 +321,13 @@ class CryptographyFlutterPlugin : FlutterPlugin, MethodCallHandler { parameters.init(ECGenParameterSpec(curve)) val ecParameters = parameters.getParameterSpec(ECParameterSpec::class.java) val privateKeySpec = ECPrivateKeySpec( - BigInteger(d), + BigInteger(1, d), ecParameters ) val remoteX = call.argument("remoteX")!! val remoteY = call.argument("remoteY")!! - val remotePublicPoint = ECPoint(BigInteger(remoteX), BigInteger(remoteY)) + val remotePublicPoint = ECPoint(BigInteger(1, remoteX), BigInteger(1, remoteY)) val remotePublicKeySpec = ECPublicKeySpec(remotePublicPoint, ecParameters) val keyFactory = when (provider) { @@ -386,7 +386,7 @@ class CryptographyFlutterPlugin : FlutterPlugin, MethodCallHandler { parameters.init(ECGenParameterSpec(curve)) val ecParameters = parameters.getParameterSpec(ECParameterSpec::class.java) val privateKeySpec = ECPrivateKeySpec( - BigInteger(d), + BigInteger(1, d), ecParameters ) @@ -430,8 +430,8 @@ class CryptographyFlutterPlugin : FlutterPlugin, MethodCallHandler { }!! val message = call.argument("data")!! - val x = BigInteger(call.argument("x")!!) - val y = BigInteger(call.argument("y")!!) + val x = BigInteger(1, call.argument("x")!!) + val y = BigInteger(1, call.argument("y")!!) val verifiedSignatureBytes = call.argument("signature")!! val provider = call.argument("androidProvider")