Use UInt in kdf derivation, because that's the most js can support more or less. I'll try to figure out if we can use all 52bits lates. Also dont show arm build to intellij as it is checking if there is coroutines build for arm and fails with the most unusefull and misleading error I have seen so far.

This commit is contained in:
Ugljesa Jovanovic 2021-04-30 22:10:02 +02:00
parent cf00c17a64
commit da85fefb9b
No known key found for this signature in database
GPG Key ID: 178E6DFCECCB0E0F
6 changed files with 60 additions and 52 deletions

View File

@ -71,6 +71,9 @@ android {
getByName("release") {
isMinifyEnabled = false
}
getByName("debug") {
isMinifyEnabled = false
}
}
sourceSets.getByName("main") {
// jniLibs.srcDir("src/androidMain/libs")
@ -122,22 +125,23 @@ kotlin {
}
}
linuxArm64() {
binaries {
staticLib {
if (ideaActive.not()) {
linuxArm64() {
binaries {
staticLib {
}
}
}
// 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()
// ld.lld: error: undefined symbol: explicit_bzero
// >>> referenced by utils.c
// >>> libsodium_la-utils.o:(sodium_memzero) in archive /tmp/included11051337748775083797/libsodium.a
//
// ld.lld: error: undefined symbol: getrandom
// >>> referenced by randombytes_sysrandom.c
// >>> libsodium_la-randombytes_sysrandom.o:(_randombytes_linux_getrandom) in archive /tmp/included11051337748775083797/libsodium.a
}
// 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()
// ld.lld: error: undefined symbol: explicit_bzero
// >>> referenced by utils.c
// >>> libsodium_la-utils.o:(sodium_memzero) in archive /tmp/included11051337748775083797/libsodium.a
//
// ld.lld: error: undefined symbol: getrandom
// >>> referenced by randombytes_sysrandom.c
// >>> libsodium_la-randombytes_sysrandom.o:(_randombytes_linux_getrandom) in archive /tmp/included11051337748775083797/libsodium.a
}
@ -292,7 +296,11 @@ kotlin {
"linuxX64"
)
val linuxArm64Bit = setOf(
"linuxArm64"
if (ideaActive.not()) {
"linuxArm64"
} else {
""
}
)
val linux32Bit = setOf(
"" // "linuxArm32Hfp"
@ -441,29 +449,29 @@ kotlin {
}
}
val androidMain by getting {
isNotRunningInIdea {
kotlin.srcDirs("src/androidMain", "src/androidSpecific", "src/jvmMain/kotlin")
}
isRunningInIdea {
kotlin.srcDirs("src/androidSpecific", "src/jvmMain/kotlin")
}
dependencies {
implementation("net.java.dev.jna:jna:5.5.0@aar")
implementation(Deps.Jvm.resourceLoader) {
exclude("net.java.dev.jna", "jna")
}
val androidMain by getting {
isNotRunningInIdea {
kotlin.srcDirs("src/androidMain", "src/androidSpecific", "src/jvmMain/kotlin")
}
isRunningInIdea {
kotlin.srcDirs("src/androidSpecific", "src/jvmMain/kotlin")
}
dependencies {
implementation("net.java.dev.jna:jna:5.5.0@aar")
implementation(Deps.Jvm.resourceLoader) {
exclude("net.java.dev.jna", "jna")
}
}
}
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 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 jvmMain by getting {
kotlin.srcDirs("src/jvmSpecific", "src/jvmMain/kotlin")
@ -650,7 +658,7 @@ tasks {
val jsBrowserTest by getting(KotlinJsTest::class) {
testLogging {
events("PASSED", "FAILED", "SKIPPED")
showStandardStreams = true
showStandardStreams = true
}
}

View File

@ -11,9 +11,9 @@ const val crypto_kdf_KEYBYTES = 32
expect object Kdf {
/**
* The crypto_kdf_derive_from_key() function derives a subkey_id-th subkey subkey of length subkey_len bytes using
* The deriveFromKey function derives a subkeyId-th subkey of length subkeyLenght bytes using
* the master key key and the context ctx.
* subkey_id can be any value up to (2^64)-1.
* subkey_id can be any value up to (2^32) because javascript doesn't support long types.
* subkey_len has to be between crypto_kdf_BYTES_MIN (inclusive) and crypto_kdf_BYTES_MAX (inclusive).
* Similar to a type, the context ctx is a 8 characters string describing what the key is going to be used for.
* Its purpose is to mitigate accidental bugs by separating domains. The same function used with the same key but
@ -24,10 +24,10 @@ expect object Kdf {
* If more convenient, it is also fine to use a single global context for a whole application. This will still
* prevent the same keys from being mistakenly used by another application.
*/
fun deriveFromKey(subkeyId: Int, subkeyLength: Int, context: String, masterKey: UByteArray) : UByteArray
fun deriveFromKey(subkeyId: UInt, subkeyLength: Int, context: String, masterKey: UByteArray) : UByteArray
/**
* The crypto_kdf_keygen() function creates a master key.
*/
fun keygen() : UByteArray
}
}

View File

@ -15,15 +15,15 @@ class KdfTest {
fun testKdf() = runTest {
LibsodiumInitializer.initializeWithCallback {
val masterKey = Kdf.keygen()
val subkey1 = Kdf.deriveFromKey(1, crypto_kdf_BYTES_MAX, "test1234", masterKey)
val subkey2 = Kdf.deriveFromKey(2, crypto_kdf_BYTES_MAX, "test1234", masterKey)
val subkey1 = Kdf.deriveFromKey(1U, crypto_kdf_BYTES_MAX, "test1234", masterKey)
val subkey2 = Kdf.deriveFromKey(2U, crypto_kdf_BYTES_MAX, "test1234", masterKey)
assertTrue {
subkey1.size == crypto_kdf_BYTES_MAX &&
subkey2.size == crypto_kdf_BYTES_MAX
}
val repeatSubkey1 = Kdf.deriveFromKey(1, crypto_kdf_BYTES_MAX, "test1234", masterKey)
val repeatSubkey1 = Kdf.deriveFromKey(1U, crypto_kdf_BYTES_MAX, "test1234", masterKey)
assertTrue {
subkey1.contentEquals(repeatSubkey1)
}

View File

@ -6,9 +6,9 @@ import ext.libsodium.com.ionspin.kotlin.crypto.toUInt8Array
actual object Kdf {
/**
* The crypto_kdf_derive_from_key() function derives a subkey_id-th subkey subkey of length subkey_len bytes using
* The deriveFromKey function derives a subkeyId-th subkey of length subkeyLenght bytes using
* the master key key and the context ctx.
* subkey_id can be any value up to (2^64)-1.
* subkey_id can be any value up to (2^32) because javascript doesn't support long types.
* subkey_len has to be between crypto_kdf_BYTES_MIN (inclusive) and crypto_kdf_BYTES_MAX (inclusive).
* Similar to a type, the context ctx is a 8 characters string describing what the key is going to be used for.
* Its purpose is to mitigate accidental bugs by separating domains. The same function used with the same key but
@ -20,7 +20,7 @@ actual object Kdf {
* prevent the same keys from being mistakenly used by another application.
*/
actual fun deriveFromKey(
subkeyId: Int,
subkeyId: UInt,
subkeyLength: Int,
context: String,
masterKey: UByteArray
@ -40,4 +40,4 @@ actual object Kdf {
return getSodium().crypto_kdf_keygen().toUByteArray()
}
}
}

View File

@ -4,9 +4,9 @@ import com.ionspin.kotlin.crypto.LibsodiumInitializer.sodiumJna
actual object Kdf {
/**
* The crypto_kdf_derive_from_key() function derives a subkey_id-th subkey subkey of length subkey_len bytes using
* The deriveFromKey function derives a subkeyId-th subkey of length subkeyLenght bytes using
* the master key key and the context ctx.
* subkey_id can be any value up to (2^64)-1.
* subkey_id can be any value up to (2^32) because javascript doesn't support long types
* subkey_len has to be between crypto_kdf_BYTES_MIN (inclusive) and crypto_kdf_BYTES_MAX (inclusive).
* Similar to a type, the context ctx is a 8 characters string describing what the key is going to be used for.
* Its purpose is to mitigate accidental bugs by separating domains. The same function used with the same key but
@ -18,7 +18,7 @@ actual object Kdf {
* prevent the same keys from being mistakenly used by another application.
*/
actual fun deriveFromKey(
subkeyId: Int,
subkeyId: UInt,
subkeyLength: Int,
context: String,
masterKey: UByteArray

View File

@ -10,9 +10,9 @@ import libsodium.crypto_kdf_keygen
actual object Kdf {
/**
* The crypto_kdf_derive_from_key() function derives a subkey_id-th subkey subkey of length subkey_len bytes using
* The deriveFromKey function derives a subkeyId-th subkey of length subkeyLenght bytes using
* the master key key and the context ctx.
* subkey_id can be any value up to (2^64)-1.
* subkey_id can be any value up to (2^32) because javascript doesn't support long types.
* subkey_len has to be between crypto_kdf_BYTES_MIN (inclusive) and crypto_kdf_BYTES_MAX (inclusive).
* Similar to a type, the context ctx is a 8 characters string describing what the key is going to be used for.
* Its purpose is to mitigate accidental bugs by separating domains. The same function used with the same key but
@ -24,7 +24,7 @@ actual object Kdf {
* prevent the same keys from being mistakenly used by another application.
*/
actual fun deriveFromKey(
subkeyId: Int,
subkeyId: UInt,
subkeyLength: Int,
context: String,
masterKey: UByteArray
@ -63,4 +63,4 @@ actual object Kdf {
return masterKey
}
}
}