summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/x509/x509_vpm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/x509/x509_vpm.c')
-rw-r--r--src/lib/libcrypto/x509/x509_vpm.c171
1 files changed, 96 insertions, 75 deletions
diff --git a/src/lib/libcrypto/x509/x509_vpm.c b/src/lib/libcrypto/x509/x509_vpm.c
index 7f0824f75e..f0d2a0902e 100644
--- a/src/lib/libcrypto/x509/x509_vpm.c
+++ b/src/lib/libcrypto/x509/x509_vpm.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
@@ -67,7 +67,8 @@
67 67
68/* X509_VERIFY_PARAM functions */ 68/* X509_VERIFY_PARAM functions */
69 69
70static void x509_verify_param_zero(X509_VERIFY_PARAM *param) 70static void
71x509_verify_param_zero(X509_VERIFY_PARAM *param)
71{ 72{
72 if (!param) 73 if (!param)
73 return; 74 return;
@@ -84,16 +85,19 @@ static void x509_verify_param_zero(X509_VERIFY_PARAM *param)
84 } 85 }
85} 86}
86 87
87X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void) 88X509_VERIFY_PARAM *
89X509_VERIFY_PARAM_new(void)
88{ 90{
89 X509_VERIFY_PARAM *param; 91 X509_VERIFY_PARAM *param;
92
90 param = malloc(sizeof(X509_VERIFY_PARAM)); 93 param = malloc(sizeof(X509_VERIFY_PARAM));
91 memset(param, 0, sizeof(X509_VERIFY_PARAM)); 94 memset(param, 0, sizeof(X509_VERIFY_PARAM));
92 x509_verify_param_zero(param); 95 x509_verify_param_zero(param);
93 return param; 96 return param;
94} 97}
95 98
96void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param) 99void
100X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param)
97{ 101{
98 x509_verify_param_zero(param); 102 x509_verify_param_zero(param);
99 free(param); 103 free(param);
@@ -109,7 +113,7 @@ void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param)
109 * for SSL servers or clients but only if the application has not set new 113 * for SSL servers or clients but only if the application has not set new
110 * ones. 114 * ones.
111 * 115 *
112 * The "inh_flags" field determines how this function behaves. 116 * The "inh_flags" field determines how this function behaves.
113 * 117 *
114 * Normally any values which are set in the default are not copied from the 118 * Normally any values which are set in the default are not copied from the
115 * destination and verify flags are ORed together. 119 * destination and verify flags are ORed together.
@@ -141,13 +145,14 @@ void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param)
141#define x509_verify_param_copy(field, def) \ 145#define x509_verify_param_copy(field, def) \
142 if (test_x509_verify_param_copy(field, def)) \ 146 if (test_x509_verify_param_copy(field, def)) \
143 dest->field = src->field 147 dest->field = src->field
144
145 148
146int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *dest, 149
147 const X509_VERIFY_PARAM *src) 150int
151X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *dest, const X509_VERIFY_PARAM *src)
148{ 152{
149 unsigned long inh_flags; 153 unsigned long inh_flags;
150 int to_default, to_overwrite; 154 int to_default, to_overwrite;
155
151 if (!src) 156 if (!src)
152 return 1; 157 return 1;
153 inh_flags = dest->inh_flags | src->inh_flags; 158 inh_flags = dest->inh_flags | src->inh_flags;
@@ -193,18 +198,20 @@ int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *dest,
193 return 1; 198 return 1;
194} 199}
195 200
196int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, 201int
197 const X509_VERIFY_PARAM *from) 202X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, const X509_VERIFY_PARAM *from)
198{ 203{
199 unsigned long save_flags = to->inh_flags; 204 unsigned long save_flags = to->inh_flags;
200 int ret; 205 int ret;
206
201 to->inh_flags |= X509_VP_FLAG_DEFAULT; 207 to->inh_flags |= X509_VP_FLAG_DEFAULT;
202 ret = X509_VERIFY_PARAM_inherit(to, from); 208 ret = X509_VERIFY_PARAM_inherit(to, from);
203 to->inh_flags = save_flags; 209 to->inh_flags = save_flags;
204 return ret; 210 return ret;
205} 211}
206 212
207int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name) 213int
214X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name)
208{ 215{
209 if (param->name) 216 if (param->name)
210 free(param->name); 217 free(param->name);
@@ -214,7 +221,8 @@ int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name)
214 return 0; 221 return 0;
215} 222}
216 223
217int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, unsigned long flags) 224int
225X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, unsigned long flags)
218{ 226{
219 param->flags |= flags; 227 param->flags |= flags;
220 if (flags & X509_V_FLAG_POLICY_MASK) 228 if (flags & X509_V_FLAG_POLICY_MASK)
@@ -222,39 +230,46 @@ int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, unsigned long flags)
222 return 1; 230 return 1;
223} 231}
224 232
225int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param, unsigned long flags) 233int
234X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param, unsigned long flags)
226{ 235{
227 param->flags &= ~flags; 236 param->flags &= ~flags;
228 return 1; 237 return 1;
229} 238}
230 239
231unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *param) 240unsigned long
241X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *param)
232{ 242{
233 return param->flags; 243 return param->flags;
234} 244}
235 245
236int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose) 246int
247X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose)
237{ 248{
238 return X509_PURPOSE_set(&param->purpose, purpose); 249 return X509_PURPOSE_set(&param->purpose, purpose);
239} 250}
240 251
241int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust) 252int
253X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust)
242{ 254{
243 return X509_TRUST_set(&param->trust, trust); 255 return X509_TRUST_set(&param->trust, trust);
244} 256}
245 257
246void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth) 258void
259X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth)
247{ 260{
248 param->depth = depth; 261 param->depth = depth;
249} 262}
250 263
251void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t) 264void
265X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t)
252{ 266{
253 param->check_time = t; 267 param->check_time = t;
254 param->flags |= X509_V_FLAG_USE_CHECK_TIME; 268 param->flags |= X509_V_FLAG_USE_CHECK_TIME;
255} 269}
256 270
257int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, ASN1_OBJECT *policy) 271int
272X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, ASN1_OBJECT *policy)
258{ 273{
259 if (!param->policies) { 274 if (!param->policies) {
260 param->policies = sk_ASN1_OBJECT_new_null(); 275 param->policies = sk_ASN1_OBJECT_new_null();
@@ -266,11 +281,13 @@ int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, ASN1_OBJECT *policy)
266 return 1; 281 return 1;
267} 282}
268 283
269int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, 284int
270 STACK_OF(ASN1_OBJECT) *policies) 285X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param,
286 STACK_OF(ASN1_OBJECT) *policies)
271{ 287{
272 int i; 288 int i;
273 ASN1_OBJECT *oid, *doid; 289 ASN1_OBJECT *oid, *doid;
290
274 if (!param) 291 if (!param)
275 return 0; 292 return 0;
276 if (param->policies) 293 if (param->policies)
@@ -299,7 +316,8 @@ int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param,
299 return 1; 316 return 1;
300} 317}
301 318
302int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param) 319int
320X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param)
303{ 321{
304 return param->depth; 322 return param->depth;
305} 323}
@@ -312,80 +330,81 @@ int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param)
312 330
313static const X509_VERIFY_PARAM default_table[] = { 331static const X509_VERIFY_PARAM default_table[] = {
314 { 332 {
315 "default", /* X509 default parameters */ 333 "default", /* X509 default parameters */
316 0, /* Check time */ 334 0, /* Check time */
317 0, /* internal flags */ 335 0, /* internal flags */
318 0, /* flags */ 336 0, /* flags */
319 0, /* purpose */ 337 0, /* purpose */
320 0, /* trust */ 338 0, /* trust */
321 100, /* depth */ 339 100, /* depth */
322 NULL /* policies */ 340 NULL /* policies */
323 }, 341 },
324 { 342 {
325 "pkcs7", /* S/MIME sign parameters */ 343 "pkcs7", /* S/MIME sign parameters */
326 0, /* Check time */ 344 0, /* Check time */
327 0, /* internal flags */ 345 0, /* internal flags */
328 0, /* flags */ 346 0, /* flags */
329 X509_PURPOSE_SMIME_SIGN, /* purpose */ 347 X509_PURPOSE_SMIME_SIGN, /* purpose */
330 X509_TRUST_EMAIL, /* trust */ 348 X509_TRUST_EMAIL, /* trust */
331 -1, /* depth */ 349 -1, /* depth */
332 NULL /* policies */ 350 NULL /* policies */
333 }, 351 },
334 { 352 {
335 "smime_sign", /* S/MIME sign parameters */ 353 "smime_sign", /* S/MIME sign parameters */
336 0, /* Check time */ 354 0, /* Check time */
337 0, /* internal flags */ 355 0, /* internal flags */
338 0, /* flags */ 356 0, /* flags */
339 X509_PURPOSE_SMIME_SIGN, /* purpose */ 357 X509_PURPOSE_SMIME_SIGN, /* purpose */
340 X509_TRUST_EMAIL, /* trust */ 358 X509_TRUST_EMAIL, /* trust */
341 -1, /* depth */ 359 -1, /* depth */
342 NULL /* policies */ 360 NULL /* policies */
343 }, 361 },
344 { 362 {
345 "ssl_client", /* SSL/TLS client parameters */ 363 "ssl_client", /* SSL/TLS client parameters */
346 0, /* Check time */ 364 0, /* Check time */
347 0, /* internal flags */ 365 0, /* internal flags */
348 0, /* flags */ 366 0, /* flags */
349 X509_PURPOSE_SSL_CLIENT, /* purpose */ 367 X509_PURPOSE_SSL_CLIENT, /* purpose */
350 X509_TRUST_SSL_CLIENT, /* trust */ 368 X509_TRUST_SSL_CLIENT, /* trust */
351 -1, /* depth */ 369 -1, /* depth */
352 NULL /* policies */ 370 NULL /* policies */
353 }, 371 },
354 { 372 {
355 "ssl_server", /* SSL/TLS server parameters */ 373 "ssl_server", /* SSL/TLS server parameters */
356 0, /* Check time */ 374 0, /* Check time */
357 0, /* internal flags */ 375 0, /* internal flags */
358 0, /* flags */ 376 0, /* flags */
359 X509_PURPOSE_SSL_SERVER, /* purpose */ 377 X509_PURPOSE_SSL_SERVER, /* purpose */
360 X509_TRUST_SSL_SERVER, /* trust */ 378 X509_TRUST_SSL_SERVER, /* trust */
361 -1, /* depth */ 379 -1, /* depth */
362 NULL /* policies */ 380 NULL /* policies */
363 } 381 }
364}; 382};
365 383
366static STACK_OF(X509_VERIFY_PARAM) *param_table = NULL; 384static STACK_OF(X509_VERIFY_PARAM) *param_table = NULL;
367 385
368static int table_cmp(const X509_VERIFY_PARAM *a, const X509_VERIFY_PARAM *b) 386static int
369 387table_cmp(const X509_VERIFY_PARAM *a, const X509_VERIFY_PARAM *b)
370{ 388{
371 return strcmp(a->name, b->name); 389 return strcmp(a->name, b->name);
372} 390}
373 391
374DECLARE_OBJ_BSEARCH_CMP_FN(X509_VERIFY_PARAM, X509_VERIFY_PARAM, 392DECLARE_OBJ_BSEARCH_CMP_FN(X509_VERIFY_PARAM, X509_VERIFY_PARAM, table);
375 table); 393IMPLEMENT_OBJ_BSEARCH_CMP_FN(X509_VERIFY_PARAM, X509_VERIFY_PARAM, table);
376IMPLEMENT_OBJ_BSEARCH_CMP_FN(X509_VERIFY_PARAM, X509_VERIFY_PARAM,
377 table);
378 394
379static int param_cmp(const X509_VERIFY_PARAM * const *a, 395static int
380 const X509_VERIFY_PARAM * const *b) 396param_cmp(const X509_VERIFY_PARAM * const *a,
397 const X509_VERIFY_PARAM * const *b)
381{ 398{
382 return strcmp((*a)->name, (*b)->name); 399 return strcmp((*a)->name, (*b)->name);
383} 400}
384 401
385int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param) 402int
403X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param)
386{ 404{
387 int idx; 405 int idx;
388 X509_VERIFY_PARAM *ptmp; 406 X509_VERIFY_PARAM *ptmp;
407
389 if (!param_table) { 408 if (!param_table) {
390 param_table = sk_X509_VERIFY_PARAM_new(param_cmp); 409 param_table = sk_X509_VERIFY_PARAM_new(param_cmp);
391 if (!param_table) 410 if (!param_table)
@@ -403,7 +422,8 @@ int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param)
403 return 1; 422 return 1;
404} 423}
405 424
406const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name) 425const X509_VERIFY_PARAM *
426X509_VERIFY_PARAM_lookup(const char *name)
407{ 427{
408 int idx; 428 int idx;
409 X509_VERIFY_PARAM pm; 429 X509_VERIFY_PARAM pm;
@@ -415,13 +435,14 @@ const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name)
415 return sk_X509_VERIFY_PARAM_value(param_table, idx); 435 return sk_X509_VERIFY_PARAM_value(param_table, idx);
416 } 436 }
417 return OBJ_bsearch_table(&pm, default_table, 437 return OBJ_bsearch_table(&pm, default_table,
418 sizeof(default_table)/sizeof(X509_VERIFY_PARAM)); 438 sizeof(default_table)/sizeof(X509_VERIFY_PARAM));
419} 439}
420 440
421void X509_VERIFY_PARAM_table_cleanup(void) 441void
442X509_VERIFY_PARAM_table_cleanup(void)
422{ 443{
423 if (param_table) 444 if (param_table)
424 sk_X509_VERIFY_PARAM_pop_free(param_table, 445 sk_X509_VERIFY_PARAM_pop_free(param_table,
425 X509_VERIFY_PARAM_free); 446 X509_VERIFY_PARAM_free);
426 param_table = NULL; 447 param_table = NULL;
427} 448}