Working SRNG implementation for nodeJs and browser js

This commit is contained in:
Ugljesa Jovanovic 2020-01-05 20:21:34 +01:00
parent 7e905bd948
commit cb7ca575ab
No known key found for this signature in database
GPG Key ID: 178E6DFCECCB0E0F
4 changed files with 97 additions and 11 deletions

View File

@ -19,6 +19,8 @@
import com.moowork.gradle.node.task.NodeTask
import org.gradle.api.tasks.testing.logging.TestLogging
import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeTest
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
plugins {
@ -63,13 +65,21 @@ kotlin {
println("Destination dir ${it.compileKotlinTask.destinationDir}")
}
}
nodejs() {
browser {
testTask {
useKarma {
useChrome()
}
}
}
nodejs {
testTask {
useMocha() {
timeout = "10s"
}
}
}
}
linuxX64("linux") {
binaries {
@ -304,10 +314,31 @@ tasks {
}
}
val linuxTest by getting(KotlinNativeTest::class) {
testLogging {
events("PASSED", "FAILED", "SKIPPED")
// showStandardStreams = true
}
}
val jsNodeTest by getting(KotlinJsTest::class) {
testLogging {
events("PASSED", "FAILED", "SKIPPED")
showStandardStreams = true
}
}
val jsBrowserTest by getting(KotlinJsTest::class) {
testLogging {
events("PASSED", "FAILED", "SKIPPED")
showStandardStreams = true
}
}
}

View File

@ -25,12 +25,27 @@ actual object SRNG {
var counter = 0
@ExperimentalUnsignedTypes
actual fun getRandomBytes(amount: Int): Array<UByte> {
// val runningOnNode = js("(typeof window === 'undefined')").unsafeCast<Boolean>()
// if (runningOnNode) {
// js("var crypto = require('crypto')").asDynamic().randomBytes(amount)
// } else {
// throw RuntimeException("Secure random not supported yet for non-nodejs environment")
// }
return Array<UByte>(amount) { (counter++).toUByte() } // TODO Wow. Such random. Very entropy.
val runningOnNode = js(
"if (typeof window === 'undefined') {\n" +
" true;\n" +
" } else {\n" +
" false;\n" +
" }"
)
val randomBytes = if (runningOnNode) {
js("require('crypto')").randomBytes(amount).toJSON().data
} else {
js(
"""
var randomArray = new Uint8Array(amount);
var crypto = (self.crypto || self.msCrypto);
crypto.getRandomValues(randomArray);
"""
)
var randomArrayResult = js("Array.prototype.slice.call(randomArray);")
randomArrayResult
}
return randomBytes as Array<UByte>
}
}

View File

@ -0,0 +1,40 @@
/*
* 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 kotlin.test.Test
import kotlin.test.assertTrue
/**
* Created by Ugljesa Jovanovic
* ugljesa.jovanovic@ionspin.com
* on 05-Jan-2020
*/
class SRNGJsTest {
@Test
fun testJsSrng() {
val bytes1 = SRNG.getRandomBytes(10)
val bytes2 = SRNG.getRandomBytes(10)
assertTrue {
!bytes1.contentEquals(bytes2) &&
bytes1.size == 10 &&
bytes2.size == 10
}
}
}