added HKDF, version will be 0.9.3
This commit is contained in:
1 parent
d402afe1bd
commit
84a3e82216
4 files changed
+229
-1
No files matched your search
@@ -8,6 +8,7 @@
|
||||
* real dot sergeych at gmail.
|
||||
*/
|
||||
|
||||
import com.ionspin.kotlin.crypto.util.encodeToUByteArray
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import net.sergeych.crypto2.Hash
|
||||
import net.sergeych.crypto2.KDF
|
||||
@@ -133,4 +134,84 @@ class KDFTest {
|
||||
assertEquals(96, longKdf.deriveFromBytes(source).size)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun hkdfDeriveFromBytesTest() = runTest {
|
||||
initCrypto()
|
||||
val source = "strong source bytes with enough entropy".encodeToUByteArray()
|
||||
val salt = "stored public salt".encodeToUByteArray()
|
||||
val info = "crypto2:test".encodeToUByteArray()
|
||||
val kdf = KDF.HKDF(Hash.Sha3_256, salt, info, 80)
|
||||
|
||||
val b1 = kdf.deriveFromBytes(source)
|
||||
val b2 = kdf.deriveFromBytes(source)
|
||||
val b3 = kdf.deriveFromBytes(source + 1u)
|
||||
val b4 = kdf.copy(info = "crypto2:other".encodeToUByteArray()).deriveFromBytes(source)
|
||||
val expected = hexToUBytes(
|
||||
"580cfd4eb588312097c9e43852d62bec9aff988591e2e5f721a2facc80c3c494" +
|
||||
"d3487b81e19f71611bdebb9983b94e058c9f0c38bc226b9b895eb554d17446b" +
|
||||
"672e12c7e2c36683807cd1e8d67ada0f7"
|
||||
)
|
||||
|
||||
assertEquals(80, b1.size)
|
||||
assertContentEquals(expected, b1)
|
||||
assertContentEquals(b1, b2)
|
||||
assertFalse { b1 contentEquals b3 }
|
||||
assertFalse { b1 contentEquals b4 }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun hkdfParametersCompareArraysByContentTest() = runTest {
|
||||
initCrypto()
|
||||
val k1 = KDF.HKDF(
|
||||
Hash.Sha3_384,
|
||||
"salt".encodeToUByteArray(),
|
||||
"info".encodeToUByteArray(),
|
||||
42
|
||||
)
|
||||
val k2 = KDF.HKDF(
|
||||
Hash.Sha3_384,
|
||||
"salt".encodeToUByteArray(),
|
||||
"info".encodeToUByteArray(),
|
||||
42
|
||||
)
|
||||
|
||||
assertEquals(k1, k2)
|
||||
assertEquals(k1.hashCode(), k2.hashCode())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun hkdfRejectsInvalidParametersTest() = runTest {
|
||||
initCrypto()
|
||||
|
||||
assertThrows<IllegalArgumentException> {
|
||||
KDF.HKDF(Hash.Sha3_256, keySize = 0)
|
||||
}
|
||||
assertThrows<IllegalArgumentException> {
|
||||
KDF.HKDF(Hash.Sha3AndBlake, keySize = 32)
|
||||
}
|
||||
assertThrows<IllegalArgumentException> {
|
||||
KDF.HKDF(Hash.Sha3_256, keySize = 32 * 255 + 1)
|
||||
}
|
||||
assertThrows<IllegalArgumentException> {
|
||||
KDF.HKDF(Hash.Sha3_256, keySize = 32).deriveFromBytes(ubyteArrayOf())
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun hkdfDoesNotDeriveFromPasswordTest() = runTest {
|
||||
initCrypto()
|
||||
val kdf = KDF.HKDF(keySize = 32)
|
||||
|
||||
assertThrows<UnsupportedOperationException> {
|
||||
kdf.deriveKey("password")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private fun hexToUBytes(hex: String): UByteArray {
|
||||
require(hex.length % 2 == 0) { "hex string should have even length" }
|
||||
return UByteArray(hex.length / 2) {
|
||||
hex.substring(it * 2, it * 2 + 2).toInt(16).toUByte()
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user