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