comparison libtomcrypt/src/misc/hkdf/hkdf_test.c @ 1471:6dba84798cd5

Update to libtomcrypt 1.18.1, merged with Dropbear changes
author Matt Johnston <matt@ucc.asn.au>
date Fri, 09 Feb 2018 21:44:05 +0800
parents
children
comparison
equal deleted inserted replaced
1470:8bba51a55704 1471:6dba84798cd5
1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
2 *
3 * LibTomCrypt is a library that provides various cryptographic
4 * algorithms in a highly modular and flexible manner.
5 *
6 * The library is free for all purposes without any express
7 * guarantee it works.
8 */
9 #include "tomcrypt.h"
10
11 /**
12 @file hkdf_test.c
13 LTC_HKDF support, self-test, Steffen Jaeckel
14 */
15
16 #ifdef LTC_HKDF
17
18 /*
19 TEST CASES SOURCE:
20
21 Internet Engineering Task Force (IETF) H. Krawczyk
22 Request for Comments: 5869 IBM Research
23 Category: Informational P. Eronen
24 ISSN: 2070-1721 Nokia
25 May 2010
26 Appendix A. Test Vectors
27 */
28
29 /**
30 LTC_HKDF self-test
31 @return CRYPT_OK if successful, CRYPT_NOP if tests have been disabled.
32 */
33 int hkdf_test(void)
34 {
35 #ifndef LTC_TEST
36 return CRYPT_NOP;
37 #else
38 unsigned char OKM[82];
39 int i;
40
41 static const struct hkdf_test_case {
42 int num;
43 const char* Hash;
44 unsigned char IKM[80];
45 unsigned long IKM_l;
46 unsigned char salt[80];
47 unsigned long salt_l;
48 unsigned char info[80];
49 unsigned long info_l;
50 unsigned char PRK[32];
51 unsigned long PRK_l;
52 unsigned char OKM[82];
53 unsigned long OKM_l;
54 } cases[] = {
55 #ifdef LTC_SHA256
56 /*
57 Basic test case with SHA-256
58
59 Hash = SHA-256
60 IKM = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b (22 octets)
61 salt = 0x000102030405060708090a0b0c (13 octets)
62 info = 0xf0f1f2f3f4f5f6f7f8f9 (10 octets)
63 L = 42
64
65 PRK = 0x077709362c2e32df0ddc3f0dc47bba63
66 90b6c73bb50f9c3122ec844ad7c2b3e5 (32 octets)
67 OKM = 0x3cb25f25faacd57a90434f64d0362f2a
68 2d2d0a90cf1a5a4c5db02d56ecc4c5bf
69 34007208d5b887185865 (42 octets)
70 */
71 {1, "sha256",
72 {0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
73 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
74 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b}, 22,
75 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
76 0x08, 0x09, 0x0a, 0x0b, 0x0c}, 13,
77 {0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
78 0xf8, 0xf9}, 10,
79 {0x07, 0x77, 0x09, 0x36, 0x2c, 0x2e, 0x32, 0xdf,
80 0x0d, 0xdc, 0x3f, 0x0d, 0xc4, 0x7b, 0xba, 0x63,
81 0x90, 0xb6, 0xc7, 0x3b, 0xb5, 0x0f, 0x9c, 0x31,
82 0x22, 0xec, 0x84, 0x4a, 0xd7, 0xc2, 0xb3, 0xe5}, 32,
83 {0x3c, 0xb2, 0x5f, 0x25, 0xfa, 0xac, 0xd5, 0x7a,
84 0x90, 0x43, 0x4f, 0x64, 0xd0, 0x36, 0x2f, 0x2a,
85 0x2d, 0x2d, 0x0a, 0x90, 0xcf, 0x1a, 0x5a, 0x4c,
86 0x5d, 0xb0, 0x2d, 0x56, 0xec, 0xc4, 0xc5, 0xbf,
87 0x34, 0x00, 0x72, 0x08, 0xd5, 0xb8, 0x87, 0x18,
88 0x58, 0x65}, 42},
89 #ifdef LTC_TEST_EXT
90 /* Test with SHA-256 and longer inputs/outputs */
91 {2, "sha256",
92 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
93 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
94 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
95 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
96 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
97 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
98 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
99 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
100 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
101 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f}, 80,
102 {0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
103 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
104 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
105 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
106 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
107 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
108 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
109 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
110 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
111 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf}, 80,
112 {0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
113 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
114 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
115 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
116 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
117 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
118 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
119 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
120 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
121 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff}, 80,
122 {0x06, 0xa6, 0xb8, 0x8c, 0x58, 0x53, 0x36, 0x1a,
123 0x06, 0x10, 0x4c, 0x9c, 0xeb, 0x35, 0xb4, 0x5c,
124 0xef, 0x76, 0x00, 0x14, 0x90, 0x46, 0x71, 0x01,
125 0x4a, 0x19, 0x3f, 0x40, 0xc1, 0x5f, 0xc2, 0x44}, 32,
126 {0xb1, 0x1e, 0x39, 0x8d, 0xc8, 0x03, 0x27, 0xa1,
127 0xc8, 0xe7, 0xf7, 0x8c, 0x59, 0x6a, 0x49, 0x34,
128 0x4f, 0x01, 0x2e, 0xda, 0x2d, 0x4e, 0xfa, 0xd8,
129 0xa0, 0x50, 0xcc, 0x4c, 0x19, 0xaf, 0xa9, 0x7c,
130 0x59, 0x04, 0x5a, 0x99, 0xca, 0xc7, 0x82, 0x72,
131 0x71, 0xcb, 0x41, 0xc6, 0x5e, 0x59, 0x0e, 0x09,
132 0xda, 0x32, 0x75, 0x60, 0x0c, 0x2f, 0x09, 0xb8,
133 0x36, 0x77, 0x93, 0xa9, 0xac, 0xa3, 0xdb, 0x71,
134 0xcc, 0x30, 0xc5, 0x81, 0x79, 0xec, 0x3e, 0x87,
135 0xc1, 0x4c, 0x01, 0xd5, 0xc1, 0xf3, 0x43, 0x4f,
136 0x1d, 0x87}, 82},
137 /* Test with SHA-256 and zero length salt/info */
138 {3, "sha256",
139 {0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
140 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
141 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b}, 22,
142 {0}, 0,
143 {0}, 0,
144 {0x19, 0xef, 0x24, 0xa3, 0x2c, 0x71, 0x7b, 0x16,
145 0x7f, 0x33, 0xa9, 0x1d, 0x6f, 0x64, 0x8b, 0xdf,
146 0x96, 0x59, 0x67, 0x76, 0xaf, 0xdb, 0x63, 0x77,
147 0xac, 0x43, 0x4c, 0x1c, 0x29, 0x3c, 0xcb, 0x04}, 32,
148 {0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f,
149 0x71, 0x5f, 0x80, 0x2a, 0x06, 0x3c, 0x5a, 0x31,
150 0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1, 0x87, 0x9e,
151 0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d,
152 0x9d, 0x20, 0x13, 0x95, 0xfa, 0xa4, 0xb6, 0x1a,
153 0x96, 0xc8}, 42},
154 #endif /* LTC_TEST_EXT */
155 #endif /* LTC_SHA256 */
156 #ifdef LTC_SHA1
157 /* Basic test case with SHA-1 */
158 {4, "sha1",
159 {0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
160 0x0b, 0x0b, 0x0b}, 11,
161 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
162 0x08, 0x09, 0x0a, 0x0b, 0x0c}, 13,
163 {0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
164 0xf8, 0xf9}, 10,
165 {0x9b, 0x6c, 0x18, 0xc4, 0x32, 0xa7, 0xbf, 0x8f,
166 0x0e, 0x71, 0xc8, 0xeb, 0x88, 0xf4, 0xb3, 0x0b,
167 0xaa, 0x2b, 0xa2, 0x43}, 20,
168 {0x08, 0x5a, 0x01, 0xea, 0x1b, 0x10, 0xf3, 0x69,
169 0x33, 0x06, 0x8b, 0x56, 0xef, 0xa5, 0xad, 0x81,
170 0xa4, 0xf1, 0x4b, 0x82, 0x2f, 0x5b, 0x09, 0x15,
171 0x68, 0xa9, 0xcd, 0xd4, 0xf1, 0x55, 0xfd, 0xa2,
172 0xc2, 0x2e, 0x42, 0x24, 0x78, 0xd3, 0x05, 0xf3,
173 0xf8, 0x96}, 42},
174 #ifdef LTC_TEST_EXT
175 /* Test with SHA-1 and longer inputs/outputs */
176 {5, "sha1",
177 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
178 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
179 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
180 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
181 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
182 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
183 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
184 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
185 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
186 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f}, 80,
187 {0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
188 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
189 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
190 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
191 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
192 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
193 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
194 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
195 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
196 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf}, 80,
197 {0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
198 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
199 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
200 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
201 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
202 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
203 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
204 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
205 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
206 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff}, 80,
207 {0x8a, 0xda, 0xe0, 0x9a, 0x2a, 0x30, 0x70, 0x59,
208 0x47, 0x8d, 0x30, 0x9b, 0x26, 0xc4, 0x11, 0x5a,
209 0x22, 0x4c, 0xfa, 0xf6}, 20,
210 {0x0b, 0xd7, 0x70, 0xa7, 0x4d, 0x11, 0x60, 0xf7,
211 0xc9, 0xf1, 0x2c, 0xd5, 0x91, 0x2a, 0x06, 0xeb,
212 0xff, 0x6a, 0xdc, 0xae, 0x89, 0x9d, 0x92, 0x19,
213 0x1f, 0xe4, 0x30, 0x56, 0x73, 0xba, 0x2f, 0xfe,
214 0x8f, 0xa3, 0xf1, 0xa4, 0xe5, 0xad, 0x79, 0xf3,
215 0xf3, 0x34, 0xb3, 0xb2, 0x02, 0xb2, 0x17, 0x3c,
216 0x48, 0x6e, 0xa3, 0x7c, 0xe3, 0xd3, 0x97, 0xed,
217 0x03, 0x4c, 0x7f, 0x9d, 0xfe, 0xb1, 0x5c, 0x5e,
218 0x92, 0x73, 0x36, 0xd0, 0x44, 0x1f, 0x4c, 0x43,
219 0x00, 0xe2, 0xcf, 0xf0, 0xd0, 0x90, 0x0b, 0x52,
220 0xd3, 0xb4}, 82},
221 /* Test with SHA-1 and zero-length salt/info */
222 {6, "sha1",
223 {0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
224 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
225 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b}, 22,
226 {0}, 0,
227 {0}, 0,
228 {0xda, 0x8c, 0x8a, 0x73, 0xc7, 0xfa, 0x77, 0x28,
229 0x8e, 0xc6, 0xf5, 0xe7, 0xc2, 0x97, 0x78, 0x6a,
230 0xa0, 0xd3, 0x2d, 0x01}, 20,
231 {0x0a, 0xc1, 0xaf, 0x70, 0x02, 0xb3, 0xd7, 0x61,
232 0xd1, 0xe5, 0x52, 0x98, 0xda, 0x9d, 0x05, 0x06,
233 0xb9, 0xae, 0x52, 0x05, 0x72, 0x20, 0xa3, 0x06,
234 0xe0, 0x7b, 0x6b, 0x87, 0xe8, 0xdf, 0x21, 0xd0,
235 0xea, 0x00, 0x03, 0x3d, 0xe0, 0x39, 0x84, 0xd3,
236 0x49, 0x18}, 42},
237 /* Test with SHA-1, salt not provided (defaults to HashLen zero octets),
238 zero-length info */
239 {7, "sha1",
240 {0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
241 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
242 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c}, 22,
243 {0}, 0, /* pass a null pointer */
244 {0}, 0,
245 {0x2a, 0xdc, 0xca, 0xda, 0x18, 0x77, 0x9e, 0x7c,
246 0x20, 0x77, 0xad, 0x2e, 0xb1, 0x9d, 0x3f, 0x3e,
247 0x73, 0x13, 0x85, 0xdd}, 20,
248 {0x2c, 0x91, 0x11, 0x72, 0x04, 0xd7, 0x45, 0xf3,
249 0x50, 0x0d, 0x63, 0x6a, 0x62, 0xf6, 0x4f, 0x0a,
250 0xb3, 0xba, 0xe5, 0x48, 0xaa, 0x53, 0xd4, 0x23,
251 0xb0, 0xd1, 0xf2, 0x7e, 0xbb, 0xa6, 0xf5, 0xe5,
252 0x67, 0x3a, 0x08, 0x1d, 0x70, 0xcc, 0xe7, 0xac,
253 0xfc, 0x48}, 42},
254 #endif /* LTC_TEST_EXT */
255 #endif /* LTC_SHA1 */
256 };
257
258 int err;
259 int tested=0,failed=0;
260 for(i=0; i < (int)(sizeof(cases) / sizeof(cases[0])); i++) {
261 int hash = find_hash(cases[i].Hash);
262 if (hash == -1) continue;
263 ++tested;
264 if((err = hkdf(hash, cases[i].salt, cases[i].salt_l,
265 cases[i].info, cases[i].info_l,
266 cases[i].IKM, cases[i].IKM_l,
267 OKM, cases[i].OKM_l)) != CRYPT_OK) {
268 #if defined(LTC_TEST_DBG) && (LTC_TEST_DBG > 1)
269 printf("LTC_HKDF-%s test #%d, %s\n", cases[i].Hash, i, error_to_string(err));
270 #endif
271 return err;
272 }
273
274 if(compare_testvector(OKM, cases[i].OKM_l, cases[i].OKM, (size_t)cases[i].OKM_l, "HKDF", cases[i].num)) {
275 failed++;
276 }
277 }
278
279 if (failed != 0) {
280 return CRYPT_FAIL_TESTVECTOR;
281 } else if (tested == 0) {
282 return CRYPT_NOP;
283 } else {
284 return CRYPT_OK;
285 }
286 #endif
287 }
288
289 #endif
290
291
292 /* ref: $Format:%D$ */
293 /* git commit: $Format:%H$ */
294 /* commit time: $Format:%ai$ */