1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
2 /* SPDX-License-Identifier: Unlicense */
3 #include "tomcrypt_private.h"
4 
5 /**
6   @file hkdf_test.c
7   PKCS #5 support, self-test, Steffen Jaeckel
8 */
9 
10 #ifdef LTC_PKCS_5
11 
12 /*
13     TEST CASES SOURCE:
14 
15 Internet Engineering Task Force (IETF)                      S. Josefsson
16 Request for Comments: 6070                                        SJD AB
17 Category: Informational                                     January 2011
18 ISSN: 2070-1721
19 */
20 
21 /**
22   PKCS #5 self-test
23   @return CRYPT_OK if successful, CRYPT_NOP if tests have been disabled.
24 */
pkcs_5_test(void)25 int pkcs_5_test (void)
26 {
27  #ifndef LTC_TEST
28     return CRYPT_NOP;
29  #else
30 
31     typedef struct {
32         const char* P;
33         unsigned long P_len;
34         const char* S;
35         unsigned long S_len;
36         int c;
37         unsigned long dkLen;
38         unsigned char DK[40];
39     } case_item;
40 
41     static const case_item cases_5_2[] = {
42         {
43             "password",
44             8,
45             "salt",
46             4,
47             1,
48             20,
49             { 0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71,
50               0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06,
51               0x2f, 0xe0, 0x37, 0xa6 }
52         },
53         {
54             "password",
55             8,
56             "salt",
57             4,
58             2,
59             20,
60             { 0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c,
61               0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0,
62               0xd8, 0xde, 0x89, 0x57 }
63         },
64 #ifdef LTC_TEST_EXT
65         {
66             "password",
67             8,
68             "salt",
69             4,
70             4096,
71             20,
72             { 0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a,
73               0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0,
74               0x65, 0xa4, 0x29, 0xc1 }
75         },
76         {
77             "password",
78             8,
79             "salt",
80             4,
81             16777216,
82             20,
83             { 0xee, 0xfe, 0x3d, 0x61, 0xcd, 0x4d, 0xa4, 0xe4,
84               0xe9, 0x94, 0x5b, 0x3d, 0x6b, 0xa2, 0x15, 0x8c,
85               0x26, 0x34, 0xe9, 0x84 }
86         },
87         {
88             "passwordPASSWORDpassword",
89             25,
90             "saltSALTsaltSALTsaltSALTsaltSALTsalt",
91             36,
92             4096,
93             25,
94             { 0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b,
95               0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a,
96               0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70,
97               0x38 }
98         },
99         {
100             "pass\0word",
101             9,
102             "sa\0lt",
103             5,
104             4096,
105             16,
106             { 0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d,
107               0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3 }
108         },
109 #endif /* LTC_TEST_EXT */
110     };
111 
112     static const case_item cases_5_1[] = {
113         {
114             "password",
115             8,
116             "saltsalt", /* must be 8 octects */
117             8,          /* ignored by alg1 */
118             1,
119             20,
120             { 0xca, 0xb8, 0x6d, 0xd6, 0x26, 0x17, 0x10, 0x89, 0x1e, 0x8c,
121               0xb5, 0x6e, 0xe3, 0x62, 0x56, 0x91, 0xa7, 0x5d, 0xf3, 0x44 }
122         },
123     };
124 
125     static const case_item cases_5_1o[] = {
126         {
127             "password",
128             8,
129             "saltsalt", /* must be 8 octects */
130             8,          /* ignored by alg1_openssl */
131             1,
132             20,
133             { 0xca, 0xb8, 0x6d, 0xd6, 0x26, 0x17, 0x10, 0x89, 0x1e, 0x8c,
134               0xb5, 0x6e, 0xe3, 0x62, 0x56, 0x91, 0xa7, 0x5d, 0xf3, 0x44 }
135 
136         },
137         {
138             "password",
139             8,
140             "saltsalt", /* must be 8 octects */
141             8,          /* ignored by alg1_openssl */
142             1,
143             30,
144             { 0xca, 0xb8, 0x6d, 0xd6, 0x26, 0x17, 0x10, 0x89, 0x1e, 0x8c,
145               0xb5, 0x6e, 0xe3, 0x62, 0x56, 0x91, 0xa7, 0x5d, 0xf3, 0x44,
146               0xf0, 0xbf, 0xf4, 0xc1, 0x2c, 0xf3, 0x59, 0x6f, 0xc0, 0x0b }
147 
148         }
149     };
150 
151     unsigned char DK[40];
152     unsigned long dkLen;
153     int i, err;
154     int tested=0, failed=0;
155     int hash = find_hash("sha1");
156     if (hash == -1)
157     {
158 #ifdef LTC_TEST_DBG
159       printf("PKCS#5 test failed: 'sha1' hash not found\n");
160 #endif
161       return CRYPT_ERROR;
162     }
163 
164     /* testing alg 2 */
165     for(i=0; i < (int)(sizeof(cases_5_2) / sizeof(cases_5_2[0])); i++) {
166         ++tested;
167         dkLen = cases_5_2[i].dkLen;
168         if((err = pkcs_5_alg2((unsigned char*)cases_5_2[i].P, cases_5_2[i].P_len,
169                               (unsigned char*)cases_5_2[i].S, cases_5_2[i].S_len,
170                               cases_5_2[i].c, hash,
171                               DK, &dkLen)) != CRYPT_OK) {
172 #ifdef LTC_TEST_DBG
173             printf("\npkcs_5_alg2() #%d: Failed/1 (%s)\n", i, error_to_string(err));
174 #endif
175             ++failed;
176         }
177         else if (compare_testvector(DK, dkLen, cases_5_2[i].DK, cases_5_2[i].dkLen, "PKCS#5_2", i)) {
178             ++failed;
179         }
180     }
181 
182     /* testing alg 1 */
183     for(i=0; i < (int)(sizeof(cases_5_1) / sizeof(case_item)); i++, tested++) {
184         dkLen = cases_5_1[i].dkLen;
185         if((err = pkcs_5_alg1((unsigned char*)cases_5_1[i].P, cases_5_1[i].P_len,
186                               (unsigned char*)cases_5_1[i].S,
187                               cases_5_1[i].c, hash,
188                               DK, &dkLen)) != CRYPT_OK) {
189 #ifdef LTC_TEST_DBG
190             printf("\npkcs_5_alg1() #%d: Failed/1 (%s)\n", i, error_to_string(err));
191 #endif
192             ++failed;
193         }
194         else if (compare_testvector(DK, dkLen, cases_5_1[i].DK, cases_5_1[i].dkLen, "PKCS#5_1", i)) {
195             ++failed;
196         }
197     }
198 
199     /* testing alg 1_openssl */
200     for(i = 0; i < (int)(sizeof(cases_5_1o) / sizeof(cases_5_1o[0])); i++, tested++) {
201         dkLen = cases_5_1o[i].dkLen;
202         if ((err = pkcs_5_alg1_openssl((unsigned char*)cases_5_1o[i].P, cases_5_1o[i].P_len,
203                                        (unsigned char*)cases_5_1o[i].S,
204                                        cases_5_1o[i].c, hash,
205                                        DK, &dkLen)) != CRYPT_OK) {
206 #ifdef LTC_TEST_DBG
207             printf("\npkcs_5_alg1_openssl() #%d: Failed/1 (%s)\n", i, error_to_string(err));
208 #endif
209             ++failed;
210         }
211         else if (compare_testvector(DK, dkLen, cases_5_1o[i].DK, cases_5_1o[i].dkLen, "PKCS#5_1o", i)) {
212             ++failed;
213         }
214     }
215 
216     return (failed != 0) ? CRYPT_FAIL_TESTVECTOR : CRYPT_OK;
217  #endif
218 }
219 
220 #endif
221 
222