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

This commit is contained in:
Ugljesa Jovanovic 2020-01-06 13:51:55 -08:00
parent 84799b4ede
commit 63df04a7b6
No known key found for this signature in database
GPG Key ID: 178E6DFCECCB0E0F
4 changed files with 118 additions and 20 deletions

View File

@ -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 {

View File

@ -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) }
}
}

View File

@ -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<CFunction<Function2<CPointer<ByteVar>, ULong, Int>>>() ?: error("Failed getting advapi random")
}
@Suppress("EXPERIMENTAL_UNSIGNED_LITERALS")
actual fun getRandomBytes(amount: Int): Array<UByte> {
memScoped {
val randArray = allocArray<ByteVar>(amount)
val pointer = randArray.getPointer(this)
val status = advapiRandom(pointer.reinterpret(), amount.convert())
return Array<UByte>(amount) { pointer[it].toUByte() }
}
}
}

View File

@ -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) }