summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/evp/evp_pbe.c
diff options
context:
space:
mode:
authorjsing <>2014-05-08 15:42:26 +0000
committerjsing <>2014-05-08 15:42:26 +0000
commit9d444b7e0aa2551bd5277cfb7499d8435434d0df (patch)
treeed1791b800e1dec369aebdec3e1c883c6f688694 /src/lib/libcrypto/evp/evp_pbe.c
parent8abe0e883a32bb48c2480317b8361bd671797757 (diff)
downloadopenbsd-9d444b7e0aa2551bd5277cfb7499d8435434d0df.tar.gz
openbsd-9d444b7e0aa2551bd5277cfb7499d8435434d0df.tar.bz2
openbsd-9d444b7e0aa2551bd5277cfb7499d8435434d0df.zip
KNF.
Diffstat (limited to 'src/lib/libcrypto/evp/evp_pbe.c')
-rw-r--r--src/lib/libcrypto/evp/evp_pbe.c203
1 files changed, 95 insertions, 108 deletions
diff --git a/src/lib/libcrypto/evp/evp_pbe.c b/src/lib/libcrypto/evp/evp_pbe.c
index 37683af76a..779c1592da 100644
--- a/src/lib/libcrypto/evp/evp_pbe.c
+++ b/src/lib/libcrypto/evp/evp_pbe.c
@@ -10,7 +10,7 @@
10 * are met: 10 * are met:
11 * 11 *
12 * 1. Redistributions of source code must retain the above copyright 12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer. 13 * notice, this list of conditions and the following disclaimer.
14 * 14 *
15 * 2. Redistributions in binary form must reproduce the above copyright 15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in 16 * notice, this list of conditions and the following disclaimer in
@@ -70,50 +70,36 @@ static STACK_OF(EVP_PBE_CTL) *pbe_algs;
70 70
71/* Setup a cipher context from a PBE algorithm */ 71/* Setup a cipher context from a PBE algorithm */
72 72
73typedef struct 73typedef struct {
74 {
75 int pbe_type; 74 int pbe_type;
76 int pbe_nid; 75 int pbe_nid;
77 int cipher_nid; 76 int cipher_nid;
78 int md_nid; 77 int md_nid;
79 EVP_PBE_KEYGEN *keygen; 78 EVP_PBE_KEYGEN *keygen;
80 } EVP_PBE_CTL; 79} EVP_PBE_CTL;
81 80
82static const EVP_PBE_CTL builtin_pbe[] = 81static const EVP_PBE_CTL builtin_pbe[] = {
83 { 82 {EVP_PBE_TYPE_OUTER, NID_pbeWithMD2AndDES_CBC, NID_des_cbc, NID_md2, PKCS5_PBE_keyivgen},
84 {EVP_PBE_TYPE_OUTER, NID_pbeWithMD2AndDES_CBC, 83 {EVP_PBE_TYPE_OUTER, NID_pbeWithMD5AndDES_CBC, NID_des_cbc, NID_md5, PKCS5_PBE_keyivgen},
85 NID_des_cbc, NID_md2, PKCS5_PBE_keyivgen}, 84 {EVP_PBE_TYPE_OUTER, NID_pbeWithSHA1AndRC2_CBC, NID_rc2_64_cbc, NID_sha1, PKCS5_PBE_keyivgen},
86 {EVP_PBE_TYPE_OUTER, NID_pbeWithMD5AndDES_CBC,
87 NID_des_cbc, NID_md5, PKCS5_PBE_keyivgen},
88 {EVP_PBE_TYPE_OUTER, NID_pbeWithSHA1AndRC2_CBC,
89 NID_rc2_64_cbc, NID_sha1, PKCS5_PBE_keyivgen},
90 85
91#ifndef OPENSSL_NO_HMAC 86#ifndef OPENSSL_NO_HMAC
92 {EVP_PBE_TYPE_OUTER, NID_id_pbkdf2, -1, -1, PKCS5_v2_PBKDF2_keyivgen}, 87 {EVP_PBE_TYPE_OUTER, NID_id_pbkdf2, -1, -1, PKCS5_v2_PBKDF2_keyivgen},
93#endif 88#endif
94 89
95 {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And128BitRC4, 90 {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And128BitRC4, NID_rc4, NID_sha1, PKCS12_PBE_keyivgen},
96 NID_rc4, NID_sha1, PKCS12_PBE_keyivgen}, 91 {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And40BitRC4, NID_rc4_40, NID_sha1, PKCS12_PBE_keyivgen},
97 {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And40BitRC4, 92 {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And3_Key_TripleDES_CBC, NID_des_ede3_cbc, NID_sha1, PKCS12_PBE_keyivgen},
98 NID_rc4_40, NID_sha1, PKCS12_PBE_keyivgen}, 93 {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And2_Key_TripleDES_CBC, NID_des_ede_cbc, NID_sha1, PKCS12_PBE_keyivgen},
99 {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And3_Key_TripleDES_CBC, 94 {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And128BitRC2_CBC, NID_rc2_cbc, NID_sha1, PKCS12_PBE_keyivgen},
100 NID_des_ede3_cbc, NID_sha1, PKCS12_PBE_keyivgen}, 95 {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And40BitRC2_CBC, NID_rc2_40_cbc, NID_sha1, PKCS12_PBE_keyivgen},
101 {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And2_Key_TripleDES_CBC,
102 NID_des_ede_cbc, NID_sha1, PKCS12_PBE_keyivgen},
103 {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And128BitRC2_CBC,
104 NID_rc2_cbc, NID_sha1, PKCS12_PBE_keyivgen},
105 {EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And40BitRC2_CBC,
106 NID_rc2_40_cbc, NID_sha1, PKCS12_PBE_keyivgen},
107 96
108#ifndef OPENSSL_NO_HMAC 97#ifndef OPENSSL_NO_HMAC
109 {EVP_PBE_TYPE_OUTER, NID_pbes2, -1, -1, PKCS5_v2_PBE_keyivgen}, 98 {EVP_PBE_TYPE_OUTER, NID_pbes2, -1, -1, PKCS5_v2_PBE_keyivgen},
110#endif 99#endif
111 {EVP_PBE_TYPE_OUTER, NID_pbeWithMD2AndRC2_CBC, 100 {EVP_PBE_TYPE_OUTER, NID_pbeWithMD2AndRC2_CBC, NID_rc2_64_cbc, NID_md2, PKCS5_PBE_keyivgen},
112 NID_rc2_64_cbc, NID_md2, PKCS5_PBE_keyivgen}, 101 {EVP_PBE_TYPE_OUTER, NID_pbeWithMD5AndRC2_CBC, NID_rc2_64_cbc, NID_md5, PKCS5_PBE_keyivgen},
113 {EVP_PBE_TYPE_OUTER, NID_pbeWithMD5AndRC2_CBC, 102 {EVP_PBE_TYPE_OUTER, NID_pbeWithSHA1AndDES_CBC, NID_des_cbc, NID_sha1, PKCS5_PBE_keyivgen},
114 NID_rc2_64_cbc, NID_md5, PKCS5_PBE_keyivgen},
115 {EVP_PBE_TYPE_OUTER, NID_pbeWithSHA1AndDES_CBC,
116 NID_des_cbc, NID_sha1, PKCS5_PBE_keyivgen},
117 103
118 104
119 {EVP_PBE_TYPE_PRF, NID_hmacWithSHA1, -1, NID_sha1, 0}, 105 {EVP_PBE_TYPE_PRF, NID_hmacWithSHA1, -1, NID_sha1, 0},
@@ -123,141 +109,141 @@ static const EVP_PBE_CTL builtin_pbe[] =
123 {EVP_PBE_TYPE_PRF, NID_hmacWithSHA384, -1, NID_sha384, 0}, 109 {EVP_PBE_TYPE_PRF, NID_hmacWithSHA384, -1, NID_sha384, 0},
124 {EVP_PBE_TYPE_PRF, NID_hmacWithSHA512, -1, NID_sha512, 0}, 110 {EVP_PBE_TYPE_PRF, NID_hmacWithSHA512, -1, NID_sha512, 0},
125 {EVP_PBE_TYPE_PRF, NID_id_HMACGostR3411_94, -1, NID_id_GostR3411_94, 0}, 111 {EVP_PBE_TYPE_PRF, NID_id_HMACGostR3411_94, -1, NID_id_GostR3411_94, 0},
126 }; 112};
127 113
128#ifdef TEST 114#ifdef TEST
129int main(int argc, char **argv) 115int
130 { 116main(int argc, char **argv)
117{
131 int i, nid_md, nid_cipher; 118 int i, nid_md, nid_cipher;
132 EVP_PBE_CTL *tpbe, *tpbe2; 119 EVP_PBE_CTL *tpbe, *tpbe2;
133 /*OpenSSL_add_all_algorithms();*/ 120 /*OpenSSL_add_all_algorithms();*/
134 121
135 for (i = 0; i < sizeof(builtin_pbe)/sizeof(EVP_PBE_CTL); i++) 122 for (i = 0; i < sizeof(builtin_pbe) / sizeof(EVP_PBE_CTL); i++) {
136 {
137 tpbe = builtin_pbe + i; 123 tpbe = builtin_pbe + i;
138 fprintf(stderr, "%d %d %s ", tpbe->pbe_type, tpbe->pbe_nid, 124 fprintf(stderr, "%d %d %s ", tpbe->pbe_type, tpbe->pbe_nid,
139 OBJ_nid2sn(tpbe->pbe_nid)); 125 OBJ_nid2sn(tpbe->pbe_nid));
140 if (EVP_PBE_find(tpbe->pbe_type, tpbe->pbe_nid, 126 if (EVP_PBE_find(tpbe->pbe_type, tpbe->pbe_nid,
141 &nid_cipher ,&nid_md,0)) 127 &nid_cipher , &nid_md, 0))
142 fprintf(stderr, "Found %s %s\n", 128 fprintf(stderr, "Found %s %s\n",
143 OBJ_nid2sn(nid_cipher), 129 OBJ_nid2sn(nid_cipher), OBJ_nid2sn(nid_md));
144 OBJ_nid2sn(nid_md));
145 else 130 else
146 fprintf(stderr, "Find ERROR!!\n"); 131 fprintf(stderr, "Find ERROR!!\n");
147 } 132 }
148 133
149 return 0; 134 return 0;
150 } 135}
151#endif 136#endif
152
153
154 137
155int EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen, 138int
156 ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de) 139EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen,
157 { 140 ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de)
141{
158 const EVP_CIPHER *cipher; 142 const EVP_CIPHER *cipher;
159 const EVP_MD *md; 143 const EVP_MD *md;
160 int cipher_nid, md_nid; 144 int cipher_nid, md_nid;
161 EVP_PBE_KEYGEN *keygen; 145 EVP_PBE_KEYGEN *keygen;
162 146
163 if (!EVP_PBE_find(EVP_PBE_TYPE_OUTER, OBJ_obj2nid(pbe_obj), 147 if (!EVP_PBE_find(EVP_PBE_TYPE_OUTER, OBJ_obj2nid(pbe_obj),
164 &cipher_nid, &md_nid, &keygen)) 148 &cipher_nid, &md_nid, &keygen)) {
165 {
166 char obj_tmp[80]; 149 char obj_tmp[80];
167 EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_UNKNOWN_PBE_ALGORITHM); 150 EVPerr(EVP_F_EVP_PBE_CIPHERINIT, EVP_R_UNKNOWN_PBE_ALGORITHM);
168 if (!pbe_obj) strlcpy (obj_tmp, "NULL", sizeof obj_tmp); 151 if (!pbe_obj)
169 else i2t_ASN1_OBJECT(obj_tmp, sizeof obj_tmp, pbe_obj); 152 strlcpy (obj_tmp, "NULL", sizeof obj_tmp);
153 else
154 i2t_ASN1_OBJECT(obj_tmp, sizeof obj_tmp, pbe_obj);
170 ERR_asprintf_error_data("TYPE=%s", obj_tmp); 155 ERR_asprintf_error_data("TYPE=%s", obj_tmp);
171 return 0; 156 return 0;
172 } 157 }
173 158
174 if(!pass) 159 if (!pass)
175 passlen = 0; 160 passlen = 0;
176 else if (passlen == -1) 161 else if (passlen == -1)
177 passlen = strlen(pass); 162 passlen = strlen(pass);
178 163
179 if (cipher_nid == -1) 164 if (cipher_nid == -1)
180 cipher = NULL; 165 cipher = NULL;
181 else 166 else {
182 {
183 cipher = EVP_get_cipherbynid(cipher_nid); 167 cipher = EVP_get_cipherbynid(cipher_nid);
184 if (!cipher) 168 if (!cipher) {
185 { 169 EVPerr(EVP_F_EVP_PBE_CIPHERINIT, EVP_R_UNKNOWN_CIPHER);
186 EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_UNKNOWN_CIPHER);
187 return 0; 170 return 0;
188 }
189 } 171 }
172 }
190 173
191 if (md_nid == -1) 174 if (md_nid == -1)
192 md = NULL; 175 md = NULL;
193 else 176 else {
194 {
195 md = EVP_get_digestbynid(md_nid); 177 md = EVP_get_digestbynid(md_nid);
196 if (!md) 178 if (!md) {
197 { 179 EVPerr(EVP_F_EVP_PBE_CIPHERINIT, EVP_R_UNKNOWN_DIGEST);
198 EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_UNKNOWN_DIGEST);
199 return 0; 180 return 0;
200 }
201 } 181 }
182 }
202 183
203 if (!keygen(ctx, pass, passlen, param, cipher, md, en_de)) 184 if (!keygen(ctx, pass, passlen, param, cipher, md, en_de)) {
204 { 185 EVPerr(EVP_F_EVP_PBE_CIPHERINIT, EVP_R_KEYGEN_FAILURE);
205 EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_KEYGEN_FAILURE);
206 return 0; 186 return 0;
207 } 187 }
208 return 1; 188 return 1;
209} 189}
210 190
211DECLARE_OBJ_BSEARCH_CMP_FN(EVP_PBE_CTL, EVP_PBE_CTL, pbe2); 191DECLARE_OBJ_BSEARCH_CMP_FN(EVP_PBE_CTL, EVP_PBE_CTL, pbe2);
212 192
213static int pbe2_cmp(const EVP_PBE_CTL *pbe1, const EVP_PBE_CTL *pbe2) 193static int
214 { 194pbe2_cmp(const EVP_PBE_CTL *pbe1, const EVP_PBE_CTL *pbe2)
195{
215 int ret = pbe1->pbe_type - pbe2->pbe_type; 196 int ret = pbe1->pbe_type - pbe2->pbe_type;
197
216 if (ret) 198 if (ret)
217 return ret; 199 return ret;
218 else 200 else
219 return pbe1->pbe_nid - pbe2->pbe_nid; 201 return pbe1->pbe_nid - pbe2->pbe_nid;
220 } 202}
221 203
222IMPLEMENT_OBJ_BSEARCH_CMP_FN(EVP_PBE_CTL, EVP_PBE_CTL, pbe2); 204IMPLEMENT_OBJ_BSEARCH_CMP_FN(EVP_PBE_CTL, EVP_PBE_CTL, pbe2);
223 205
224static int pbe_cmp(const EVP_PBE_CTL * const *a, const EVP_PBE_CTL * const *b) 206static int
225 { 207pbe_cmp(const EVP_PBE_CTL * const *a, const EVP_PBE_CTL * const *b)
208{
226 int ret = (*a)->pbe_type - (*b)->pbe_type; 209 int ret = (*a)->pbe_type - (*b)->pbe_type;
210
227 if (ret) 211 if (ret)
228 return ret; 212 return ret;
229 else 213 else
230 return (*a)->pbe_nid - (*b)->pbe_nid; 214 return (*a)->pbe_nid - (*b)->pbe_nid;
231 } 215}
232 216
233/* Add a PBE algorithm */ 217/* Add a PBE algorithm */
234 218
235int EVP_PBE_alg_add_type(int pbe_type, int pbe_nid, int cipher_nid, int md_nid, 219int
236 EVP_PBE_KEYGEN *keygen) 220EVP_PBE_alg_add_type(int pbe_type, int pbe_nid, int cipher_nid, int md_nid,
237 { 221 EVP_PBE_KEYGEN *keygen)
222{
238 EVP_PBE_CTL *pbe_tmp; 223 EVP_PBE_CTL *pbe_tmp;
224
239 if (!pbe_algs) 225 if (!pbe_algs)
240 pbe_algs = sk_EVP_PBE_CTL_new(pbe_cmp); 226 pbe_algs = sk_EVP_PBE_CTL_new(pbe_cmp);
241 if (!(pbe_tmp = (EVP_PBE_CTL*) malloc (sizeof(EVP_PBE_CTL)))) 227 if (!(pbe_tmp = (EVP_PBE_CTL*) malloc (sizeof(EVP_PBE_CTL)))) {
242 { 228 EVPerr(EVP_F_EVP_PBE_ALG_ADD_TYPE, ERR_R_MALLOC_FAILURE);
243 EVPerr(EVP_F_EVP_PBE_ALG_ADD_TYPE,ERR_R_MALLOC_FAILURE);
244 return 0; 229 return 0;
245 } 230 }
246 pbe_tmp->pbe_type = pbe_type; 231 pbe_tmp->pbe_type = pbe_type;
247 pbe_tmp->pbe_nid = pbe_nid; 232 pbe_tmp->pbe_nid = pbe_nid;
248 pbe_tmp->cipher_nid = cipher_nid; 233 pbe_tmp->cipher_nid = cipher_nid;
249 pbe_tmp->md_nid = md_nid; 234 pbe_tmp->md_nid = md_nid;
250 pbe_tmp->keygen = keygen; 235 pbe_tmp->keygen = keygen;
251 236
252
253 sk_EVP_PBE_CTL_push (pbe_algs, pbe_tmp); 237 sk_EVP_PBE_CTL_push (pbe_algs, pbe_tmp);
254 return 1; 238 return 1;
255 } 239}
256 240
257int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md, 241int
258 EVP_PBE_KEYGEN *keygen) 242EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md,
259 { 243 EVP_PBE_KEYGEN *keygen)
244{
260 int cipher_nid, md_nid; 245 int cipher_nid, md_nid;
246
261 if (cipher) 247 if (cipher)
262 cipher_nid = EVP_CIPHER_type(cipher); 248 cipher_nid = EVP_CIPHER_type(cipher);
263 else 249 else
@@ -268,12 +254,13 @@ int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md,
268 md_nid = -1; 254 md_nid = -1;
269 255
270 return EVP_PBE_alg_add_type(EVP_PBE_TYPE_OUTER, nid, 256 return EVP_PBE_alg_add_type(EVP_PBE_TYPE_OUTER, nid,
271 cipher_nid, md_nid, keygen); 257 cipher_nid, md_nid, keygen);
272 } 258}
273 259
274int EVP_PBE_find(int type, int pbe_nid, 260int
275 int *pcnid, int *pmnid, EVP_PBE_KEYGEN **pkeygen) 261EVP_PBE_find(int type, int pbe_nid,
276 { 262 int *pcnid, int *pmnid, EVP_PBE_KEYGEN **pkeygen)
263{
277 EVP_PBE_CTL *pbetmp = NULL, pbelu; 264 EVP_PBE_CTL *pbetmp = NULL, pbelu;
278 int i; 265 int i;
279 if (pbe_nid == NID_undef) 266 if (pbe_nid == NID_undef)
@@ -282,17 +269,15 @@ int EVP_PBE_find(int type, int pbe_nid,
282 pbelu.pbe_type = type; 269 pbelu.pbe_type = type;
283 pbelu.pbe_nid = pbe_nid; 270 pbelu.pbe_nid = pbe_nid;
284 271
285 if (pbe_algs) 272 if (pbe_algs) {
286 {
287 i = sk_EVP_PBE_CTL_find(pbe_algs, &pbelu); 273 i = sk_EVP_PBE_CTL_find(pbe_algs, &pbelu);
288 if (i != -1) 274 if (i != -1)
289 pbetmp = sk_EVP_PBE_CTL_value (pbe_algs, i); 275 pbetmp = sk_EVP_PBE_CTL_value (pbe_algs, i);
290 } 276 }
291 if (pbetmp == NULL) 277 if (pbetmp == NULL) {
292 {
293 pbetmp = OBJ_bsearch_pbe2(&pbelu, builtin_pbe, 278 pbetmp = OBJ_bsearch_pbe2(&pbelu, builtin_pbe,
294 sizeof(builtin_pbe)/sizeof(EVP_PBE_CTL)); 279 sizeof(builtin_pbe)/sizeof(EVP_PBE_CTL));
295 } 280 }
296 if (pbetmp == NULL) 281 if (pbetmp == NULL)
297 return 0; 282 return 0;
298 if (pcnid) 283 if (pcnid)
@@ -302,15 +287,17 @@ int EVP_PBE_find(int type, int pbe_nid,
302 if (pkeygen) 287 if (pkeygen)
303 *pkeygen = pbetmp->keygen; 288 *pkeygen = pbetmp->keygen;
304 return 1; 289 return 1;
305 } 290}
306 291
307static void free_evp_pbe_ctl(EVP_PBE_CTL *pbe) 292static void
308 { 293free_evp_pbe_ctl(EVP_PBE_CTL *pbe)
309 free(pbe); 294{
310 } 295 free(pbe);
296}
311 297
312void EVP_PBE_cleanup(void) 298void
313 { 299EVP_PBE_cleanup(void)
300{
314 sk_EVP_PBE_CTL_pop_free(pbe_algs, free_evp_pbe_ctl); 301 sk_EVP_PBE_CTL_pop_free(pbe_algs, free_evp_pbe_ctl);
315 pbe_algs = NULL; 302 pbe_algs = NULL;
316 } 303}