From 63df04a7b62988eee680e68d2ad35f7cb46f087a Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Mon, 6 Jan 2020 13:51:55 -0800 Subject: [PATCH] Implemented mingw srng, add some more gradle handling for idea, disabled mingwx86 for now as it's not supported by coroutines, and I want to use coroutines eventually --- multiplatform-crypto/build.gradle.kts | 62 +++++++++++++------ .../com/ionspin/kotlin/crypto/SRNGTest.kt | 6 +- .../kotlin/com/ionspin/kotlin/crypto/SRNG.kt | 43 +++++++++++++ .../kotlin/bignum/crypto/util/testBlocking.kt | 27 ++++++++ 4 files changed, 118 insertions(+), 20 deletions(-) create mode 100644 multiplatform-crypto/src/mingwX64Main/kotlin/com/ionspin/kotlin/crypto/SRNG.kt create mode 100644 multiplatform-crypto/src/mingwX64Test/kotlin/com/ionspin/kotlin/bignum/crypto/util/testBlocking.kt diff --git a/multiplatform-crypto/build.gradle.kts b/multiplatform-crypto/build.gradle.kts index 30c12ae..9564389 100644 --- a/multiplatform-crypto/build.gradle.kts +++ b/multiplatform-crypto/build.gradle.kts @@ -51,9 +51,22 @@ version = "0.0.3-SNAPSHOT" val ideaActive = System.getProperty("idea.active") == "true" +fun getHostOsName(): String { + val target = System.getProperty("os.name") + if (target == "Linux") return "linux" + if (target.startsWith("Windows")) return "windows" + if (target.startsWith("Mac")) return "macos" + return "unknown" +} + kotlin { + val hostOsName = getHostOsName() if (ideaActive) { - linuxX64("native") + when(hostOsName) { + "linux" -> linuxX64("native") + "macos" -> macosX64("native") + "windows" -> mingwX64("native") + } } jvm() js { @@ -131,13 +144,13 @@ kotlin { } } - mingwX86() { - binaries { - staticLib { - - } - } - } +// mingwX86() { +// binaries { +// staticLib { +// +// } +// } +// } linuxArm32Hfp() { binaries { @@ -168,7 +181,6 @@ kotlin { dependencies { implementation(kotlin(Deps.Common.test)) implementation(kotlin(Deps.Common.testAnnotation)) - implementation(Deps.Common.coroutines) } } val jvmMain by getting { @@ -263,20 +275,26 @@ kotlin { dependsOn(nativeTest) } - val mingwX86Main by getting { - dependsOn(nativeMain) - } - - val mingwX86Test by getting { - dependsOn(nativeTest) - } +// val mingwX86Main by getting { +// dependsOn(commonMain) +// dependencies { +// implementation(Deps.Native.coroutines) +// } +// } +// +// val mingwX86Test by getting { +// dependsOn(commonTest) +// } val mingwX64Main by getting { - dependsOn(nativeMain) + dependsOn(commonMain) + dependencies { + implementation(Deps.Native.coroutines) + } } val mingwX64Test by getting { - dependsOn(nativeTest) + dependsOn(commonTest) } val linuxArm32HfpMain by getting { @@ -347,6 +365,14 @@ tasks { } } + val mingwX64Test by getting(KotlinNativeTest::class) { + + testLogging { + events("PASSED", "FAILED", "SKIPPED") + showStandardStreams = true + } + } + val jsNodeTest by getting(KotlinJsTest::class) { testLogging { diff --git a/multiplatform-crypto/src/commonTest/kotlin/com/ionspin/kotlin/crypto/SRNGTest.kt b/multiplatform-crypto/src/commonTest/kotlin/com/ionspin/kotlin/crypto/SRNGTest.kt index 532da42..dba842a 100644 --- a/multiplatform-crypto/src/commonTest/kotlin/com/ionspin/kotlin/crypto/SRNGTest.kt +++ b/multiplatform-crypto/src/commonTest/kotlin/com/ionspin/kotlin/crypto/SRNGTest.kt @@ -27,9 +27,11 @@ import kotlin.test.assertTrue class SRNGTest { @Test fun testSrng() { + //Just a sanity test, need to add better srng tests. val randomBytes1 = SRNG.getRandomBytes(10) val randomBytes2 = SRNG.getRandomBytes(10) -// assertTrue { !randomBytes1.contentEquals(randomBytes2) } - //TODO implement SRNG for minGW + randomBytes1.forEach { println("RB1: $it")} + randomBytes2.forEach { println("RB2: $it")} + assertTrue { !randomBytes1.contentEquals(randomBytes2) } } } \ No newline at end of file diff --git a/multiplatform-crypto/src/mingwX64Main/kotlin/com/ionspin/kotlin/crypto/SRNG.kt b/multiplatform-crypto/src/mingwX64Main/kotlin/com/ionspin/kotlin/crypto/SRNG.kt new file mode 100644 index 0000000..f082a4b --- /dev/null +++ b/multiplatform-crypto/src/mingwX64Main/kotlin/com/ionspin/kotlin/crypto/SRNG.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2019 Ugljesa Jovanovic + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.ionspin.kotlin.crypto + +import kotlinx.cinterop.* +import platform.windows.* + +/** + * Created by Ugljesa Jovanovic + * ugljesa.jovanovic@ionspin.com + * on 21-Sep-2019 + */ +actual object SRNG { + private val advapi by lazy { LoadLibraryA("ADVAPI32.DLL")} + + private val advapiRandom by lazy { + GetProcAddress(advapi, "SystemFunction036")?.reinterpret, ULong, Int>>>() ?: error("Failed getting advapi random") + } + + @Suppress("EXPERIMENTAL_UNSIGNED_LITERALS") + actual fun getRandomBytes(amount: Int): Array { + memScoped { + val randArray = allocArray(amount) + val pointer = randArray.getPointer(this) + val status = advapiRandom(pointer.reinterpret(), amount.convert()) + return Array(amount) { pointer[it].toUByte() } + } + } +} \ No newline at end of file diff --git a/multiplatform-crypto/src/mingwX64Test/kotlin/com/ionspin/kotlin/bignum/crypto/util/testBlocking.kt b/multiplatform-crypto/src/mingwX64Test/kotlin/com/ionspin/kotlin/bignum/crypto/util/testBlocking.kt new file mode 100644 index 0000000..328fcc4 --- /dev/null +++ b/multiplatform-crypto/src/mingwX64Test/kotlin/com/ionspin/kotlin/bignum/crypto/util/testBlocking.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2019 Ugljesa Jovanovic + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.ionspin.kotlin.crypto.util + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.runBlocking + +/** + * Created by Ugljesa Jovanovic + * ugljesa.jovanovic@ionspin.com + * on 20-Jul-2019 + */ +actual fun testBlocking(block: suspend (scope: CoroutineScope) -> Unit) = runBlocking { block(this) } \ No newline at end of file