pto.0.1.0.source-code.Models.kt Maven / Gradle / Ivy
package se.wollan.crypto
import kotlin.random.Random
@JvmInline
value class SecretKey(val value: ByteArray) {
init {
require(value.size == LEN_BYTES) { "key length must be $LEN_BYTES bytes / ${LEN_BYTES * 8} bits (not ${value.size} bytes)" }
}
override fun toString(): String = value.toHexString()
fun clear() {
for (i in value.indices)
value[i] = 0
}
fun copy() = SecretKey(value.copyOf())
companion object {
const val LEN_BYTES = 32
fun fromHex(hex: String) = SecretKey(hex.fromHexString())
fun tryCreate(hex: CharArray): SecretKey? = runCatching { fromHex(String(hex)) }.getOrNull()
}
}
@JvmInline
internal value class Salt(val value: ByteArray) {
init {
require(value.size == LEN_BYTES) { "salt must be ${SecretKey.LEN_BYTES} bytes / ${SecretKey.LEN_BYTES * 8} bits (not ${value.size} bytes)" }
}
override fun toString(): String = value.toHexString()
companion object {
const val LEN_BYTES = 16
fun random(random: Random) = Salt(random.nextBytes(LEN_BYTES))
fun fromHex(hex: String) = Salt(hex.fromHexString())
}
}
@JvmInline
value class Pincode(val value: CharArray) {
init {
require(value.size in 6..256) { "invalid pincode length: ${value.size}" }
}
fun clear() {
for (i in value.indices)
value[i] = ' '
}
companion object {
fun fromString(s: String) = Pincode(s.toCharArray())
fun tryCreate(value: CharArray) = runCatching { Pincode(value) }.getOrNull()
}
}