From 1e4c56e58a92bd7b51092e0eb2ea3ed24eb7b306 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Sat, 17 Oct 2020 10:03:27 +0200 Subject: [PATCH 01/51] make tampered tests fail less by modifying more bytes --- .../AuthenticatedEncryptionWithAssociatedDataTest.kt | 12 ++++++++++++ .../ionspin/kotlin/crypto/secretbox/SecretBoxTest.kt | 4 ++++ .../kotlin/crypto/secretstream/SecretStreamTest.kt | 2 ++ .../ionspin/kotlin/crypto/signature/SignatureTest.kt | 4 ++++ 4 files changed, 22 insertions(+) diff --git a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/aead/AuthenticatedEncryptionWithAssociatedDataTest.kt b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/aead/AuthenticatedEncryptionWithAssociatedDataTest.kt index c6de2bf..fe3a6b5 100644 --- a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/aead/AuthenticatedEncryptionWithAssociatedDataTest.kt +++ b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/aead/AuthenticatedEncryptionWithAssociatedDataTest.kt @@ -53,6 +53,8 @@ class AuthenticatedEncryptionWithAssociatedDataTest { assertFailsWith(AeadCorrupedOrTamperedDataException::class) { val tamperedTag = encrypted.copyOf() tamperedTag[3] = 0U + tamperedTag[1] = 0U + tamperedTag[0] = 0U AuthenticatedEncryptionWithAssociatedData.xChaCha20Poly1305IetfDecrypt( tamperedTag, associatedData, @@ -105,6 +107,8 @@ class AuthenticatedEncryptionWithAssociatedDataTest { assertFailsWith(AeadCorrupedOrTamperedDataException::class) { val tamperedTag = encrypted.tag.copyOf() tamperedTag[3] = 0U + tamperedTag[1] = 0U + tamperedTag[0] = 0U AuthenticatedEncryptionWithAssociatedData.xChaCha20Poly1305IetfDecryptDetached( encrypted.data, tamperedTag, @@ -156,6 +160,8 @@ class AuthenticatedEncryptionWithAssociatedDataTest { assertFailsWith(AeadCorrupedOrTamperedDataException::class) { val tamperedTag = encrypted.copyOf() tamperedTag[3] = 0U + tamperedTag[1] = 0U + tamperedTag[0] = 0U AuthenticatedEncryptionWithAssociatedData.chaCha20Poly1305IetfDecrypt( tamperedTag, associatedData, @@ -207,6 +213,8 @@ class AuthenticatedEncryptionWithAssociatedDataTest { assertFailsWith(AeadCorrupedOrTamperedDataException::class) { val tamperedTag = encrypted.tag.copyOf() tamperedTag[3] = 0U + tamperedTag[1] = 0U + tamperedTag[0] = 0U AuthenticatedEncryptionWithAssociatedData.chaCha20Poly1305IetfDecryptDetached( encrypted.data, tamperedTag, @@ -257,6 +265,8 @@ class AuthenticatedEncryptionWithAssociatedDataTest { assertFailsWith(AeadCorrupedOrTamperedDataException::class) { val tamperedTag = encrypted.copyOf() tamperedTag[3] = 0U + tamperedTag[1] = 0U + tamperedTag[0] = 0U AuthenticatedEncryptionWithAssociatedData.chaCha20Poly1305Decrypt( tamperedTag, associatedData, @@ -307,6 +317,8 @@ class AuthenticatedEncryptionWithAssociatedDataTest { assertFailsWith(AeadCorrupedOrTamperedDataException::class) { val tamperedTag = encrypted.tag.copyOf() tamperedTag[3] = 0U + tamperedTag[1] = 0U + tamperedTag[0] = 0U AuthenticatedEncryptionWithAssociatedData.chaCha20Poly1305DecryptDetached( encrypted.data, tamperedTag, diff --git a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/secretbox/SecretBoxTest.kt b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/secretbox/SecretBoxTest.kt index caf19a5..bae56b1 100644 --- a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/secretbox/SecretBoxTest.kt +++ b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/secretbox/SecretBoxTest.kt @@ -40,6 +40,8 @@ class SecretBoxTest { assertFailsWith(SecretBoxCorruptedOrTamperedDataExceptionOrInvalidKey::class) { val tamperedTag = encrypted.copyOf() tamperedTag[2] = 0U + tamperedTag[1] = 0U + tamperedTag[0] = 0U SecretBox.openEasy(tamperedTag, nonce, key) } } @@ -73,6 +75,8 @@ class SecretBoxTest { assertFailsWith(SecretBoxCorruptedOrTamperedDataExceptionOrInvalidKey::class) { val tamperedTag = encrypted.tag.copyOf() tamperedTag[2] = 0U + tamperedTag[1] = 0U + tamperedTag[0] = 0U SecretBox.openDetached(encrypted.data, tamperedTag, nonce, key) } } diff --git a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/secretstream/SecretStreamTest.kt b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/secretstream/SecretStreamTest.kt index 574891f..a000e99 100644 --- a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/secretstream/SecretStreamTest.kt +++ b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/secretstream/SecretStreamTest.kt @@ -75,6 +75,8 @@ class SecretStreamTest { } assertFailsWith(SecretStreamCorruptedOrTamperedDataException::class) { encrypted[encrypted.size - 5] = 0U + encrypted[encrypted.size - 4] = 0U + encrypted[encrypted.size - 3] = 0U val decryptState = SecretStream.xChaCha20Poly1305InitPull(key, stateAndHeader.header) val decrypted = SecretStream.xChaCha20Poly1305Pull(decryptState.state, encrypted, ubyteArrayOf()) diff --git a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/signature/SignatureTest.kt b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/signature/SignatureTest.kt index dca334d..d82d939 100644 --- a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/signature/SignatureTest.kt +++ b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/signature/SignatureTest.kt @@ -24,6 +24,8 @@ class SignatureTest { assertFailsWith(InvalidSignatureException::class) { val tamperedMessage = signedMessage.copyOf() tamperedMessage[crypto_sign_BYTES + 1] = 0U + tamperedMessage[crypto_sign_BYTES + 2] = 0U + tamperedMessage[crypto_sign_BYTES + 3] = 0U Signature.open(tamperedMessage, keys.publicKey) } } @@ -65,6 +67,8 @@ class SignatureTest { assertFailsWith(InvalidSignatureException::class) { val tamperedSignature = signature.copyOf() tamperedSignature[crypto_sign_BYTES - 1] = 0U + tamperedSignature[crypto_sign_BYTES - 2] = 0U + tamperedSignature[crypto_sign_BYTES - 3] = 0U Signature.finalVerify(verificationState, tamperedSignature, keys.publicKey) } } From 14cf103ac7a8ca64afcf720cffbbd067dd866a5d Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Sat, 17 Oct 2020 11:41:38 +0200 Subject: [PATCH 02/51] Added android sample app --- buildSrc/src/main/kotlin/Deps.kt | 21 +++ .../build.gradle.kts | 2 +- sample/build.gradle.kts | 131 ++++++++++++- sample/src/androidMain/AndroidManifest.xml | 29 +++ .../sample/LibsodiumBindingsSampleApp.kt | 31 ++++ .../kotlin/crypto/sample/MainActivity.kt | 26 +++ .../drawable-v24/ic_launcher_foreground.xml | 34 ++++ .../res/drawable/ic_launcher_background.xml | 174 ++++++++++++++++++ .../androidMain/res/layout/activity_main.xml | 19 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 9 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 9 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3593 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5339 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2636 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3388 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4926 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7472 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7909 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11873 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10652 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16570 bytes sample/src/androidMain/res/values/colors.xml | 11 ++ sample/src/androidMain/res/values/dimen.xml | 8 + sample/src/androidMain/res/values/strings.xml | 7 + sample/src/androidMain/res/values/styles.xml | 26 +++ .../com/ionspin/kotlin/core/Placeholder | 0 26 files changed, 534 insertions(+), 3 deletions(-) create mode 100644 sample/src/androidMain/AndroidManifest.xml create mode 100644 sample/src/androidMain/kotlin/com/ionspin/kotlin/crypto/sample/LibsodiumBindingsSampleApp.kt create mode 100644 sample/src/androidMain/kotlin/com/ionspin/kotlin/crypto/sample/MainActivity.kt create mode 100644 sample/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 sample/src/androidMain/res/drawable/ic_launcher_background.xml create mode 100644 sample/src/androidMain/res/layout/activity_main.xml create mode 100644 sample/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 sample/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 sample/src/androidMain/res/mipmap-hdpi/ic_launcher.png create mode 100644 sample/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 sample/src/androidMain/res/mipmap-mdpi/ic_launcher.png create mode 100644 sample/src/androidMain/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 sample/src/androidMain/res/mipmap-xhdpi/ic_launcher.png create mode 100644 sample/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 sample/src/androidMain/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 sample/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 sample/src/androidMain/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 sample/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 sample/src/androidMain/res/values/colors.xml create mode 100644 sample/src/androidMain/res/values/dimen.xml create mode 100644 sample/src/androidMain/res/values/strings.xml create mode 100644 sample/src/androidMain/res/values/styles.xml create mode 100644 sample/src/androidTest/kotlin/com/ionspin/kotlin/core/Placeholder diff --git a/buildSrc/src/main/kotlin/Deps.kt b/buildSrc/src/main/kotlin/Deps.kt index e8b420b..a29e32c 100644 --- a/buildSrc/src/main/kotlin/Deps.kt +++ b/buildSrc/src/main/kotlin/Deps.kt @@ -30,6 +30,13 @@ object Versions { val kotlinPoet = "1.6.0" + val sharedModule = "0.1.0-SNAPSHOT" + + val ktor = "1.3.2" + + val timber = "4.7.1" + + } @@ -52,6 +59,8 @@ object Deps { val kotlinBigNum = "com.ionspin.kotlin:bignum:${Versions.kotlinBigNumVersion}" val apiProject = ":multiplatform-crypto-api" + + val sharedModule = "com.ionspin.kotlin.crypto.sample:shared:${Versions.sharedModule}" } object Js { @@ -100,6 +109,15 @@ object Deps { } + object Android { + val coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-android:${Versions.kotlinCoroutines}" + val ktorClientOkHttp = "io.ktor:ktor-client-okhttp:${Versions.ktor}" + val ktorClient = "io.ktor:ktor-client-android:${Versions.ktor}" + val ktorClientSerialization = "io.ktor:ktor-client-serialization-jvm:${Versions.ktor}" + val serialization = "org.jetbrains.kotlinx:kotlinx-serialization-runtime:${Versions.kotlinSerialization}" + val timber = "com.jakewharton.timber:timber:${Versions.timber}" + } + } @@ -113,5 +131,8 @@ object PluginsDeps { val taskTree = "com.dorongold.task-tree" val androidLibrary = "com.android.library" val kotlinAndroidExtensions = "kotlin-android-extensions" + val androidApplication = "com.android.application" + val kotlinAndroid = "kotlin-android" + val kapt = "kotlin-kapt" } diff --git a/multiplatform-crypto-libsodium-bindings/build.gradle.kts b/multiplatform-crypto-libsodium-bindings/build.gradle.kts index f91c1bd..d38fad7 100644 --- a/multiplatform-crypto-libsodium-bindings/build.gradle.kts +++ b/multiplatform-crypto-libsodium-bindings/build.gradle.kts @@ -60,7 +60,7 @@ println("Idea active: $ideaActive") android { compileSdkVersion(29) defaultConfig { - minSdkVersion(24) + minSdkVersion(21) targetSdkVersion(29) versionCode = 1 versionName = "1.0" diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 50171a8..ec6f87b 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -22,9 +22,11 @@ import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest plugins { kotlin(PluginsDeps.multiplatform) + id(PluginsDeps.kapt) + id(PluginsDeps.androidApplication) + id(PluginsDeps.kotlinAndroidExtensions) id (PluginsDeps.mavenPublish) id (PluginsDeps.signing) - id (PluginsDeps.node) version Versions.nodePlugin } val sonatypeStaging = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" @@ -40,10 +42,11 @@ val sonatypeUsernameEnv : String? = System.getenv()["SONATYPE_USERNAME"] repositories { mavenCentral() jcenter() + maven("https://dl.bintray.com/terl/lazysodium-maven") } group = "com.ionspin.kotlin" -version = "0.0.4-SNAPSHOT" +version = "0.1.0-SNAPSHOT" val ideaActive = System.getProperty("idea.active") == "true" @@ -69,6 +72,9 @@ kotlin { } } + + android() + linuxX64("linux") { binaries { @@ -125,6 +131,23 @@ kotlin { } } } + + // select iOS target platform depending on the Xcode environment variables + val iOSTarget: (String, org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget.() -> Unit) -> org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget = + if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true) + ::iosArm64 + else + ::iosX64 + + iOSTarget("ios") { + binaries { + framework { + baseName = "LibsodiumBindingsSampleApplication" + export(Deps.Common.sharedModule) + freeCompilerArgs += ("-Xobjc-generics") + } + } + } } runningOnWindows { @@ -154,6 +177,34 @@ kotlin { } } + val androidMain by getting { + + dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:${Versions.kotlin}") + implementation("androidx.appcompat:appcompat:1.2.0") + implementation("androidx.core:core-ktx:1.3.2") + implementation("androidx.constraintlayout:constraintlayout:2.0.2") + implementation("com.google.android.material:material:1.3.0-alpha03") +// implementation("androidx.ui:ui-tooling:$composeDevVersion") +// implementation("androidx.ui:ui-layout:$composeDevVersion") +// implementation("androidx.ui:ui-material:$composeDevVersion") +// implementation("androidx.ui:ui-foundation:$composeDevVersion") +// implementation("androidx.ui:ui-framework:$composeDevVersion") + implementation(Deps.Android.coroutines) + implementation(Deps.Android.timber) +// implementation("androidx.compose:compose-runtime:$composeDevVersion") + } + } + val androidTest by getting { + dependencies { + implementation(kotlin(Deps.Jvm.test)) + implementation(kotlin(Deps.Jvm.testJUnit)) + implementation(Deps.Jvm.coroutinesTest) + implementation(kotlin(Deps.Jvm.reflection)) + implementation(Deps.Jvm.coroutinesCore) + } + } + val nativeMain by creating { dependsOn(commonMain) @@ -265,6 +316,82 @@ kotlin { } +android { + compileSdkVersion(29) + defaultConfig { + applicationId = "com.ionspin.kotlin.crypto.sample" + minSdkVersion(21) + targetSdkVersion(29) + versionCode = 1 + versionName = "1.0" + testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + getByName("release") { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + } + } + sourceSets { + val main by getting + main.manifest.srcFile("src/androidMain/AndroidManifest.xml") + main.java.srcDirs("src/androidMain/kotlin") + main.res.srcDirs("src/androidMain/res") + } + packagingOptions { + exclude("META-INF/library_release.kotlin_module") + exclude("META-INF/kotlinx-serialization-runtime.kotlin_module") + exclude("META-INF/ktor-http.kotlin_module") + exclude("META-INF/ktor-utils.kotlin_module") + exclude("META-INF/ktor-io.kotlin_module") + exclude("META-INF/ktor-*") + } + compileOptions { + setSourceCompatibility(JavaVersion.VERSION_1_8) + setTargetCompatibility(JavaVersion.VERSION_1_8) + } + tasks.withType { + kotlinOptions { + jvmTarget = "1.8" + } + } + +// buildFeatures { +// // Enables Jetpack Compose for this module +// this.compose = true +// } + +// composeOptions { +// kotlinCompilerExtensionVersion = "0.1.0-dev05" +// } + + // Magic for compose dev08, but it doesn't work with serialization plugin because of IR. Leave here for future reference. +// project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java) +// .configureEach { +// println("Task: $this") +// if (this.name.contains("Android")) { +// println("Setting plugins: $this") +// this.kotlinOptions.freeCompilerArgs += listOf( +// "-P", +// "plugin:androidx.compose.plugins.idea:enabled=true" +// ) +// this.kotlinOptions.freeCompilerArgs += "-Xplugin=${project.rootDir}/compose-compiler-0.1.0-dev08.jar" +// this.kotlinOptions.freeCompilerArgs += "-Xuse-ir" +// } +// } +// project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java) +// .forEach { compile -> +// compile.kotlinOptions.freeCompilerArgs += listOf( +// "-P", +// "plugin:androidx.compose.plugins.idea:enabled=true" +// ) +// compile.kotlinOptions.freeCompilerArgs += "-Xplugin=${project.rootDir}/compose-compiler-0.1.0-dev08.jar" +// compile.kotlinOptions.freeCompilerArgs += "-Xuse-ir" +// println("Compile: $compile") +// println("Compiler free args ${compile.kotlinOptions.freeCompilerArgs}") +// } +} + tasks { diff --git a/sample/src/androidMain/AndroidManifest.xml b/sample/src/androidMain/AndroidManifest.xml new file mode 100644 index 0000000..1cf861a --- /dev/null +++ b/sample/src/androidMain/AndroidManifest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + diff --git a/sample/src/androidMain/kotlin/com/ionspin/kotlin/crypto/sample/LibsodiumBindingsSampleApp.kt b/sample/src/androidMain/kotlin/com/ionspin/kotlin/crypto/sample/LibsodiumBindingsSampleApp.kt new file mode 100644 index 0000000..38ebe9d --- /dev/null +++ b/sample/src/androidMain/kotlin/com/ionspin/kotlin/crypto/sample/LibsodiumBindingsSampleApp.kt @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Ugljesa Jovanovic (ugljesa.jovanovic@ionspin.com) + */ + +package com.ionspin.kotlin.crypto.sample + +import android.app.Application +import com.ionspin.kotlin.crypto.LibsodiumInitializer +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.async +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import timber.log.Timber + +/** + * @author [Ugljesa Jovanovic](ugi@mobilabsolutions.com) + */ +class LibsodiumBindingsSampleApp : Application() { + + override fun onCreate() { + super.onCreate() + Timber.plant(Timber.DebugTree()) + val initialization = GlobalScope.async { + LibsodiumInitializer.initialize() + } + runBlocking { + initialization.await() + } + + } +} diff --git a/sample/src/androidMain/kotlin/com/ionspin/kotlin/crypto/sample/MainActivity.kt b/sample/src/androidMain/kotlin/com/ionspin/kotlin/crypto/sample/MainActivity.kt new file mode 100644 index 0000000..f484737 --- /dev/null +++ b/sample/src/androidMain/kotlin/com/ionspin/kotlin/crypto/sample/MainActivity.kt @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2020 Ugljesa Jovanovic (ugljesa.jovanovic@ionspin.com) + */ + +package com.ionspin.kotlin.crypto.sample + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.ionspin.kotlin.crypto.hash.Hash +import com.ionspin.kotlin.crypto.util.encodeToUByteArray +import com.ionspin.kotlin.crypto.util.toHexString +import kotlinx.android.synthetic.main.activity_main.* + +class MainActivity : AppCompatActivity() { + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + val hash = Hash.sha512("123".encodeToUByteArray()) + helloWorldTextView.setText("Hash (SHA512) of 123: ${hash.toHexString()}") + + + } + +} diff --git a/sample/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml b/sample/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..c82f3ae --- /dev/null +++ b/sample/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/sample/src/androidMain/res/drawable/ic_launcher_background.xml b/sample/src/androidMain/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..5aac4c9 --- /dev/null +++ b/sample/src/androidMain/res/drawable/ic_launcher_background.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sample/src/androidMain/res/layout/activity_main.xml b/sample/src/androidMain/res/layout/activity_main.xml new file mode 100644 index 0000000..2510cdc --- /dev/null +++ b/sample/src/androidMain/res/layout/activity_main.xml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/sample/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml b/sample/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..30ebbd4 --- /dev/null +++ b/sample/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/sample/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml b/sample/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..30ebbd4 --- /dev/null +++ b/sample/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/sample/src/androidMain/res/mipmap-hdpi/ic_launcher.png b/sample/src/androidMain/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a571e60098c92c2baca8a5df62f2929cbff01b52 GIT binary patch literal 3593 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 P00000NkvXXu0mjfP=x?Y literal 0 HcmV?d00001 diff --git a/sample/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png b/sample/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..61da551c5594a1f9d26193983d2cd69189014603 GIT binary patch literal 5339 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 literal 0 HcmV?d00001 diff --git a/sample/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png b/sample/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b216f2d313cc673d8b8c4da591c174ebed52795c GIT binary patch literal 11873 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 literal 0 HcmV?d00001 diff --git a/sample/src/androidMain/res/values/colors.xml b/sample/src/androidMain/res/values/colors.xml new file mode 100644 index 0000000..56c95a6 --- /dev/null +++ b/sample/src/androidMain/res/values/colors.xml @@ -0,0 +1,11 @@ + + + + + #0069A1 + #004970 + #FF5722 + #FF656565 + diff --git a/sample/src/androidMain/res/values/dimen.xml b/sample/src/androidMain/res/values/dimen.xml new file mode 100644 index 0000000..971418e --- /dev/null +++ b/sample/src/androidMain/res/values/dimen.xml @@ -0,0 +1,8 @@ + + + + + 16dp + \ No newline at end of file diff --git a/sample/src/androidMain/res/values/strings.xml b/sample/src/androidMain/res/values/strings.xml new file mode 100644 index 0000000..231daf2 --- /dev/null +++ b/sample/src/androidMain/res/values/strings.xml @@ -0,0 +1,7 @@ + + + + Lbsodium Bindings Sample + diff --git a/sample/src/androidMain/res/values/styles.xml b/sample/src/androidMain/res/values/styles.xml new file mode 100644 index 0000000..cd9e26a --- /dev/null +++ b/sample/src/androidMain/res/values/styles.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + diff --git a/sample/src/androidTest/kotlin/com/ionspin/kotlin/core/Placeholder b/sample/src/androidTest/kotlin/com/ionspin/kotlin/core/Placeholder new file mode 100644 index 0000000..e69de29 From 0a52a55a9d25304149d4b8e4dfa29b4af3fe8965 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Sat, 17 Oct 2020 17:39:53 +0200 Subject: [PATCH 03/51] Add js sample (node and browser) --- build.gradle.kts | 3 +- buildSrc/build.gradle.kts | 6 +- buildSrc/src/main/kotlin/Deps.kt | 26 +++++- multiplatform-crypto/build.gradle.kts | 1 + sample/build.gradle.kts | 89 ++++++++++++++++++- .../com/ionspin/kotlin/crypto/sample/App.kt | 35 ++++++++ .../com/ionspin/kotlin/crypto/sample/Main.kt | 28 ++++++ sample/src/jsMain/resources/index.html | 12 +++ sample/webpack.config.d/devServer.config.js | 7 ++ 9 files changed, 198 insertions(+), 9 deletions(-) create mode 100644 sample/src/jsMain/kotlin/com/ionspin/kotlin/crypto/sample/App.kt create mode 100644 sample/src/jsMain/kotlin/com/ionspin/kotlin/crypto/sample/Main.kt create mode 100644 sample/src/jsMain/resources/index.html create mode 100644 sample/webpack.config.d/devServer.config.js diff --git a/build.gradle.kts b/build.gradle.kts index 7a49d0a..cdadcc4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -15,9 +15,8 @@ * */ - buildscript { - + repositories { mavenCentral() google() diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 2658b0f..409bfe9 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -17,7 +17,9 @@ plugins { + `java-gradle-plugin` `kotlin-dsl` + `kotlin-dsl-precompiled-script-plugins` } repositories { @@ -29,8 +31,8 @@ repositories { } dependencies { - implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.0-rc") - implementation("com.android.tools.build:gradle:4.0.1") + implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.10") + implementation("com.android.tools.build:gradle:4.0.2") } System.setProperty("PROJECT_PATH", project.projectDir.parentFile.toString()) diff --git a/buildSrc/src/main/kotlin/Deps.kt b/buildSrc/src/main/kotlin/Deps.kt index a29e32c..c468cae 100644 --- a/buildSrc/src/main/kotlin/Deps.kt +++ b/buildSrc/src/main/kotlin/Deps.kt @@ -23,7 +23,7 @@ object Versions { val dokkaPlugin = "1.4.0-rc" val taskTreePlugin = "1.5" - val kotlinBigNumVersion = "0.1.6-1.4.0-rc-SNAPSHOT" + val kotlinBigNumVersion = "0.2.2" val lazySodium = "4.3.1-SNAPSHOT" val jna = "5.5.0" @@ -64,15 +64,39 @@ object Deps { } object Js { + + object JsVersions { + val react = "16.13.1-pre.124-kotlin-1.4.10" + val reactNpm = "16.13.1" + val styled = "5.2.0-pre.124-kotlin-1.4.10" + val styledNpm = "1.0.0" + + } + val stdLib = "stdlib-js" val test = "test-js" val coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core-js:${Versions.kotlinCoroutines}" val serialization = "org.jetbrains.kotlinx:kotlinx-serialization-runtime-js:${Versions.kotlinSerialization}" + val ktorClient = "io.ktor:ktor-client-js:${Versions.ktor}" + val ktorClientSerialization = "io.ktor:ktor-client-serialization-js:${Versions.ktor}" + val ktorClientWebSockets = "io.ktor:ktor-client-websockets-js:${Versions.ktor}" + + object React { + val react = "org.jetbrains:kotlin-react:${JsVersions.react}" + val reactDom = "org.jetbrains:kotlin-react-dom:${JsVersions.react}" + val styled = "org.jetbrains:kotlin-styled:${JsVersions.styled}" + + } + object Npm { val libsodium = Pair("libsodium-wrappers-sumo", "0.7.8") //val libsodiumWrappers = Pair("libsodium-wrappers-sumo", "file:${getProjectPath()}/multiplatform-crypto-delegated/libsodium-wrappers-sumo-0.7.6.tgz") val libsodiumWrappers = Pair("libsodium-wrappers-sumo", "0.7.8") + val reactPair = Pair("react", JsVersions.reactNpm) + val reactDomPair = Pair("react-dom", JsVersions.reactNpm) + val styledComponentsPair = Pair("styled-components", "5.2.0") + val inlineStylePrefixesPair = Pair("inline-style-prefixer", "6.0.0") } } diff --git a/multiplatform-crypto/build.gradle.kts b/multiplatform-crypto/build.gradle.kts index e75bc59..d458d71 100644 --- a/multiplatform-crypto/build.gradle.kts +++ b/multiplatform-crypto/build.gradle.kts @@ -49,6 +49,7 @@ val ideaActive = System.getProperty("idea.active") == "true" kotlin { val hostOsName = getHostOsName() + val bla =1 runningOnLinuxx86_64 { jvm() js { diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index ec6f87b..f418f36 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -25,9 +25,11 @@ plugins { id(PluginsDeps.kapt) id(PluginsDeps.androidApplication) id(PluginsDeps.kotlinAndroidExtensions) - id (PluginsDeps.mavenPublish) - id (PluginsDeps.signing) + id(PluginsDeps.mavenPublish) + id(PluginsDeps.signing) + } +org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolverPlugin.apply(project) val sonatypeStaging = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" val sonatypeSnapshots = "https://oss.sonatype.org/content/repositories/snapshots/" @@ -56,6 +58,9 @@ kotlin { jvm() js { browser { + webpackTask { + + } testTask { enabled = false //Until I sort out testing on travis useKarma { @@ -64,21 +69,21 @@ kotlin { } } nodejs { + testTask { useMocha() { timeout = "10s" } } } + binaries.executable() } android() linuxX64("linux") { - binaries { - executable { } } @@ -236,6 +241,27 @@ kotlin { val jsMain by getting { dependencies { implementation(kotlin(Deps.Js.stdLib)) + implementation(Deps.Js.coroutines) +// implementation(Deps.Js.serialization) +// implementation(Deps.Js.ktorClient) +// implementation(Deps.Js.ktorClientSerialization) +// implementation(Deps.Js.ktorClientWebSockets) + // React + implementation(Deps.Js.React.react) + implementation(Deps.Js.React.reactDom) + implementation(npm(Deps.Js.Npm.reactPair.first, Deps.Js.Npm.reactPair.second)) + implementation(npm(Deps.Js.Npm.reactDomPair.first, Deps.Js.Npm.reactDomPair.second)) + + // Styled + implementation(Deps.Js.React.styled) + implementation(npm(Deps.Js.Npm.styledComponentsPair.first, Deps.Js.Npm.styledComponentsPair.second)) + implementation(npm(Deps.Js.Npm.inlineStylePrefixesPair.first, Deps.Js.Npm.inlineStylePrefixesPair.second)) + // Webpack ktor missing deps +// implementation(npm("text-encoding", "0.7.0")) +// implementation(npm("abort-controller", "3.0.0")) +// implementation(npm("bufferutil", "4.0.1")) +// implementation(npm("utf-8-validate", "5.0.2")) +// implementation(npm("fs")) } } val jsTest by getting { @@ -447,6 +473,61 @@ tasks { } +if (getHostOsName() == "macos") { + + val packForXcode by tasks.creating(Sync::class) { + val targetDir = File(buildDir, "xcode-frameworks") + + // / selecting the right configuration for the iOS + // / framework depending on the environment + // / variables set by Xcode build + val mode = System.getenv("CONFIGURATION") ?: "DEBUG" + val framework = kotlin.targets + .getByName("ios") + .binaries.getFramework(mode) + inputs.property("mode", mode) + dependsOn(framework.linkTask) + + from({ framework.outputDirectory }) + into(targetDir) + + // / generate a helpful ./gradlew wrapper with embedded Java path + doLast { + val gradlew = File(targetDir, "gradlew") + gradlew.writeText( + "#!/bin/bash\n" + + "export 'JAVA_HOME=${System.getProperty("java.home")}'\n" + + "cd '${rootProject.rootDir}'\n" + + "./gradlew \$@\n" + ) + gradlew.setExecutable(true) + } + } + + tasks.getByName("build").dependsOn(packForXcode) +} + +fun org.jetbrains.kotlin.gradle.plugin.mpp.Executable.windowsResources(rcFileName: String) { + val taskName = linkTaskName.replaceFirst("link", "windres") + val inFile = compilation.defaultSourceSet.resources.sourceDirectories.singleFile.resolve(rcFileName) + val outFile = buildDir.resolve("processedResources/$taskName.res") + + val windresTask = tasks.create(taskName) { + val konanUserDir = System.getenv("KONAN_DATA_DIR") ?: "${System.getProperty("user.home")}/.konan" + val konanLlvmDir = "$konanUserDir/dependencies/msys2-mingw-w64-x86_64-clang-llvm-lld-compiler_rt-8.0.1/bin" + + inputs.file(inFile) + outputs.file(outFile) + commandLine("$konanLlvmDir/windres", inFile, "-D_${buildType.name}", "-O", "coff", "-o", outFile) + environment("PATH", "$konanLlvmDir;${System.getenv("PATH")}") + + dependsOn(compilation.compileKotlinTask) + } + + linkTask.dependsOn(windresTask) + linkerOpts(outFile.toString()) +} + diff --git a/sample/src/jsMain/kotlin/com/ionspin/kotlin/crypto/sample/App.kt b/sample/src/jsMain/kotlin/com/ionspin/kotlin/crypto/sample/App.kt new file mode 100644 index 0000000..f626f89 --- /dev/null +++ b/sample/src/jsMain/kotlin/com/ionspin/kotlin/crypto/sample/App.kt @@ -0,0 +1,35 @@ +import com.ionspin.kotlin.crypto.hash.Hash +import com.ionspin.kotlin.crypto.util.encodeToUByteArray +import com.ionspin.kotlin.crypto.util.toHexString +import kotlinx.css.br +import react.RBuilder +import react.RComponent +import react.RProps +import react.RState +import react.ReactElement +import react.dom.h1 + +external interface RAppState : RState { + var currentState: String +} + +external interface RAppProps : RProps { + +} + +class App(props: RAppProps) : RComponent(props) { + override fun RBuilder.render() { + val hash = Hash.sha512("123".encodeToUByteArray()) + h1 { + +"Hash (SHA512) of 123: ${hash.toHexString()}" + + } + } + +} + +fun RBuilder.app(handler: RAppProps.() -> Unit): ReactElement { + return child(App::class) { + this.attrs(handler) + } +} diff --git a/sample/src/jsMain/kotlin/com/ionspin/kotlin/crypto/sample/Main.kt b/sample/src/jsMain/kotlin/com/ionspin/kotlin/crypto/sample/Main.kt new file mode 100644 index 0000000..841f0c5 --- /dev/null +++ b/sample/src/jsMain/kotlin/com/ionspin/kotlin/crypto/sample/Main.kt @@ -0,0 +1,28 @@ + + +import com.ionspin.kotlin.crypto.LibsodiumInitializer +import com.ionspin.kotlin.crypto.hash.Hash +import com.ionspin.kotlin.crypto.util.LibsodiumRandom +import com.ionspin.kotlin.crypto.util.encodeToUByteArray +import com.ionspin.kotlin.crypto.util.toHexString +import react.dom.render +import kotlinx.browser.document +import kotlin.browser.window + +fun main() { + val runningOnNode = jsTypeOf(window) == "undefined" + if (!runningOnNode) { + LibsodiumInitializer.initializeWithCallback { + render(document.getElementById("root")) { + app { + + } + } + } + } else { + LibsodiumInitializer.initializeWithCallback { + val hash = Hash.sha512("123".encodeToUByteArray()) + println("Hash (SHA512) of 123: ${hash.toHexString()}") + } + } +} diff --git a/sample/src/jsMain/resources/index.html b/sample/src/jsMain/resources/index.html new file mode 100644 index 0000000..9f04a20 --- /dev/null +++ b/sample/src/jsMain/resources/index.html @@ -0,0 +1,12 @@ + + + + + Libsodium bindings sample app! + + + +
+ + + diff --git a/sample/webpack.config.d/devServer.config.js b/sample/webpack.config.d/devServer.config.js new file mode 100644 index 0000000..c4d84c0 --- /dev/null +++ b/sample/webpack.config.d/devServer.config.js @@ -0,0 +1,7 @@ +config.devServer = config.devServer || {} +config.devServer.port = 8081 +config.devServer.open = false +config.devServer.watchOptions = { + "aggregateTimeout": 1000, + "poll": 1000 +} \ No newline at end of file From d81f1eea4beed211d4b1e1bf96ceb1aa49771e1c Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Sat, 17 Oct 2020 18:08:12 +0200 Subject: [PATCH 04/51] Started buidling sample structure --- buildSrc/src/main/kotlin/Deps.kt | 16 +++++------ sample/build.gradle.kts | 28 ++++--------------- .../kotlin/crypto/sample/di/ServiceLocator.kt | 28 +++++++++++++++++++ .../crypto/sample/ui/LandingController.kt | 10 +++++++ 4 files changed, 51 insertions(+), 31 deletions(-) create mode 100644 sample/src/commonMain/kotlin/com/ionspin/kotlin/crypto/sample/di/ServiceLocator.kt create mode 100644 sample/src/commonMain/kotlin/com/ionspin/kotlin/crypto/sample/ui/LandingController.kt diff --git a/buildSrc/src/main/kotlin/Deps.kt b/buildSrc/src/main/kotlin/Deps.kt index c468cae..96d7376 100644 --- a/buildSrc/src/main/kotlin/Deps.kt +++ b/buildSrc/src/main/kotlin/Deps.kt @@ -17,24 +17,20 @@ object Versions { val kotlinCoroutines = "1.3.9" val kotlin = "1.4.10" - val kotlinSerialization = "1.0.0-RC" + val kotlinSerialization = "1.0.0" + val kotlinSerializationPlugin = "1.4.10" val atomicfu = "0.14.3-M2-2-SNAPSHOT" //NOTE: my linux arm32 and arm64 build val nodePlugin = "1.3.0" val dokkaPlugin = "1.4.0-rc" val taskTreePlugin = "1.5" - val kotlinBigNumVersion = "0.2.2" - val lazySodium = "4.3.1-SNAPSHOT" val jna = "5.5.0" - val kotlinPoet = "1.6.0" - val sharedModule = "0.1.0-SNAPSHOT" - val ktor = "1.3.2" - val timber = "4.7.1" + val kodeinVersion = "7.1.0" @@ -52,7 +48,7 @@ object Deps { val test = "test-common" val testAnnotation = "test-annotations-common" val coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:${Versions.kotlinCoroutines}" - val serialization = "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:${Versions.kotlinSerialization}" + val serialization = "org.jetbrains.kotlinx:kotlinx-serialization-json:${Versions.kotlinSerialization}" val atomicfu = "com.ionspin.kotlin.atomicfu:atomicfu:${Versions.atomicfu}" @@ -61,6 +57,8 @@ object Deps { val apiProject = ":multiplatform-crypto-api" val sharedModule = "com.ionspin.kotlin.crypto.sample:shared:${Versions.sharedModule}" + + val kodein = "org.kodein.di:kodein-di:${Versions.kodeinVersion}" } object Js { @@ -146,7 +144,7 @@ object Deps { object PluginsDeps { - val kotlinSerializationPlugin = "kotlinx-serialization" + val kotlinSerializationPlugin = "plugin.serialization" val multiplatform = "multiplatform" val node = "com.github.node-gradle.node" val mavenPublish = "maven-publish" diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index f418f36..234594c 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -27,6 +27,7 @@ plugins { id(PluginsDeps.kotlinAndroidExtensions) id(PluginsDeps.mavenPublish) id(PluginsDeps.signing) + kotlin(PluginsDeps.kotlinSerializationPlugin) version Versions.kotlinSerializationPlugin } org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolverPlugin.apply(project) @@ -91,12 +92,7 @@ kotlin { // Linux 32 is using target-sysroot-2-raspberrypi which is missing getrandom and explicit_bzero in stdlib // so konanc can't build klib because getrandom missing will cause sodium_misuse() // so 32bit will be only available from non-delegated flavor -// linuxArm32Hfp() { -// binaries { -// executable { -// } -// } -// } + linuxArm64() { binaries { executable { @@ -172,6 +168,7 @@ kotlin { implementation(kotlin(Deps.Common.stdLib)) implementation(kotlin(Deps.Common.test)) implementation(Deps.Common.kotlinBigNum) + implementation(Deps.Common.serialization) implementation(project(":multiplatform-crypto-libsodium-bindings")) } } @@ -242,10 +239,7 @@ kotlin { dependencies { implementation(kotlin(Deps.Js.stdLib)) implementation(Deps.Js.coroutines) -// implementation(Deps.Js.serialization) -// implementation(Deps.Js.ktorClient) -// implementation(Deps.Js.ktorClientSerialization) -// implementation(Deps.Js.ktorClientWebSockets) + // React implementation(Deps.Js.React.react) implementation(Deps.Js.React.reactDom) @@ -256,12 +250,7 @@ kotlin { implementation(Deps.Js.React.styled) implementation(npm(Deps.Js.Npm.styledComponentsPair.first, Deps.Js.Npm.styledComponentsPair.second)) implementation(npm(Deps.Js.Npm.inlineStylePrefixesPair.first, Deps.Js.Npm.inlineStylePrefixesPair.second)) - // Webpack ktor missing deps -// implementation(npm("text-encoding", "0.7.0")) -// implementation(npm("abort-controller", "3.0.0")) -// implementation(npm("bufferutil", "4.0.1")) -// implementation(npm("utf-8-validate", "5.0.2")) -// implementation(npm("fs")) + } } val jsTest by getting { @@ -275,12 +264,7 @@ kotlin { val linuxTest by getting { dependsOn(nativeTest) } -// val linuxArm32HfpMain by getting { -// dependsOn(nativeMain) -// } -// val linuxArm32HfpTest by getting { -// dependsOn(nativeTest) -// } + val linuxArm64Main by getting { dependsOn(nativeMain) } diff --git a/sample/src/commonMain/kotlin/com/ionspin/kotlin/crypto/sample/di/ServiceLocator.kt b/sample/src/commonMain/kotlin/com/ionspin/kotlin/crypto/sample/di/ServiceLocator.kt new file mode 100644 index 0000000..3b50331 --- /dev/null +++ b/sample/src/commonMain/kotlin/com/ionspin/kotlin/crypto/sample/di/ServiceLocator.kt @@ -0,0 +1,28 @@ +package com.ionspin.kotlin.crypto.sample.di + +import kotlinx.serialization.json.Json + +/** + * Created by Ugljesa Jovanovic + * ugljesa.jovanovic@ionspin.com + * on 17-Oct-2020 + */ +object ServiceLocator : ServiceLocatorInterface { + override val Storage: StorageModule = StorageModule.StorageServiceLocator() + + +} + +interface ServiceLocatorInterface { + val Storage: StorageModule +} + +interface StorageModule { + val json: Json + + class StorageServiceLocator : StorageModule { + override val json = Json { + prettyPrint = true + } + } +} diff --git a/sample/src/commonMain/kotlin/com/ionspin/kotlin/crypto/sample/ui/LandingController.kt b/sample/src/commonMain/kotlin/com/ionspin/kotlin/crypto/sample/ui/LandingController.kt new file mode 100644 index 0000000..3166bc3 --- /dev/null +++ b/sample/src/commonMain/kotlin/com/ionspin/kotlin/crypto/sample/ui/LandingController.kt @@ -0,0 +1,10 @@ +package com.ionspin.kotlin.crypto.sample.ui + +/** + * Created by Ugljesa Jovanovic + * ugljesa.jovanovic@ionspin.com + * on 17-Oct-2020 + */ +class LandingController { + +} From 28b97e345def137268b38b582f046015513bbce3 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Sun, 18 Oct 2020 11:58:59 +0200 Subject: [PATCH 05/51] Add ios template project --- .../iosApp/iosApp.xcodeproj/project.pbxproj | 644 ++++++++++++++++++ sample/iosApp/iosApp/AppDelegate.swift | 29 + .../AppIcon.appiconset/Contents.json | 98 +++ .../iosApp/Assets.xcassets/Contents.json | 6 + .../iosApp/Base.lproj/LaunchScreen.storyboard | 25 + sample/iosApp/iosApp/ContentView.swift | 13 + sample/iosApp/iosApp/Info.plist | 60 ++ .../Preview Assets.xcassets/Contents.json | 6 + sample/iosApp/iosApp/SceneDelegate.swift | 56 ++ sample/iosApp/iosAppTests/Info.plist | 22 + sample/iosApp/iosAppTests/iosAppTests.swift | 26 + sample/iosApp/iosAppUITests/Info.plist | 22 + .../iosApp/iosAppUITests/iosAppUITests.swift | 35 + 13 files changed, 1042 insertions(+) create mode 100644 sample/iosApp/iosApp.xcodeproj/project.pbxproj create mode 100644 sample/iosApp/iosApp/AppDelegate.swift create mode 100644 sample/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 sample/iosApp/iosApp/Assets.xcassets/Contents.json create mode 100644 sample/iosApp/iosApp/Base.lproj/LaunchScreen.storyboard create mode 100644 sample/iosApp/iosApp/ContentView.swift create mode 100644 sample/iosApp/iosApp/Info.plist create mode 100644 sample/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 sample/iosApp/iosApp/SceneDelegate.swift create mode 100644 sample/iosApp/iosAppTests/Info.plist create mode 100644 sample/iosApp/iosAppTests/iosAppTests.swift create mode 100644 sample/iosApp/iosAppUITests/Info.plist create mode 100644 sample/iosApp/iosAppUITests/iosAppUITests.swift diff --git a/sample/iosApp/iosApp.xcodeproj/project.pbxproj b/sample/iosApp/iosApp.xcodeproj/project.pbxproj new file mode 100644 index 0000000..61c843f --- /dev/null +++ b/sample/iosApp/iosApp.xcodeproj/project.pbxproj @@ -0,0 +1,644 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 7555FF7F242A565900829871 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF7E242A565900829871 /* AppDelegate.swift */; }; + 7555FF81242A565900829871 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF80242A565900829871 /* SceneDelegate.swift */; }; + 7555FF83242A565900829871 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF82242A565900829871 /* ContentView.swift */; }; + 7555FF85242A565B00829871 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7555FF84242A565B00829871 /* Assets.xcassets */; }; + 7555FF88242A565B00829871 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7555FF87242A565B00829871 /* Preview Assets.xcassets */; }; + 7555FF8B242A565B00829871 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7555FF89242A565B00829871 /* LaunchScreen.storyboard */; }; + 7555FF96242A565B00829871 /* iosAppTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF95242A565B00829871 /* iosAppTests.swift */; }; + 7555FFA1242A565B00829871 /* iosAppUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FFA0242A565B00829871 /* iosAppUITests.swift */; }; + 7555FFB2242A642300829871 /* sample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7555FFB1242A642300829871 /* sample.framework */; }; + 7555FFB3242A642300829871 /* sample.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7555FFB1242A642300829871 /* sample.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 7555FF92242A565B00829871 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7555FF73242A565900829871 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 7555FF7A242A565900829871; + remoteInfo = iosApp; + }; + 7555FF9D242A565B00829871 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7555FF73242A565900829871 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 7555FF7A242A565900829871; + remoteInfo = iosApp; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 7555FFB4242A642300829871 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 7555FFB3242A642300829871 /* sample.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 7555FF7B242A565900829871 /* iosApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iosApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 7555FF7E242A565900829871 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7555FF80242A565900829871 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 7555FF82242A565900829871 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 7555FF84242A565B00829871 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 7555FF87242A565B00829871 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 7555FF8A242A565B00829871 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 7555FF8C242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7555FF91242A565B00829871 /* iosAppTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iosAppTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 7555FF95242A565B00829871 /* iosAppTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iosAppTests.swift; sourceTree = ""; }; + 7555FF97242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7555FF9C242A565B00829871 /* iosAppUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iosAppUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 7555FFA0242A565B00829871 /* iosAppUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iosAppUITests.swift; sourceTree = ""; }; + 7555FFA2242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7555FFB1242A642300829871 /* sample.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = sample.framework; path = "../sample/build/xcode-frameworks/sample.framework"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 7555FF78242A565900829871 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7555FFB2242A642300829871 /* sample.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7555FF8E242A565B00829871 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7555FF99242A565B00829871 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 7555FF72242A565900829871 = { + isa = PBXGroup; + children = ( + 7555FF7D242A565900829871 /* iosApp */, + 7555FF94242A565B00829871 /* iosAppTests */, + 7555FF9F242A565B00829871 /* iosAppUITests */, + 7555FF7C242A565900829871 /* Products */, + 7555FFB0242A642200829871 /* Frameworks */, + ); + sourceTree = ""; + }; + 7555FF7C242A565900829871 /* Products */ = { + isa = PBXGroup; + children = ( + 7555FF7B242A565900829871 /* iosApp.app */, + 7555FF91242A565B00829871 /* iosAppTests.xctest */, + 7555FF9C242A565B00829871 /* iosAppUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 7555FF7D242A565900829871 /* iosApp */ = { + isa = PBXGroup; + children = ( + 7555FF7E242A565900829871 /* AppDelegate.swift */, + 7555FF80242A565900829871 /* SceneDelegate.swift */, + 7555FF82242A565900829871 /* ContentView.swift */, + 7555FF84242A565B00829871 /* Assets.xcassets */, + 7555FF89242A565B00829871 /* LaunchScreen.storyboard */, + 7555FF8C242A565B00829871 /* Info.plist */, + 7555FF86242A565B00829871 /* Preview Content */, + ); + path = iosApp; + sourceTree = ""; + }; + 7555FF86242A565B00829871 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 7555FF87242A565B00829871 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 7555FF94242A565B00829871 /* iosAppTests */ = { + isa = PBXGroup; + children = ( + 7555FF95242A565B00829871 /* iosAppTests.swift */, + 7555FF97242A565B00829871 /* Info.plist */, + ); + path = iosAppTests; + sourceTree = ""; + }; + 7555FF9F242A565B00829871 /* iosAppUITests */ = { + isa = PBXGroup; + children = ( + 7555FFA0242A565B00829871 /* iosAppUITests.swift */, + 7555FFA2242A565B00829871 /* Info.plist */, + ); + path = iosAppUITests; + sourceTree = ""; + }; + 7555FFB0242A642200829871 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 7555FFB1242A642300829871 /* sample.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 7555FF7A242A565900829871 /* iosApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */; + buildPhases = ( + 7555FFB5242A651A00829871 /* ShellScript */, + 7555FF77242A565900829871 /* Sources */, + 7555FF78242A565900829871 /* Frameworks */, + 7555FF79242A565900829871 /* Resources */, + 7555FFB4242A642300829871 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = iosApp; + productName = iosApp; + productReference = 7555FF7B242A565900829871 /* iosApp.app */; + productType = "com.apple.product-type.application"; + }; + 7555FF90242A565B00829871 /* iosAppTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7555FFA8242A565B00829871 /* Build configuration list for PBXNativeTarget "iosAppTests" */; + buildPhases = ( + 7555FF8D242A565B00829871 /* Sources */, + 7555FF8E242A565B00829871 /* Frameworks */, + 7555FF8F242A565B00829871 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 7555FF93242A565B00829871 /* PBXTargetDependency */, + ); + name = iosAppTests; + productName = iosAppTests; + productReference = 7555FF91242A565B00829871 /* iosAppTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 7555FF9B242A565B00829871 /* iosAppUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7555FFAB242A565B00829871 /* Build configuration list for PBXNativeTarget "iosAppUITests" */; + buildPhases = ( + 7555FF98242A565B00829871 /* Sources */, + 7555FF99242A565B00829871 /* Frameworks */, + 7555FF9A242A565B00829871 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 7555FF9E242A565B00829871 /* PBXTargetDependency */, + ); + name = iosAppUITests; + productName = iosAppUITests; + productReference = 7555FF9C242A565B00829871 /* iosAppUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 7555FF73242A565900829871 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1130; + LastUpgradeCheck = 1130; + ORGANIZATIONNAME = orgName; + TargetAttributes = { + 7555FF7A242A565900829871 = { + CreatedOnToolsVersion = 11.3.1; + }; + 7555FF90242A565B00829871 = { + CreatedOnToolsVersion = 11.3.1; + TestTargetID = 7555FF7A242A565900829871; + }; + 7555FF9B242A565B00829871 = { + CreatedOnToolsVersion = 11.3.1; + TestTargetID = 7555FF7A242A565900829871; + }; + }; + }; + buildConfigurationList = 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 7555FF72242A565900829871; + productRefGroup = 7555FF7C242A565900829871 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 7555FF7A242A565900829871 /* iosApp */, + 7555FF90242A565B00829871 /* iosAppTests */, + 7555FF9B242A565B00829871 /* iosAppUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 7555FF79242A565900829871 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7555FF8B242A565B00829871 /* LaunchScreen.storyboard in Resources */, + 7555FF88242A565B00829871 /* Preview Assets.xcassets in Resources */, + 7555FF85242A565B00829871 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7555FF8F242A565B00829871 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7555FF9A242A565B00829871 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 7555FFB5242A651A00829871 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd \"$SRCROOT/..\"\n./gradlew :sample:packForXCode -PXCODE_CONFIGURATION=${CONFIGURATION}\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 7555FF77242A565900829871 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7555FF7F242A565900829871 /* AppDelegate.swift in Sources */, + 7555FF81242A565900829871 /* SceneDelegate.swift in Sources */, + 7555FF83242A565900829871 /* ContentView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7555FF8D242A565B00829871 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7555FF96242A565B00829871 /* iosAppTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7555FF98242A565B00829871 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7555FFA1242A565B00829871 /* iosAppUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 7555FF93242A565B00829871 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 7555FF7A242A565900829871 /* iosApp */; + targetProxy = 7555FF92242A565B00829871 /* PBXContainerItemProxy */; + }; + 7555FF9E242A565B00829871 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 7555FF7A242A565900829871 /* iosApp */; + targetProxy = 7555FF9D242A565B00829871 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 7555FF89242A565B00829871 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 7555FF8A242A565B00829871 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 7555FFA3242A565B00829871 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = 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_DOCUMENTATION_COMMENTS = YES; + 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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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 = 13.2; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 7555FFA4242A565B00829871 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = 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_DOCUMENTATION_COMMENTS = YES; + 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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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 = 13.2; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 7555FFA6242A565B00829871 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; + ENABLE_PREVIEWS = YES; + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../sample/build/xcode-frameworks"; + INFOPLIST_FILE = iosApp/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 7555FFA7242A565B00829871 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; + ENABLE_PREVIEWS = YES; + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../sample/build/xcode-frameworks"; + INFOPLIST_FILE = iosApp/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 7555FFA9242A565B00829871 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = iosAppTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosAppTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iosApp.app/iosApp"; + }; + name = Debug; + }; + 7555FFAA242A565B00829871 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = iosAppTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosAppTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iosApp.app/iosApp"; + }; + name = Release; + }; + 7555FFAC242A565B00829871 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = iosAppUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosAppUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = iosApp; + }; + name = Debug; + }; + 7555FFAD242A565B00829871 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = iosAppUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosAppUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = iosApp; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7555FFA3242A565B00829871 /* Debug */, + 7555FFA4242A565B00829871 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7555FFA6242A565B00829871 /* Debug */, + 7555FFA7242A565B00829871 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7555FFA8242A565B00829871 /* Build configuration list for PBXNativeTarget "iosAppTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7555FFA9242A565B00829871 /* Debug */, + 7555FFAA242A565B00829871 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7555FFAB242A565B00829871 /* Build configuration list for PBXNativeTarget "iosAppUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7555FFAC242A565B00829871 /* Debug */, + 7555FFAD242A565B00829871 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 7555FF73242A565900829871 /* Project object */; +} diff --git a/sample/iosApp/iosApp/AppDelegate.swift b/sample/iosApp/iosApp/AppDelegate.swift new file mode 100644 index 0000000..34ca27d --- /dev/null +++ b/sample/iosApp/iosApp/AppDelegate.swift @@ -0,0 +1,29 @@ +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/sample/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/sample/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/sample/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/sample/iosApp/iosApp/Assets.xcassets/Contents.json b/sample/iosApp/iosApp/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/sample/iosApp/iosApp/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/sample/iosApp/iosApp/Base.lproj/LaunchScreen.storyboard b/sample/iosApp/iosApp/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/sample/iosApp/iosApp/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sample/iosApp/iosApp/ContentView.swift b/sample/iosApp/iosApp/ContentView.swift new file mode 100644 index 0000000..dfe33f9 --- /dev/null +++ b/sample/iosApp/iosApp/ContentView.swift @@ -0,0 +1,13 @@ +import SwiftUI + +struct ContentView: View { + var body: some View { + Text("Hello, World!") + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/sample/iosApp/iosApp/Info.plist b/sample/iosApp/iosApp/Info.plist new file mode 100644 index 0000000..9742bf0 --- /dev/null +++ b/sample/iosApp/iosApp/Info.plist @@ -0,0 +1,60 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/sample/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json b/sample/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/sample/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/sample/iosApp/iosApp/SceneDelegate.swift b/sample/iosApp/iosApp/SceneDelegate.swift new file mode 100644 index 0000000..dcee5d0 --- /dev/null +++ b/sample/iosApp/iosApp/SceneDelegate.swift @@ -0,0 +1,56 @@ +import UIKit +import SwiftUI + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. + // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. + // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). + + // Create the SwiftUI view that provides the window contents. + let contentView = ContentView() + + // Use a UIHostingController as window root view controller. + if let windowScene = scene as? UIWindowScene { + let window = UIWindow(windowScene: windowScene) + window.rootViewController = UIHostingController(rootView: contentView) + self.window = window + window.makeKeyAndVisible() + } + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + + +} + diff --git a/sample/iosApp/iosAppTests/Info.plist b/sample/iosApp/iosAppTests/Info.plist new file mode 100644 index 0000000..64d65ca --- /dev/null +++ b/sample/iosApp/iosAppTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/sample/iosApp/iosAppTests/iosAppTests.swift b/sample/iosApp/iosAppTests/iosAppTests.swift new file mode 100644 index 0000000..0c6e03d --- /dev/null +++ b/sample/iosApp/iosAppTests/iosAppTests.swift @@ -0,0 +1,26 @@ +import XCTest +@testable import appName + +class appNameTests: XCTestCase { + + override func setUp() { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/sample/iosApp/iosAppUITests/Info.plist b/sample/iosApp/iosAppUITests/Info.plist new file mode 100644 index 0000000..64d65ca --- /dev/null +++ b/sample/iosApp/iosAppUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/sample/iosApp/iosAppUITests/iosAppUITests.swift b/sample/iosApp/iosAppUITests/iosAppUITests.swift new file mode 100644 index 0000000..8fb13f2 --- /dev/null +++ b/sample/iosApp/iosAppUITests/iosAppUITests.swift @@ -0,0 +1,35 @@ +import XCTest + +class appNameUITests: XCTestCase { + + override func setUp() { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testLaunchPerformance() { + if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) { + // This measures how long it takes to launch your application. + measure(metrics: [XCTOSSignpostMetric.applicationLaunch]) { + XCUIApplication().launch() + } + } + } +} From de664187d9c082d88b2ad173041437557234b42b Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Sun, 18 Oct 2020 12:09:23 +0200 Subject: [PATCH 06/51] Move android sourcets to running on linux only --- sample/build.gradle.kts | 57 ++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 234594c..b78cdf5 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -179,33 +179,6 @@ kotlin { } } - val androidMain by getting { - - dependencies { - implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:${Versions.kotlin}") - implementation("androidx.appcompat:appcompat:1.2.0") - implementation("androidx.core:core-ktx:1.3.2") - implementation("androidx.constraintlayout:constraintlayout:2.0.2") - implementation("com.google.android.material:material:1.3.0-alpha03") -// implementation("androidx.ui:ui-tooling:$composeDevVersion") -// implementation("androidx.ui:ui-layout:$composeDevVersion") -// implementation("androidx.ui:ui-material:$composeDevVersion") -// implementation("androidx.ui:ui-foundation:$composeDevVersion") -// implementation("androidx.ui:ui-framework:$composeDevVersion") - implementation(Deps.Android.coroutines) - implementation(Deps.Android.timber) -// implementation("androidx.compose:compose-runtime:$composeDevVersion") - } - } - val androidTest by getting { - dependencies { - implementation(kotlin(Deps.Jvm.test)) - implementation(kotlin(Deps.Jvm.testJUnit)) - implementation(Deps.Jvm.coroutinesTest) - implementation(kotlin(Deps.Jvm.reflection)) - implementation(Deps.Jvm.coroutinesCore) - } - } val nativeMain by creating { @@ -258,6 +231,36 @@ kotlin { implementation(kotlin(Deps.Js.test)) } } + + val androidMain by getting { + + dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:${Versions.kotlin}") + implementation("androidx.appcompat:appcompat:1.2.0") + implementation("androidx.core:core-ktx:1.3.2") + implementation("androidx.constraintlayout:constraintlayout:2.0.2") + implementation("com.google.android.material:material:1.3.0-alpha03") +// implementation("androidx.ui:ui-tooling:$composeDevVersion") +// implementation("androidx.ui:ui-layout:$composeDevVersion") +// implementation("androidx.ui:ui-material:$composeDevVersion") +// implementation("androidx.ui:ui-foundation:$composeDevVersion") +// implementation("androidx.ui:ui-framework:$composeDevVersion") + implementation(Deps.Android.coroutines) + implementation(Deps.Android.timber) +// implementation("androidx.compose:compose-runtime:$composeDevVersion") + } + } + val androidTest by getting { + dependencies { + implementation(kotlin(Deps.Jvm.test)) + implementation(kotlin(Deps.Jvm.testJUnit)) + implementation(Deps.Jvm.coroutinesTest) + implementation(kotlin(Deps.Jvm.reflection)) + implementation(Deps.Jvm.coroutinesCore) + } + } + + val linuxMain by getting { dependsOn(nativeMain) } From d368aa958686326cc99e513406f020f33131e85d Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Sun, 18 Oct 2020 12:10:29 +0200 Subject: [PATCH 07/51] xcode changes --- sample/iosApp/iosApp.xcodeproj/project.pbxproj | 6 ++++-- .../contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../UserInterfaceState.xcuserstate | Bin 0 -> 69161 bytes .../xcschemes/xcschememanagement.plist | 14 ++++++++++++++ sample/iosApp/iosApp/Info.plist | 2 ++ 6 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 sample/iosApp/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/ionspin.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 sample/iosApp/iosApp.xcodeproj/xcuserdata/ionspin.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/sample/iosApp/iosApp.xcodeproj/project.pbxproj b/sample/iosApp/iosApp.xcodeproj/project.pbxproj index 61c843f..cf55f66 100644 --- a/sample/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/sample/iosApp/iosApp.xcodeproj/project.pbxproj @@ -485,6 +485,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; + DEVELOPMENT_TEAM = 5U57WAFNJ6; ENABLE_PREVIEWS = YES; FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../sample/build/xcode-frameworks"; INFOPLIST_FILE = iosApp/Info.plist; @@ -492,7 +493,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosApp; + PRODUCT_BUNDLE_IDENTIFIER = com.ionspin.kotlin.crypto.sample; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -505,6 +506,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; + DEVELOPMENT_TEAM = 5U57WAFNJ6; ENABLE_PREVIEWS = YES; FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../sample/build/xcode-frameworks"; INFOPLIST_FILE = iosApp/Info.plist; @@ -512,7 +514,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosApp; + PRODUCT_BUNDLE_IDENTIFIER = com.ionspin.kotlin.crypto.sample; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/ionspin.xcuserdatad/UserInterfaceState.xcuserstate b/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/ionspin.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..a400651a9148e57c25de63fe108f0ee3cca081bb GIT binary patch literal 69161 zcmd3P2Y3_5)A#M3%2gw5V_XQBPUyXc1lg8B!41ham;j0~0vwF(*oHttlH2s&d!?lJ zkluUmkluSw{^`AZGk3bvNtR^UkoWoi@ADF{XMQ`oJ3BkOx4XaPtxb*X9plHp%n^=q zJm=t?oQrdF(xM^j!)@)2EzNa9>f0JtH^RTFhjg^GE*jFZ{D5#nM|&nmj@caY^r{HX z4{r>w@J57Q;sj2t33k+Xgf((wZ~lHx<`k|km&@gGqqx!B7;Y>#jvLQS;3jgDxXD~8 zHw?lkUn z?hNic?tJbdZZo%qdx(3OdxU$GdyIRWdxCqCdy0FSdxm?Kdyadadx3kAdx?9Ed!2iS z`;7aX`-1zD`-=OT`-S_J`;GgZ`-f1%6F2EiGD!~UNA@5C$zU>sj3lGTI5LS$BgLeI z_(&1j$0OimW9El67P~IfxuW7&(d@O^zYQk`u|Pt>; zH@S!0OYS2NktfKL*Q_nHTi~oOa4c`Bj0m>ksrt}zluMA zU(2`h?fiOvBfp71oIip;nm>*|kw1k$oj;2|m%o6&nBUBAl_;#hd2&%Fvn4jV;v_rPIjE;IMZ>C<9x?Oj!PX|9hW<< za$M`U!Ev+WR>vKVyB+sA9&|k7c---n<5|ZGjvbCy9Irdxa=h#K!11x;Gsl;XZyet_ zesuie_}%fB<6kFrI-P=3c4jzxJF}gAo%zl^oQ2N8&SB0youi%OoD-c>oYS4NoO?UH z&JyQb=f2KzXO%PPtaa8ompDVt<<78kwR4TL*?FL|!+DVNVCSJu&3UBr80YcMlbokI z&v2gYJkNQd^AhJ4=Vi_-o!2<8ci!Z@#d*8)F6X_@2b>Q(A9FtGe8%~_^CjoY&exo8 zI^S`=@BGO5sq+ix*UtYre{lZn{LT5N^B)&+Ib3d+J~=UV2fcdc-(avk7W>uPniyVkol zx;D8EcOBt6+I5`kMAs><(_Lq|&UIbjy4bbZwas;f>uT3^t{Yw3UAMXJblu~+-}R8| zQP&f$r(MsvUUcnrz3O_y^|tFh*N3i8T%WtXa((Oi-u08~SJxk|zulahce~u8TXFYt zXS(~ibKM2*{_cV9A@1Ssk?t|>@$O0PsqPu>z1;h_i`+i z-{!vEeTVx__oME|+>g7Ta6jpO#{H6ehx>K+JMPcipSyo>|LFeJ{io1N@CdzyOd(6i z7WxP|LSJDIVX!bp7%Pku#tV~$8Ny7VMDPiv!dzjVP$n!9mI}*+kg&f{FDw_I5uX=d z5?>Zy6WHI!-!KIz>8NI!iiNx8_0pQK-7kWZFRlh2gTk87xUQ%9GUQ^yw-cjCHK2knazEHka{-^w){H*+@{Hgq-64jx) zRY_G5ZnmSXRtJSlz5{Q?F33Rt~Zyd zQH|fqWpjNr2c!Agz>sIi1m9He)Ctq4kC|NLn=)qd_$iad6ctS>9W!y#)EP5ocqf*O z_f8CXvi&8#g)MDs+FR=z!X+&Y>(+*wJIs>vxk22>E4c!$AGZhBpBumxasxG|=F;4n zpoyBK$yaiNxgp$8ZWsuR;D%_5rfM0C=7K~H{B^`Kgl}wK(Q;5}Tm9N_$TQ6PL3RD| zqWZRl_3gEd?TyQu!V4QaRtFoKS2cyO-CZAnI-CfMm&Pir5l8c~P@lTAG&ExA{%8L!R8|@AN9!ewA~`A>&6EP9J~h=)yxL z%$Nv&pD}IPp@#})15e>*V*^j+rg77`8Qe^67PptyOY>;GwM;Eb%hvi_3C+3>H;40b zMew&0Xw|;jC~dSh9{x5#8xit&p!DGCmV+wl*Eg=Jhq@U*vi|993quWigH%mNV^d>C zW4L``ehM2#(y%n;;mbR#vrD+qx0xb2VfaP1!7*P_RyOZsazuid(=1v|KGu z%iqRT!#``a0{G{iXlvo3hL#oKv7kS{v16=N&{(V0!O&p12@DFauzm}<>fE-Lb*;uP zAhT^ZOI*U$b0aU~mU7Fu5Vyb9PuoN5uMN12Th29bE4bxap*Bbx41Yq&*`1#jLg8EkBfO%az ze!01%Ae47F$Bvs)*VqwWtJf5K1tLv{x1k~2-X2~7gC@MJy#YsKRZBa#R7>;H_DHw+ zL8tv1mztTA-+$1M5hHiF1yQMPt?yV}2Vo$*VP0c%$5u(MZER`xwzlqP{HGcQWxI#$ z$mr$iov5tvhSvIKT-4~+O!7W_$E}rV)06nYERw;X_fm7o*km!!Sxq0a$t?~m- z!5&+sev9=ebr8lwk7LJx!hz|7tlJ16gL`k0b_^XhJWaJB-!*)EFsSX>d#fbv7&UrK zntD+C@_fA+{=Mn97q*U{xOKvW!Cd5jTPIB(Jm)~;AA{$dc$)sVEmNVGX|^dnSl|%iAiZFzl|%L< z(}@=rRr5$W*`KtK4dhUw!7}PRawRO9?t&%L1F&3r1{O>2koU;Ph8>hdjGG?$Z{$DZ zQ)8$c$sGk#gKtA?lM$OM*L5^CHiv5)!v`4)RP^1*u-nER%^kyaq%9xvEDu$8%q^~+ zFtwz%I$8#VpovqX|FjiZy|FdiJ}pvQs5TgyG$AUdyI>H4ZSyMs3K&C;D;r@-GOBSL zcYMf`RS_&-*MSB{hxs<{I2`EaAU=^hnH#xvZ zw(#INt#kCIGm*~Z&PJrOv@u(_bF{IDG;m#exUH%!yfWO@7G6;dV|7(a+eY7pj<7z2 z{3Y!>^t9pv?!wL5IK%LZxl5K=W_#P(>NjrVF6J)fIw0-P|7m%YS@2fwW^UvS+&1nq z?sD!5?n>?|@SJP7Yq{&V>$w}a8@ZdbiP|J>vNlDVs!h|TYcsT&+AM7^ZML?zw$BaV zWVe8u-NxOHX#=?1cJ3Z zEvw(yvJM=ocS(5px>c)Sn!sP8^DT}+FsG*I%qn<+{I~!K8uUi?IF+LR>N%541JepMQl(HdHR^Y z4%h2e>iD3Y1x7~7&`mS!8j-R|8`~{2JzU6>8ELSx@XC(rmO$gG)s|=P;9f?5+^H3B z;a<^7u(x`{sIwYWpB@bVdxN`hEB7Y%mgdvuYvWA6dYAi<%h|@g$Gy*epp|NKwRzjP zkHAMh(fr^I`)UK10$g<9Ex~_9Q!x+x6Z@^aepPd0$GR2aI;gGD5QFD5?jJLBzTv*_ zRMHRNi$7^);AZ7Gv-Z;4%J2znr@?cUJg8%MxSiY|+@CPN{ssF~e?uiJf|eVUg_~FD z`IYTwwe?Nw!XBbk8RP9=!tH1K?N&m#4*L%lSGII)h zR;?`#dB$0>$?#qXZPO+n*>k@YktI(}pscQ=aV;bw^=n(TCE8LA9DN}qg5jCt#*M?6(moCbZF_5D z^SJpfI6IA7qyJ~jS|g&=cR);9JEoy+V{1ptxOPBk3WEk_Ig$U2-GJF|Yg@|!MlDB^ zF)$p#W6jn#du}TkiLr0q5*t`PL@kj_DbIE*INI-(&C;Mt)ZKbwq8!3YcV!O5)z;*ac z92wsB2$UXFFx*CRQ23?pC@_FaHbU;**kJy|s9H68W{uXU)xAy@kvg)N><1pPge)b? zNC=XeJ;`#?0Dp$bN*E%hhs3m9g}#^_i2i{~NX!_n)Rhx zWE92A_m253mSgu(&^GOf&gfPeqIGC(8mAqgt%E;XwRU@`SWO!BP|>8dXlwM5-E6c* zGqy&H))XD5Z8%P~wYFiIc<>m*WGC4Kt#>H2*WqM1Zc{9;Zx2H-8`~Ccf&*F%5VN>0G?6aLOV+oU9!LITASyYIr(11J+s% z>maLY?&yT4ZD5p7>`v#9bHSZL=uUbE9jSpo_^RdIxRM4$}_SJLpiukZssO zmuZJYJLpQigEpnxLB>83xtZLC<7zv(h1{xX8q<#0Ms6o}kUO;_86}KT9Jr%n8q=tz zIj+nGH{%p!6JrvHhm4;Ut!r#r5e#>9K-_LOfD*$)uDZUlWnFu9ecP&Vq-Be7XUnMm z{aF16w4=1Tm&wBrw=sG@LLMcLk;m(dRVTz{?O5#??Px~-!=ODFm!1FK^fyfX`o0`_ znmmu~`3!lMJf|I}9j~3Rjl4i!Brjxp`EFnbp`o^d`dn6$N2&R z>Dk&j@c(nP^Nnz7Hw=baYq+grBSxN*#`e~xdVRYD0-@;!g?i5xMg(C$2{s#(8XW^M z*d}I{qi063QpK>bP~Qq04Y4I{EQ~B>^dk4LVa0kG=KF^0{D?#NC+%EZ=JX=JlHbVh zbr6`0K&_nzt1c1@*TWakLd=lbH*G2nc*}hYD+BXGL7z8JJTFw`t)3S&Lf4<`hiujuJ{KPaV`rUDQnlDpHBcRG})(puMPv_NJLM zi)Pb4G>7)3xipXF(*oL$?m_$00kn_~q=V>SI)o0T!{~52g6>I2(ou9Y9Ye>`adbSL zKqt~kbTXYnr_yP3I-Nmh(phvbI-BlI_n~vBmln}tT0(ual+LB|sGsgj=hHG;PAh07 zt)dHPfCgzbt)aDaAzei4=wiAbT|$@AWi&+hr}cC>ZJ;Y?n69L&=xW+X51?yk6J1N2 zX$x(o2huj$PCMv2x}F|HH_(mrV0sAML=UBh(Zi`m89jm?NsppO(_`qd^f-DvJ%OG` zPogK&Q|PJmG4VrF1jhLbuXw^fG!my@Fmz zucBAeYv{G~I(j|5f!;`OqBqm+^cH$6y^Y>Z@1S?myXf8Y9(pgmkKRuopbyfA=)?38 z`Y3&jK2D#YPtvF8)ASkoEPakXPhX%f(wFECx|6<4U!kwk*XZl?4f-a1i@r_Yq3_c7 z==<~o`XT*@eoQ~1pVH6h=kyEuCH;ziO~0Yv(*M!#==byo`Xl{`{!D+NztZ36@AMD) zC;f~5P5+_)@*Gci%JaN~ck(XY%?rH9OT5f0yvk?ry?77bo6qF4_-wuppTqa%bNM_z zpD*D1@q6(7`2l<(Kad~959WvPL-}F+aDD{8CqI%O#gFF4@MHOL{CIu>KarorPv)oa zQ~7E9bbbaulb^-!#n0yV=J(;}@Ls-%FXl^lA79GP<>&E!eqVk*U&fd76?`RM#V_Ck ze2}l^Yxr7zA-{;P;}`S$@k{un{4zeo@6Xrs%lQU=1s~Qf&@R+2(k|96(Js|CYg@Ff z+BWSn?Q-o3?Mm$`?P~2B?ON?R?RxD7?MCe;?PhJec8hkacAIv)c87MSc9(Xyc8_+i zcAs{?_JH=F_K^0l_K5bV_L%m#_JsDN_LTOt_Kfzd_MG;-_Ja1J_L8*y`sIU zy{5gcy`jCSy`{aay`#OWy{EmeeV~1)eWZP?eWHD;eWrb`eW87+eWiV^eWQJ={ZIQ& z`(FD&`%(Kz`&s)%`&Ii*`(67(`&0W%`&;`*`B~qiBYBMEGg81vKSuUoq(37A7%60A zAR~hq8O+EKMusvnjFI7tj9_F>Mn*C+ijmQbjA3LfBjXqu&&UKuCNeUKk;#lqVPq;J z(-@h~$P7kiGBS&iy%?Fz$li?X!^j*)yo?kvQp`vRBR)n-8JWw-JVyMC?90e}M#>l| zXQYCWN=B*}S-?nuksu@0jMOkv%g91T7BN!C$YMtJV`K> ztY9R}$Vx_5F|wMGMn(=`WDO%tjI3p(nUNMoS{XTzkv2x!8R=kT9V6=*If#)BjBI4& zU`7sMWD_HYGIAIrhcluv!WcP%ks}#7ijkukIfjvA899!T;~6=DkrNp?iII~TIfao^ z899xS(-}E~kuw=Ni;=S#Ifs#R899%U^BK8-kqa5Qh>?pKxrC8R8QILp7Dl!*vW=0; z7`dF0D;T+wk*gTFnvrW5xt5XZ7`dL28yLBfk((H~nUU>`+``DMjNHb^?Tp;P$eoPb z#mL=^+{4JdjNHe_{fs=o$b*bL#K^;pJi^GMj6BB3DkHBk@;W1LF!ClNZ!z*VBkwTsE+g+T@;)OUF!CWI zA2ISVBcCwxDI=dT@;M`4F!CiMUorAEBi}IcEhGP9Kth2C6~0s?1wmS{W#}6gHs3aN>pU6dhQVV9-|$vv~3RP`S6lU+N21hhX&)stWi@ z{fkVC4nd{SmXfc$2<@;`gCTzfXjGQe6jz6eYAQ;~e5U4M5&I&=`6|3cWxh~lMX1CF z<&}g2zF=idpx9^G$53H{Ra62=C=6O3+TLFgtoD|bg{r-CE%l>NeN;+yteUSHa+k_L zi7#LpdMqmD5hHc8(#=hqf_3HgzBwU@SY^?^cCnLDY-j?sdENl_O2AiKSzZ+kmG~_K zPD7O`5tYhT{Ah&zQ?}4s7YrFK9$e@ztqwt@D@we9l2DnyDBunFqiuI4LX3@vD5~+7 znZk7;a0VzfSRL>e)u0cX^*;x7`zO||g;Kl~)m9^)kFo{vvU7`zL$$s@&<1)D3XX^u zEb$f9%!S@Vzx1LFXcYX-H09ESrbJw)$X{JtSz`IuR+JqTUjjC+zswhaLP~s#pv5W! zzK{W67IHZ%4v1Hb6axKI>-R0RDtuMKQX<0DFlPJ}bK^2%BP3jliX%IfVh&})_d}&% zYp4P;YpcK;P;Yp=-dtaWFW{~A;aCG5EY#i>HzzF2UlEBLNejCb_2$GEX8C9YAT-bC zh4B&$l?E!yVU+vJAZ{3AKE{vlK(tOy=&hpjixj%><0<8+JXw_>6Y8A$4mH4X4 zD(lL971g1#N~1qbV_re&VacScDudPFE)eO1;J2pE>!>p%PN&vaR#~MNVNNmn8q;W; zw>sCPB;bd*Gv8kglZs_swKp)=XN8n^Q7b>D9CP-FY5EV6%f&SO$0*l7As#k+2z%bF z<7X(F9V1%;?qQqozeI_=7zxulTwj|&-=Nr-7%^-5gh>$V3ocp$p{p1y@Rs|d1M9oa zC7?^2Q>a^ zjbL?MG-3D)rDA<9B4tc|b>&5sWtNBji_(K*FjF>!gQCLl7zKaTyvhn+B?Pe~-s5nh z($E;Ca&K{Ea8Ys4;=Ol^9YV-FPUp9C^C(Qp)^Y+q8=*t`aIQ#Wlgl28ayIAxhO4o0D& zQK6DL$e>^bEr&toFM|2Bx-Kq(aSTJ10i9H80s)MGaYpQk!h6_+VZziWXk+A5MdO}h zG>Q(7io#qzAJP>_%phThd=GNtxn(ef>`8%R94d{DD!~jL^aW~t;Du&Em>LH|m{`Ni zVkP~KiKsawstNg^QF)kED;Mf1d2yK^s$_Ni6x6U)+|n=u6Iy0A>~s_!7=<^m?UJD) z2q32TtT=4nqR3(ea%~*k`Xpou?~TG)QEV`zqB2zFx6r&OkP{WaCJ4cF3OSi2Q-U(X zqB7Xrp@shHdC8M$$6VCu6V-tc4@-tnbzPMOyDy4lM@94nMU3_3DACU*Q9Td38QiYA zva-yc9yqE{(&oXHhGa>MP!NS|9&9Cq<=!B4cnDS@K3Ia`ByP4}Evnd>2b@N)J=kD% zb{)#}k6Jn3=c|I;&R>hE31(}73QKkg%1(>QLVql%sRX%*3&S*2gLAi$pjnByF-Mz5 zg%HH%j{%?M16Fnw>-)=5V^FkMn})Frs*9BmcP$^;y4KSQ$7+@h6uo^DW z;5jG`b)h#|mH}cqA$hB~|cAyndA);c-Dx2Ym$TDx@3`W+6?n zC$ElUP-U!Lr8wY2hsK2`EJk3X0~;BaA)sI6ukZ%Ub%^75)Xlf+!Ym5$1Ol@@^_ga! zgmNQdJtwq!*6ZIC99%ipIjsP5bAggBu!O*-?$Z5UR zUQ_3G)EREqF=M=$GnQ7CLB6Da)H9XtLZv}=rKtI)y1gUs?Nmsjks2w`EaU-HiW%OK zorTD5VhE4sRQpT)(PZvnR2g8m%T!5_oj!)bxrv1BY0Q%-H6%t#4-;6u5F`|x9qAd= zi0Or@nj+Zei0+kiZqVmZCnjbXG1EwU%yN7cu(Jc*X|~Wys1*|h76zbUp|d&#jF(Y# zc-)8E$Ub7w_-b1N9%6pFHRiw9P$}K7y@tx0s4^(79HV0s&YAC^{NOlwbMlTD7BeTm zj|v0g6av1*3DG}7;l1L7tvz$tZ>@oyNywFL1;Hd!1RJpWOdH)rb$pr#$=XHh4$>Eh zG&;_vU>&4t<T1vm^cpA;-rrpLw6>Sy!Eaj9?ctlhf!d0ywH{Fb&jT^eqm{q=Fdzf>osFg+V+J@fbxY-jDT0G( zD+*y#cGD(n{;!7kqQhWrS7WUioH>d0{1sT7wRo`d0;{|{)En5TJfrEVaYHz!)%v0M zh)&{>^bqT0nFqRNr3NG}M2Ck2#a~*7iJZAcat=cAA*9xL7{GAt$PyoVN%z3mw8l9U zHTuVBL?ra|(w;3jN1*J`Mga2tifS)-8mxK2qEgt!FzuL) zzW)!dw0BbU@ZMWU&NB!Ap=v$*-Zy{I!U}xJm zUY%tKwNH1T^yp*OC}yeVtVFO0X@Hf~LB0m*mA(U1Y_@J7-D(-Z31T694K#CCOrHYg zS5Rk7y45mzS^r1@A!06k5`wr@xe!0jTfM#r!MgH9?5;?k!wz7DuM7f#H946z+z*k4 zchNv)Wwqs@vg%4xX&EYw??MTS5BM-eh-9Irc0FoON<$m^0(N=IVHsTn+W^*S2gc+BHB{da+O8D4WR#{nPxl%hScQta2#>Bo% z)Sza^u1Bc&!L|;r9IP$Gi(+tKzpb#eseToFPl)6*F%$B}M6Hohy{fDRcC~AQF)*7D zCf>ag!+SHTww?2ckc+d}>zd<4N16|y({f!PX2p!(R@-iTF? z3`%dXJT%`|2cM2hOx>eVH?AjRb&EqdZPh^NMrYDbYnaN%q4J)o3ND5y0)+F zlE~U86olS~0?dB60Kq1wYM3Yn!a-IPyRqZE7!gwTWJ0ygT^1Z^O#O%jY)zKdRK#Wz z+Yljc1Sf3NDsK=PFg~(hf$DLSNvwKs9vmKnS*gbQg5IB~($EF3bx;!&f_oUeG%qU59KMubT+1QWm*-eh+Dc2xEzu1l{gVurJ|*InS0M-iaVd`ZNhh0QPXrD&2$X3zJsK_;8C~ zh>dg_zxqKERbgyrW0*7!3F%wu)|xG{*=<$yek^2ex`i0qaCkH*sBdhWvtlHio0dO> zph+SGR6Ne|NE=4B_^j;I1bY<0rlxCQ4475RClF(Lx)^3Hy*1U97)eb_o<@{8Nl}dF zEa2|fm||nHir4}l@W4?zdB<~z7B~IdMokQw(ZzaH*U{qkEM7#YS?L*OK-o=$^wzB5 zP6Ud}Zd2Q22U_U!T5a_zBE=0LxbxK7)`HJz=*#hlYGhrb*Q-1@H|VRdCgnE}q$0Ln zaUeJdAtXbBiKme893+0!F}C+%G{C{vAY=*pQC8!4rdidu5xX`Py9RFBu7oET;0{iB zHQZNhY3safg_E%QXCwIR;+yBK^+S=-6)a41zPZu$@OxOs;@w?S7MerL z5a70$ngC=;=iJ~Y1oo$Et}(!MgG(xl_3!q^A`Dk_w&NhqUlBI3*Q9P?UwIXrswt{0 zF*kdie{{=2t3gZQn7E$7dyDa;1ML4`W^ElgVrm8 z;~Z#H?B1Malb3sh}JGWsk zgzL%R#{34(bioc4!4{`W#mZEdc{E05?AHxM*Zra1|hW+MaKr8v!ZcgZNot zKN{ugk9Z~Bw$}V^0jFso{LF(d+2(BH8ibWH{VnYZD882*RfwIO7_? zgoo6kx)PV)7VL0@O*;Z4fvxZ@#IGu5UyVe}xSh4M1{fTtHa^zXm|whHV-Tw+gVjvu zjRe>LO227=8Dz9v<8!K6#0)H=vIj*3eX#FcS%$l;J~+(c3zhq-=T$;t8J$^Odm(t* zleFb)kq`!_U;~zm?SoKh4_{k@M>6!z1EB~Jy3n1-_HwG!vS8{ zi>o#drn{;UH|^kS>((0FWrdIPa2v4}K5WOXbzBP(Hf=Aq1_Ydh$5mnEL?f;WtU$CF z5#yHisT*2vfSQW=6>xt9YK?AUp)EzUo}^yziNFWPk&T1f(GS_K{d;PjzVbDl!1Uk- zMC*P$sj1M>pfjvbsjig>mG(4a>j@nS&(=b`vlh#)#$B=u?t|4>k*;Z%noPeL2{&5J zCTl^oxX(>C|FCUu>V8q{Tcq!Kdjr<#cvo9$gW@4dV8IIMA||`F{y=pNB)cWBj5Q5f zhiGxzYbgwZy(dU&@r+A?ole&V1WWD^x@lJ5#aLwRnwoYUl7?Lt)I5I)oWHT^XZoo% zjt)bx#5)PNI*o6#0DPN)^Xl+@4Q@(!%j$xD3yC38@>wb#DHxqq%HdnRS-GPSCHc6H zZ6_l^^;hV(6hoDzrEoa6veY<1Z2}&PfXTy7yjkArO8iQ0O>{xuf>5z_WXN>_qQ&jO zr|=2bh#$Wwdd$#jtCJBXd1{+rQ_|RI&`;dqRRypx=!H$U=m`hcX^5G8wG5NAQF(Pg|V-^Qlk%?+rcmv`k4owlqtxG~QSZ!4IR$vYQbt z`GU!YR#@K*2MYu6u_GQ8PQMvDDf<1|;5@jLYWsfex)qBEB+WR}D#D6`uulPJ#;{SW z%=3=jfDfM(@M1{`em{T!96i}kAR^A|DPoxy zzE#ijm*c?)+sS&@BZxY)o2bU=6Z@eL*W-w@ch@-PmnL{xAO!oxcC0P)F|C^zn885CZh^duAU*DS<7^OY>cFIj1JV3SXjbzBM6d0piPrEodqaQR zCwhS%gT?ICvtnZRNWVj*qMji^G^~clQ$iKd+qWmKP(Qr%L7RUuwn#Rt8tw?^C<2(VWW$x|8%z0LJa z8{s5Beul@t!khiZF@uepHsK2uMmmTe$YH^%ug2kYzgd&sh*X&dQbH8{iU&S57J=2r zxAi^EosHnLcM06IvoAuGbcWJz96%%Z+uPUSsS3kPvzFim-V*(sKmJ93qsojn?tDb_ zb{kRu%n9xb51hgGGwYor_Z|qhPq*Pp{IxJ|go^4y&?)A*a(5wu6?Ge|+*e*1fO|Jk z{keJ~Wwzd6#GBr2JjjHxx+co7o>dW3c5f-3D6nndxc5Y`1RZL0B>J*`Zv}1~b?#Mt ztyB>#hAx0JDyDg(5phB1N~VKoW^9osN}%G_eR~sr9Kr{73%qe+1LkqOT4mx-MEug8 z;p+_o^ER$;ZATv6QxJ1T&oJi}Td{IF!uWa&6M`KQ{dTx*xXePxik?BjA&VmLCa5%2 z7ZQxPBO&g+5qsaBVZ*6tydwf@8GRjF3>lHtL*89zhH^iy3c*r1o)tZl>MlXZ1Owgj zS=;KnQ*hIJ-CGT(*v$i9?zxCpoTBPo;z6K8SAm}>uW?=DC1 zR574SYxP@H(TgPRDny*OEA@|jTCwktxr2zB%Ky8x6Zb>(GZE%!uia%s6M1MIqL!zq zelQH=0gWAy8N^ML@J>ff0AFX)j~wB~z3%$aL}3X+>!fqBDTn0hi5BQ)4yF<}y zr0x*HF4`rF;hq>8@576&xHkf)0)23o5zot*t-Tye3GTL1V8K+i5S}2hmM-ov7Era@ z3MikC7ue04ritVouVyH3XR46@ad&@1Np#)>woi5n*Op2zXZ8_&5=H9l^Fi=RPJa96YjX zthS8(+|KqKk2o{BvIlbeNFs%^mKWc53E6KgyH7%x5uISnqxojj#-3DlpNd)&J88wT zKbW0j9CNb2)!{w^^=Ea`w>~RIkCq!CxE$86bjPjE-De|EQTjk#oDFxMhj<0ZPc;Tu z-SEIZykA&dX1^&4T%_&`+!w<8Dh6c+FmE8mPCT2-HupvDi;)v2wOC?ast5^*`%?F2 zgQX0ftw>7Hq4R0DFLPfG575B^EQU)5!g#})t?nz(ki@@4TDAyjRLD>@3%}ZZ0}xcX zuW?`NzRrC;qb^3>j0%j3m$`3r-$XufZ)a3u)T5ovXr?w|5fa!TU0j{cVW$)R8Ps-2 zA!3woG1pmSd1h&Mx$no)?snhfzSn&pqcWokqbj2rmjR31cK1Wv2;h;M!)PxpM+0V^ zf?6OcL|VvpEC{Iq+XM9n>GUVSppqZ^+X$0YumQ+e;Q51?U+U^DZ5<_H;9zY8wy`$Q z&xsMy(UFu&=Ob}HMfz;Eh+^E&x`DT5i~Bi7dv5_Q7=y11=#|@Bn!*OfEmq&G=1%u3 zCZnJGRYtS45e6pG_qpG6zr|=aqd68!nEPFKCjvkBHQWgIC(s{S4x@dvfrIC?ZPsb@ z%rd@ke-lr|=e`znzJm@#oxZwGtFE)d{S(*A{j>WQq?%d*AB8G=JI;vZu64PGEgG`k zcVl# zcAp$zlFcvZSI~bz;lM$IhYVd>5w!7HgALV<9Zk?hy@6ZW_=UkR9c}}rZlpg$E=myd zw?jF#Kz-%+mjK_dzr7r|^MJFgB3RnkhLpVRtu1inrVWU*;JJwQc7tHdW1$*;*$%%B zb^vc=d42mD7>QGQxg1s{*&VYIu%y&`BJ7A53p>Ek}m{VnpF*6cHDZY1(8$V&%L0rp0{t|eN61a&XyqHlQK~3~HGy!h>LD^HM?3gxv#>_;-%kZK}MKH>%S>yLL zBOxC!X987fxVa&`b;c}6HB|kWsW9qDS{Tu+UYADH+P;Np5B69 zX=n?Fn~h$osqw?Y3i%45*0H||!m}R+Njkj9QX2W+82oSCALj3tM0mp|j0YBRs9Jdi zbf&$qt>v?JRxKD8fL&Zqp4rca9Y!NZh}Q?i{>~1eOBkf%5J(bJmYct@QJG_pABr|D zsB4N_zlxmhQ}|Tyu4xMw3Xv^F5-L$mV0s&fdSnQOvD?2 zhxja@YrGOTWbXh5;#avZxSxUOGKUNxW65|jkxV92$W-7WoIz%h*}yzlL`rlv;`zX_ z)<}*cr;@G6X+~ZouK^dueP~=bN|70KrBG!Kr;mXB>=tWRqnst|G57ZIDrUM z-~|Vx1&sD%bPq=RGdh6LLPiHNI_N5Hgy0qgK@=oG78F6nC^?w%moffI#^1&GyBU8k zHq&;Y3JajVTmYPvQ2`mNp>AXkVg>g@X;N!)qb5 zWgGtttZRlD2cBut-61R0&g=wwExFglgdX^c+4LZ}gH36RkN9UbHaGZ?>F zr=yz#e?r#`PKyBU|BR0=HPalt5ok+vO;)=&_B^At8Vp)EVTBMDRtl?x)k33ifUrhr z64naMLW|HU94NF2?LvpJPFOD-By12i3I_{^2%CgMg~Noy1x;YW5yFweQNq!}F~YIJ zal-M!3BrlONy5p(DZ;73X~OBk8N!*uS;E=EIl{TZdBXX^1;T~GMZ(3xCBmh`W?_r4 zRoEt6CR{FDAzUe3C0s3BBU~$7CtNSwAlxY2B-|`)7j6-56>bx57w!=56z&r47VZ)5 z748%67akBE6dn>D79J5E6&@2F7oHHF6rK{E7M>BF6`m8G7hVuv6kZZ`2s?$Bg;#`E zh1Z1Fg*SvZg|~#ag?EH^h4+N_g%5-eg^z@fg-?V}h0lb~g)f9Jg|CFKg>Qs!h5rfP z3EvAp2tNux2|o+J2)_!y3BL<}2!9HH34aU!2>*(lNJJ{~qC<3wF3~Ltq9{tDEGnWZ zW{AB+kJwwx6tl!^v5%M|_7!u*JTYG^5c`RHi2cO@Vxc%t93&1FhloSPVd8Lcgt(_T zQXD0Y7RQKV#c|?zae_EeoFq;br-)OiGFckalTk4mWvf)rC22{5CdXRtQKp;T5+McNUReVi~EU7#HHdgF(mFU){D!< z262TL7FUX^#MNS>c!0P@Y!cUs&0>q#Djq1diS1&CxK3Oz9wcrMH;M;~hlrcRL&d|y z!$nPG;t}GJ;!)z!;xXc};&I~f;tAr3;z{Dk;wj>(;%VaP;u+$Z;#uO^;yL2E;(6lv z;sxS`;zi=c;w9px;%0G+xK-RHUM5~HULjs7UL{^FUL#&BUMF5J-XPv6-Xz{EZWnJ6 zZxwG7Zx`e@5#WUCw9&qbnEwUbmC@4}J)O}r7(J8GvlxZ7 ziZ)fxlM(b{fN(`(d?w?w7@y7f zK8(*{d|$@rGCq&-`HU}Md_TtT!TA1+AHeuR#t&rtAjU(&G=%X(89$8i!x=w<@sJ;k zWc(<`k7oQB#*bzEIL41>`~=2NWc(z?PiFiS#!qGZG{#S7Jj`4(89$5hdog}Cmec#xuqr!T2K?e-z`7X8bXXKbG;wG5&bQpTPJN8GjPvPiFinj6ap}r!oF?#-G9X zGZ}vtIwOr_+iApbjjz$Pf%e(O7^(O)iC&8 zW^7H{$mhh*QN0J`bK+O1*d_U#_-zs~*yXm-35nmMShvXM#Gg=Qm&oVDUlC$#JeQX7 z-n{vo7an)Q!?SVZbK)PUn;!X`_&3U?K|UvODA--{If+kbO5{LsEcu+|LfIaW&q*RG zrb#|0DG5u7Sd@Z%PU?k<-6x-uGEuLa}L!ugp`YVyNi5I z(w{Nt${f#erQWpOf?#2D%`hlk_J8(jlLd#$bOW zleBZ7N#jv64e~i@5(;*gd`_B*TCqf6Hi9lZ0fmQEB42Z*87Lh~pJkJ-N<=;Y98`@+FsxY4~|4mmc|?G#_PCke!CjoliCxn_mZC;i85- z25#h|Wy~AMQUgkNgM3a}i3-DGc;vbypOYF%V^_n~K^*y1LEjhkQ=D6(wyRY+MkCWeJn+Kp~q4TaUyiC7+Y-MipE0 zz>yFAVMNmIsEFt-v^c~8@5J{DEO+F|6h*~i;V=2hzq+d`vhIYy( z4ZalR3Xy(C(H@Y`Nq?c@Ks)W0)&B{|=cIo-nG_whv4`4ZilQ+s8KqRS(F@2%_!LW}VSwP)xkk83-io#-wvAs?k$ztV<6onbR5qri_?u`mDEnwV5 zj3b|uvr#U_E21qBHOe%jFG|PIo^?q+C+DM1H_7MZJy0oq@;SM%Qz3~)s&R(X9INtR zREiniUETJRhoMTEaoUC7dNt1j| z)^E1#4)Qr!ztR$qWbL9w9tBN@#!fEBp6ChroLq&P-6o%tgQ%7c`J7yv$VuQPUclmN zFlY+xNs?TLO6ii%$x9-}nAB`hQa0lzyhT1IhfuO7J|}meK+nnN!$>-!F6Bm+%d`>5uV0 zewjv=3u&+BYQB)`ME6EWm-@`WgyHu;=<35v(P`@B2I=j1I29QP7kr&~Y9?Y7k9 zbMj^BBc&#vldnXixaZ!I*cADwl!$yzz6N1>PCh4JkNR}=~fH3!2ZF9lCnBGdA4BbUb}%@K9>d{? z+DXXgve8Iy7h>6`pcqSi>Mo``%-ejj1t-77JSxoH(^$43dO5xroC-2r!rlakNLpQ3ut z$mirQP&ck8ilfVdBaNAi zd`@vALfi;W*r*A~=M)Lm<0g|>_0HsTii%3RPClo25GO8}nuWuoF1BZMQ<2XpSqPJ4 z2qu7uA)ixnP&w{F)5JEI$yh4#IVBI_k_<7^7K}$Wuuk-1N}K*gWhjCsi4ainILjk#XzZZE>rF*9bCDW3GPfxs z5Ny}T=af;15%>Od@}@K_3F^dE7)eb_#v)4GE3Y<`m z0eV!|(PGKxl*tIS8_4IBX$TaT-KMrF(s{a7wg+03nTQlOfZ}-LBC5Dk3Qzjz2(jdI z%4`IQ<0y&)!FG=Bq~kfr^vLIwIf(t=lFuo{SVkOw#4Z!ubta!vO0k?cSBg9l&`t6= z#g9;NF)IaB9QmA5hU#$+lvurs2L_Z%M2hQs>)C@{BcD?Oh@Jd7^f+QWbTQ0VjTc0c zlFunMh#I&1k=$Yn)p)4h_7ryfJN(Kb1nvoqM@sTJWj};X>^0papHr4~%R;N_U69Wy z^#~gmMAB%{81gw~1%f1h>pQNqjYz9^cVhB6WfkHjf1f`&9y|pGXWJ8zu_*`i)W*c* zbIMx8OU{&#+{Ps2b4n`$#-&%ud&1U;3CZV_c7*H6;KuyMeB3`V`JA#IvC|%gc2iAC zf(Ua{+!J%kMg&g&41e-QO-eqeY(mK7&zQ$STH_|lqmzn!PB|RW)AoD|-3Um=V_Nn{ zDMusXg4h%{xm(3qXyPU%pHq%Q__PCO5_s6ViY1>@PDI$W zBR~?^Sn@gL6vT|%Sxep$Hm~hWKBt_HSUnl6<|bFn!^+B8yV8m#(^e<)Ipti0{jbUA zlnbzwnR)5FB%bIL=A)|1pL3HhAzXiv?9j|NdDYjY3d2}J9DJV`)4r#y{NX-_k@ zp3n`8C!bTE+a=5FJ}@;T*?p4qIUo9olgsmR~E zV6(Z}fh;UB`JBpi!)9w3c11p?@`##z)tkDVt@mB+Piw0#giJnhB!e_tAdY-a6?@jI zwjDRiDLRwSsS2Ve&o^R>wOTcjF`G1Tz|Ih*O;md!V)A8qV#MU+b805yB@ZMqc(yUC zSGp7VoZ1J`k}sHSXbG9sbkx-3b80RY@!yfpsRg?MKLz=m+8^=L3Oxy%C^h+-F0SjK-wKBvw{`2Ui8POZQa{&VsS>7hpOMe0XCnN6M?R;XgZR6bd`>+dF?X4KPQ3_WQju?^=quo`OF%xSUW$;Zc!^R# zc0oR;Zbj_fPd=w!z6;Hen0!vX3Lz5=bZZpY7WkbA!}P^{4EdaTE#mD)@;UVe1WYhL zq;Fty@;UWp1Wy$Mx~#o^iz-S!r{0Q)yPJGYy#rBG`G1#o#*@#fcki;H3CQQv`w(^4 zSjv)+b0^lm4gQy)Rt|C)SGeH=^q56S1$r?7zkihNFe7SVUDTj4UD#n5LXpHp8z z=v3pod;D;)(;6k8Q+FVEsvzGza69>&`U+z27V`195{HMntV?E261+od`|riVY*8`r~Zgq zJtv=2e?k4-Kt8AbjzGJQd`|rf@lun|WpKUJf4B>`sQ)s4i}m(*hW<4xy(dv3G$$F( z3|H6Ga;C79p>R1{GGxYIz9mCt{1w{3rT8*N{o1g>%v5U-RGIRb8GCR!*JNa6WM}lr z$jRuNk(-g1k)KhJ(U0+0G5%`CU&Huo8Gjw)uV?%XjK7ibH!=R^Ycl$04B$p^LoxwBUmyYp0_jpUJ_p4 z*buI2s_$6Y(zbSSW4o`ZaaAKQ#lhopb_sv`!p1gWhHD3|9ghX06TdYBU0w`YSxZBN zrzg{p)EUk?fcI}*8{kHMXp~%9zqYYyBRt4wFAO>0n(z*7CnJES3&^fI;1^kqt*cv_ z!|jc0*MadZZ4)Ms9S=-DaX(G;lf750?^vN%drX}4%;_bi#igZ1#bd@#E}lGQa#3l? z81EGCj4{37n ziGPTHiT_BPL?wshk_4$h8Y>k^HBzIrNjgC~Q94h$RN5kKlP;I8lWvf1lD12?O0P*@ zNq@_doF(^>`^tH8fjmSWCXbLu%A@76vQMs)+vJnw3*-ysi{wk>E9LF-J@S+CbMmY5 z_wqjqQFz6r2#TZ(RmLjwm2#yr7~55H&wZW;Ja2p6^}O%-(DSk9Q_ts~FFjv-zV&?P`N8v(=U30~o6sOo8#52dJT3F$%*~lwGcV7)GV|)p`!XNT zd?xd`%oj3W%6vETlg!UDzsUS5^M}lzGJnbZE%T2oA*)Z;h^&cOv$E!8Rc0;73TD-0 zEy-GzwSU&~tQA@7vkuQ- zPt5jZ*Jn3mhqG5@H)gNNzBv1e?5ne{&AvYS?(E01pUHkM`-SY6vR}{spbyu_*=I3%&vU-a`8wy@oS$=k&G|j&&z!&e zX7(N0cUs>$eT)10`p)gUy6;hauj+eu-`D$o-S@ZLoZQ^p{M>%I{c{U*2jvdQ9hN&Q zcXsYRx!&C3TwiWQ?t0 zDDRQH$MT-Ydpqyly!Z1y%=&s|@AH4m|GB_b;3>!~$S%k!$SY_s*i>+Q z!D$6&6r5FXPQk?mmlkX(*j8|P!F2_<6ue&WQ^BA89R1w=#C~$W+v+}a?vkI~bvnsGEvEE`;WmRX@WYuQXW%Xu##ahie%XW+nVB==v zV-sK#Vv}Z5VN+vsXY*$xvmtEpY#D$z-~;#pkAWvZ5D)@91&Ba6@EnK$C_p6e3P1o1 zhyr4OI3NK?0#bl9AOpw(a)3Ob04M@VfHI&0r~+z$I-mh)0$PAJpabXvdVoHl9~cCN zfl*)_m;fe$DPRVe1LlE6U>R5i)`3l68`uT*0XlF5d;~rNUx07Gci<=R3p@^<08fFZ z!L#5w@B+vPGJ#jXtKc>8I(P$Q1OEa+5C+*nPLLbq1^GciP#6>i#X(6>8k7a)K_yTH zR0p*{T~Hr10!_iY;C;{%v;pnGhoB4S4tjw;pg;Ho3VkTqerO09h2B7u&@?m$EkMiA8ng-RK>N@k^bz_S`Ud@g ze!;)Nr{FX2Irt*X1pfhFgIQoU7=U4z1LlVLU_n>}7Kf!^Sy%y9hE-t=SR1|#8^Ff! z9rzw>0b9YgumkJ_yTTr@H|z^Ph6CXcI1CPlU%(XjC5*s090SM0NpLEh0cXQ`a3Nd* zm%~+XE!+S%!)x z*SR1r0+%|MK9?caQ!X+Wm8*`covV{;kLxqn7j6PKKer(FBkmyX5bjd$I_?JU1MV-} z-*|5FaPn~TIPiGzc=1qqqIhC>s(D&?+ISXtHhH#rPxD^lz051mtIn&*>&olP>(86U zo6lRwJI*`H`=0MK-zC1we1d#Zd@_7yeAaxneBpdA`DlDOe5HKld_#Pbd{g|V`7iNb z<`>|X>%tR>?Is6oFbei+#x(5 zJS4m#yeqsf!XUyZ!XzRiq9URu@<7B<#7X3-2w8+GQXo<(QY|tfG9@x2dR+8((etA0 zq5`5qqK2a8q86gDqG_TTqOV2AMJGhRiX9g_A;u*pEG8;uCT1;WD;6&HQj8{+FIFK| zB{nKHEjBCmulQ;4v*PUH0^&mAhT`Vp7UER#DDfEaKJhW}H{$ z)K#gQQh=19l)03J6iF&l>XlTXRFzbX)U?#H)T;D(>8sM$q?M($rFEsfr30mdrE{gr zq${Lnq*tWZWEf-^Wte36WW;48Wh`YL$~ep5GD$KiGOuOEWhP`k%KVV|SC&gwSXNZ_ zzO22hqim#Xv}~+wvuuxSpX|2m2iZ?@qH=O_3UVQGFXYH_b#m=;opJ|qU*x{YGs}bW zu>5WLJMwqsgXEvdzmU(7FO@HsUzFdH-%(&tU{qjI5Kxd*kXCr0;HcoFKvjrRh*4-) z=vNq2SXS6k*i!@*c@+5+?di(AMo?AGwDcekchE~xye!mM&v#YV+WB}b)HrCeoAWnYD^DyS-@Dx(^#`dl?a zwO4gibzJqk+DSDAHR=D)&1!*a;cCy-deuhN#?_ChpH)BiA7ksP>#0-Kqts*6`_#wO z-)LOcxS_$OVW?rQVWAPPk)e^LF{81fv8Kta32MTcCYld4tu!&sM9pN)*P7#+6I#c# z&T5_0Qv2@&XQ1^|i>yV}8q%87n$o_m4QUg!?`zv@J8I+FN!lseZ?)&O7j>@au*F!g7w?el{cT@LJ_rq=7+ore8ZfD#s zyj^_z;P#i>-}FTEWcB3r0`!P_;d;G#qk7}|O!_SPtor8qcKQzb+4?2=W%}FtAM`&N zs2S)P7#I{7R2ozpG8wWMvKm?#Iv74QOft+i%r#s$JTN>oQZ~{y(lv@RN;k?hIyCxb z^xas)*udDx7&lHbPBGp#{$TvcM8HJSMA{_OB*KJZ^2TJ&WZo1q!0f@j2e}W*9#lN|X~|%D#!}z% zuBEwUie;{4zU6`C7t3!}a#m_q8decjs1l&oXu^UJ2rQ1;%zc)vTW9E4r~r>1#P8lWo-RyLv6!sdu>N;$L;>GW3&6q?!KM9 zougfuUA>KPm?YkYWIRFmOe+pQChX99mhkl1aM@C0xM;1qS zM}Nlv$2P~;jsp)FA2L5=dHCR=<3p#1?GO7O4mtr&+)lhsVNMjMNT&s-O{Z;VA!li4 zS?3qdh%@Fq;ymR%x(vH=x(d09xIS}z<%+nzb6s>@c4Kja z-Pql%+??E8+*;gv-Cnzc?mX^%?qTi}_el2@_g(jW4=oQP4-=0lk7SQjk5!L7j{{E; zPgzfS&tT8zo)MmXo@1VGysmh$dfoJL^78ib@v8M|^Xl;W==H)`8eir+~fJj8;`dFWCBzI)B;`x#010ztOV=^>^~8IqVPoNN#v90C$Ud9 zp3t8h1hrYXY2(x8|IFgQ|EIU+2@?%74l@r63`4_G!cxQ1!ZN~I!g|9N!dAn+ z6E6^1h%k|Z$W7!U3KFG=vP1=<5>bVyM${wTCE5{#h-4y0j3&kr6NxFrTw*@4kXS-2 zBUTVciF+hQ5*JCBBtjA+DU(!58YFF!E=iAMOY$T=BKeXYlLAS>q~|0m=@khj;iNQD zE-9Z>NGc{(k!nfxq$W}esh2cCnkBs_Es&N-o1`7m9*IsmBK;G7BK%xLMnrZ*Nkmgb zXGDL*yNJz*orwL2!-$U&e@A?a_!04oe2ILSe3i^hzCpf82FV06Cz+e9M1DYaArr|_ zE6Pt<*v42z8t~L7k*dQD>-gk;fz1B2^<@BB_yOk@Yk(Es{o~ zVYFyk94(QSLQAJ*(Q;`8v|?Hrt&&zltEV;5T4^1$ZdxC0fHq7UqfOA>(Pn7xX^XTK z+B$8Ewo5yp9nn6~zR>=m{X~u-ClChYEOH)UL@py&5oY8DauWd&0>X*#ApD3BB8o^L z(uf?Qh}=Td5KTk}(L)Ro6T}QLM;;*7h#lgHI3sR|C-MmKLjsT>BorYc&yWa&io8Nl zBnpW|5|Csh4ar1ukbI;FDMc!fYNQTnL|Tw`qzmaq`jH`I6nTS8BGbqmvVbfjYse`Gx+5oWX@x-l#A77!5>2&@eO{eSuQYmneebXbc*U zCZVZl2AYlLp@nD(T8>tswP*v{jJBbjXb<`t9Yjaaar7-Zh0db$=n}e$ZlK%f9!f_) zpr6sN=y&vA>^OE3JB|I0UBE73SFk^^>liEc7Y1SM7#GHi31GsQ7$%9yVDgv}rh=(s zT9_`Tj~QX6*j?;CW{KHg_Si$r1#`!|Fdxhxdx8aHPcahq93x|q7!AX)Xe;OB$K4D+5 zf3TnUG5iG1fS<+B7s5qx30xYN!xiycxEijB>)?90 zA#Q@3;pX@Q+#0vT9dT#e4fn(!;eL1k9)ySDMEn^Zfm88UIEqK%v3LTWjHlt5cn+SA z7vZIN1zwHU;f;7R-h=ny+xQ3kQ`GsWt5MgYgrj7l+9*%w&Jstfi`e*d77|s}>7?Bv47@ruwnB17M zn2MM;F>^8VG2dfP#xleT$I8UY#Xg92jCG2QjZKTqi0z6UiXDml5qB!?beve6e4JvO zbKIji-?)sp!noo%dfeBzf8u%L#o{I6UE_V@{o|A3v*UB)SK@c$_Y+PhTuQi{Ae{4SyH7^l~Ywx?Ni-TJyR*EcxrTNb81g&U+Q-1htyALf26Uc{gtMbW|U@< z7M}Jpjh0rE)|%Fywvx7+wx7KAXOp zzMlRg<5b4!42}%J4B-r&43msI8KD^w8I+97jG~N^jFF6~jG4?UnXH*NGu1NnG7U2Q zGD9=NGIKIZGs`pIX3l3WW*y5qn{_UWJxd@%D7qO6jvk*uk# zne5Zqm$ENst7hNM*3W*N9hObXuF7uCZq1&{Ud!IdVaj32Va-v@(ah1#amn$?@yp4| zDb6X)d6P4jGoSM_mm&8|E_<#(u28N`u1l_4E}ol|o02<{JC!?=`z!BE-tT#wc|v(2 zd8T=mdDeN9JUlNtuQjhPuRre~?@Qjdd^n#kUm*WZzE!?Wet7=Nd|G}%er0}j{#^cA z{zd^~0doOMfm(rHfkA;+!IOfZf}DcVg7Sjtg5`qM!ZU?Tg;xrt3vU&w7CIJs7J3(! z7d8|&75-CnqUcnSSdn~@Vv%c+Z;^jdOi^l4deK19MA2l?*W%;FCyJqB-eUe@i(-f3 zhsEK=FNQ7_Rfu`GF5;#`til2=kt@~&jDWV!TW z>9x}9rShffrJAKarNO14rJ1Egr6r|rOXo`$%Z`ZtlseXRPo zYL#l;YQ5@^>KE1I>h|jX>cN`RHJ55G*QnOquF7#o-ySQ-o)%o{8k(1wJDq=ue`k%qCx3yps^GB=tuK4`RR#2OPD zlN*;Bw;Okx*qa2JgqrM|+?za``kUS~y=}hP%-PJ{?Aq+x?B870T;JT-{JHtxmSZg{ zExIjwEwq-nmV}n6mZg@JR|me4lSw$irN z&fE^R!|k^1uI=vat?hm7{T+XFuyy>^;ojlj5zx`yG2AiQ$=J!<$DlSsS=3qG zS=;%&>tq*0mwwmXF7vLmuKcdTuEVZxUEjMEyEVJDyOX-JyK}ogb^q-C)uYj4&|}n- z(^J}0-t)QV-`-=r8odU+M!mVcWxW->Kl>Q^&h#1fnfF=rrS#?Y<@fFNeeV16TIIFw zYrWS6uPa|y_n+^-+JCLzx&KkWZ+~@vOMlw{!vNy|(}3=P>44cl(LnV;?ZB78V}rj9 z+6}r5dJGN@z8!ow1P}2I2@C}eg%3R+8XB4$ni^&qhKJdQU59;#{f8TdJBPbRPL5m{ zVH`0Yu^6!&Ngc@>DHz!s`8@JvRB%*kRAw|}^u;K7bYOI1baL$K*v&Cu%y!Im%zdnQ ztY)lk?8Dgiv7h5A&7or#YVpWn*ARe!7b_T}4{w{dTG-hO=hc~WjtZBk?Mg4)6 z`FHB?G~cDX%YB#s?&lQ4)S0RKQ}$DiQzcWiQ}xp)rq54boYt8(nZ7d}H=RD6IlVl+ zGrc#XIHNhEJ(E3CGE+8teD?R*^RvdY7PFSKakJ^OnX~U_*Jn59Wad=n)aFv>^5zQW ze!gdTf9Ac_d#Cpx<5t&J&o;2lz0JE#+@@~7 z++N(?+TPib*-_b1+lkvr-^twhxbtJ@-(7`Wja{wXm%A~$al2EyOS>z3SNCr20eg4$ ztoCg7;`cK4vi6qtw)b}Tx%P$kMfW}T1NH;=bM{O3%lFs!5B3ia1P&w*qz^(5A`U1A zc?abORR^^P^#>gXT?e}dUk|<={B!Vw&P->gbJ2O}0(4=zC|#MZNjIgt(B0`?bRW7u z{Ruso{*+FlKc|!FDfD!D7CncaM=zw8(97vn^jdm7y^-EcpQCTke;r;v + + + + SchemeUserState + + iosApp.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/sample/iosApp/iosApp/Info.plist b/sample/iosApp/iosApp/Info.plist index 9742bf0..b75fa78 100644 --- a/sample/iosApp/iosApp/Info.plist +++ b/sample/iosApp/iosApp/Info.plist @@ -39,6 +39,8 @@ UILaunchStoryboardName LaunchScreen + UIMainStoryboardFile + LaunchScreen UIRequiredDeviceCapabilities armv7 From 3bcba4dfedcb11e39f0d743e13fbf554424f315f Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Sun, 18 Oct 2020 15:46:35 +0200 Subject: [PATCH 08/51] Remove catalyst --- sodiumWrapper/libsodium | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sodiumWrapper/libsodium b/sodiumWrapper/libsodium index b0ed382..7a92dd9 160000 --- a/sodiumWrapper/libsodium +++ b/sodiumWrapper/libsodium @@ -1 +1 @@ -Subproject commit b0ed382e71ff52e5ecef8691d62dfe7a04a803f7 +Subproject commit 7a92dd9bbc39bb47c07de9707046c9e966efcb04 From 7702a9d931a7cf65cbe80f8b76a5769ac1662f32 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Sun, 18 Oct 2020 16:01:01 +0200 Subject: [PATCH 09/51] Catalyst --- sodiumWrapper/libsodium | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sodiumWrapper/libsodium b/sodiumWrapper/libsodium index 7a92dd9..5754e2a 160000 --- a/sodiumWrapper/libsodium +++ b/sodiumWrapper/libsodium @@ -1 +1 @@ -Subproject commit 7a92dd9bbc39bb47c07de9707046c9e966efcb04 +Subproject commit 5754e2a632302554af2f8c7895be26be5ef6e546 From 8b3baaba81bcebe92c086bb25c066adca84123cb Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Sun, 18 Oct 2020 16:46:17 +0200 Subject: [PATCH 10/51] Reverting to old dist-builds --- sodiumWrapper/libsodium | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sodiumWrapper/libsodium b/sodiumWrapper/libsodium index 5754e2a..b5402ae 160000 --- a/sodiumWrapper/libsodium +++ b/sodiumWrapper/libsodium @@ -1 +1 @@ -Subproject commit 5754e2a632302554af2f8c7895be26be5ef6e546 +Subproject commit b5402aed53a36dc8bd4b5feb5d954088a85e375a From 065abe1daba21ef2064202b74532f7e3388d315d Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Sun, 18 Oct 2020 23:29:21 +0200 Subject: [PATCH 11/51] Update libsodium build to latest upstream with tvos modification --- .gitignore | 3 + .gitmodules | 2 +- macBuild.sh | 7 +- .../build.gradle.kts | 58 ++++++++++++---- .../build.gradle.kts | 68 +++++++++++++------ sodiumWrapper/libsodium | 2 +- sodiumWrapper/makeIos.sh | 5 -- sodiumWrapper/makeIosWatchosTvos.sh | 24 +++++++ 8 files changed, 125 insertions(+), 44 deletions(-) delete mode 100755 sodiumWrapper/makeIos.sh create mode 100755 sodiumWrapper/makeIosWatchosTvos.sh diff --git a/.gitignore b/.gitignore index 3d16a63..459283c 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,6 @@ build/ /sodiumWrapper/static-tvos/ /sodiumWrapper/static-watchos/ /kotlin-multiplatform-libsodium-generator/out/ +/sodiumWrapper/static-ios-simulators/ +/sodiumWrapper/static-tvos-simulators/ +/sodiumWrapper/static-watchos-simulators/ diff --git a/.gitmodules b/.gitmodules index 07b8c1c..efa2409 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "sodiumWrapper/libsodium"] path = sodiumWrapper/libsodium - url = https://github.com/ionspin/libsodium.git + url = git@github.com:ionspin/libsodium.git diff --git a/macBuild.sh b/macBuild.sh index 9fb86c2..a2c6d85 100755 --- a/macBuild.sh +++ b/macBuild.sh @@ -5,12 +5,11 @@ set -e #now let's build linux deps cd sodiumWrapper ./makeMacosX86-64.sh -./makeIos.sh -./makeTvos.sh -./makeWatchos.sh +./makeIosWatchosTvos.sh #now we can do the delegated build cd .. ./gradlew multiplatform-crypto-delegated:build -#and finally pure build +#pure build ./gradlew multiplatform-crypto:build +#libsodium bindings set +e \ No newline at end of file diff --git a/multiplatform-crypto-delegated/build.gradle.kts b/multiplatform-crypto-delegated/build.gradle.kts index e0ea1c3..77b5912 100644 --- a/multiplatform-crypto-delegated/build.gradle.kts +++ b/multiplatform-crypto-delegated/build.gradle.kts @@ -297,22 +297,28 @@ kotlin { val macos64Bit = setOf( "macosX64" ) - val ios64Bit = setOf( - "iosArm64", "iosX64" + val iosArm = setOf( + "iosArm64", "iosArm32" ) - val ios32Bit = setOf( - "iosArm32" + val iosSimulator = setOf( + "iosX64" ) val mingw64Bit = setOf( "mingwX64" ) - val tvos64Bit = setOf( - "tvosArm64", "tvosX64" + val tvosArm = setOf( + "tvosArm64" + ) + val tvosSimulator = setOf( + "tvosX64" ) - val watchos32Bit = setOf( - "watchosX86", "watchosArm32", "watchosArm64" + val watchosArm = setOf( + "watchosArm32", "watchosArm64" + ) + val watchosSimulator = setOf( + "watchosX86" ) targets.withType { @@ -347,7 +353,7 @@ kotlin { defaultSourceSet.dependsOn(createWorkaroundNativeMainSourceSet(this@withType.name, nativeDependencies)) } //All ioses share the same static library - if (ios64Bit.contains(this@withType.name)) { + if (iosArm.contains(this@withType.name)) { defaultSourceSet.dependsOn(createWorkaroundNativeMainSourceSet(this@withType.name, nativeDependencies)) println("Setting ios cinterop for $this") val libsodiumCinterop by cinterops.creating { @@ -359,19 +365,19 @@ kotlin { ) } - if (ios32Bit.contains(this@withType.name)) { + if (iosSimulator.contains(this@withType.name)) { defaultSourceSet.dependsOn(createWorkaroundNativeMainSourceSet(this@withType.name, nativeDependencies)) println("Setting ios cinterop for $this") val libsodiumCinterop by cinterops.creating { defFile(project.file("src/nativeInterop/cinterop/libsodium.def")) - compilerOpts.add("-I${project.rootDir}/sodiumWrapper/static-ios/include") + compilerOpts.add("-I${project.rootDir}/sodiumWrapper/static-ios-simulators/include") } kotlinOptions.freeCompilerArgs = listOf( - "-include-binary", "${project.rootDir}/sodiumWrapper/static-ios/lib/libsodium.a" + "-include-binary", "${project.rootDir}/sodiumWrapper/static-ios-simulators/lib/libsodium.a" ) } - if (tvos64Bit.contains(this@withType.name)) { + if (tvosArm.contains(this@withType.name)) { defaultSourceSet.dependsOn(createWorkaroundNativeMainSourceSet(this@withType.name, nativeDependencies)) println("Setting ios cinterop for $this") val libsodiumCinterop by cinterops.creating { @@ -383,7 +389,19 @@ kotlin { ) } - if (watchos32Bit.contains(this@withType.name)) { + if (tvosSimulator.contains(this@withType.name)) { + defaultSourceSet.dependsOn(createWorkaroundNativeMainSourceSet(this@withType.name, nativeDependencies)) + println("Setting ios cinterop for $this") + val libsodiumCinterop by cinterops.creating { + defFile(project.file("src/nativeInterop/cinterop/libsodium.def")) + compilerOpts.add("-I${project.rootDir}/sodiumWrapper/static-tvos-simulators/include") + } + kotlinOptions.freeCompilerArgs = listOf( + "-include-binary", "${project.rootDir}/sodiumWrapper/static-tvos-simulators/lib/libsodium.a" + ) + } + + if (watchosArm.contains(this@withType.name)) { defaultSourceSet.dependsOn(createWorkaroundNativeMainSourceSet(this@withType.name, nativeDependencies)) println("Setting ios cinterop for $this") val libsodiumCinterop by cinterops.creating { @@ -395,6 +413,18 @@ kotlin { ) } + if (watchosSimulator.contains(this@withType.name)) { + defaultSourceSet.dependsOn(createWorkaroundNativeMainSourceSet(this@withType.name, nativeDependencies)) + println("Setting ios cinterop for $this") + val libsodiumCinterop by cinterops.creating { + defFile(project.file("src/nativeInterop/cinterop/libsodium.def")) + compilerOpts.add("-I${project.rootDir}/sodiumWrapper/static-watchos-simulators/include") + } + kotlinOptions.freeCompilerArgs = listOf( + "-include-binary", "${project.rootDir}/sodiumWrapper/static-watchos-simulators/lib/libsodium.a" + ) + } + } diff --git a/multiplatform-crypto-libsodium-bindings/build.gradle.kts b/multiplatform-crypto-libsodium-bindings/build.gradle.kts index d38fad7..77feb1a 100644 --- a/multiplatform-crypto-libsodium-bindings/build.gradle.kts +++ b/multiplatform-crypto-libsodium-bindings/build.gradle.kts @@ -301,22 +301,28 @@ kotlin { val macos64Bit = setOf( "macosX64" ) - val ios64Bit = setOf( - "iosArm64", "iosX64" + val iosArm = setOf( + "iosArm64", "iosArm32" ) - val ios32Bit = setOf( - "iosArm32" + val iosSimulator = setOf( + "iosX64" ) val mingw64Bit = setOf( "mingwX64" ) - val tvos64Bit = setOf( - "tvosArm64", "tvosX64" + val tvosArm = setOf( + "tvosArm64" + ) + val tvosSimulator = setOf( + "tvosX64" ) - val watchos32Bit = setOf( - "watchosX86", "watchosArm32", "watchosArm64" + val watchosArm = setOf( + "watchosArm32", "watchosArm64" + ) + val watchosSimulator = setOf( + "watchosX86" ) targets.withType { @@ -327,12 +333,12 @@ kotlin { defaultSourceSet.dependsOn(nativeMain) } if (linuxArm64Bit.contains(this@withType.name)) { - defaultSourceSet.dependsOn( - createWorkaroundNativeMainSourceSet( - this@withType.name, - nativeDependencies - ) + defaultSourceSet.dependsOn( + createWorkaroundNativeMainSourceSet( + this@withType.name, + nativeDependencies ) + ) compilations.getByName("main") { val libsodiumCinterop by cinterops.creating { @@ -351,7 +357,7 @@ kotlin { defaultSourceSet.dependsOn(createWorkaroundNativeMainSourceSet(this@withType.name, nativeDependencies)) } //All ioses share the same static library - if (ios64Bit.contains(this@withType.name)) { + if (iosArm.contains(this@withType.name)) { defaultSourceSet.dependsOn(createWorkaroundNativeMainSourceSet(this@withType.name, nativeDependencies)) println("Setting ios cinterop for $this") val libsodiumCinterop by cinterops.creating { @@ -363,19 +369,19 @@ kotlin { ) } - if (ios32Bit.contains(this@withType.name)) { + if (iosSimulator.contains(this@withType.name)) { defaultSourceSet.dependsOn(createWorkaroundNativeMainSourceSet(this@withType.name, nativeDependencies)) println("Setting ios cinterop for $this") val libsodiumCinterop by cinterops.creating { defFile(project.file("src/nativeInterop/cinterop/libsodium.def")) - compilerOpts.add("-I${project.rootDir}/sodiumWrapper/static-ios/include") + compilerOpts.add("-I${project.rootDir}/sodiumWrapper/static-ios-simulators/include") } kotlinOptions.freeCompilerArgs = listOf( - "-include-binary", "${project.rootDir}/sodiumWrapper/static-ios/lib/libsodium.a" + "-include-binary", "${project.rootDir}/sodiumWrapper/static-ios-simulators/lib/libsodium.a" ) } - if (tvos64Bit.contains(this@withType.name)) { + if (tvosArm.contains(this@withType.name)) { defaultSourceSet.dependsOn(createWorkaroundNativeMainSourceSet(this@withType.name, nativeDependencies)) println("Setting ios cinterop for $this") val libsodiumCinterop by cinterops.creating { @@ -387,7 +393,19 @@ kotlin { ) } - if (watchos32Bit.contains(this@withType.name)) { + if (tvosSimulator.contains(this@withType.name)) { + defaultSourceSet.dependsOn(createWorkaroundNativeMainSourceSet(this@withType.name, nativeDependencies)) + println("Setting ios cinterop for $this") + val libsodiumCinterop by cinterops.creating { + defFile(project.file("src/nativeInterop/cinterop/libsodium.def")) + compilerOpts.add("-I${project.rootDir}/sodiumWrapper/static-tvos-simulators/include") + } + kotlinOptions.freeCompilerArgs = listOf( + "-include-binary", "${project.rootDir}/sodiumWrapper/static-tvos-simulators/lib/libsodium.a" + ) + } + + if (watchosArm.contains(this@withType.name)) { defaultSourceSet.dependsOn(createWorkaroundNativeMainSourceSet(this@withType.name, nativeDependencies)) println("Setting ios cinterop for $this") val libsodiumCinterop by cinterops.creating { @@ -399,6 +417,18 @@ kotlin { ) } + if (watchosSimulator.contains(this@withType.name)) { + defaultSourceSet.dependsOn(createWorkaroundNativeMainSourceSet(this@withType.name, nativeDependencies)) + println("Setting ios cinterop for $this") + val libsodiumCinterop by cinterops.creating { + defFile(project.file("src/nativeInterop/cinterop/libsodium.def")) + compilerOpts.add("-I${project.rootDir}/sodiumWrapper/static-watchos-simulators/include") + } + kotlinOptions.freeCompilerArgs = listOf( + "-include-binary", "${project.rootDir}/sodiumWrapper/static-watchos-simulators/lib/libsodium.a" + ) + } + } diff --git a/sodiumWrapper/libsodium b/sodiumWrapper/libsodium index b5402ae..1a9ef3d 160000 --- a/sodiumWrapper/libsodium +++ b/sodiumWrapper/libsodium @@ -1 +1 @@ -Subproject commit b5402aed53a36dc8bd4b5feb5d954088a85e375a +Subproject commit 1a9ef3db870ba0d98d04a469bdb9b0cd2379a9e3 diff --git a/sodiumWrapper/makeIos.sh b/sodiumWrapper/makeIos.sh deleted file mode 100755 index 317fd70..0000000 --- a/sodiumWrapper/makeIos.sh +++ /dev/null @@ -1,5 +0,0 @@ -cd libsodium -./dist-build/ios.sh -mkdir ../static-ios -cp -R ./libsodium-ios/lib ../static-ios/lib -cp -R ./libsodium-ios/include ../static-ios/include diff --git a/sodiumWrapper/makeIosWatchosTvos.sh b/sodiumWrapper/makeIosWatchosTvos.sh new file mode 100755 index 0000000..0741fa3 --- /dev/null +++ b/sodiumWrapper/makeIosWatchosTvos.sh @@ -0,0 +1,24 @@ +cd libsodium +./dist-build/apple-xcframework.sh + +mkdir ../static-ios +mkdir ../static-ios-simulators +mkdir ../static-watchos +mkdir ../static-watchos-simulators +mkdir ../static-tvos +mkdir ../static-tvos-simulators + +cp -R ./libsodium-apple/ios/lib ../static-ios/lib +cp -R ./libsodium-apple/ios/include ../static-ios +cp -R ./libsodium-apple/ios-simulators/lib ../static-ios-simulators/lib +cp -R ./libsodium-apple/ios-simulators/include ../static-ios-simulators + +cp -R ./libsodium-apple/watchos/lib ../static-watchos/lib +cp -R ./libsodium-apple/watchos/include ../static-watchos +cp -R ./libsodium-apple/watchos-simulators/lib ../static-watchos-simulators/lib +cp -R ./libsodium-apple/watchos-simulators/include ../static-watchos-simulators + +cp -R ./libsodium-apple/tvos/lib ../static-tvos/lib +cp -R ./libsodium-apple/tvos/include ../static-tvos +cp -R ./libsodium-apple/tvos-simulators/lib ../static-tvos-simulators/lib +cp -R ./libsodium-apple/tvos-simulators/include ../static-tvos-simulators \ No newline at end of file From 02b887041952843ed219cf4904b4ab97f19c4db1 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Sun, 18 Oct 2020 23:58:14 +0200 Subject: [PATCH 12/51] Reenable android everywhere, because mac builds fail if there is no android target present and plugin is declared --- .../build.gradle.kts | 42 ++-- sample/build.gradle.kts | 227 ++++++++++-------- 2 files changed, 145 insertions(+), 124 deletions(-) diff --git a/multiplatform-crypto-libsodium-bindings/build.gradle.kts b/multiplatform-crypto-libsodium-bindings/build.gradle.kts index 77feb1a..528cd95 100644 --- a/multiplatform-crypto-libsodium-bindings/build.gradle.kts +++ b/multiplatform-crypto-libsodium-bindings/build.gradle.kts @@ -77,10 +77,10 @@ android { kotlin { val hostOsName = getHostOsName() + android() runningOnLinuxx86_64 { println("Configuring Linux X86-64 targets") jvm() - android() js { browser { testTask { @@ -440,7 +440,27 @@ kotlin { } } + val androidMain by getting { + isNotRunningInIdea { + kotlin.srcDirs("src/androidSpecific", "src/jvmMain/kotlin") + } + isRunningInIdea { + kotlin.srcDirs("src/androidSpecific") + } + dependencies { + implementation("com.goterl.lazycode:lazysodium-android:4.2.0@aar") + implementation("net.java.dev.jna:jna:5.5.0@aar") + } + } + val androidTest by getting { + dependencies { + implementation(kotlin(Deps.Jvm.test)) + implementation(kotlin(Deps.Jvm.testJUnit)) + implementation("androidx.test:runner:1.2.0") + implementation("androidx.test:rules:1.2.0") + } + } runningOnLinuxx86_64 { @@ -464,27 +484,7 @@ kotlin { implementation(kotlin(Deps.Jvm.reflection)) } } - val androidMain by getting { - isNotRunningInIdea { - kotlin.srcDirs("src/androidSpecific", "src/jvmMain/kotlin") - } - isRunningInIdea { - kotlin.srcDirs("src/androidSpecific") - } - dependencies { - implementation("com.goterl.lazycode:lazysodium-android:4.2.0@aar") - implementation("net.java.dev.jna:jna:5.5.0@aar") - } - } - val androidTest by getting { - dependencies { - implementation(kotlin(Deps.Jvm.test)) - implementation(kotlin(Deps.Jvm.testJUnit)) - implementation("androidx.test:runner:1.2.0") - implementation("androidx.test:rules:1.2.0") - } - } val jsMain by getting { dependencies { diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index b78cdf5..f05b583 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -23,8 +23,8 @@ import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest plugins { kotlin(PluginsDeps.multiplatform) id(PluginsDeps.kapt) - id(PluginsDeps.androidApplication) - id(PluginsDeps.kotlinAndroidExtensions) +// id(PluginsDeps.androidApplication) +// id(PluginsDeps.kotlinAndroidExtensions) id(PluginsDeps.mavenPublish) id(PluginsDeps.signing) kotlin(PluginsDeps.kotlinSerializationPlugin) version Versions.kotlinSerializationPlugin @@ -81,7 +81,7 @@ kotlin { } - android() +// android() linuxX64("linux") { binaries { @@ -232,33 +232,33 @@ kotlin { } } - val androidMain by getting { - - dependencies { - implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:${Versions.kotlin}") - implementation("androidx.appcompat:appcompat:1.2.0") - implementation("androidx.core:core-ktx:1.3.2") - implementation("androidx.constraintlayout:constraintlayout:2.0.2") - implementation("com.google.android.material:material:1.3.0-alpha03") -// implementation("androidx.ui:ui-tooling:$composeDevVersion") -// implementation("androidx.ui:ui-layout:$composeDevVersion") -// implementation("androidx.ui:ui-material:$composeDevVersion") -// implementation("androidx.ui:ui-foundation:$composeDevVersion") -// implementation("androidx.ui:ui-framework:$composeDevVersion") - implementation(Deps.Android.coroutines) - implementation(Deps.Android.timber) -// implementation("androidx.compose:compose-runtime:$composeDevVersion") - } - } - val androidTest by getting { - dependencies { - implementation(kotlin(Deps.Jvm.test)) - implementation(kotlin(Deps.Jvm.testJUnit)) - implementation(Deps.Jvm.coroutinesTest) - implementation(kotlin(Deps.Jvm.reflection)) - implementation(Deps.Jvm.coroutinesCore) - } - } +// val androidMain by getting { +// +// dependencies { +// implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:${Versions.kotlin}") +// implementation("androidx.appcompat:appcompat:1.2.0") +// implementation("androidx.core:core-ktx:1.3.2") +// implementation("androidx.constraintlayout:constraintlayout:2.0.2") +// implementation("com.google.android.material:material:1.3.0-alpha03") +//// implementation("androidx.ui:ui-tooling:$composeDevVersion") +//// implementation("androidx.ui:ui-layout:$composeDevVersion") +//// implementation("androidx.ui:ui-material:$composeDevVersion") +//// implementation("androidx.ui:ui-foundation:$composeDevVersion") +//// implementation("androidx.ui:ui-framework:$composeDevVersion") +// implementation(Deps.Android.coroutines) +// implementation(Deps.Android.timber) +//// implementation("androidx.compose:compose-runtime:$composeDevVersion") +// } +// } +// val androidTest by getting { +// dependencies { +// implementation(kotlin(Deps.Jvm.test)) +// implementation(kotlin(Deps.Jvm.testJUnit)) +// implementation(Deps.Jvm.coroutinesTest) +// implementation(kotlin(Deps.Jvm.reflection)) +// implementation(Deps.Jvm.coroutinesCore) +// } +// } val linuxMain by getting { @@ -329,81 +329,81 @@ kotlin { } -android { - compileSdkVersion(29) - defaultConfig { - applicationId = "com.ionspin.kotlin.crypto.sample" - minSdkVersion(21) - targetSdkVersion(29) - versionCode = 1 - versionName = "1.0" - testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner" - } - buildTypes { - getByName("release") { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") - } - } - sourceSets { - val main by getting - main.manifest.srcFile("src/androidMain/AndroidManifest.xml") - main.java.srcDirs("src/androidMain/kotlin") - main.res.srcDirs("src/androidMain/res") - } - packagingOptions { - exclude("META-INF/library_release.kotlin_module") - exclude("META-INF/kotlinx-serialization-runtime.kotlin_module") - exclude("META-INF/ktor-http.kotlin_module") - exclude("META-INF/ktor-utils.kotlin_module") - exclude("META-INF/ktor-io.kotlin_module") - exclude("META-INF/ktor-*") - } - compileOptions { - setSourceCompatibility(JavaVersion.VERSION_1_8) - setTargetCompatibility(JavaVersion.VERSION_1_8) - } - tasks.withType { - kotlinOptions { - jvmTarget = "1.8" - } - } - -// buildFeatures { -// // Enables Jetpack Compose for this module -// this.compose = true +//android { +// compileSdkVersion(29) +// defaultConfig { +// applicationId = "com.ionspin.kotlin.crypto.sample" +// minSdkVersion(21) +// targetSdkVersion(29) +// versionCode = 1 +// versionName = "1.0" +// testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner" // } - -// composeOptions { -// kotlinCompilerExtensionVersion = "0.1.0-dev05" +// buildTypes { +// getByName("release") { +// isMinifyEnabled = false +// proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") +// } // } - - // Magic for compose dev08, but it doesn't work with serialization plugin because of IR. Leave here for future reference. -// project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java) -// .configureEach { -// println("Task: $this") -// if (this.name.contains("Android")) { -// println("Setting plugins: $this") -// this.kotlinOptions.freeCompilerArgs += listOf( -// "-P", -// "plugin:androidx.compose.plugins.idea:enabled=true" -// ) -// this.kotlinOptions.freeCompilerArgs += "-Xplugin=${project.rootDir}/compose-compiler-0.1.0-dev08.jar" -// this.kotlinOptions.freeCompilerArgs += "-Xuse-ir" -// } +// sourceSets { +// val main by getting +// main.manifest.srcFile("src/androidMain/AndroidManifest.xml") +// main.java.srcDirs("src/androidMain/kotlin") +// main.res.srcDirs("src/androidMain/res") +// } +// packagingOptions { +// exclude("META-INF/library_release.kotlin_module") +// exclude("META-INF/kotlinx-serialization-runtime.kotlin_module") +// exclude("META-INF/ktor-http.kotlin_module") +// exclude("META-INF/ktor-utils.kotlin_module") +// exclude("META-INF/ktor-io.kotlin_module") +// exclude("META-INF/ktor-*") +// } +// compileOptions { +// setSourceCompatibility(JavaVersion.VERSION_1_8) +// setTargetCompatibility(JavaVersion.VERSION_1_8) +// } +// tasks.withType { +// kotlinOptions { +// jvmTarget = "1.8" // } -// project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java) -// .forEach { compile -> -// compile.kotlinOptions.freeCompilerArgs += listOf( -// "-P", -// "plugin:androidx.compose.plugins.idea:enabled=true" -// ) -// compile.kotlinOptions.freeCompilerArgs += "-Xplugin=${project.rootDir}/compose-compiler-0.1.0-dev08.jar" -// compile.kotlinOptions.freeCompilerArgs += "-Xuse-ir" -// println("Compile: $compile") -// println("Compiler free args ${compile.kotlinOptions.freeCompilerArgs}") -// } -} +// } +// +//// buildFeatures { +//// // Enables Jetpack Compose for this module +//// this.compose = true +//// } +// +//// composeOptions { +//// kotlinCompilerExtensionVersion = "0.1.0-dev05" +//// } +// +// // Magic for compose dev08, but it doesn't work with serialization plugin because of IR. Leave here for future reference. +//// project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java) +//// .configureEach { +//// println("Task: $this") +//// if (this.name.contains("Android")) { +//// println("Setting plugins: $this") +//// this.kotlinOptions.freeCompilerArgs += listOf( +//// "-P", +//// "plugin:androidx.compose.plugins.idea:enabled=true" +//// ) +//// this.kotlinOptions.freeCompilerArgs += "-Xplugin=${project.rootDir}/compose-compiler-0.1.0-dev08.jar" +//// this.kotlinOptions.freeCompilerArgs += "-Xuse-ir" +//// } +//// } +//// project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java) +//// .forEach { compile -> +//// compile.kotlinOptions.freeCompilerArgs += listOf( +//// "-P", +//// "plugin:androidx.compose.plugins.idea:enabled=true" +//// ) +//// compile.kotlinOptions.freeCompilerArgs += "-Xplugin=${project.rootDir}/compose-compiler-0.1.0-dev08.jar" +//// compile.kotlinOptions.freeCompilerArgs += "-Xuse-ir" +//// println("Compile: $compile") +//// println("Compiler free args ${compile.kotlinOptions.freeCompilerArgs}") +//// } +//} tasks { @@ -516,7 +516,28 @@ fun org.jetbrains.kotlin.gradle.plugin.mpp.Executable.windowsResources(rcFileNam } - +/* +// Create and configure the targets. + val ios32 = iosArm32("ios32") + val ios64 = iosArm64("ios64") + configure(listOf(ios32, ios64)) { + binaries.framework { + baseName = "my_framework" + } + } + // Create a task to build a fat framework. + tasks.create("debugFatFramework", FatFrameworkTask::class) { + // The fat framework must have the same base name as the initial frameworks. + baseName = "my_framework" + // The default destination directory is '/fat-framework'. + destinationDir = buildDir.resolve("fat-framework/debug") + // Specify the frameworks to be merged. + from( + ios32.binaries.getFramework("DEBUG"), + ios64.binaries.getFramework("DEBUG") + ) + } + */ From 2801fb948449033c3c3da2d3e3d1910ba69d512b Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Mon, 19 Oct 2020 19:10:29 +0200 Subject: [PATCH 13/51] Hack for 32biy/64bit array in native shared code, needs safeguards --- .../com/ionspin/kotlin/crypto/util/LibsodiumUtil.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumUtil.kt b/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumUtil.kt index 81577aa..0a06d5c 100644 --- a/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumUtil.kt +++ b/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumUtil.kt @@ -60,15 +60,15 @@ actual object LibsodiumUtil { actual fun unpad(paddedData: UByteArray, blocksize: Int) : UByteArray { val paddedDataCopy = paddedData.copyOf() val paddedDataCopyPinned = paddedDataCopy.pin() - var newSize = ULongArray(1) { 0UL } - val newSizePinned = newSize.pin() + var newSizeULong = ULongArray(1) { 0UL } + val newSizePinned = newSizeULong.pin() sodium_unpad( - newSizePinned.addressOf(0), + newSizePinned.addressOf(0) as kotlinx.cinterop.CValuesRef, // TODO Find a better solution for this! paddedDataCopyPinned.toPtr(), paddedData.size.convert(), blocksize.convert() ) - val unpaddedSize = newSize[0] + val unpaddedSize = newSizeULong[0] if (unpaddedSize > Int.MAX_VALUE.toULong()) { throw RuntimeException("Unsupported array size (larger than Integer max value) $unpaddedSize") } From 5527b6dc79658cd345ecf2f08fa23598ac1f1b90 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Mon, 19 Oct 2020 19:18:09 +0200 Subject: [PATCH 14/51] Same deal for another return parameter --- .../kotlin/com/ionspin/kotlin/crypto/util/LibsodiumUtil.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumUtil.kt b/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumUtil.kt index 0a06d5c..a599767 100644 --- a/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumUtil.kt +++ b/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumUtil.kt @@ -126,7 +126,7 @@ actual object LibsodiumUtil { data, data.length.convert(), null, - binLenPinned.addressOf(0), + binLenPinned.addressOf(0) as kotlinx.cinterop.CValuesRef, // TODO Find a better solution for this! null, variant.value From 0a7c6a55f3c2350aae40c7a25cd2772a669cfba7 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Mon, 19 Oct 2020 20:10:04 +0200 Subject: [PATCH 15/51] Inital xcode support --- README.md | 4 +- sample/build.gradle.kts | 312 +++++++++++++++++++--------------------- 2 files changed, 146 insertions(+), 170 deletions(-) diff --git a/README.md b/README.md index 255863e..c636e89 100644 --- a/README.md +++ b/README.md @@ -135,10 +135,10 @@ Currently supported native platforms: ### TODO: - Copy/adapt code documentation, currently only some functions have documentation that is a copy-paste from libsodium website -- Complete the bindings list -- Samples +- Replace LazySodium with direct JNA calls, and add build scripts for required libraries if missing - Android testing - Fix browser testing, both locally and in CI/CD +- LobsodiumUtil `unpad` and `fromBase64` native implementations use a nasty hack to support shared native sourceset. The hack either needs to be removed and replaced with another solution or additional safeguards need to be added. diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index f05b583..f0f197f 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -17,14 +17,15 @@ @file:Suppress("UnstableApiUsage") -import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeTest import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest +import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeTest +import org.jetbrains.kotlin.gradle.tasks.FatFrameworkTask plugins { kotlin(PluginsDeps.multiplatform) id(PluginsDeps.kapt) -// id(PluginsDeps.androidApplication) -// id(PluginsDeps.kotlinAndroidExtensions) + id(PluginsDeps.androidApplication) + id(PluginsDeps.kotlinAndroidExtensions) id(PluginsDeps.mavenPublish) id(PluginsDeps.signing) kotlin(PluginsDeps.kotlinSerializationPlugin) version Versions.kotlinSerializationPlugin @@ -35,12 +36,7 @@ org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolverPlugin.apply(project) val sonatypeStaging = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" val sonatypeSnapshots = "https://oss.sonatype.org/content/repositories/snapshots/" -val sonatypePassword : String? by project -val sonatypeUsername : String? by project - -val sonatypePasswordEnv : String? = System.getenv()["SONATYPE_PASSWORD"] -val sonatypeUsernameEnv : String? = System.getenv()["SONATYPE_USERNAME"] repositories { mavenCentral() @@ -55,6 +51,8 @@ val ideaActive = System.getProperty("idea.active") == "true" kotlin { val hostOsName = getHostOsName() + + android() runningOnLinuxx86_64 { jvm() js { @@ -81,7 +79,6 @@ kotlin { } -// android() linuxX64("linux") { binaries { @@ -89,9 +86,7 @@ kotlin { } } } - // Linux 32 is using target-sysroot-2-raspberrypi which is missing getrandom and explicit_bzero in stdlib - // so konanc can't build klib because getrandom missing will cause sodium_misuse() - // so 32bit will be only available from non-delegated flavor + linuxArm64() { binaries { @@ -103,51 +98,44 @@ kotlin { } runningOnMacos { - iosX64() { - binaries { - framework { + val iosX64Target = iosX64() + val iosArm64Target = iosArm64() + val iosArm32Target = iosArm32() + val macosX64Target = macosX64() + val tvosX64Target = tvosX64() + val tvosArm64Target = tvosArm64() + val watchosArm64Target = watchosArm64() + val watchosArm32Target = watchosArm32() + val watchosX86Target = watchosX86() - } + configure(listOf( + iosX64Target, iosArm64Target, iosArm32Target, macosX64Target, + tvosX64Target, tvosArm64Target, watchosArm64Target, + watchosArm32Target, watchosX86Target) + ) { + binaries.framework { + baseName = "sample" } } - iosArm64() { - binaries { - framework { - - } - } - } - - iosArm32() { - binaries { - framework { - - } - } - } - macosX64() { - binaries { - executable { - - } - } - } - - // select iOS target platform depending on the Xcode environment variables - val iOSTarget: (String, org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget.() -> Unit) -> org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget = - if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true) - ::iosArm64 - else - ::iosX64 - - iOSTarget("ios") { - binaries { - framework { - baseName = "LibsodiumBindingsSampleApplication" - export(Deps.Common.sharedModule) - freeCompilerArgs += ("-Xobjc-generics") - } - } + val mode = System.getenv("CONFIGURATION") ?: "DEBUG" + // Create a task to build a fat framework. + tasks.create("packForXcode", FatFrameworkTask::class) { + // The fat framework must have the same base name as the initial frameworks. + baseName = "sample" + // The default destination directory is '/fat-framework'. + destinationDir = File(buildDir, "xcode-frameworks") + // Specify the frameworks to be merged. + from( + iosX64Target.binaries.getFramework(mode), + iosArm64Target.binaries.getFramework(mode), + iosArm32Target.binaries.getFramework(mode), + macosX64Target.binaries.getFramework(mode), + tvosX64Target.binaries.getFramework(mode), + tvosArm64Target.binaries.getFramework(mode), + watchosArm64Target.binaries.getFramework(mode), + watchosArm32Target.binaries.getFramework(mode), + watchosX86Target.binaries.getFramework(mode) + ) } } runningOnWindows { @@ -162,6 +150,8 @@ kotlin { println(targets.names) + + sourceSets { val commonMain by getting { dependencies { @@ -179,6 +169,34 @@ kotlin { } } + val androidMain by getting { + + dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:${Versions.kotlin}") + implementation("androidx.appcompat:appcompat:1.2.0") + implementation("androidx.core:core-ktx:1.3.2") + implementation("androidx.constraintlayout:constraintlayout:2.0.2") + implementation("com.google.android.material:material:1.3.0-alpha03") +// implementation("androidx.ui:ui-tooling:$composeDevVersion") +// implementation("androidx.ui:ui-layout:$composeDevVersion") +// implementation("androidx.ui:ui-material:$composeDevVersion") +// implementation("androidx.ui:ui-foundation:$composeDevVersion") +// implementation("androidx.ui:ui-framework:$composeDevVersion") + implementation(Deps.Android.coroutines) + implementation(Deps.Android.timber) +// implementation("androidx.compose:compose-runtime:$composeDevVersion") + } + } + val androidTest by getting { + dependencies { + implementation(kotlin(Deps.Jvm.test)) + implementation(kotlin(Deps.Jvm.testJUnit)) + implementation(Deps.Jvm.coroutinesTest) + implementation(kotlin(Deps.Jvm.reflection)) + implementation(Deps.Jvm.coroutinesCore) + } + } + val nativeMain by creating { @@ -232,35 +250,6 @@ kotlin { } } -// val androidMain by getting { -// -// dependencies { -// implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:${Versions.kotlin}") -// implementation("androidx.appcompat:appcompat:1.2.0") -// implementation("androidx.core:core-ktx:1.3.2") -// implementation("androidx.constraintlayout:constraintlayout:2.0.2") -// implementation("com.google.android.material:material:1.3.0-alpha03") -//// implementation("androidx.ui:ui-tooling:$composeDevVersion") -//// implementation("androidx.ui:ui-layout:$composeDevVersion") -//// implementation("androidx.ui:ui-material:$composeDevVersion") -//// implementation("androidx.ui:ui-foundation:$composeDevVersion") -//// implementation("androidx.ui:ui-framework:$composeDevVersion") -// implementation(Deps.Android.coroutines) -// implementation(Deps.Android.timber) -//// implementation("androidx.compose:compose-runtime:$composeDevVersion") -// } -// } -// val androidTest by getting { -// dependencies { -// implementation(kotlin(Deps.Jvm.test)) -// implementation(kotlin(Deps.Jvm.testJUnit)) -// implementation(Deps.Jvm.coroutinesTest) -// implementation(kotlin(Deps.Jvm.reflection)) -// implementation(Deps.Jvm.coroutinesCore) -// } -// } - - val linuxMain by getting { dependsOn(nativeMain) } @@ -329,81 +318,81 @@ kotlin { } -//android { -// compileSdkVersion(29) -// defaultConfig { -// applicationId = "com.ionspin.kotlin.crypto.sample" -// minSdkVersion(21) -// targetSdkVersion(29) -// versionCode = 1 -// versionName = "1.0" -// testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner" +android { + compileSdkVersion(29) + defaultConfig { + applicationId = "com.ionspin.kotlin.crypto.sample" + minSdkVersion(21) + targetSdkVersion(29) + versionCode = 1 + versionName = "1.0" + testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + getByName("release") { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + } + } + sourceSets { + val main by getting + main.manifest.srcFile("src/androidMain/AndroidManifest.xml") + main.java.srcDirs("src/androidMain/kotlin") + main.res.srcDirs("src/androidMain/res") + } + packagingOptions { + exclude("META-INF/library_release.kotlin_module") + exclude("META-INF/kotlinx-serialization-runtime.kotlin_module") + exclude("META-INF/ktor-http.kotlin_module") + exclude("META-INF/ktor-utils.kotlin_module") + exclude("META-INF/ktor-io.kotlin_module") + exclude("META-INF/ktor-*") + } + compileOptions { + setSourceCompatibility(JavaVersion.VERSION_1_8) + setTargetCompatibility(JavaVersion.VERSION_1_8) + } + tasks.withType { + kotlinOptions { + jvmTarget = "1.8" + } + } + +// buildFeatures { +// // Enables Jetpack Compose for this module +// this.compose = true // } -// buildTypes { -// getByName("release") { -// isMinifyEnabled = false -// proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + +// composeOptions { +// kotlinCompilerExtensionVersion = "0.1.0-dev05" +// } + + // Magic for compose dev08, but it doesn't work with serialization plugin because of IR. Leave here for future reference. +// project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java) +// .configureEach { +// println("Task: $this") +// if (this.name.contains("Android")) { +// println("Setting plugins: $this") +// this.kotlinOptions.freeCompilerArgs += listOf( +// "-P", +// "plugin:androidx.compose.plugins.idea:enabled=true" +// ) +// this.kotlinOptions.freeCompilerArgs += "-Xplugin=${project.rootDir}/compose-compiler-0.1.0-dev08.jar" +// this.kotlinOptions.freeCompilerArgs += "-Xuse-ir" +// } // } -// } -// sourceSets { -// val main by getting -// main.manifest.srcFile("src/androidMain/AndroidManifest.xml") -// main.java.srcDirs("src/androidMain/kotlin") -// main.res.srcDirs("src/androidMain/res") -// } -// packagingOptions { -// exclude("META-INF/library_release.kotlin_module") -// exclude("META-INF/kotlinx-serialization-runtime.kotlin_module") -// exclude("META-INF/ktor-http.kotlin_module") -// exclude("META-INF/ktor-utils.kotlin_module") -// exclude("META-INF/ktor-io.kotlin_module") -// exclude("META-INF/ktor-*") -// } -// compileOptions { -// setSourceCompatibility(JavaVersion.VERSION_1_8) -// setTargetCompatibility(JavaVersion.VERSION_1_8) -// } -// tasks.withType { -// kotlinOptions { -// jvmTarget = "1.8" +// project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java) +// .forEach { compile -> +// compile.kotlinOptions.freeCompilerArgs += listOf( +// "-P", +// "plugin:androidx.compose.plugins.idea:enabled=true" +// ) +// compile.kotlinOptions.freeCompilerArgs += "-Xplugin=${project.rootDir}/compose-compiler-0.1.0-dev08.jar" +// compile.kotlinOptions.freeCompilerArgs += "-Xuse-ir" +// println("Compile: $compile") +// println("Compiler free args ${compile.kotlinOptions.freeCompilerArgs}") // } -// } -// -//// buildFeatures { -//// // Enables Jetpack Compose for this module -//// this.compose = true -//// } -// -//// composeOptions { -//// kotlinCompilerExtensionVersion = "0.1.0-dev05" -//// } -// -// // Magic for compose dev08, but it doesn't work with serialization plugin because of IR. Leave here for future reference. -//// project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java) -//// .configureEach { -//// println("Task: $this") -//// if (this.name.contains("Android")) { -//// println("Setting plugins: $this") -//// this.kotlinOptions.freeCompilerArgs += listOf( -//// "-P", -//// "plugin:androidx.compose.plugins.idea:enabled=true" -//// ) -//// this.kotlinOptions.freeCompilerArgs += "-Xplugin=${project.rootDir}/compose-compiler-0.1.0-dev08.jar" -//// this.kotlinOptions.freeCompilerArgs += "-Xuse-ir" -//// } -//// } -//// project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java) -//// .forEach { compile -> -//// compile.kotlinOptions.freeCompilerArgs += listOf( -//// "-P", -//// "plugin:androidx.compose.plugins.idea:enabled=true" -//// ) -//// compile.kotlinOptions.freeCompilerArgs += "-Xplugin=${project.rootDir}/compose-compiler-0.1.0-dev08.jar" -//// compile.kotlinOptions.freeCompilerArgs += "-Xuse-ir" -//// println("Compile: $compile") -//// println("Compiler free args ${compile.kotlinOptions.freeCompilerArgs}") -//// } -//} +} tasks { @@ -432,20 +421,7 @@ tasks { } } -// val legacyjsNodeTest by getting(KotlinJsTest::class) { -// -// testLogging { -// events("PASSED", "FAILED", "SKIPPED") -// showStandardStreams = true -// } -// } -// val jsIrBrowserTest by getting(KotlinJsTest::class) { -// testLogging { -// events("PASSED", "FAILED", "SKIPPED") -// showStandardStreams = true -// } -// } } if (getHostOsName() == "windows") { From 8700e6d87eb897b7ef5e7910c675c8ae8dc58963 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Mon, 19 Oct 2020 20:59:49 +0200 Subject: [PATCH 16/51] Successful ios build --- sample/build.gradle.kts | 72 ++---------------- .../iosApp/iosApp.xcodeproj/project.pbxproj | 8 +- .../UserInterfaceState.xcuserstate | Bin 69161 -> 21305 bytes 3 files changed, 12 insertions(+), 68 deletions(-) diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index f0f197f..5e76d7c 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -108,8 +108,12 @@ kotlin { val watchosArm32Target = watchosArm32() val watchosX86Target = watchosX86() + configure(listOf(macosX64Target)) { + binaries.executable {} + } + configure(listOf( - iosX64Target, iosArm64Target, iosArm32Target, macosX64Target, + iosX64Target, iosArm64Target, iosArm32Target, tvosX64Target, tvosArm64Target, watchosArm64Target, watchosArm32Target, watchosX86Target) ) { @@ -118,6 +122,7 @@ kotlin { } } val mode = System.getenv("CONFIGURATION") ?: "DEBUG" + println("Mode $mode") // Create a task to build a fat framework. tasks.create("packForXcode", FatFrameworkTask::class) { // The fat framework must have the same base name as the initial frameworks. @@ -128,13 +133,7 @@ kotlin { from( iosX64Target.binaries.getFramework(mode), iosArm64Target.binaries.getFramework(mode), - iosArm32Target.binaries.getFramework(mode), - macosX64Target.binaries.getFramework(mode), - tvosX64Target.binaries.getFramework(mode), - tvosArm64Target.binaries.getFramework(mode), - watchosArm64Target.binaries.getFramework(mode), - watchosArm32Target.binaries.getFramework(mode), - watchosX86Target.binaries.getFramework(mode) + iosArm32Target.binaries.getFramework(mode) ) } } @@ -436,40 +435,6 @@ tasks { } -if (getHostOsName() == "macos") { - - val packForXcode by tasks.creating(Sync::class) { - val targetDir = File(buildDir, "xcode-frameworks") - - // / selecting the right configuration for the iOS - // / framework depending on the environment - // / variables set by Xcode build - val mode = System.getenv("CONFIGURATION") ?: "DEBUG" - val framework = kotlin.targets - .getByName("ios") - .binaries.getFramework(mode) - inputs.property("mode", mode) - dependsOn(framework.linkTask) - - from({ framework.outputDirectory }) - into(targetDir) - - // / generate a helpful ./gradlew wrapper with embedded Java path - doLast { - val gradlew = File(targetDir, "gradlew") - gradlew.writeText( - "#!/bin/bash\n" + - "export 'JAVA_HOME=${System.getProperty("java.home")}'\n" + - "cd '${rootProject.rootDir}'\n" + - "./gradlew \$@\n" - ) - gradlew.setExecutable(true) - } - } - - tasks.getByName("build").dependsOn(packForXcode) -} - fun org.jetbrains.kotlin.gradle.plugin.mpp.Executable.windowsResources(rcFileName: String) { val taskName = linkTaskName.replaceFirst("link", "windres") val inFile = compilation.defaultSourceSet.resources.sourceDirectories.singleFile.resolve(rcFileName) @@ -492,28 +457,7 @@ fun org.jetbrains.kotlin.gradle.plugin.mpp.Executable.windowsResources(rcFileNam } -/* -// Create and configure the targets. - val ios32 = iosArm32("ios32") - val ios64 = iosArm64("ios64") - configure(listOf(ios32, ios64)) { - binaries.framework { - baseName = "my_framework" - } - } - // Create a task to build a fat framework. - tasks.create("debugFatFramework", FatFrameworkTask::class) { - // The fat framework must have the same base name as the initial frameworks. - baseName = "my_framework" - // The default destination directory is '/fat-framework'. - destinationDir = buildDir.resolve("fat-framework/debug") - // Specify the frameworks to be merged. - from( - ios32.binaries.getFramework("DEBUG"), - ios64.binaries.getFramework("DEBUG") - ) - } - */ + diff --git a/sample/iosApp/iosApp.xcodeproj/project.pbxproj b/sample/iosApp/iosApp.xcodeproj/project.pbxproj index cf55f66..6b849f5 100644 --- a/sample/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/sample/iosApp/iosApp.xcodeproj/project.pbxproj @@ -65,7 +65,7 @@ 7555FF9C242A565B00829871 /* iosAppUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iosAppUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 7555FFA0242A565B00829871 /* iosAppUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iosAppUITests.swift; sourceTree = ""; }; 7555FFA2242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 7555FFB1242A642300829871 /* sample.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = sample.framework; path = "../sample/build/xcode-frameworks/sample.framework"; sourceTree = ""; }; + 7555FFB1242A642300829871 /* sample.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = sample.framework; path = "../build/xcode-frameworks/sample.framework"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -307,7 +307,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cd \"$SRCROOT/..\"\n./gradlew :sample:packForXCode -PXCODE_CONFIGURATION=${CONFIGURATION}\n"; + shellScript = "cd \"$SRCROOT/..\"\n../gradlew :sample:packForXCode -PXCODE_CONFIGURATION=${CONFIGURATION}\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; DEVELOPMENT_TEAM = 5U57WAFNJ6; ENABLE_PREVIEWS = YES; - FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../sample/build/xcode-frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../build/xcode-frameworks"; INFOPLIST_FILE = iosApp/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -508,7 +508,7 @@ DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; DEVELOPMENT_TEAM = 5U57WAFNJ6; ENABLE_PREVIEWS = YES; - FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../sample/build/xcode-frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../build/xcode-frameworks"; INFOPLIST_FILE = iosApp/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", diff --git a/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/ionspin.xcuserdatad/UserInterfaceState.xcuserstate b/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/ionspin.xcuserdatad/UserInterfaceState.xcuserstate index a400651a9148e57c25de63fe108f0ee3cca081bb..625e396c3f02811f00b9a26cb0164ab57b190c9f 100644 GIT binary patch literal 21305 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 Date: Mon, 19 Oct 2020 22:22:33 +0200 Subject: [PATCH 17/51] Further ios improvements --- bindings-macBuildAndPublishSnapshot.sh | 15 +++++++++++++++ buildSrc/src/main/kotlin/Deps.kt | 2 +- macBuild-buildLibsodium.sh | 11 +++++++++++ sample/build.gradle.kts | 6 ++++-- .../iosApp/iosApp.xcodeproj/project.pbxproj | 18 ------------------ .../UserInterfaceState.xcuserstate | Bin 21305 -> 24974 bytes sample/iosApp/iosApp/ContentView.swift | 4 ++++ 7 files changed, 35 insertions(+), 21 deletions(-) create mode 100755 bindings-macBuildAndPublishSnapshot.sh create mode 100755 macBuild-buildLibsodium.sh diff --git a/bindings-macBuildAndPublishSnapshot.sh b/bindings-macBuildAndPublishSnapshot.sh new file mode 100755 index 0000000..57e2558 --- /dev/null +++ b/bindings-macBuildAndPublishSnapshot.sh @@ -0,0 +1,15 @@ +set -e +#!/bin/sh +./gradlew multiplatform-crypto-libsodium-bindings:publishMacosX64PublicationToSnapshotRepository + +./gradlew multiplatform-crypto-libsodium-bindings:publishIosArm32PublicationToSnapshotRepository \ +multiplatform-crypto-libsodium-bindings:publishIosArm64PublicationToSnapshotRepository \ +multiplatform-crypto-libsodium-bindings:publishIosX64PublicationToSnapshotRepository + +./gradlew multiplatform-crypto-libsodium-bindings:publishWatchosArm32PublicationToSnapshotRepository \ +multiplatform-crypto-libsodium-bindings:publishWatchosArm64PublicationToSnapshotRepository \ +multiplatform-crypto-libsodium-bindings:publishWatchosX86PublicationToSnapshotRepository + +./gradlew multiplatform-crypto-libsodium-bindings:publishTvosArm64PublicationToSnapshotRepository \ +multiplatform-crypto-libsodium-bindings:publishTvosX64PublicationToSnapshotRepository +set +e diff --git a/buildSrc/src/main/kotlin/Deps.kt b/buildSrc/src/main/kotlin/Deps.kt index 96d7376..b026cce 100644 --- a/buildSrc/src/main/kotlin/Deps.kt +++ b/buildSrc/src/main/kotlin/Deps.kt @@ -56,7 +56,7 @@ object Deps { val apiProject = ":multiplatform-crypto-api" - val sharedModule = "com.ionspin.kotlin.crypto.sample:shared:${Versions.sharedModule}" + val libsodiumModule = "com.ionspin.kotlin:multiplatform-crypto-libsodium-bindings:${Versions.sharedModule}" val kodein = "org.kodein.di:kodein-di:${Versions.kodeinVersion}" } diff --git a/macBuild-buildLibsodium.sh b/macBuild-buildLibsodium.sh new file mode 100755 index 0000000..84546be --- /dev/null +++ b/macBuild-buildLibsodium.sh @@ -0,0 +1,11 @@ +set -e +#!/bin/sh +#this will hopefully download all konan dependancies that we use in the build scripts +./gradlew multiplatform-crypto-api:build +#now let's build linux deps +cd sodiumWrapper +./makeMacosX86-64.sh +./makeIosWatchosTvos.sh +#now we can do the delegated build +cd .. +set +e \ No newline at end of file diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 5e76d7c..e54ab0b 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -42,6 +42,7 @@ repositories { mavenCentral() jcenter() maven("https://dl.bintray.com/terl/lazysodium-maven") + maven("https://oss.sonatype.org/content/repositories/snapshots/") } group = "com.ionspin.kotlin" @@ -118,7 +119,8 @@ kotlin { watchosArm32Target, watchosX86Target) ) { binaries.framework { - baseName = "sample" + baseName = "LibsodiumBindings" + export(Deps.Common.libsodiumModule) } } val mode = System.getenv("CONFIGURATION") ?: "DEBUG" @@ -158,7 +160,7 @@ kotlin { implementation(kotlin(Deps.Common.test)) implementation(Deps.Common.kotlinBigNum) implementation(Deps.Common.serialization) - implementation(project(":multiplatform-crypto-libsodium-bindings")) + api(Deps.Common.libsodiumModule) } } val commonTest by getting { diff --git a/sample/iosApp/iosApp.xcodeproj/project.pbxproj b/sample/iosApp/iosApp.xcodeproj/project.pbxproj index 6b849f5..84aaf76 100644 --- a/sample/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/sample/iosApp/iosApp.xcodeproj/project.pbxproj @@ -15,8 +15,6 @@ 7555FF8B242A565B00829871 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7555FF89242A565B00829871 /* LaunchScreen.storyboard */; }; 7555FF96242A565B00829871 /* iosAppTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF95242A565B00829871 /* iosAppTests.swift */; }; 7555FFA1242A565B00829871 /* iosAppUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FFA0242A565B00829871 /* iosAppUITests.swift */; }; - 7555FFB2242A642300829871 /* sample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7555FFB1242A642300829871 /* sample.framework */; }; - 7555FFB3242A642300829871 /* sample.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7555FFB1242A642300829871 /* sample.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -36,20 +34,6 @@ }; /* End PBXContainerItemProxy section */ -/* Begin PBXCopyFilesBuildPhase section */ - 7555FFB4242A642300829871 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 7555FFB3242A642300829871 /* sample.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - /* Begin PBXFileReference section */ 7555FF7B242A565900829871 /* iosApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iosApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 7555FF7E242A565900829871 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -73,7 +57,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 7555FFB2242A642300829871 /* sample.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -174,7 +157,6 @@ 7555FF77242A565900829871 /* Sources */, 7555FF78242A565900829871 /* Frameworks */, 7555FF79242A565900829871 /* Resources */, - 7555FFB4242A642300829871 /* Embed Frameworks */, ); buildRules = ( ); diff --git a/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/ionspin.xcuserdatad/UserInterfaceState.xcuserstate b/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/ionspin.xcuserdatad/UserInterfaceState.xcuserstate index 625e396c3f02811f00b9a26cb0164ab57b190c9f..e7ba4d6f2150c4e596c40c09b9d634c669304289 100644 GIT binary patch delta 10275 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 Lb6>w_@jv@Nxf4mR diff --git a/sample/iosApp/iosApp/ContentView.swift b/sample/iosApp/iosApp/ContentView.swift index dfe33f9..e9437d7 100644 --- a/sample/iosApp/iosApp/ContentView.swift +++ b/sample/iosApp/iosApp/ContentView.swift @@ -1,8 +1,12 @@ import SwiftUI +import sample + struct ContentView: View { var body: some View { + Text("Hello, World!") + } } From ff0ff4f3dce4ec5e5b9c3038ce7123edcdf25ad7 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Mon, 19 Oct 2020 22:27:38 +0200 Subject: [PATCH 18/51] Version bump --- buildSrc/src/main/kotlin/Deps.kt | 5 +++-- multiplatform-crypto-libsodium-bindings/build.gradle.kts | 2 +- sample/build.gradle.kts | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/buildSrc/src/main/kotlin/Deps.kt b/buildSrc/src/main/kotlin/Deps.kt index b026cce..0c7fae3 100644 --- a/buildSrc/src/main/kotlin/Deps.kt +++ b/buildSrc/src/main/kotlin/Deps.kt @@ -27,7 +27,7 @@ object Versions { val lazySodium = "4.3.1-SNAPSHOT" val jna = "5.5.0" val kotlinPoet = "1.6.0" - val sharedModule = "0.1.0-SNAPSHOT" + val libsodiumBindings = "0.1.1-SNAPSHOT" val ktor = "1.3.2" val timber = "4.7.1" val kodeinVersion = "7.1.0" @@ -39,6 +39,7 @@ object Versions { object ReleaseInfo { val group = "com.ionspin.kotlin" val version = "0.1.0-SNAPSHOT" + val bindingsVersion = "0.1.1-SNAPSHOT" } object Deps { @@ -56,7 +57,7 @@ object Deps { val apiProject = ":multiplatform-crypto-api" - val libsodiumModule = "com.ionspin.kotlin:multiplatform-crypto-libsodium-bindings:${Versions.sharedModule}" + val libsodiumBindings = "com.ionspin.kotlin:multiplatform-crypto-libsodium-bindings:${Versions.libsodiumBindings}" val kodein = "org.kodein.di:kodein-di:${Versions.kodeinVersion}" } diff --git a/multiplatform-crypto-libsodium-bindings/build.gradle.kts b/multiplatform-crypto-libsodium-bindings/build.gradle.kts index 528cd95..3195504 100644 --- a/multiplatform-crypto-libsodium-bindings/build.gradle.kts +++ b/multiplatform-crypto-libsodium-bindings/build.gradle.kts @@ -53,7 +53,7 @@ repositories { } group = ReleaseInfo.group -version = ReleaseInfo.version +version = ReleaseInfo.bindingsVersion val ideaActive = isInIdea() println("Idea active: $ideaActive") diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index e54ab0b..4cc5ec3 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -120,7 +120,7 @@ kotlin { ) { binaries.framework { baseName = "LibsodiumBindings" - export(Deps.Common.libsodiumModule) + export(Deps.Common.libsodiumBindings) } } val mode = System.getenv("CONFIGURATION") ?: "DEBUG" @@ -160,7 +160,7 @@ kotlin { implementation(kotlin(Deps.Common.test)) implementation(Deps.Common.kotlinBigNum) implementation(Deps.Common.serialization) - api(Deps.Common.libsodiumModule) + api(Deps.Common.libsodiumBindings) } } val commonTest by getting { From bb216793d0727e5d411d5a127f301330142234ec Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Mon, 19 Oct 2020 23:01:03 +0200 Subject: [PATCH 19/51] Forgot framework name update --- sample/build.gradle.kts | 2 +- .../UserInterfaceState.xcuserstate | Bin 24974 -> 24991 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 4cc5ec3..364fbd6 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -128,7 +128,7 @@ kotlin { // Create a task to build a fat framework. tasks.create("packForXcode", FatFrameworkTask::class) { // The fat framework must have the same base name as the initial frameworks. - baseName = "sample" + baseName = "LibsodiumBindings" // The default destination directory is '/fat-framework'. destinationDir = File(buildDir, "xcode-frameworks") // Specify the frameworks to be merged. diff --git a/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/ionspin.xcuserdatad/UserInterfaceState.xcuserstate b/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/ionspin.xcuserdatad/UserInterfaceState.xcuserstate index e7ba4d6f2150c4e596c40c09b9d634c669304289..43a0fdde01716f27cecea1c125b3812056fd1f42 100644 GIT binary patch delta 1602 zcmXYxeNa|a9>R{6Zb zsz6i93tFgO3H68ggZyDJ{wRO2KQ`JGqa1II9y8_SEv_Ik~fo3Mz_9OY+OATAs23O^+n{R=X-)e%DK` zX4mVkw_QhFpSsSuuDSX_I2a2i0}Xfp20AbR0Ss_p0Rd)$SztEE1arYWPymX+bD$2q z0*--q!582>=mtN4`^s?AO0W{4#3&P$WF=F{Ql396Pq^*8mm^j5u1@6eCwC-jp(y;JYfhm1Hw zHx?LMjRvFLxL{l}dX4MG4dbRUXxuY?G47KHGKxf!XflZ;kjW&8q!LIlF$g1)JWJM- z4P+y!B7Y#eNj0e<0kW4gk|y#NX(ess2suhR$>-!t@-;b6E|N>+GPy#olb>h^^~KUL zbSxcDlj(FigQieI1x=?JG?UJ!PtaVth%TXp^tZH#uAv9$+w?GPqaC!D-lliyARS^} zmd-L*Cd*>kEQhUTRA!W*@OGc9C_n zOFs5J`zPyT{p>am;vqbYkK)mMG>_*AJc&=`!w-SmT<~$U-g4u5=R=73Cnr}H)o>gp>S?jGzYqPb(+GSN+&s()tr`2WsZ2e-7 zw8QO4JI0Q+$JufAbX&DOw$~=Mu+!}fJJX(Pud|!&Gxk?@mwnm(mpx$LweQ*Y#Rw59 zB1Dvk5fj8jF-1T@1Q)hX%oLd-OJs`$Vxd?jo)#;`I#DS$i)~`Ns1`M%R@8}l(I{G+ z9A}}E=M+07&N`>U+30L?wmLOVt@EN&@9c42b{d@~r_f7>7@-VIE!WnaC7tizieC4;Ulm&wUX>W9#H%}+ z<9a0z8JdzhEG<35v`3A7_>l?Oo}BzdD1TU4gl<3|!l9$XtT2mE7K%?Jg!0K**^kaB zDa`k`IYM_wJTNIM+n7}tn3sE-W&Z{98irSOZy0%dCZX-YOnvl2V?r;a&FW*3apR|D zWoPG?7Z%PLpBE^b?{6H(+p-?jCqDLgC_MeyG>ha+y4{#mJg1Uwp*+M%9QFRH((SF}WpXiT#;q2*|0nqOO_ zE!AqZ*R?gue^SB!RHokH9cY_dLV8Nn?W6Oro^RPj)(;6T)R*XW`kVSXeY3t@Z`Jqf zU+Zo95&f8cTtBII>RtL3{i=S$Pz=q8FrtheMy%1(NHo%nv4%8e8*7bi#sT98;~I>F zu`nJc!X(%S_J@Pu5SRjIz%p14{jdT)2P@%nSPvUu6Wjnd!!2+tY=IvJ;YV;MJOta} z5qK1Kz!UH!?1ZP_Y4{5~=Zo|W^^NnD`d0b2`#MnsN=BJz0-A`jkwnu_5h_NrP$?=y z&!87kHCl|8p%v&QvOw!GOXwQ9i2)A7-Ej<##ql_p zfDxXE3voHFzyVx|tMOvI6xZO_a1-8uH{thiGv0$uY+Ke3;XUzmN#mqDxGYiZjv&1Yl=bH1(1!lmkG=t_V=4$hGbB$SV zHkeK326MByC1^IAt>y(Q(i&t9w`N<*tVV0Eb<{d$by&x(6V_SloORy1XkD|eTQ{s* zqz8#1cab=959vz=kildq$t06V0VyOi${>&w22<0r|B7bmR?{38DyAQj4_9~Yzmvf3fa@FgauhOTf`Q#Wo$WnmA%2< zWNTR?Yhqj2R@TBkV6AK)JHQSG*tv_cY4!)Z%>HKA*)0xuG>_qNyeA*ZQ+XOs z=a6Gw#Ql5$f0i%dHN2MB@l`y;8~8^40dM8|`PaOSAK}ONaek6_@-BXc->?;1v%~Ff zcC;O1$Jq&XlHJ?B*B)#;_CxklcDcRW4%XW(_Fnsx{hNK&A&zh!bS5~tPM%ZX6gef% zGmhV>aGrB2oo1)i`N=u&{N-GAZU{waB0@xpUgCbyPYe{vB3(d%g(aw%F6zV%v0Jo? zL*jeUCC-R*;-dIdToKpAO;>TF-0p6?+t*EYQ{1$mYq*xnT*n>mj&vV($Gh3?bhpSY zaZBB~ZiO3gE8U=5?bf)fJl7lPP4IHPC%x%jzBkh=_GWtluhM(btM(RqOT8Lzh1cx0 zdpBi@M3T! Z7xF8)Pac$qWxM=Q{v^9X!MuLp%s)Av7FGZN From 62397b54257f590544be3d488dd56d69f69f7d4e Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Mon, 19 Oct 2020 23:42:04 +0200 Subject: [PATCH 20/51] Gradle version bump --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 65fa2e2..8e234f9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -16,6 +16,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From e7093ab15f9d66848c41b0beecf81db5d16424bf Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Tue, 20 Oct 2020 00:22:22 +0200 Subject: [PATCH 21/51] export library framework experiment --- .../build.gradle.kts | 184 +++++++++--------- sample/build.gradle.kts | 35 ++-- 2 files changed, 112 insertions(+), 107 deletions(-) diff --git a/multiplatform-crypto-libsodium-bindings/build.gradle.kts b/multiplatform-crypto-libsodium-bindings/build.gradle.kts index 3195504..b06227f 100644 --- a/multiplatform-crypto-libsodium-bindings/build.gradle.kts +++ b/multiplatform-crypto-libsodium-bindings/build.gradle.kts @@ -145,107 +145,103 @@ kotlin { println("Configuring Linux Arm 32 targets") } - - runningOnMacos { - println("Configuring macos targets") - iosX64() { - binaries { - framework { - optimized = true - } - } - } - iosArm64() { - binaries { - framework { - optimized = true - } - } - } - - iosArm32() { - binaries { - framework { - optimized = true - } - } - } - macosX64() { - binaries { - framework { - optimized = true - } - } - compilations.getByName("main") { - val libsodiumCinterop by cinterops.creating { - defFile(project.file("src/nativeInterop/cinterop/libsodium.def")) - compilerOpts.add("-I${project.rootDir}/sodiumWrapper/static-macos-x86-64/include") - } - kotlinOptions.freeCompilerArgs = listOf( - "-include-binary", "${project.rootDir}/sodiumWrapper/static-macos-x86-64/lib/libsodium.a" - ) - } - } - tvosX64() { - binaries { - framework { - optimized = true - } - } - } - - tvosArm64() { - binaries { - framework { - optimized = true - } - } - } - - watchosArm64() { - binaries { - framework { - optimized = true - } - } - } - - watchosArm32() { - binaries { - framework { - optimized = true - } - } - } - - watchosX86() { - binaries { - framework { - optimized = true - } + println("Configuring macos targets") + iosX64() { + binaries { + framework { + optimized = true } } } - runningOnWindows { - println("Configuring Mingw targets") - mingwX64() { - binaries { - staticLib { - optimized = true - } - } - compilations.getByName("main") { - val libsodiumCinterop by cinterops.creating { - defFile(project.file("src/nativeInterop/cinterop/libsodium.def")) - compilerOpts.add("-I${project.rootDir}/sodiumWrapper/static-mingw-x86-64/include") - } - kotlinOptions.freeCompilerArgs = listOf( - "-include-binary", "${project.rootDir}/sodiumWrapper/static-mingw-x86-64/lib/libsodium.a" - ) + iosArm64() { + binaries { + framework { + optimized = true } } } + iosArm32() { + binaries { + framework { + optimized = true + } + } + } + macosX64() { + binaries { + framework { + optimized = true + } + } + compilations.getByName("main") { + val libsodiumCinterop by cinterops.creating { + defFile(project.file("src/nativeInterop/cinterop/libsodium.def")) + compilerOpts.add("-I${project.rootDir}/sodiumWrapper/static-macos-x86-64/include") + } + kotlinOptions.freeCompilerArgs = listOf( + "-include-binary", "${project.rootDir}/sodiumWrapper/static-macos-x86-64/lib/libsodium.a" + ) + } + } + tvosX64() { + binaries { + framework { + optimized = true + } + } + } + + tvosArm64() { + binaries { + framework { + optimized = true + } + } + } + + watchosArm64() { + binaries { + framework { + optimized = true + } + } + } + + watchosArm32() { + binaries { + framework { + optimized = true + } + } + } + + watchosX86() { + binaries { + framework { + optimized = true + } + } + } + println("Configuring Mingw targets") + mingwX64() { + binaries { + staticLib { + optimized = true + } + } + compilations.getByName("main") { + val libsodiumCinterop by cinterops.creating { + defFile(project.file("src/nativeInterop/cinterop/libsodium.def")) + compilerOpts.add("-I${project.rootDir}/sodiumWrapper/static-mingw-x86-64/include") + } + kotlinOptions.freeCompilerArgs = listOf( + "-include-binary", "${project.rootDir}/sodiumWrapper/static-mingw-x86-64/lib/libsodium.a" + ) + } + } + + println(targets.names) sourceSets { diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 364fbd6..90ff178 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -99,9 +99,18 @@ kotlin { } runningOnMacos { - val iosX64Target = iosX64() - val iosArm64Target = iosArm64() - val iosArm32Target = iosArm32() + val iosX64Target = iosX64() { + baseName = "LibsodiumBindings" + export(Deps.Common.libsodiumBindings) + } + val iosArm64Target = iosArm64() { + baseName = "LibsodiumBindings" + export(Deps.Common.libsodiumBindings) + } + val iosArm32Target = iosArm32() { + baseName = "LibsodiumBindings" + export(Deps.Common.libsodiumBindings) + } val macosX64Target = macosX64() val tvosX64Target = tvosX64() val tvosArm64Target = tvosArm64() @@ -113,16 +122,16 @@ kotlin { binaries.executable {} } - configure(listOf( - iosX64Target, iosArm64Target, iosArm32Target, - tvosX64Target, tvosArm64Target, watchosArm64Target, - watchosArm32Target, watchosX86Target) - ) { - binaries.framework { - baseName = "LibsodiumBindings" - export(Deps.Common.libsodiumBindings) - } - } +// configure(listOf( +// iosX64Target, iosArm64Target, iosArm32Target, +// tvosX64Target, tvosArm64Target, watchosArm64Target, +// watchosArm32Target, watchosX86Target) +// ) { +// binaries.framework { +// baseName = "LibsodiumBindings" +// export(Deps.Common.libsodiumBindings) +// } +// } val mode = System.getenv("CONFIGURATION") ?: "DEBUG" println("Mode $mode") // Create a task to build a fat framework. From adf81371edc98a0e72d5af6f7232f3d899658d3c Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Tue, 20 Oct 2020 00:23:59 +0200 Subject: [PATCH 22/51] Mistake mistake --- sample/build.gradle.kts | 45 ++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 90ff178..0989422 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -100,16 +100,29 @@ kotlin { runningOnMacos { val iosX64Target = iosX64() { - baseName = "LibsodiumBindings" - export(Deps.Common.libsodiumBindings) + binaries { + framework { + baseName = "LibsodiumBindings" + export(Deps.Common.libsodiumBindings) + } + } + } val iosArm64Target = iosArm64() { - baseName = "LibsodiumBindings" - export(Deps.Common.libsodiumBindings) + binaries { + framework { + baseName = "LibsodiumBindings" + export(Deps.Common.libsodiumBindings) + } + } } val iosArm32Target = iosArm32() { - baseName = "LibsodiumBindings" - export(Deps.Common.libsodiumBindings) + binaries { + framework { + baseName = "LibsodiumBindings" + export(Deps.Common.libsodiumBindings) + } + } } val macosX64Target = macosX64() val tvosX64Target = tvosX64() @@ -122,16 +135,16 @@ kotlin { binaries.executable {} } -// configure(listOf( -// iosX64Target, iosArm64Target, iosArm32Target, -// tvosX64Target, tvosArm64Target, watchosArm64Target, -// watchosArm32Target, watchosX86Target) -// ) { -// binaries.framework { -// baseName = "LibsodiumBindings" -// export(Deps.Common.libsodiumBindings) -// } -// } + configure(listOf( + iosX64Target, iosArm64Target, iosArm32Target, + tvosX64Target, tvosArm64Target, watchosArm64Target, + watchosArm32Target, watchosX86Target) + ) { + binaries.framework { + baseName = "LibsodiumBindings" + export(Deps.Common.libsodiumBindings) + } + } val mode = System.getenv("CONFIGURATION") ?: "DEBUG" println("Mode $mode") // Create a task to build a fat framework. From 2b43c6e29381b32822dafb73e10f70f92c241bfc Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Tue, 20 Oct 2020 00:24:57 +0200 Subject: [PATCH 23/51] Already exists --- sample/build.gradle.kts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 0989422..1596980 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -135,16 +135,16 @@ kotlin { binaries.executable {} } - configure(listOf( - iosX64Target, iosArm64Target, iosArm32Target, - tvosX64Target, tvosArm64Target, watchosArm64Target, - watchosArm32Target, watchosX86Target) - ) { - binaries.framework { - baseName = "LibsodiumBindings" - export(Deps.Common.libsodiumBindings) - } - } +// configure(listOf( +// iosX64Target, iosArm64Target, iosArm32Target, +// tvosX64Target, tvosArm64Target, watchosArm64Target, +// watchosArm32Target, watchosX86Target) +// ) { +// binaries.framework { +// baseName = "LibsodiumBindings" +// export(Deps.Common.libsodiumBindings) +// } +// } val mode = System.getenv("CONFIGURATION") ?: "DEBUG" println("Mode $mode") // Create a task to build a fat framework. From a210ef2db3bbb3564eed87ccfa19df0b5d18be96 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Tue, 20 Oct 2020 00:32:42 +0200 Subject: [PATCH 24/51] It's late --- .../kotlin/com/ionspin/kotlin/crypto/sample/Sample.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sample/src/commonMain/kotlin/com/ionspin/kotlin/crypto/sample/Sample.kt b/sample/src/commonMain/kotlin/com/ionspin/kotlin/crypto/sample/Sample.kt index dd58382..2e4fb1f 100644 --- a/sample/src/commonMain/kotlin/com/ionspin/kotlin/crypto/sample/Sample.kt +++ b/sample/src/commonMain/kotlin/com/ionspin/kotlin/crypto/sample/Sample.kt @@ -1,6 +1,8 @@ package com.ionspin.kotlin.crypto.sample +import com.ionspin.kotlin.crypto.hash.Hash import com.ionspin.kotlin.crypto.util.LibsodiumRandom +import com.ionspin.kotlin.crypto.util.encodeToUByteArray import com.ionspin.kotlin.crypto.util.toHexString @@ -9,4 +11,9 @@ object Sample { val random = LibsodiumRandom.buf(32) println("Random: ${random.toHexString()}") } + + fun hashSomething() : String { + val hash = Hash.sha512("123".encodeToUByteArray()) + return "Hash (SHA512) of 123: ${hash.toHexString()}" + } } From ce945d40ec7708525de11a536f99b5db231dc43f Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Tue, 20 Oct 2020 00:37:07 +0200 Subject: [PATCH 25/51] Working ios base sample --- .../iosApp/iosApp.xcodeproj/project.pbxproj | 20 ++++++++++++++++++ .../UserInterfaceState.xcuserstate | Bin 24991 -> 28828 bytes sample/iosApp/iosApp/ContentView.swift | 8 +++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/sample/iosApp/iosApp.xcodeproj/project.pbxproj b/sample/iosApp/iosApp.xcodeproj/project.pbxproj index 84aaf76..b8b75c4 100644 --- a/sample/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/sample/iosApp/iosApp.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 5745FD43253E4477006B7D0E /* LibsodiumBindings.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5745FD42253E4477006B7D0E /* LibsodiumBindings.framework */; }; + 5745FD44253E4477006B7D0E /* LibsodiumBindings.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 5745FD42253E4477006B7D0E /* LibsodiumBindings.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 7555FF7F242A565900829871 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF7E242A565900829871 /* AppDelegate.swift */; }; 7555FF81242A565900829871 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF80242A565900829871 /* SceneDelegate.swift */; }; 7555FF83242A565900829871 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF82242A565900829871 /* ContentView.swift */; }; @@ -34,7 +36,22 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 5745FD45253E4477006B7D0E /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 5745FD44253E4477006B7D0E /* LibsodiumBindings.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ + 5745FD42253E4477006B7D0E /* LibsodiumBindings.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LibsodiumBindings.framework; path = "../build/xcode-frameworks/LibsodiumBindings.framework"; sourceTree = ""; }; 7555FF7B242A565900829871 /* iosApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iosApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 7555FF7E242A565900829871 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7555FF80242A565900829871 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -57,6 +74,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 5745FD43253E4477006B7D0E /* LibsodiumBindings.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -141,6 +159,7 @@ 7555FFB0242A642200829871 /* Frameworks */ = { isa = PBXGroup; children = ( + 5745FD42253E4477006B7D0E /* LibsodiumBindings.framework */, 7555FFB1242A642300829871 /* sample.framework */, ); name = Frameworks; @@ -157,6 +176,7 @@ 7555FF77242A565900829871 /* Sources */, 7555FF78242A565900829871 /* Frameworks */, 7555FF79242A565900829871 /* Resources */, + 5745FD45253E4477006B7D0E /* Embed Frameworks */, ); buildRules = ( ); diff --git a/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/ionspin.xcuserdatad/UserInterfaceState.xcuserstate b/sample/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/ionspin.xcuserdatad/UserInterfaceState.xcuserstate index 43a0fdde01716f27cecea1c125b3812056fd1f42..26944704f0d344ec1cdfb3c78c0618397d1c94ac 100644 GIT binary patch delta 12242 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 Date: Tue, 20 Oct 2020 19:34:22 +0200 Subject: [PATCH 26/51] Enable windows build, set mac builds for gitlab runners --- .gitlab-ci.yml | 47 ++++++++++++++++++- macBuild.sh | 3 +- ... => macBuildAndPublishSnapshot-bindings.sh | 0 macBuildAndPublishSnapshot-delegated.sh | 15 ++++++ .../kotlin/crypto/util/LibsodiumUtil.kt | 1 + windowsBuild-delegated.sh | 6 +-- 6 files changed, 67 insertions(+), 5 deletions(-) rename bindings-macBuildAndPublishSnapshot.sh => macBuildAndPublishSnapshot-bindings.sh (100%) create mode 100755 macBuildAndPublishSnapshot-delegated.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c1e6426..4e55468 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,6 +17,7 @@ simpleCheck: script: echo PREPARE tags: - linuxX64 +# ---- Linux builds ---- buildLinux: stage: build @@ -26,6 +27,21 @@ buildLinux: - ./linuxBuild.sh tags: - linuxX64 +linuxPublishToSnapshot: + script: + - ./linuxBuild.sh + - ./linuxBuildAndPublish.sh + rules: + - if: '$CI_COMMIT_BRANCH == "master"' + - allow_failure: false + needs: + - job: buildLinux + tags: + - linuxX64 + + +# ---- Mac builds ---- + buildMac: stage: build when: manual @@ -34,11 +50,40 @@ buildMac: - ./macBuild.sh tags: - macos + +macPublishToSnapshot: + script: + - ./macBuild.sh + - ./macBuildAndPublishSnapshot-bindings.sh + - ./macBuildAndPublishSnapshot-delegated.sh + rules: + - if: '$CI_COMMIT_BRANCH == "master"' + - allow_failure: false + needs: + - job: buildMac + tags: + - macos + +# ---- Windows builds ---- + buildWindows: stage: build when: manual allow_failure: false - script: echo TEST_PULL_REQUEST_WIN + script: + - ./windowsBuild-delegated.sh + - ./windowsBuild-pure.sh tags: - windowsX64 +windowsPublishToSnapshot: + script: + - ./windowsBuildAndPublish-delegated.sh + - ./windowsBuildAndPublish-pure.sh + rules: + - if: '$CI_COMMIT_BRANCH == "master"' + - allow_failure: false + needs: + - job: buildWindows + tags: + - windowsX64 diff --git a/macBuild.sh b/macBuild.sh index a2c6d85..23d0c7c 100755 --- a/macBuild.sh +++ b/macBuild.sh @@ -12,4 +12,5 @@ cd .. #pure build ./gradlew multiplatform-crypto:build #libsodium bindings -set +e \ No newline at end of file +./gradlew multiplatform-crypto-libsodium-bindings:build +set +e diff --git a/bindings-macBuildAndPublishSnapshot.sh b/macBuildAndPublishSnapshot-bindings.sh similarity index 100% rename from bindings-macBuildAndPublishSnapshot.sh rename to macBuildAndPublishSnapshot-bindings.sh diff --git a/macBuildAndPublishSnapshot-delegated.sh b/macBuildAndPublishSnapshot-delegated.sh new file mode 100755 index 0000000..8fb7d2d --- /dev/null +++ b/macBuildAndPublishSnapshot-delegated.sh @@ -0,0 +1,15 @@ +set -e +#!/bin/sh +./gradlew multiplatform-crypto-delegated:publishMacosX64PublicationToSnapshotRepository + +./gradlew multiplatform-crypto-delegated:publishIosArm32PublicationToSnapshotRepository \ +multiplatform-crypto-delegated:publishIosArm64PublicationToSnapshotRepository \ +multiplatform-crypto-delegated:publishIosX64PublicationToSnapshotRepository + +./gradlew multiplatform-crypto-delegated:publishWatchosArm32PublicationToSnapshotRepository \ +multiplatform-crypto-delegated:publishWatchosArm64PublicationToSnapshotRepository \ +multiplatform-crypto-delegated:publishWatchosX86PublicationToSnapshotRepository + +./gradlew multiplatform-crypto-delegated:publishTvosArm64PublicationToSnapshotRepository \ +multiplatform-crypto-delegated:publishTvosX64PublicationToSnapshotRepository +set +e diff --git a/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumUtil.kt b/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumUtil.kt index a599767..afc4209 100644 --- a/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumUtil.kt +++ b/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumUtil.kt @@ -12,6 +12,7 @@ import libsodium.sodium_memcmp import libsodium.sodium_memzero import libsodium.sodium_pad import libsodium.sodium_unpad +import platform.posix.size_tVar /** * Created by Ugljesa Jovanovic diff --git a/windowsBuild-delegated.sh b/windowsBuild-delegated.sh index 655bb92..76ec9a9 100755 --- a/windowsBuild-delegated.sh +++ b/windowsBuild-delegated.sh @@ -7,9 +7,9 @@ cd sodiumWrapper echo "Starting mingw libsodium build" ./configureMingw64.sh echo "Configure done" -$GNU_MAKE -j4 -C libsodium clean -$GNU_MAKE -j4 -C libsodium -$GNU_MAKE -j4 -C libsodium install +make -j4 -C libsodium clean +make -j4 -C libsodium +make -j4 -C libsodium install echo "completed libsodium build" #now we can do the delegated build cd .. From ef70baae3495d2b8b4dbdd60236b22b36f7ec1bf Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Tue, 20 Oct 2020 19:37:31 +0200 Subject: [PATCH 27/51] Add stage to publish jobs --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4e55468..7c22085 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,6 +28,7 @@ buildLinux: tags: - linuxX64 linuxPublishToSnapshot: + stage: deploy script: - ./linuxBuild.sh - ./linuxBuildAndPublish.sh @@ -52,6 +53,7 @@ buildMac: - macos macPublishToSnapshot: + stage: deploy script: - ./macBuild.sh - ./macBuildAndPublishSnapshot-bindings.sh @@ -77,6 +79,7 @@ buildWindows: - windowsX64 windowsPublishToSnapshot: + stage: deploy script: - ./windowsBuildAndPublish-delegated.sh - ./windowsBuildAndPublish-pure.sh From eee83ca83949f5b654a85c123f3fcd9c71601d75 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Tue, 20 Oct 2020 19:47:58 +0200 Subject: [PATCH 28/51] HTTPS submodule --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index efa2409..07b8c1c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "sodiumWrapper/libsodium"] path = sodiumWrapper/libsodium - url = git@github.com:ionspin/libsodium.git + url = https://github.com/ionspin/libsodium.git From 314765eee19e6bdf1ea82e79f495e898bd0de4ad Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Tue, 20 Oct 2020 20:18:52 +0200 Subject: [PATCH 29/51] Windows msys build --- .gitlab-ci.yml | 4 ++-- .../kotlin/crypto/authenticated/XChaCha20Poly1305Test.kt | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7c22085..dd99848 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -81,8 +81,8 @@ buildWindows: windowsPublishToSnapshot: stage: deploy script: - - ./windowsBuildAndPublish-delegated.sh - - ./windowsBuildAndPublish-pure.sh + - C:\msys64\msys2_shell.cmd -msys -here windowsBuildAndPublish-delegated.sh + - C:\msys64\msys2_shell.cmd -msys -here windowsBuildAndPublish-pure.sh rules: - if: '$CI_COMMIT_BRANCH == "master"' - allow_failure: false diff --git a/multiplatform-crypto-delegated/src/commonTest/kotlin/com/ionspin/kotlin/crypto/authenticated/XChaCha20Poly1305Test.kt b/multiplatform-crypto-delegated/src/commonTest/kotlin/com/ionspin/kotlin/crypto/authenticated/XChaCha20Poly1305Test.kt index 6ed851c..f9006e6 100644 --- a/multiplatform-crypto-delegated/src/commonTest/kotlin/com/ionspin/kotlin/crypto/authenticated/XChaCha20Poly1305Test.kt +++ b/multiplatform-crypto-delegated/src/commonTest/kotlin/com/ionspin/kotlin/crypto/authenticated/XChaCha20Poly1305Test.kt @@ -226,7 +226,9 @@ class XChaCha20Poly1305Test { expected.contentEquals(result) && decrypted.contentEquals(data) } val messedUpTag = result.copyOf() + messedUpTag[messedUpTag.size - 3] = 0U messedUpTag[messedUpTag.size - 2] = 0U + messedUpTag[messedUpTag.size - 1] = 0U assertFails { val decryptorForWrongTag = XChaCha20Poly1305Delegated(key, state, header, true) val plaintext = decryptorForWrongTag.decrypt(messedUpTag) From cfb1750538dc1e7b063421b8cc01f1cd93969cc8 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Tue, 20 Oct 2020 20:58:00 +0200 Subject: [PATCH 30/51] Msys2 for pull build as well --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dd99848..a8faada 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -73,8 +73,8 @@ buildWindows: when: manual allow_failure: false script: - - ./windowsBuild-delegated.sh - - ./windowsBuild-pure.sh + - C:\msys64\msys2_shell.cmd -msys -here windowsBuild-delegated.sh + - C:\msys64\msys2_shell.cmd -msys -here windowsBuild-pure.sh tags: - windowsX64 From e5af5f68e3ebbfa07b47cb99780ff82f97e2b751 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Tue, 20 Oct 2020 21:00:22 +0200 Subject: [PATCH 31/51] Try no start msys2 --- .gitlab-ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a8faada..942d1d8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -73,16 +73,16 @@ buildWindows: when: manual allow_failure: false script: - - C:\msys64\msys2_shell.cmd -msys -here windowsBuild-delegated.sh - - C:\msys64\msys2_shell.cmd -msys -here windowsBuild-pure.sh + - C:\msys64\msys2_shell.cmd -msys -here -no-start windowsBuild-delegated.sh + - C:\msys64\msys2_shell.cmd -msys -here -no-start windowsBuild-pure.sh tags: - windowsX64 windowsPublishToSnapshot: stage: deploy script: - - C:\msys64\msys2_shell.cmd -msys -here windowsBuildAndPublish-delegated.sh - - C:\msys64\msys2_shell.cmd -msys -here windowsBuildAndPublish-pure.sh + - C:\msys64\msys2_shell.cmd -msys -here -no-start windowsBuildAndPublish-delegated.sh + - C:\msys64\msys2_shell.cmd -msys -here -no-start windowsBuildAndPublish-pure.sh rules: - if: '$CI_COMMIT_BRANCH == "master"' - allow_failure: false From 4227006b71694df935459e631b20e60e5f7975e3 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Tue, 20 Oct 2020 22:23:14 +0200 Subject: [PATCH 32/51] Try bash --- .gitlab-ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 942d1d8..6dde8a8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -73,16 +73,16 @@ buildWindows: when: manual allow_failure: false script: - - C:\msys64\msys2_shell.cmd -msys -here -no-start windowsBuild-delegated.sh - - C:\msys64\msys2_shell.cmd -msys -here -no-start windowsBuild-pure.sh + - C:\msys64\usr\bin\bash -lc windowsBuild-delegated.sh + - C:\msys64\usr\bin\bash -lc windowsBuild-pure.sh tags: - windowsX64 windowsPublishToSnapshot: stage: deploy script: - - C:\msys64\msys2_shell.cmd -msys -here -no-start windowsBuildAndPublish-delegated.sh - - C:\msys64\msys2_shell.cmd -msys -here -no-start windowsBuildAndPublish-pure.sh + - C:\msys64\usr\bin\bash -lc windowsBuildAndPublish-delegated.sh + - C:\msys64\usr\bin\bash -lc windowsBuildAndPublish-pure.sh rules: - if: '$CI_COMMIT_BRANCH == "master"' - allow_failure: false From a3899ace73f33ef49426c60f89e4941a8725a87b Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Tue, 20 Oct 2020 22:33:59 +0200 Subject: [PATCH 33/51] Changed windows runner to bash --- .gitlab-ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6dde8a8..7c22085 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -73,16 +73,16 @@ buildWindows: when: manual allow_failure: false script: - - C:\msys64\usr\bin\bash -lc windowsBuild-delegated.sh - - C:\msys64\usr\bin\bash -lc windowsBuild-pure.sh + - ./windowsBuild-delegated.sh + - ./windowsBuild-pure.sh tags: - windowsX64 windowsPublishToSnapshot: stage: deploy script: - - C:\msys64\usr\bin\bash -lc windowsBuildAndPublish-delegated.sh - - C:\msys64\usr\bin\bash -lc windowsBuildAndPublish-pure.sh + - ./windowsBuildAndPublish-delegated.sh + - ./windowsBuildAndPublish-pure.sh rules: - if: '$CI_COMMIT_BRANCH == "master"' - allow_failure: false From fd0033e4ce7daa2d9f11c2d543d15823e717e942 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Tue, 20 Oct 2020 23:28:49 +0200 Subject: [PATCH 34/51] Further msys2 attempts --- .gitlab-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7c22085..3a6afd9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -73,8 +73,9 @@ buildWindows: when: manual allow_failure: false script: - - ./windowsBuild-delegated.sh - - ./windowsBuild-pure.sh + - C:\msys64\usr\bin\pacman --noconfirm -Syyuu --ask 20 + - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-delegated.sh" + - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-pure.sh" tags: - windowsX64 From 44af7014e68af0354cab00074b937a44f07487e5 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Wed, 21 Oct 2020 18:04:57 +0200 Subject: [PATCH 35/51] Win build debug --- .gitlab-ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3a6afd9..7aae169 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -73,9 +73,10 @@ buildWindows: when: manual allow_failure: false script: - - C:\msys64\usr\bin\pacman --noconfirm -Syyuu --ask 20 - - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-delegated.sh" - - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-pure.sh" + - C:\msys64\usr\bin\bash -lc "env" + - C:\msys64\usr\bin\bash -lc "pwd" +# - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-delegated.sh" +# - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-pure.sh" tags: - windowsX64 From 2afac6dc15fe16d914af57776159d05b80951de6 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Wed, 21 Oct 2020 18:18:06 +0200 Subject: [PATCH 36/51] Gitlab runner windows build debug --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7aae169..f4b1bf4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -73,8 +73,11 @@ buildWindows: when: manual allow_failure: false script: + - echo "$PWD" + - echo "--------- bash ---------" - C:\msys64\usr\bin\bash -lc "env" - C:\msys64\usr\bin\bash -lc "pwd" + - dir env: # - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-delegated.sh" # - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-pure.sh" tags: From 5da3ce79333b1ea194d92fccda4402420e65667e Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Wed, 21 Oct 2020 18:18:06 +0200 Subject: [PATCH 37/51] Gitlab runner windows build debug --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7aae169..3fdf503 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -73,8 +73,11 @@ buildWindows: when: manual allow_failure: false script: + - echo "$PWD" + - echo "--------- bash ---------" - C:\msys64\usr\bin\bash -lc "env" - C:\msys64\usr\bin\bash -lc "pwd" + - "dir env:" # - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-delegated.sh" # - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-pure.sh" tags: From f5a4618f655d4e604896bb30437637e7894326c3 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Wed, 21 Oct 2020 18:25:20 +0200 Subject: [PATCH 38/51] Gitlab runner windows build debug --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3fdf503..abcd47a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -86,8 +86,8 @@ buildWindows: windowsPublishToSnapshot: stage: deploy script: - - ./windowsBuildAndPublish-delegated.sh - - ./windowsBuildAndPublish-pure.sh +# - ./windowsBuildAndPublish-delegated.sh +# - ./windowsBuildAndPublish-pure.sh rules: - if: '$CI_COMMIT_BRANCH == "master"' - allow_failure: false From d76ceca76d462ff7e33e7d82e6fd74ddcca3bd60 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Wed, 21 Oct 2020 18:30:24 +0200 Subject: [PATCH 39/51] Gitlab runner windows build debug 3 --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index abcd47a..c0184c4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -86,6 +86,7 @@ buildWindows: windowsPublishToSnapshot: stage: deploy script: + - echo "Deploy---" # - ./windowsBuildAndPublish-delegated.sh # - ./windowsBuildAndPublish-pure.sh rules: From f9defab67e8a4287adb836c32115a4cc7497e030 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Wed, 21 Oct 2020 18:43:00 +0200 Subject: [PATCH 40/51] Gitlab runner windows build debug 4 --- .gitlab-ci.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c0184c4..ac5967a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -73,13 +73,18 @@ buildWindows: when: manual allow_failure: false script: + - $env:PROJECT_DIR_TMP="$PWD" - echo "$PWD" + - echo "$PROJECT_DIR" - echo "--------- bash ---------" - C:\msys64\usr\bin\bash -lc "env" - C:\msys64\usr\bin\bash -lc "pwd" - "dir env:" -# - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-delegated.sh" -# - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-pure.sh" + - cd $PROJECT_DIR + - echo "---- CD ----" + - echo "$PWD" + - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-delegated.sh" + - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-pure.sh" tags: - windowsX64 From 8c0cc6ca09e5fcb3724d0d5cf79adc70736fac8b Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Wed, 21 Oct 2020 18:45:10 +0200 Subject: [PATCH 41/51] Gitlab runner windows build debug 5 --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ac5967a..586cf89 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -75,12 +75,12 @@ buildWindows: script: - $env:PROJECT_DIR_TMP="$PWD" - echo "$PWD" - - echo "$PROJECT_DIR" + - echo "$$env:PROJECT_DIR_TMP" - echo "--------- bash ---------" - C:\msys64\usr\bin\bash -lc "env" - C:\msys64\usr\bin\bash -lc "pwd" - "dir env:" - - cd $PROJECT_DIR + - cd $env:PROJECT_DIR_TMP - echo "---- CD ----" - echo "$PWD" - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-delegated.sh" From 65eab027f0bc753827688f92ed72e93377ac0d63 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Wed, 21 Oct 2020 18:52:17 +0200 Subject: [PATCH 42/51] Gitlab runner windows build debug 6 --- .gitlab-ci.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 586cf89..53ba000 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -73,18 +73,14 @@ buildWindows: when: manual allow_failure: false script: - - $env:PROJECT_DIR_TMP="$PWD" - echo "$PWD" - - echo "$$env:PROJECT_DIR_TMP" - echo "--------- bash ---------" - C:\msys64\usr\bin\bash -lc "env" - C:\msys64\usr\bin\bash -lc "pwd" - "dir env:" - - cd $env:PROJECT_DIR_TMP - - echo "---- CD ----" - echo "$PWD" - - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-delegated.sh" - - C:\msys64\usr\bin\bash -lc "bash -x ./windowsBuild-pure.sh" + - C:\msys64\usr\bin\bash -lc "cd $CI_PROJECT_DIR; bash -x ./windowsBuild-delegated.sh" + - C:\msys64\usr\bin\bash -lc "cd $CI_PROJECT_DIR; bash -x ./windowsBuild-pure.sh" tags: - windowsX64 From 1d7195835b40bfaa6b5b4e4e49800d56c27e6c7b Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Wed, 21 Oct 2020 18:58:20 +0200 Subject: [PATCH 43/51] Gitlab runner windows build debug 7 --- .gitlab-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 53ba000..1ab0368 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -79,8 +79,9 @@ buildWindows: - C:\msys64\usr\bin\bash -lc "pwd" - "dir env:" - echo "$PWD" - - C:\msys64\usr\bin\bash -lc "cd $CI_PROJECT_DIR; bash -x ./windowsBuild-delegated.sh" - - C:\msys64\usr\bin\bash -lc "cd $CI_PROJECT_DIR; bash -x ./windowsBuild-pure.sh" + - $env:CHERE_INVOKING = 'yes' + - C:\msys64\usr\bin\bash -lc windowsBuild-delegated.sh + - C:\msys64\usr\bin\bash -lc windowsBuild-pure.sh tags: - windowsX64 From 85e2ba136d71652a6c40343f9a9b8fb619e13caf Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Wed, 21 Oct 2020 18:59:45 +0200 Subject: [PATCH 44/51] See where we end up --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1ab0368..185ccd9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -80,6 +80,8 @@ buildWindows: - "dir env:" - echo "$PWD" - $env:CHERE_INVOKING = 'yes' + - C:\msys64\usr\bin\bash -lc pwd + - C:\msys64\usr\bin\bash -lc ls - C:\msys64\usr\bin\bash -lc windowsBuild-delegated.sh - C:\msys64\usr\bin\bash -lc windowsBuild-pure.sh tags: From 85d36c68bc4f7d51890c088dce3b1ec06913799c Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Wed, 21 Oct 2020 19:00:23 +0200 Subject: [PATCH 45/51] quotes --- .gitlab-ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 185ccd9..c427490 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -80,10 +80,10 @@ buildWindows: - "dir env:" - echo "$PWD" - $env:CHERE_INVOKING = 'yes' - - C:\msys64\usr\bin\bash -lc pwd - - C:\msys64\usr\bin\bash -lc ls - - C:\msys64\usr\bin\bash -lc windowsBuild-delegated.sh - - C:\msys64\usr\bin\bash -lc windowsBuild-pure.sh + - C:\msys64\usr\bin\bash -lc "pwd" + - C:\msys64\usr\bin\bash -lc "ls" + - C:\msys64\usr\bin\bash -lc "./windowsBuild-delegated.sh" + - C:\msys64\usr\bin\bash -lc "./windowsBuild-pure.sh" tags: - windowsX64 From e284a709231d56ac2cf54d87a09f723491ffe000 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Wed, 21 Oct 2020 19:08:00 +0200 Subject: [PATCH 46/51] Working gitlab runner winbuild --- .gitlab-ci.yml | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c427490..22a1027 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -73,15 +73,7 @@ buildWindows: when: manual allow_failure: false script: - - echo "$PWD" - - echo "--------- bash ---------" - - C:\msys64\usr\bin\bash -lc "env" - - C:\msys64\usr\bin\bash -lc "pwd" - - "dir env:" - - echo "$PWD" - $env:CHERE_INVOKING = 'yes' - - C:\msys64\usr\bin\bash -lc "pwd" - - C:\msys64\usr\bin\bash -lc "ls" - C:\msys64\usr\bin\bash -lc "./windowsBuild-delegated.sh" - C:\msys64\usr\bin\bash -lc "./windowsBuild-pure.sh" tags: @@ -90,9 +82,9 @@ buildWindows: windowsPublishToSnapshot: stage: deploy script: - - echo "Deploy---" -# - ./windowsBuildAndPublish-delegated.sh -# - ./windowsBuildAndPublish-pure.sh + - $env:CHERE_INVOKING = 'yes' + - C:\msys64\usr\bin\bash -lc "./windowsBuildAndPublish-delegated.sh" + - C:\msys64\usr\bin\bash -lc "./windowsBuildAndPublish-pure.sh" rules: - if: '$CI_COMMIT_BRANCH == "master"' - allow_failure: false From 6f28cb93f716eeeeee83e456f462f2b7a2c0a70b Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Wed, 21 Oct 2020 22:18:28 +0200 Subject: [PATCH 47/51] Publish only when building master branch --- .gitlab-ci.yml | 21 ++++++--------------- README.md | 9 ++++++++- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 22a1027..d1d11f5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -32,11 +32,8 @@ linuxPublishToSnapshot: script: - ./linuxBuild.sh - ./linuxBuildAndPublish.sh - rules: - - if: '$CI_COMMIT_BRANCH == "master"' - - allow_failure: false - needs: - - job: buildLinux + only: + - master tags: - linuxX64 @@ -58,11 +55,8 @@ macPublishToSnapshot: - ./macBuild.sh - ./macBuildAndPublishSnapshot-bindings.sh - ./macBuildAndPublishSnapshot-delegated.sh - rules: - - if: '$CI_COMMIT_BRANCH == "master"' - - allow_failure: false - needs: - - job: buildMac + only: + - master tags: - macos @@ -85,10 +79,7 @@ windowsPublishToSnapshot: - $env:CHERE_INVOKING = 'yes' - C:\msys64\usr\bin\bash -lc "./windowsBuildAndPublish-delegated.sh" - C:\msys64\usr\bin\bash -lc "./windowsBuildAndPublish-pure.sh" - rules: - - if: '$CI_COMMIT_BRANCH == "master"' - - allow_failure: false - needs: - - job: buildWindows + only: + - master tags: - windowsX64 diff --git a/README.md b/README.md index c636e89..5b76552 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,14 @@ Currently supported native platforms: - +#### Notes for Gitlab runners: +- At the moment all runners need to have android sdk +#### Mac: + +#### Windows: +- Needs android sdk +- Git needs long file path enabled +- msys2 needs to be installed and `pacman update` executed From abcb25e3338f6cecc184782e990fa84894c7b78e Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 23 Oct 2020 11:27:26 +0200 Subject: [PATCH 48/51] Use make directly when publishing, also clean before building --- windowsBuildAndPublish-delegated.sh | 8 ++++---- windowsBuildAndPublish-pure.sh | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/windowsBuildAndPublish-delegated.sh b/windowsBuildAndPublish-delegated.sh index 6432351..a6a9c0b 100755 --- a/windowsBuildAndPublish-delegated.sh +++ b/windowsBuildAndPublish-delegated.sh @@ -1,15 +1,15 @@ set -e #!/bin/sh #this will hopefully download all konan dependancies that we use in the build scripts - +./gradlew clean ./gradlew multiplatform-crypto-api:build cd sodiumWrapper echo "Starting mingw libsodium build" ./configureMingw64.sh echo "Configure done" -$GNU_MAKE -j4 -C libsodium clean -$GNU_MAKE -j4 -C libsodium -$GNU_MAKE -j4 -C libsodium install +make -j4 -C libsodium clean +make -j4 -C libsodium +make -j4 -C libsodium install echo "completed libsodium build" #now we can do the delegated build cd .. diff --git a/windowsBuildAndPublish-pure.sh b/windowsBuildAndPublish-pure.sh index f1f2c00..6340b8d 100755 --- a/windowsBuildAndPublish-pure.sh +++ b/windowsBuildAndPublish-pure.sh @@ -1,8 +1,8 @@ set -e #!/bin/sh #this will hopefully download all konan dependancies that we use in the build scripts - +./gradlew clean ./gradlew multiplatform-crypto-api:build ./gradlew multiplatform-crypto:build ./gradlew multiplatform-crypto:publishMingwX64PublicationToSnapshotRepository -set +e \ No newline at end of file +set +e From 236e3927dc25a033ba87e49a1527bf43c1ffdf53 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 23 Oct 2020 11:53:40 +0200 Subject: [PATCH 49/51] Forgot to add clean to other scripts --- windowsBuild-delegated.sh | 2 +- windowsBuild-pure.sh | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/windowsBuild-delegated.sh b/windowsBuild-delegated.sh index 76ec9a9..0d8cf23 100755 --- a/windowsBuild-delegated.sh +++ b/windowsBuild-delegated.sh @@ -1,7 +1,7 @@ set -e #!/bin/sh #this will hopefully download all konan dependancies that we use in the build scripts - +./gradlew clean ./gradlew multiplatform-crypto-api:build cd sodiumWrapper echo "Starting mingw libsodium build" diff --git a/windowsBuild-pure.sh b/windowsBuild-pure.sh index 3ad152f..706b61f 100755 --- a/windowsBuild-pure.sh +++ b/windowsBuild-pure.sh @@ -1,5 +1,6 @@ set -e #!/bin/sh +./gradlew clean ./gradlew multiplatform-crypto-api:build ./gradlew multiplatform-crypto:build set +e From edcadc1a0ce14f04c310fdc173e7d1c7e8dbde51 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 23 Oct 2020 13:10:08 +0200 Subject: [PATCH 50/51] Windows runner uses konan that lives in systemprofile --- sodiumWrapper/configureMingw64.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sodiumWrapper/configureMingw64.sh b/sodiumWrapper/configureMingw64.sh index d39417c..ce70b05 100755 --- a/sodiumWrapper/configureMingw64.sh +++ b/sodiumWrapper/configureMingw64.sh @@ -2,7 +2,7 @@ ## and then borrowed and slightly modified from https://github.com/datkt/sodium/configure ## borrowed from https://github.com/sodium-friends/sodium-native/blob/master/configure PREFIX="${PREFIX:-$PWD/static-mingw-x86-64}" -KONAN="${KONAN:-$HOME/.konan}" +KONAN="C:/Windows/System32/config/systemprofile/.konan" ARCH=${ARCH:-$(uname -m)} echo $PREFIX echo $KONAN From aa7bc8dd65e8f81630d56c22d3253f9eb7745337 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 23 Oct 2020 14:15:21 +0200 Subject: [PATCH 51/51] Adding native libui ui --- buildSrc/src/main/kotlin/Deps.kt | 4 + sample/build.gradle.kts | 83 ++++++++++++++----- .../sample => nativeMain/kotlin}/Runner.kt | 3 +- .../com/ionspin/kotlin/crypto/sample/UI.kt | 30 +++++++ 4 files changed, 99 insertions(+), 21 deletions(-) rename sample/src/{linuxMain/kotlin/com/ionspin/kotlin/crypto/sample => nativeMain/kotlin}/Runner.kt (71%) create mode 100644 sample/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/sample/UI.kt diff --git a/buildSrc/src/main/kotlin/Deps.kt b/buildSrc/src/main/kotlin/Deps.kt index 0c7fae3..395c929 100644 --- a/buildSrc/src/main/kotlin/Deps.kt +++ b/buildSrc/src/main/kotlin/Deps.kt @@ -141,6 +141,10 @@ object Deps { val timber = "com.jakewharton.timber:timber:${Versions.timber}" } + object Desktop { + val libui = "com.github.msink:libui:0.1.8" + } + } diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 1596980..c03b151 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -52,7 +52,13 @@ val ideaActive = System.getProperty("idea.active") == "true" kotlin { val hostOsName = getHostOsName() - + if (ideaActive) { + when (hostOsName) { + "linux" -> linuxX64("native") + "macos" -> macosX64("native") + "windows" -> mingwX64("native") + } + } android() runningOnLinuxx86_64 { jvm() @@ -88,13 +94,13 @@ kotlin { } } - - linuxArm64() { - binaries { - executable { - } - } - } + //Disable for now as libui doesnt support arm64 +// linuxArm64() { +// binaries { +// executable { +// } +// } +// } } @@ -222,16 +228,53 @@ kotlin { - val nativeMain by creating { - dependsOn(commonMain) - dependencies { +// val nativeMain by creating { +// dependsOn(commonMain) +// dependencies { +// implementation(Deps.Desktop.libui) +// } +// } +// +// val nativeTest by creating { +// dependsOn(commonTest) +// dependencies { +// } +// } + + val nativeMain = if (ideaActive) { + val nativeMain by getting { + dependsOn(commonMain) + dependencies { + implementation(Deps.Desktop.libui) + } } + nativeMain + } else { + val nativeMain by creating { + dependsOn(commonMain) + dependencies { + implementation(Deps.Desktop.libui) + } + } + nativeMain } - val nativeTest by creating { - dependsOn(commonTest) - dependencies { + val nativeTest = if (ideaActive) { + val nativeTest by getting { + dependsOn(commonTest) + dependencies { + implementation(Deps.Native.coroutines) + } } + nativeTest + } else { + val nativeTest by creating { + dependsOn(commonTest) + dependencies { + implementation(Deps.Native.coroutines) + } + } + nativeTest } runningOnLinuxx86_64 { @@ -280,12 +323,12 @@ kotlin { dependsOn(nativeTest) } - val linuxArm64Main by getting { - dependsOn(nativeMain) - } - val linuxArm64Test by getting { - dependsOn(nativeTest) - } +// val linuxArm64Main by getting { +// dependsOn(nativeMain) +// } +// val linuxArm64Test by getting { +// dependsOn(nativeTest) +// } } runningOnMacos { diff --git a/sample/src/linuxMain/kotlin/com/ionspin/kotlin/crypto/sample/Runner.kt b/sample/src/nativeMain/kotlin/Runner.kt similarity index 71% rename from sample/src/linuxMain/kotlin/com/ionspin/kotlin/crypto/sample/Runner.kt rename to sample/src/nativeMain/kotlin/Runner.kt index 3343ed0..0630398 100644 --- a/sample/src/linuxMain/kotlin/com/ionspin/kotlin/crypto/sample/Runner.kt +++ b/sample/src/nativeMain/kotlin/Runner.kt @@ -1,5 +1,6 @@ import com.ionspin.kotlin.crypto.sample.Sample -fun main() { +fun main() : Unit { Sample.runSample() + ui() } diff --git a/sample/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/sample/UI.kt b/sample/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/sample/UI.kt new file mode 100644 index 0000000..2c84065 --- /dev/null +++ b/sample/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/sample/UI.kt @@ -0,0 +1,30 @@ +import com.ionspin.kotlin.crypto.hash.Hash +import com.ionspin.kotlin.crypto.util.encodeToUByteArray +import com.ionspin.kotlin.crypto.util.toHexString +import libui.ktx.TextArea +import libui.ktx.appWindow +import libui.ktx.button +import libui.ktx.textarea +import libui.ktx.vbox + +fun ui() = appWindow( + title = "Hello", + width = 320, + height = 240 +) { + val hash = Hash.sha512("123".encodeToUByteArray()) + val text = "Hash (SHA512) of 123: ${hash.toHexString()}" + vbox { + lateinit var scroll: TextArea + + button("Test") { + action { + scroll.append(text.trimMargin()) + } + } + scroll = textarea { + readonly = true + stretchy = true + } + } +}