Skip to content

Commit daf682d

Browse files
committed
Add HKDF test-vectors test
1 parent 735c80b commit daf682d

File tree

2 files changed

+137
-0
lines changed

2 files changed

+137
-0
lines changed

build-logic/src/main/kotlin/ckbuild/tests/GenerateProviderTestsTask.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ abstract class GenerateProviderTestsTask : DefaultTask() {
7373
private val testClasses = listOf(
7474
"SupportedAlgorithmsTest",
7575
"Pbkdf2CompatibilityTest",
76+
7677
"HkdfCompatibilityTest",
78+
"HkdfTestvectorsTest",
7779

7880
"DigestTest",
7981
"Md5CompatibilityTest",
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
/*
2+
* Copyright (c) 2024 Oleg Yukhnevich. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package dev.whyoleg.cryptography.providers.tests.testvectors
6+
7+
import dev.whyoleg.cryptography.*
8+
import dev.whyoleg.cryptography.BinarySize.Companion.bytes
9+
import dev.whyoleg.cryptography.algorithms.*
10+
import dev.whyoleg.cryptography.providers.tests.api.*
11+
import kotlinx.coroutines.test.*
12+
import kotlin.test.*
13+
14+
// See https://datatracker.ietf.org/doc/html/rfc5869#appendix-A
15+
abstract class HkdfTestvectorsTest(provider: CryptographyProvider) : AlgorithmTest<HKDF>(HKDF, provider) {
16+
17+
private fun rfc5869testCase(
18+
digest: CryptographyAlgorithmId<Digest>,
19+
inputHex: String,
20+
saltHex: String?,
21+
infoHex: String?,
22+
outputSize: Int,
23+
outputHex: String,
24+
): TestResult = testWithAlgorithm {
25+
val derivation = algorithm.secretDerivation(
26+
digest = digest,
27+
outputSize = outputSize.bytes,
28+
salt = saltHex?.hexToByteArray(),
29+
info = infoHex?.hexToByteArray(),
30+
)
31+
val secretHex = derivation.deriveSecretToByteArray(inputHex.hexToByteArray()).toHexString()
32+
assertEquals(outputHex, secretHex)
33+
}
34+
35+
@Test
36+
fun rfc5869testCase1() = rfc5869testCase(
37+
digest = SHA256,
38+
inputHex = "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
39+
saltHex = "000102030405060708090a0b0c",
40+
infoHex = "f0f1f2f3f4f5f6f7f8f9",
41+
outputSize = 42,
42+
outputHex = "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865"
43+
)
44+
45+
@Test
46+
fun rfc5869testCase2() = rfc5869testCase(
47+
digest = SHA256,
48+
inputHex = "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f",
49+
saltHex = "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf",
50+
infoHex = "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
51+
outputSize = 82,
52+
outputHex = "b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec3e87c14c01d5c1f3434f1d87"
53+
)
54+
55+
@Test
56+
fun rfc5869testCase3() = rfc5869testCase(
57+
digest = SHA256,
58+
inputHex = "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
59+
saltHex = "",
60+
infoHex = "",
61+
outputSize = 42,
62+
outputHex = "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8"
63+
)
64+
65+
@Test
66+
fun rfc5869testCase3_null() = rfc5869testCase(
67+
digest = SHA256,
68+
inputHex = "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
69+
saltHex = null,
70+
infoHex = null,
71+
outputSize = 42,
72+
outputHex = "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8"
73+
)
74+
75+
@Test
76+
fun rfc5869testCase4() = rfc5869testCase(
77+
digest = SHA1,
78+
inputHex = "0b0b0b0b0b0b0b0b0b0b0b",
79+
saltHex = "000102030405060708090a0b0c",
80+
infoHex = "f0f1f2f3f4f5f6f7f8f9",
81+
outputSize = 42,
82+
outputHex = "085a01ea1b10f36933068b56efa5ad81a4f14b822f5b091568a9cdd4f155fda2c22e422478d305f3f896"
83+
)
84+
85+
@Test
86+
fun rfc5869testCase5() = rfc5869testCase(
87+
digest = SHA1,
88+
inputHex = "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f",
89+
saltHex = "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf",
90+
infoHex = "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
91+
outputSize = 82,
92+
outputHex = "0bd770a74d1160f7c9f12cd5912a06ebff6adcae899d92191fe4305673ba2ffe8fa3f1a4e5ad79f3f334b3b202b2173c486ea37ce3d397ed034c7f9dfeb15c5e927336d0441f4c4300e2cff0d0900b52d3b4"
93+
)
94+
95+
@Test
96+
fun rfc5869testCase6() = rfc5869testCase(
97+
digest = SHA1,
98+
inputHex = "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
99+
saltHex = "",
100+
infoHex = "",
101+
outputSize = 42,
102+
outputHex = "0ac1af7002b3d761d1e55298da9d0506b9ae52057220a306e07b6b87e8df21d0ea00033de03984d34918"
103+
)
104+
105+
@Test
106+
fun rfc5869testCase6_null() = rfc5869testCase(
107+
digest = SHA1,
108+
inputHex = "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
109+
saltHex = null,
110+
infoHex = null,
111+
outputSize = 42,
112+
outputHex = "0ac1af7002b3d761d1e55298da9d0506b9ae52057220a306e07b6b87e8df21d0ea00033de03984d34918"
113+
)
114+
115+
@Test
116+
fun rfc5869testCase7() = rfc5869testCase(
117+
digest = SHA1,
118+
inputHex = "0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c",
119+
saltHex = "",
120+
infoHex = "",
121+
outputSize = 42,
122+
outputHex = "2c91117204d745f3500d636a62f64f0ab3bae548aa53d423b0d1f27ebba6f5e5673a081d70cce7acfc48"
123+
)
124+
125+
@Test
126+
fun rfc5869testCase7_null() = rfc5869testCase(
127+
digest = SHA1,
128+
inputHex = "0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c",
129+
saltHex = null,
130+
infoHex = null,
131+
outputSize = 42,
132+
outputHex = "2c91117204d745f3500d636a62f64f0ab3bae548aa53d423b0d1f27ebba6f5e5673a081d70cce7acfc48"
133+
)
134+
135+
}

0 commit comments

Comments
 (0)