|
| 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