• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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