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.c132
1 files changed, 50 insertions, 82 deletions
diff --git a/src/lib/libcrypto/x509/x509_vpm.c b/src/lib/libcrypto/x509/x509_vpm.c
index 5c8c09e9fc..4ba697ead4 100644
--- a/src/lib/libcrypto/x509/x509_vpm.c
+++ b/src/lib/libcrypto/x509/x509_vpm.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: x509_vpm.c,v 1.39 2023/05/24 09:15:14 tb Exp $ */ 1/* $OpenBSD: x509_vpm.c,v 1.40 2023/05/28 05:25:24 tb Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 2004. 3 * project 2004.
4 */ 4 */
@@ -122,7 +122,7 @@ sk_deep_copy(void *sk_void, void *copy_func_void, void *free_func_void)
122} 122}
123 123
124static int 124static int
125x509_param_set_hosts_internal(X509_VERIFY_PARAM_ID *id, int mode, 125x509_param_set_hosts_internal(X509_VERIFY_PARAM *vpm, int mode,
126 const char *name, size_t namelen) 126 const char *name, size_t namelen)
127{ 127{
128 char *copy; 128 char *copy;
@@ -135,9 +135,9 @@ x509_param_set_hosts_internal(X509_VERIFY_PARAM_ID *id, int mode,
135 if (name && memchr(name, '\0', namelen)) 135 if (name && memchr(name, '\0', namelen))
136 return 0; 136 return 0;
137 137
138 if (mode == SET_HOST && id->hosts) { 138 if (mode == SET_HOST && vpm->hosts) {
139 sk_OPENSSL_STRING_pop_free(id->hosts, str_free); 139 sk_OPENSSL_STRING_pop_free(vpm->hosts, str_free);
140 id->hosts = NULL; 140 vpm->hosts = NULL;
141 } 141 }
142 if (name == NULL || namelen == 0) 142 if (name == NULL || namelen == 0)
143 return 1; 143 return 1;
@@ -145,17 +145,17 @@ x509_param_set_hosts_internal(X509_VERIFY_PARAM_ID *id, int mode,
145 if (copy == NULL) 145 if (copy == NULL)
146 return 0; 146 return 0;
147 147
148 if (id->hosts == NULL && 148 if (vpm->hosts == NULL &&
149 (id->hosts = sk_OPENSSL_STRING_new_null()) == NULL) { 149 (vpm->hosts = sk_OPENSSL_STRING_new_null()) == NULL) {
150 free(copy); 150 free(copy);
151 return 0; 151 return 0;
152 } 152 }
153 153
154 if (!sk_OPENSSL_STRING_push(id->hosts, copy)) { 154 if (!sk_OPENSSL_STRING_push(vpm->hosts, copy)) {
155 free(copy); 155 free(copy);
156 if (sk_OPENSSL_STRING_num(id->hosts) == 0) { 156 if (sk_OPENSSL_STRING_num(vpm->hosts) == 0) {
157 sk_OPENSSL_STRING_free(id->hosts); 157 sk_OPENSSL_STRING_free(vpm->hosts);
158 id->hosts = NULL; 158 vpm->hosts = NULL;
159 } 159 }
160 return 0; 160 return 0;
161 } 161 }
@@ -166,9 +166,9 @@ x509_param_set_hosts_internal(X509_VERIFY_PARAM_ID *id, int mode,
166static void 166static void
167x509_verify_param_zero(X509_VERIFY_PARAM *param) 167x509_verify_param_zero(X509_VERIFY_PARAM *param)
168{ 168{
169 X509_VERIFY_PARAM_ID *paramid;
170 if (!param) 169 if (!param)
171 return; 170 return;
171
172 free(param->name); 172 free(param->name);
173 param->name = NULL; 173 param->name = NULL;
174 param->purpose = 0; 174 param->purpose = 0;
@@ -177,40 +177,29 @@ x509_verify_param_zero(X509_VERIFY_PARAM *param)
177 param->inh_flags = 0; 177 param->inh_flags = 0;
178 param->flags = 0; 178 param->flags = 0;
179 param->depth = -1; 179 param->depth = -1;
180 if (param->policies) { 180 sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free);
181 sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free); 181 param->policies = NULL;
182 param->policies = NULL; 182 sk_OPENSSL_STRING_pop_free(param->hosts, str_free);
183 } 183 param->hosts = NULL;
184 paramid = param->id; 184 free(param->peername);
185 if (paramid->hosts) { 185 param->peername = NULL;
186 sk_OPENSSL_STRING_pop_free(paramid->hosts, str_free); 186 free(param->email);
187 paramid->hosts = NULL; 187 param->email = NULL;
188 } 188 param->emaillen = 0;
189 free(paramid->peername); 189 free(param->ip);
190 paramid->peername = NULL; 190 param->ip = NULL;
191 free(paramid->email); 191 param->iplen = 0;
192 paramid->email = NULL; 192 param->poisoned = 0;
193 paramid->emaillen = 0;
194 free(paramid->ip);
195 paramid->ip = NULL;
196 paramid->iplen = 0;
197 paramid->poisoned = 0;
198} 193}
199 194
200X509_VERIFY_PARAM * 195X509_VERIFY_PARAM *
201X509_VERIFY_PARAM_new(void) 196X509_VERIFY_PARAM_new(void)
202{ 197{
203 X509_VERIFY_PARAM *param; 198 X509_VERIFY_PARAM *param;
204 X509_VERIFY_PARAM_ID *paramid; 199
205 param = calloc(1, sizeof(X509_VERIFY_PARAM)); 200 param = calloc(1, sizeof(X509_VERIFY_PARAM));
206 if (param == NULL) 201 if (param == NULL)
207 return NULL; 202 return NULL;
208 paramid = calloc(1, sizeof(X509_VERIFY_PARAM_ID));
209 if (paramid == NULL) {
210 free(param);
211 return NULL;
212 }
213 param->id = paramid;
214 x509_verify_param_zero(param); 203 x509_verify_param_zero(param);
215 return param; 204 return param;
216} 205}
@@ -222,7 +211,6 @@ X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param)
222 if (param == NULL) 211 if (param == NULL)
223 return; 212 return;
224 x509_verify_param_zero(param); 213 x509_verify_param_zero(param);
225 free(param->id);
226 free(param); 214 free(param);
227} 215}
228LCRYPTO_ALIAS(X509_VERIFY_PARAM_free); 216LCRYPTO_ALIAS(X509_VERIFY_PARAM_free);
@@ -260,18 +248,11 @@ LCRYPTO_ALIAS(X509_VERIFY_PARAM_free);
260 */ 248 */
261 249
262/* Macro to test if a field should be copied from src to dest */ 250/* Macro to test if a field should be copied from src to dest */
263
264#define test_x509_verify_param_copy(field, def) \ 251#define test_x509_verify_param_copy(field, def) \
265 (to_overwrite || \ 252 (to_overwrite || \
266 ((src->field != def) && (to_default || (dest->field == def)))) 253 ((src->field != def) && (to_default || (dest->field == def))))
267 254
268/* As above but for ID fields */
269
270#define test_x509_verify_param_copy_id(idf, def) \
271 test_x509_verify_param_copy(id->idf, def)
272
273/* Macro to test and copy a field if necessary */ 255/* Macro to test and copy a field if necessary */
274
275#define x509_verify_param_copy(field, def) \ 256#define x509_verify_param_copy(field, def) \
276 if (test_x509_verify_param_copy(field, def)) \ 257 if (test_x509_verify_param_copy(field, def)) \
277 dest->field = src->field 258 dest->field = src->field
@@ -281,11 +262,9 @@ X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *dest, const X509_VERIFY_PARAM *src)
281{ 262{
282 unsigned long inh_flags; 263 unsigned long inh_flags;
283 int to_default, to_overwrite; 264 int to_default, to_overwrite;
284 X509_VERIFY_PARAM_ID *id;
285 265
286 if (!src) 266 if (!src)
287 return 1; 267 return 1;
288 id = src->id;
289 inh_flags = dest->inh_flags | src->inh_flags; 268 inh_flags = dest->inh_flags | src->inh_flags;
290 269
291 if (inh_flags & X509_VP_FLAG_ONCE) 270 if (inh_flags & X509_VP_FLAG_ONCE)
@@ -326,30 +305,28 @@ X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *dest, const X509_VERIFY_PARAM *src)
326 return 0; 305 return 0;
327 } 306 }
328 307
329 if (test_x509_verify_param_copy_id(hostflags, 0)) 308 x509_verify_param_copy(hostflags, 0);
330 dest->id->hostflags = id->hostflags;
331 309
332 if (test_x509_verify_param_copy_id(hosts, NULL)) { 310 if (test_x509_verify_param_copy(hosts, NULL)) {
333 if (dest->id->hosts) { 311 if (dest->hosts) {
334 sk_OPENSSL_STRING_pop_free(dest->id->hosts, str_free); 312 sk_OPENSSL_STRING_pop_free(dest->hosts, str_free);
335 dest->id->hosts = NULL; 313 dest->hosts = NULL;
336 } 314 }
337 if (id->hosts) { 315 if (src->hosts) {
338 dest->id->hosts = 316 dest->hosts = sk_deep_copy(src->hosts, strdup, str_free);
339 sk_deep_copy(id->hosts, strdup, str_free); 317 if (dest->hosts == NULL)
340 if (dest->id->hosts == NULL)
341 return 0; 318 return 0;
342 } 319 }
343 } 320 }
344 321
345 if (test_x509_verify_param_copy_id(email, NULL)) { 322 if (test_x509_verify_param_copy(email, NULL)) {
346 if (!X509_VERIFY_PARAM_set1_email(dest, id->email, 323 if (!X509_VERIFY_PARAM_set1_email(dest, src->email,
347 id->emaillen)) 324 src->emaillen))
348 return 0; 325 return 0;
349 } 326 }
350 327
351 if (test_x509_verify_param_copy_id(ip, NULL)) { 328 if (test_x509_verify_param_copy(ip, NULL)) {
352 if (!X509_VERIFY_PARAM_set1_ip(dest, id->ip, id->iplen)) 329 if (!X509_VERIFY_PARAM_set1_ip(dest, src->ip, src->iplen))
353 return 0; 330 return 0;
354 } 331 }
355 332
@@ -534,9 +511,9 @@ int
534X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, 511X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param,
535 const char *name, size_t namelen) 512 const char *name, size_t namelen)
536{ 513{
537 if (x509_param_set_hosts_internal(param->id, SET_HOST, name, namelen)) 514 if (x509_param_set_hosts_internal(param, SET_HOST, name, namelen))
538 return 1; 515 return 1;
539 param->id->poisoned = 1; 516 param->poisoned = 1;
540 return 0; 517 return 0;
541} 518}
542LCRYPTO_ALIAS(X509_VERIFY_PARAM_set1_host); 519LCRYPTO_ALIAS(X509_VERIFY_PARAM_set1_host);
@@ -545,9 +522,9 @@ int
545X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, 522X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param,
546 const char *name, size_t namelen) 523 const char *name, size_t namelen)
547{ 524{
548 if (x509_param_set_hosts_internal(param->id, ADD_HOST, name, namelen)) 525 if (x509_param_set_hosts_internal(param, ADD_HOST, name, namelen))
549 return 1; 526 return 1;
550 param->id->poisoned = 1; 527 param->poisoned = 1;
551 return 0; 528 return 0;
552} 529}
553LCRYPTO_ALIAS(X509_VERIFY_PARAM_add1_host); 530LCRYPTO_ALIAS(X509_VERIFY_PARAM_add1_host);
@@ -556,20 +533,20 @@ LCRYPTO_ALIAS(X509_VERIFY_PARAM_add1_host);
556unsigned int 533unsigned int
557X509_VERIFY_PARAM_get_hostflags(X509_VERIFY_PARAM *param) 534X509_VERIFY_PARAM_get_hostflags(X509_VERIFY_PARAM *param)
558{ 535{
559 return param->id->hostflags; 536 return param->hostflags;
560} 537}
561 538
562void 539void
563X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param, unsigned int flags) 540X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param, unsigned int flags)
564{ 541{
565 param->id->hostflags = flags; 542 param->hostflags = flags;
566} 543}
567LCRYPTO_ALIAS(X509_VERIFY_PARAM_set_hostflags); 544LCRYPTO_ALIAS(X509_VERIFY_PARAM_set_hostflags);
568 545
569char * 546char *
570X509_VERIFY_PARAM_get0_peername(X509_VERIFY_PARAM *param) 547X509_VERIFY_PARAM_get0_peername(X509_VERIFY_PARAM *param)
571{ 548{
572 return param->id->peername; 549 return param->peername;
573} 550}
574LCRYPTO_ALIAS(X509_VERIFY_PARAM_get0_peername); 551LCRYPTO_ALIAS(X509_VERIFY_PARAM_get0_peername);
575 552
@@ -577,10 +554,10 @@ int
577X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, const char *email, 554X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, const char *email,
578 size_t emaillen) 555 size_t emaillen)
579{ 556{
580 if (x509_param_set1_internal(&param->id->email, &param->id->emaillen, 557 if (x509_param_set1_internal(&param->email, &param->emaillen,
581 email, emaillen, 1)) 558 email, emaillen, 1))
582 return 1; 559 return 1;
583 param->id->poisoned = 1; 560 param->poisoned = 1;
584 return 0; 561 return 0;
585} 562}
586LCRYPTO_ALIAS(X509_VERIFY_PARAM_set1_email); 563LCRYPTO_ALIAS(X509_VERIFY_PARAM_set1_email);
@@ -591,11 +568,11 @@ X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, const unsigned char *ip,
591{ 568{
592 if (iplen != 4 && iplen != 16) 569 if (iplen != 4 && iplen != 16)
593 goto err; 570 goto err;
594 if (x509_param_set1_internal((char **)&param->id->ip, &param->id->iplen, 571 if (x509_param_set1_internal((char **)&param->ip, &param->iplen,
595 (char *)ip, iplen, 0)) 572 (char *)ip, iplen, 0))
596 return 1; 573 return 1;
597 err: 574 err:
598 param->id->poisoned = 1; 575 param->poisoned = 1;
599 return 0; 576 return 0;
600} 577}
601LCRYPTO_ALIAS(X509_VERIFY_PARAM_set1_ip); 578LCRYPTO_ALIAS(X509_VERIFY_PARAM_set1_ip);
@@ -625,10 +602,6 @@ X509_VERIFY_PARAM_get0_name(const X509_VERIFY_PARAM *param)
625} 602}
626LCRYPTO_ALIAS(X509_VERIFY_PARAM_get0_name); 603LCRYPTO_ALIAS(X509_VERIFY_PARAM_get0_name);
627 604
628static const X509_VERIFY_PARAM_ID _empty_id = { NULL };
629
630#define vpm_empty_id (X509_VERIFY_PARAM_ID *)&_empty_id
631
632/* 605/*
633 * Default verify parameters: these are used for various applications and can 606 * Default verify parameters: these are used for various applications and can
634 * be overridden by the user specified table. 607 * be overridden by the user specified table.
@@ -640,35 +613,30 @@ static const X509_VERIFY_PARAM default_table[] = {
640 .flags = X509_V_FLAG_TRUSTED_FIRST, 613 .flags = X509_V_FLAG_TRUSTED_FIRST,
641 .depth = 100, 614 .depth = 100,
642 .trust = 0, /* XXX This is not the default trust value */ 615 .trust = 0, /* XXX This is not the default trust value */
643 .id = vpm_empty_id
644 }, 616 },
645 { 617 {
646 .name = "pkcs7", 618 .name = "pkcs7",
647 .purpose = X509_PURPOSE_SMIME_SIGN, 619 .purpose = X509_PURPOSE_SMIME_SIGN,
648 .trust = X509_TRUST_EMAIL, 620 .trust = X509_TRUST_EMAIL,
649 .depth = -1, 621 .depth = -1,
650 .id = vpm_empty_id
651 }, 622 },
652 { 623 {
653 .name = "smime_sign", 624 .name = "smime_sign",
654 .purpose = X509_PURPOSE_SMIME_SIGN, 625 .purpose = X509_PURPOSE_SMIME_SIGN,
655 .trust = X509_TRUST_EMAIL, 626 .trust = X509_TRUST_EMAIL,
656 .depth = -1, 627 .depth = -1,
657 .id = vpm_empty_id
658 }, 628 },
659 { 629 {
660 .name = "ssl_client", 630 .name = "ssl_client",
661 .purpose = X509_PURPOSE_SSL_CLIENT, 631 .purpose = X509_PURPOSE_SSL_CLIENT,
662 .trust = X509_TRUST_SSL_CLIENT, 632 .trust = X509_TRUST_SSL_CLIENT,
663 .depth = -1, 633 .depth = -1,
664 .id = vpm_empty_id
665 }, 634 },
666 { 635 {
667 .name = "ssl_server", 636 .name = "ssl_server",
668 .purpose = X509_PURPOSE_SSL_SERVER, 637 .purpose = X509_PURPOSE_SSL_SERVER,
669 .trust = X509_TRUST_SSL_SERVER, 638 .trust = X509_TRUST_SSL_SERVER,
670 .depth = -1, 639 .depth = -1,
671 .id = vpm_empty_id
672 } 640 }
673}; 641};
674 642