1 /*
2 * Copyright 2014-2022 The GmSSL Project. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the License); you may
5 * not use this file except in compliance with the License.
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 */
9
10
11 #include <stdio.h>
12 #include <string.h>
13 #include <stdlib.h>
14 #include <gmssl/hex.h>
15 #include <gmssl/hkdf.h>
16 #include <gmssl/error.h>
17
18 static struct {
19 char *algor;
20 char *ikm;
21 char *salt;
22 char *info;
23 int L;
24 char *prk;
25 char *okm;
26 } hkdf_tests[] = {
27 {
28 // test 1
29 "sha256",
30 "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
31 "000102030405060708090a0b0c",
32 "f0f1f2f3f4f5f6f7f8f9",
33 42,
34 "077709362c2e32df0ddc3f0dc47bba63"
35 "90b6c73bb50f9c3122ec844ad7c2b3e5",
36 "3cb25f25faacd57a90434f64d0362f2a"
37 "2d2d0a90cf1a5a4c5db02d56ecc4c5bf"
38 "34007208d5b887185865",
39 },
40 {
41 // test 2
42 "sha256",
43 "000102030405060708090a0b0c0d0e0f"
44 "101112131415161718191a1b1c1d1e1f"
45 "202122232425262728292a2b2c2d2e2f"
46 "303132333435363738393a3b3c3d3e3f"
47 "404142434445464748494a4b4c4d4e4f",
48 "606162636465666768696a6b6c6d6e6f"
49 "707172737475767778797a7b7c7d7e7f"
50 "808182838485868788898a8b8c8d8e8f"
51 "909192939495969798999a9b9c9d9e9f"
52 "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf",
53 "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
54 "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
55 "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
56 "e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
57 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
58 82,
59 "06a6b88c5853361a06104c9ceb35b45c"
60 "ef760014904671014a193f40c15fc244",
61 "b11e398dc80327a1c8e7f78c596a4934"
62 "4f012eda2d4efad8a050cc4c19afa97c"
63 "59045a99cac7827271cb41c65e590e09"
64 "da3275600c2f09b8367793a9aca3db71"
65 "cc30c58179ec3e87c14c01d5c1f3434f"
66 "1d87",
67 },
68 {
69 // test 3
70 "sha256",
71 "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
72 "",
73 "",
74 42,
75 "19ef24a32c717b167f33a91d6f648bdf"
76 "96596776afdb6377ac434c1c293ccb04",
77 "8da4e775a563c18f715f802a063c5a31"
78 "b8a11f5c5ee1879ec3454e5f3c738d2d"
79 "9d201395faa4b61a96c8",
80 },
81 {
82 // test 4
83 "sha1",
84 "0b0b0b0b0b0b0b0b0b0b0b",
85 "000102030405060708090a0b0c",
86 "f0f1f2f3f4f5f6f7f8f9",
87 42,
88 "9b6c18c432a7bf8f0e71c8eb88f4b30baa2ba243",
89 "085a01ea1b10f36933068b56efa5ad81"
90 "a4f14b822f5b091568a9cdd4f155fda2"
91 "c22e422478d305f3f896",
92 },
93 {
94 // test 5
95 "sha1",
96 "000102030405060708090a0b0c0d0e0f"
97 "101112131415161718191a1b1c1d1e1f"
98 "202122232425262728292a2b2c2d2e2f"
99 "303132333435363738393a3b3c3d3e3f"
100 "404142434445464748494a4b4c4d4e4f",
101 "606162636465666768696a6b6c6d6e6f"
102 "707172737475767778797a7b7c7d7e7f"
103 "808182838485868788898a8b8c8d8e8f"
104 "909192939495969798999a9b9c9d9e9f"
105 "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf",
106 "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
107 "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
108 "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
109 "e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
110 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
111 82,
112 "8adae09a2a307059478d309b26c4115a224cfaf6",
113 "0bd770a74d1160f7c9f12cd5912a06eb"
114 "ff6adcae899d92191fe4305673ba2ffe"
115 "8fa3f1a4e5ad79f3f334b3b202b2173c"
116 "486ea37ce3d397ed034c7f9dfeb15c5e"
117 "927336d0441f4c4300e2cff0d0900b52"
118 "d3b4",
119 },
120 {
121 // test 6
122 "sha1",
123 "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
124 "",
125 "",
126 42,
127 "da8c8a73c7fa77288ec6f5e7c297786aa0d32d01",
128 "0ac1af7002b3d761d1e55298da9d0506"
129 "b9ae52057220a306e07b6b87e8df21d0"
130 "ea00033de03984d34918"
131 },
132 {
133 // test 7
134 "sha1",
135 "0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c",
136 "",
137 "",
138 42,
139 "2adccada18779e7c2077ad2eb19d3f3e731385dd",
140 "2c91117204d745f3500d636a62f64f0a"
141 "b3bae548aa53d423b0d1f27ebba6f5e5"
142 "673a081d70cce7acfc48",
143 },
144 };
145
test_hkdf(void)146 int test_hkdf(void)
147 {
148 int i;
149 const DIGEST *digest;
150 uint8_t ikm[512];
151 uint8_t salt[512];
152 uint8_t info[512];
153 uint8_t prk[512];
154 uint8_t okm[512];
155 size_t ikmlen, saltlen, infolen, prklen, okmlen;
156 size_t L;
157 uint8_t buf[512];
158 size_t buflen;
159 size_t len;
160
161 for (i = 0; i < sizeof(hkdf_tests)/sizeof(hkdf_tests[0]); i++) {
162
163 digest = digest_from_name(hkdf_tests[i].algor);
164 hex_to_bytes(hkdf_tests[i].ikm, strlen(hkdf_tests[i].ikm), ikm, &len);
165 hex_to_bytes(hkdf_tests[i].salt, strlen(hkdf_tests[i].salt), salt, &len);
166 hex_to_bytes(hkdf_tests[i].info, strlen(hkdf_tests[i].info), info, &len);
167 hex_to_bytes(hkdf_tests[i].prk, strlen(hkdf_tests[i].prk), prk, &len);
168 hex_to_bytes(hkdf_tests[i].okm, strlen(hkdf_tests[i].okm), okm, &len);
169 ikmlen = strlen(hkdf_tests[i].ikm)/2;
170 saltlen = strlen(hkdf_tests[i].salt)/2;
171 infolen = strlen(hkdf_tests[i].info)/2;
172 prklen = strlen(hkdf_tests[i].prk)/2;
173 okmlen = strlen(hkdf_tests[i].okm)/2;
174 L = hkdf_tests[i].L;
175
176 printf("test %d\n", i + 1);
177 format_print(stdout, 0, 0, "Hash = %s\n", digest_name(digest));
178 format_bytes(stdout, 0, 0, "IKM = ", ikm, ikmlen);
179 format_bytes(stdout, 0, 0, "salt = ", salt, saltlen);
180 format_bytes(stdout, 0, 0, "info = ", info, infolen);
181 format_print(stdout, 0, 0, "L = %zu\n", L);
182
183 if (hkdf_extract(digest, salt, saltlen, ikm, ikmlen, buf, &buflen) != 1) {
184 error_print();
185 return -1;
186 }
187 format_bytes(stdout, 0, 0, "PRK = ", buf, buflen);
188 format_bytes(stdout, 0, 0, " = ", prk, prklen);
189 if (buflen != prklen || memcmp(buf, prk, prklen) != 0) {
190 error_print();
191 return -1;
192 }
193
194 if (hkdf_expand(digest, prk, prklen, info, infolen, L, buf) != 1) {
195 error_print();
196 return -1;
197 }
198 format_bytes(stdout, 0, 0, "OKM = ", buf, L);
199 format_bytes(stdout, 0, 0, " = ", okm, okmlen);
200 if (L != okmlen || memcmp(buf, okm, okmlen) != 0) {
201 error_print();
202 return -1;
203 }
204
205 printf("\n");
206
207 }
208 return 0;
209 }
210
main(void)211 int main(void)
212 {
213 int err = 0;
214 err += test_hkdf();
215 return err;
216 }
217