xref: /freebsd/crypto/krb5/src/lib/crypto/crypto_tests/t_str2key.c (revision 7f2fe78b9dd5f51c821d771b63d2e096f6fd49e9)
1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /* lib/crypto/crypto_tests/t_str2key.c - String-to-key test vectors */
3 /*
4  * Copyright (C) 2010 by the Massachusetts Institute of Technology.
5  * All rights reserved.
6  *
7  * Export of this software from the United States of America may
8  *   require a specific license from the United States Government.
9  *   It is the responsibility of any person or organization contemplating
10  *   export to obtain such a license before exporting.
11  *
12  * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
13  * distribute this software and its documentation for any purpose and
14  * without fee is hereby granted, provided that the above copyright
15  * notice appear in all copies and that both that copyright notice and
16  * this permission notice appear in supporting documentation, and that
17  * the name of M.I.T. not be used in advertising or publicity pertaining
18  * to distribution of the software without specific, written prior
19  * permission.  Furthermore if you modify this software you must label
20  * your software as modified software and not distribute it in such a
21  * fashion that it might be confused with the original M.I.T. software.
22  * M.I.T. makes no representations about the suitability of
23  * this software for any purpose.  It is provided "as is" without express
24  * or implied warranty.
25  */
26 
27 #include "k5-int.h"
28 
29 struct test {
30     krb5_enctype enctype;
31     char *string;
32     krb5_data salt;
33     krb5_data params;
34     krb5_data expected_key;
35     krb5_error_code expected_err;
36     krb5_boolean allow_weak;
37 } test_cases[] = {
38     /* Test vectors from RFC 3961 appendix A.4. */
39     {
40         ENCTYPE_DES3_CBC_SHA1,
41         "password",
42         { KV5M_DATA, 21, "ATHENA.MIT.EDUraeburn" },
43         { KV5M_DATA, 0, NULL },
44         { KV5M_DATA, 24, "\x85\x0B\xB5\x13\x58\x54\x8C\xD0\x5E\x86\x76\x8C"
45           "\x31\x3E\x3B\xFE\xF7\x51\x19\x37\xDC\xF7\x2C\x3E" },
46         0,
47         FALSE
48     },
49     {
50         ENCTYPE_DES3_CBC_SHA1,
51         "potatoe",
52         { KV5M_DATA, 19, "WHITEHOUSE.GOVdanny" },
53         { KV5M_DATA, 0, NULL },
54         { KV5M_DATA, 24, "\xDF\xCD\x23\x3D\xD0\xA4\x32\x04\xEA\x6D\xC4\x37"
55           "\xFB\x15\xE0\x61\xB0\x29\x79\xC1\xF7\x4F\x37\x7A" },
56         0,
57         FALSE
58     },
59     {
60         ENCTYPE_DES3_CBC_SHA1,
61         "penny",
62         { KV5M_DATA, 19, "EXAMPLE.COMbuckaroo" },
63         { KV5M_DATA, 0, NULL },
64         { KV5M_DATA, 24, "\x6D\x2F\xCD\xF2\xD6\xFB\xBC\x3D\xDC\xAD\xB5\xDA"
65           "\x57\x10\xA2\x34\x89\xB0\xD3\xB6\x9D\x5D\x9D\x4A" },
66         0,
67         FALSE
68     },
69     {
70         ENCTYPE_DES3_CBC_SHA1,
71         "\xC3\x9F",
72         { KV5M_DATA, 23, "ATHENA.MIT.EDUJuri\xC5\xA1\x69\xC4\x87" },
73         { KV5M_DATA, 0, NULL },
74         { KV5M_DATA, 24, "\x16\xD5\xA4\x0E\x1C\xE3\xBA\xCB\x61\xB9\xDC\xE0"
75           "\x04\x70\x32\x4C\x83\x19\x73\xA7\xB9\x52\xFE\xB0" },
76         0,
77         FALSE
78     },
79     {
80         ENCTYPE_DES3_CBC_SHA1,
81         "\xF0\x9D\x84\x9E",
82         { KV5M_DATA, 18, "EXAMPLE.COMpianist" },
83         { KV5M_DATA, 0, NULL },
84         { KV5M_DATA, 24, "\x85\x76\x37\x26\x58\x5D\xBC\x1C\xCE\x6E\xC4\x3E"
85           "\x1F\x75\x1F\x07\xF1\xC4\xCB\xB0\x98\xF4\x0B\x19" },
86         0,
87         FALSE
88     },
89 
90     /* Test vectors from RFC 3962 appendix B. */
91     {
92         ENCTYPE_AES128_CTS_HMAC_SHA1_96,
93         "password",
94         { KV5M_DATA, 21, "ATHENA.MIT.EDUraeburn" },
95         { KV5M_DATA, 4, "\0\0\0\1" },
96         { KV5M_DATA, 16,
97           "\x42\x26\x3C\x6E\x89\xF4\xFC\x28\xB8\xDF\x68\xEE\x09\x79\x9F\x15" },
98         0,
99         TRUE
100     },
101     {
102         ENCTYPE_AES256_CTS_HMAC_SHA1_96,
103         "password",
104         { KV5M_DATA, 21, "ATHENA.MIT.EDUraeburn" },
105         { KV5M_DATA, 4, "\0\0\0\1" },
106         { KV5M_DATA, 32,
107           "\xFE\x69\x7B\x52\xBC\x0D\x3C\xE1\x44\x32\xBA\x03\x6A\x92\xE6\x5B"
108           "\xBB\x52\x28\x09\x90\xA2\xFA\x27\x88\x39\x98\xD7\x2A\xF3\x01\x61" },
109         0,
110         TRUE
111     },
112     {
113         ENCTYPE_AES128_CTS_HMAC_SHA1_96,
114         "password",
115         { KV5M_DATA, 21, "ATHENA.MIT.EDUraeburn" },
116         { KV5M_DATA, 4, "\0\0\0\2" },
117         { KV5M_DATA, 16,
118           "\xC6\x51\xBF\x29\xE2\x30\x0A\xC2\x7F\xA4\x69\xD6\x93\xBD\xDA\x13" },
119         0,
120         TRUE
121     },
122     {
123         ENCTYPE_AES256_CTS_HMAC_SHA1_96,
124         "password",
125         { KV5M_DATA, 21, "ATHENA.MIT.EDUraeburn" },
126         { KV5M_DATA, 4, "\0\0\0\2" },
127         { KV5M_DATA, 32,
128           "\xA2\xE1\x6D\x16\xB3\x60\x69\xC1\x35\xD5\xE9\xD2\xE2\x5F\x89\x61"
129           "\x02\x68\x56\x18\xB9\x59\x14\xB4\x67\xC6\x76\x22\x22\x58\x24\xFF" },
130         0,
131         TRUE
132     },
133     {
134         ENCTYPE_AES128_CTS_HMAC_SHA1_96,
135         "password",
136         { KV5M_DATA, 21, "ATHENA.MIT.EDUraeburn" },
137         { KV5M_DATA, 4, "\0\0\x04\xB0" }, /* 1200 */
138         { KV5M_DATA, 16,
139           "\x4C\x01\xCD\x46\xD6\x32\xD0\x1E\x6D\xBE\x23\x0A\x01\xED\x64\x2A" },
140         0,
141         TRUE
142     },
143     {
144         ENCTYPE_AES256_CTS_HMAC_SHA1_96,
145         "password",
146         { KV5M_DATA, 21, "ATHENA.MIT.EDUraeburn" },
147         { KV5M_DATA, 4, "\0\0\x04\xB0" }, /* 1200 */
148         { KV5M_DATA, 32,
149           "\x55\xA6\xAC\x74\x0A\xD1\x7B\x48\x46\x94\x10\x51\xE1\xE8\xB0\xA7"
150           "\x54\x8D\x93\xB0\xAB\x30\xA8\xBC\x3F\xF1\x62\x80\x38\x2B\x8C\x2A" },
151         0,
152         TRUE
153     },
154     {
155         ENCTYPE_AES128_CTS_HMAC_SHA1_96,
156         "password",
157         { KV5M_DATA, 8, "\x12\x34\x56\x78\x78\x56\x34\x12" },
158         { KV5M_DATA, 4, "\0\0\0\5" },
159         { KV5M_DATA, 16,
160           "\xE9\xB2\x3D\x52\x27\x37\x47\xDD\x5C\x35\xCB\x55\xBE\x61\x9D\x8E" },
161         0,
162         TRUE
163     },
164     {
165         ENCTYPE_AES256_CTS_HMAC_SHA1_96,
166         "password",
167         { KV5M_DATA, 8, "\x12\x34\x56\x78\x78\x56\x34\x12" },
168         { KV5M_DATA, 4, "\0\0\0\5" },
169         { KV5M_DATA, 32,
170           "\x97\xA4\xE7\x86\xBE\x20\xD8\x1A\x38\x2D\x5E\xBC\x96\xD5\x90\x9C"
171           "\xAB\xCD\xAD\xC8\x7C\xA4\x8F\x57\x45\x04\x15\x9F\x16\xC3\x6E\x31" },
172         0,
173         TRUE
174     },
175     {
176         ENCTYPE_AES128_CTS_HMAC_SHA1_96,
177         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
178         { KV5M_DATA, 29, "pass phrase equals block size" },
179         { KV5M_DATA, 4, "\0\0\x04\xB0" }, /* 1200 */
180         { KV5M_DATA, 16,
181           "\x59\xD1\xBB\x78\x9A\x82\x8B\x1A\xA5\x4E\xF9\xC2\x88\x3F\x69\xED" },
182         0,
183         TRUE
184     },
185     {
186         ENCTYPE_AES256_CTS_HMAC_SHA1_96,
187         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
188         { KV5M_DATA, 29, "pass phrase equals block size" },
189         { KV5M_DATA, 4, "\0\0\x04\xB0" }, /* 1200 */
190         { KV5M_DATA, 32,
191           "\x89\xAD\xEE\x36\x08\xDB\x8B\xC7\x1F\x1B\xFB\xFE\x45\x94\x86\xB0"
192           "\x56\x18\xB7\x0C\xBA\xE2\x20\x92\x53\x4E\x56\xC5\x53\xBA\x4B\x34" },
193         0,
194         TRUE
195     },
196     {
197         ENCTYPE_AES128_CTS_HMAC_SHA1_96,
198         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
199         { KV5M_DATA, 30, "pass phrase exceeds block size" },
200         { KV5M_DATA, 4, "\0\0\x04\xB0" }, /* 1200 */
201         { KV5M_DATA, 16,
202           "\xCB\x80\x05\xDC\x5F\x90\x17\x9A\x7F\x02\x10\x4C\x00\x18\x75\x1D" },
203         0,
204         TRUE
205     },
206     {
207         ENCTYPE_AES256_CTS_HMAC_SHA1_96,
208         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
209         { KV5M_DATA, 30, "pass phrase exceeds block size" },
210         { KV5M_DATA, 4, "\0\0\x04\xB0" }, /* 1200 */
211         { KV5M_DATA, 32,
212           "\xD7\x8C\x5C\x9C\xB8\x72\xA8\xC9\xDA\xD4\x69\x7F\x0B\xB5\xB2\xD2"
213           "\x14\x96\xC8\x2B\xEB\x2C\xAE\xDA\x21\x12\xFC\xEE\xA0\x57\x40\x1B" },
214         0,
215         TRUE
216     },
217     {
218         ENCTYPE_AES128_CTS_HMAC_SHA1_96,
219         "\xF0\x9D\x84\x9E",
220         { KV5M_DATA, 18, "EXAMPLE.COMpianist" },
221         { KV5M_DATA, 4, "\0\0\0\x32" }, /* 50 */
222         { KV5M_DATA, 16,
223           "\xF1\x49\xC1\xF2\xE1\x54\xA7\x34\x52\xD4\x3E\x7F\xE6\x2A\x56\xE5" },
224         0,
225         TRUE
226     },
227     {
228         ENCTYPE_AES256_CTS_HMAC_SHA1_96,
229         "\xF0\x9D\x84\x9E",
230         { KV5M_DATA, 18, "EXAMPLE.COMpianist" },
231         { KV5M_DATA, 4, "\0\0\0\x32" }, /* 50 */
232         { KV5M_DATA, 32,
233           "\x4B\x6D\x98\x39\xF8\x44\x06\xDF\x1F\x09\xCC\x16\x6D\xB4\xB8\x3C"
234           "\x57\x18\x48\xB7\x84\xA3\xD6\xBD\xC3\x46\x58\x9A\x3E\x39\x3F\x9E" },
235         0,
236         TRUE
237     },
238     /* Check for KRB5_ERR_BAD_S2K_PARAMS return when weak iteration counts are
239      * forbidden. */
240     {
241         ENCTYPE_AES256_CTS_HMAC_SHA1_96,
242         "\xF0\x9D\x84\x9E",
243         { KV5M_DATA, 18, "EXAMPLE.COMpianist" },
244         { KV5M_DATA, 4, "\0\0\0\x32" }, /* 50 */
245         { KV5M_DATA, 32,
246           "\x4B\x6D\x98\x39\xF8\x44\x06\xDF\x1F\x09\xCC\x16\x6D\xB4\xB8\x3C"
247           "\x57\x18\x48\xB7\x84\xA3\xD6\xBD\xC3\x46\x58\x9A\x3E\x39\x3F\x9E" },
248         KRB5_ERR_BAD_S2K_PARAMS,
249         FALSE
250     },
251 
252     /* The same inputs applied to Camellia enctypes. */
253     {
254         ENCTYPE_CAMELLIA128_CTS_CMAC,
255         "password",
256         { KV5M_DATA, 21, "ATHENA.MIT.EDUraeburn" },
257         { KV5M_DATA, 4, "\0\0\0\1" },
258         { KV5M_DATA, 16,
259           "\x57\xD0\x29\x72\x98\xFF\xD9\xD3\x5D\xE5\xA4\x7F\xB4\xBD\xE2\x4B" },
260         0,
261         TRUE
262     },
263     {
264         ENCTYPE_CAMELLIA256_CTS_CMAC,
265         "password",
266         { KV5M_DATA, 21, "ATHENA.MIT.EDUraeburn" },
267         { KV5M_DATA, 4, "\0\0\0\1" },
268         { KV5M_DATA, 32,
269           "\xB9\xD6\x82\x8B\x20\x56\xB7\xBE\x65\x6D\x88\xA1\x23\xB1\xFA\xC6"
270           "\x82\x14\xAC\x2B\x72\x7E\xCF\x5F\x69\xAF\xE0\xC4\xDF\x2A\x6D\x2C" },
271         0,
272         TRUE
273     },
274     {
275         ENCTYPE_CAMELLIA128_CTS_CMAC,
276         "password",
277         { KV5M_DATA, 21, "ATHENA.MIT.EDUraeburn" },
278         { KV5M_DATA, 4, "\0\0\0\2" },
279         { KV5M_DATA, 16,
280           "\x73\xF1\xB5\x3A\xA0\xF3\x10\xF9\x3B\x1D\xE8\xCC\xAA\x0C\xB1\x52" },
281         0,
282         TRUE
283     },
284     {
285         ENCTYPE_CAMELLIA256_CTS_CMAC,
286         "password",
287         { KV5M_DATA, 21, "ATHENA.MIT.EDUraeburn" },
288         { KV5M_DATA, 4, "\0\0\0\2" },
289         { KV5M_DATA, 32,
290           "\x83\xFC\x58\x66\xE5\xF8\xF4\xC6\xF3\x86\x63\xC6\x5C\x87\x54\x9F"
291           "\x34\x2B\xC4\x7E\xD3\x94\xDC\x9D\x3C\xD4\xD1\x63\xAD\xE3\x75\xE3" },
292         0,
293         TRUE
294     },
295     {
296         ENCTYPE_CAMELLIA128_CTS_CMAC,
297         "password",
298         { KV5M_DATA, 21, "ATHENA.MIT.EDUraeburn" },
299         { KV5M_DATA, 4, "\0\0\x04\xB0" }, /* 1200 */
300         { KV5M_DATA, 16,
301           "\x8E\x57\x11\x45\x45\x28\x55\x57\x5F\xD9\x16\xE7\xB0\x44\x87\xAA" },
302         0,
303         TRUE
304     },
305     {
306         ENCTYPE_CAMELLIA256_CTS_CMAC,
307         "password",
308         { KV5M_DATA, 21, "ATHENA.MIT.EDUraeburn" },
309         { KV5M_DATA, 4, "\0\0\x04\xB0" }, /* 1200 */
310         { KV5M_DATA, 32,
311           "\x77\xF4\x21\xA6\xF2\x5E\x13\x83\x95\xE8\x37\xE5\xD8\x5D\x38\x5B"
312           "\x4C\x1B\xFD\x77\x2E\x11\x2C\xD9\x20\x8C\xE7\x2A\x53\x0B\x15\xE6" },
313         0,
314         TRUE
315     },
316     {
317         ENCTYPE_CAMELLIA128_CTS_CMAC,
318         "password",
319         { KV5M_DATA, 8, "\x12\x34\x56\x78\x78\x56\x34\x12" },
320         { KV5M_DATA, 4, "\0\0\0\5" },
321         { KV5M_DATA, 16,
322           "\x00\x49\x8F\xD9\x16\xBF\xC1\xC2\xB1\x03\x1C\x17\x08\x01\xB3\x81" },
323         0,
324         TRUE
325     },
326     {
327         ENCTYPE_CAMELLIA256_CTS_CMAC,
328         "password",
329         { KV5M_DATA, 8, "\x12\x34\x56\x78\x78\x56\x34\x12" },
330         { KV5M_DATA, 4, "\0\0\0\5" },
331         { KV5M_DATA, 32,
332           "\x11\x08\x3A\x00\xBD\xFE\x6A\x41\xB2\xF1\x97\x16\xD6\x20\x2F\x0A"
333           "\xFA\x94\x28\x9A\xFE\x8B\x27\xA0\x49\xBD\x28\xB1\xD7\x6C\x38\x9A" },
334         0,
335         TRUE
336     },
337     {
338         ENCTYPE_CAMELLIA128_CTS_CMAC,
339         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
340         { KV5M_DATA, 29, "pass phrase equals block size" },
341         { KV5M_DATA, 4, "\0\0\x04\xB0" }, /* 1200 */
342         { KV5M_DATA, 16,
343           "\x8B\xF6\xC3\xEF\x70\x9B\x98\x1D\xBB\x58\x5D\x08\x68\x43\xBE\x05" },
344         0,
345         TRUE
346     },
347     {
348         ENCTYPE_CAMELLIA256_CTS_CMAC,
349         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
350         { KV5M_DATA, 29, "pass phrase equals block size" },
351         { KV5M_DATA, 4, "\0\0\x04\xB0" }, /* 1200 */
352         { KV5M_DATA, 32,
353           "\x11\x9F\xE2\xA1\xCB\x0B\x1B\xE0\x10\xB9\x06\x7A\x73\xDB\x63\xED"
354           "\x46\x65\xB4\xE5\x3A\x98\xD1\x78\x03\x5D\xCF\xE8\x43\xA6\xB9\xB0" },
355         0,
356         TRUE
357     },
358     {
359         ENCTYPE_CAMELLIA128_CTS_CMAC,
360         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
361         { KV5M_DATA, 30, "pass phrase exceeds block size" },
362         { KV5M_DATA, 4, "\0\0\x04\xB0" }, /* 1200 */
363         { KV5M_DATA, 16,
364           "\x57\x52\xAC\x8D\x6A\xD1\xCC\xFE\x84\x30\xB3\x12\x87\x1C\x2F\x74" },
365         0,
366         TRUE
367     },
368     {
369         ENCTYPE_CAMELLIA256_CTS_CMAC,
370         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
371         { KV5M_DATA, 30, "pass phrase exceeds block size" },
372         { KV5M_DATA, 4, "\0\0\x04\xB0" }, /* 1200 */
373         { KV5M_DATA, 32,
374           "\x61\x4D\x5D\xFC\x0B\xA6\xD3\x90\xB4\x12\xB8\x9A\xE4\xD5\xB0\x88"
375           "\xB6\x12\xB3\x16\x51\x09\x94\x67\x9D\xDB\x43\x83\xC7\x12\x6D\xDF" },
376         0,
377         TRUE
378     },
379     {
380         ENCTYPE_CAMELLIA128_CTS_CMAC,
381         "\xf0\x9d\x84\x9e",
382         { KV5M_DATA, 18, "EXAMPLE.COMpianist" },
383         { KV5M_DATA, 4, "\0\0\0\x32" }, /* 50 */
384         { KV5M_DATA, 16,
385           "\xCC\x75\xC7\xFD\x26\x0F\x1C\x16\x58\x01\x1F\xCC\x0D\x56\x06\x16" },
386         0,
387         TRUE
388     },
389     {
390         ENCTYPE_CAMELLIA256_CTS_CMAC,
391         "\xf0\x9d\x84\x9e",
392         { KV5M_DATA, 18, "EXAMPLE.COMpianist" },
393         { KV5M_DATA, 4, "\0\0\0\x32" }, /* 50 */
394         { KV5M_DATA, 32,
395           "\x16\x3B\x76\x8C\x6D\xB1\x48\xB4\xEE\xC7\x16\x3D\xF5\xAE\xD7\x0E"
396           "\x20\x6B\x68\xCE\xC0\x78\xBC\x06\x9E\xD6\x8A\x7E\xD3\x6B\x1E\xCC" },
397         0,
398         TRUE
399     },
400     /* Check for KRB5_ERR_BAD_S2K_PARAMS return when weak iteration counts are
401      * forbidden. */
402     {
403         ENCTYPE_CAMELLIA256_CTS_CMAC,
404         "\xf0\x9d\x84\x9e",
405         { KV5M_DATA, 18, "EXAMPLE.COMpianist" },
406         { KV5M_DATA, 4, "\0\0\0\x32" }, /* 50 */
407         { KV5M_DATA, 32,
408           "\x16\x3B\x76\x8C\x6D\xB1\x48\xB4\xEE\xC7\x16\x3D\xF5\xAE\xD7\x0E"
409           "\x20\x6B\x68\xCE\xC0\x78\xBC\x06\x9E\xD6\x8A\x7E\xD3\x6B\x1E\xCC" },
410         KRB5_ERR_BAD_S2K_PARAMS,
411         FALSE
412     },
413 
414     {
415         ENCTYPE_AES128_CTS_HMAC_SHA256_128,
416         "password",
417         { KV5M_DATA, 37,
418           "\x10\xDF\x9D\xD7\x83\xE5\xBC\x8A\xCE\xA1\x73\x0E\x74\x35\x5F\x61"
419           "ATHENA.MIT.EDUraeburn" },
420         { KV5M_DATA, 4, "\x00\x00\x80\x00" },
421         { KV5M_DATA, 16,
422           "\x08\x9B\xCA\x48\xB1\x05\xEA\x6E\xA7\x7C\xA5\xD2\xF3\x9D\xC5\xE7" },
423         0,
424         FALSE
425     },
426     {
427         ENCTYPE_AES256_CTS_HMAC_SHA384_192,
428         "password",
429         { KV5M_DATA, 37,
430           "\x10\xDF\x9D\xD7\x83\xE5\xBC\x8A\xCE\xA1\x73\x0E\x74\x35\x5F\x61"
431           "ATHENA.MIT.EDUraeburn" },
432         { KV5M_DATA, 4, "\x00\x00\x80\x00" },
433         { KV5M_DATA, 32,
434           "\x45\xBD\x80\x6D\xBF\x6A\x83\x3A\x9C\xFF\xC1\xC9\x45\x89\xA2\x22"
435           "\x36\x7A\x79\xBC\x21\xC4\x13\x71\x89\x06\xE9\xF5\x78\xA7\x84\x67" },
436         0,
437         FALSE
438     },
439 };
440 
441 static void
printhex(const char * head,void * data,size_t len)442 printhex(const char *head, void *data, size_t len)
443 {
444     size_t i;
445 
446     printf("%s", head);
447     for (i = 0; i < len; i++) {
448         printf("%02X", ((unsigned char*)data)[i]);
449         if (i % 16 == 15 && i + 1 < len)
450             printf("\n%*s", (int)strlen(head), "");
451         else if (i + 1 < len)
452             printf(" ");
453     }
454     printf("\n");
455 }
456 
457 extern int k5_allow_weak_pbkdf2iter;
458 
459 int
main(int argc,char ** argv)460 main(int argc, char **argv)
461 {
462     krb5_context context = NULL;
463     krb5_data string;
464     krb5_error_code ret;
465     krb5_keyblock *keyblock;
466     size_t i;
467     struct test *test;
468     krb5_boolean verbose = FALSE;
469     int status = 0;
470 
471     if (argc >= 2 && strcmp(argv[1], "-v") == 0)
472         verbose = TRUE;
473     for (i = 0; i < sizeof(test_cases) / sizeof(*test_cases); i++) {
474         test = &test_cases[i];
475         string = string2data(test->string);
476         ret = krb5_init_keyblock(context, test->enctype, 0, &keyblock);
477         assert(!ret);
478         k5_allow_weak_pbkdf2iter = test->allow_weak;
479         ret = krb5_c_string_to_key_with_params(context, test->enctype,
480                                                &string, &test->salt,
481                                                &test->params, keyblock);
482         if (ret != test->expected_err) {
483             com_err(argv[0], ret, "in krb5_c_string_to_key_with_params");
484             exit(1);
485         }
486         if (verbose) {
487             char buf[64];
488             krb5_enctype_to_name(test->enctype, FALSE, buf, sizeof(buf));
489             printf("\nTest %d:\n", (int)i);
490             printf("Enctype: %s\n", buf);
491             printf("String: %s\n", test->string);
492             printhex("Salt: ", test->salt.data, test->salt.length);
493             printhex("Params: ", test->params.data, test->params.length);
494             if (test->expected_err == 0)
495                 printhex("Key: ", keyblock->contents, keyblock->length);
496             else
497                 printf("Expected error: %d\n", (int)test->expected_err);
498         }
499         if (test->expected_err != 0) {
500             krb5_free_keyblock(context, keyblock);
501             continue;
502         }
503         assert(keyblock->length == test->expected_key.length);
504         if (memcmp(keyblock->contents, test->expected_key.data,
505                    keyblock->length) != 0) {
506             printf("str2key test %d failed\n", (int)i);
507             status = 1;
508             if (!verbose)
509                 break;
510         }
511         krb5_free_keyblock(context, keyblock);
512     }
513     return status;
514 }
515