diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/man/X509_VERIFY_PARAM_set_flags.3 | 67 | ||||
| -rw-r--r-- | src/lib/libcrypto/x509/vpm_int.h | 3 | ||||
| -rw-r--r-- | src/lib/libcrypto/x509/x509_vfy.c | 13 | ||||
| -rw-r--r-- | src/lib/libcrypto/x509/x509_vpm.c | 69 | 
4 files changed, 107 insertions, 45 deletions
| diff --git a/src/lib/libcrypto/man/X509_VERIFY_PARAM_set_flags.3 b/src/lib/libcrypto/man/X509_VERIFY_PARAM_set_flags.3 index 4f3261c975..9c0150700d 100644 --- a/src/lib/libcrypto/man/X509_VERIFY_PARAM_set_flags.3 +++ b/src/lib/libcrypto/man/X509_VERIFY_PARAM_set_flags.3 | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | .\" $OpenBSD: X509_VERIFY_PARAM_set_flags.3,v 1.12 2018/03/23 14:26:40 schwarze Exp $ | 1 | .\" $OpenBSD: X509_VERIFY_PARAM_set_flags.3,v 1.13 2018/04/06 07:08:20 beck Exp $ | 
| 2 | .\" full merge up to: OpenSSL d33def66 Feb 9 14:17:13 2016 -0500 | 2 | .\" full merge up to: OpenSSL d33def66 Feb 9 14:17:13 2016 -0500 | 
| 3 | .\" selective merge up to: OpenSSL 48e5119a Jan 19 10:49:22 2018 +0100 | 3 | .\" selective merge up to: OpenSSL 48e5119a Jan 19 10:49:22 2018 +0100 | 
| 4 | .\" | 4 | .\" | 
| @@ -68,7 +68,7 @@ | |||
| 68 | .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | 68 | .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | 
| 69 | .\" OF THE POSSIBILITY OF SUCH DAMAGE. | 69 | .\" OF THE POSSIBILITY OF SUCH DAMAGE. | 
| 70 | .\" | 70 | .\" | 
| 71 | .Dd $Mdocdate: March 23 2018 $ | 71 | .Dd $Mdocdate: April 6 2018 $ | 
| 72 | .Dt X509_VERIFY_PARAM_SET_FLAGS 3 | 72 | .Dt X509_VERIFY_PARAM_SET_FLAGS 3 | 
| 73 | .Os | 73 | .Os | 
| 74 | .Sh NAME | 74 | .Sh NAME | 
| @@ -344,14 +344,14 @@ is | |||
| 344 | .Dv NULL | 344 | .Dv NULL | 
| 345 | or empty, the list of hostnames is cleared, and name checks are not | 345 | or empty, the list of hostnames is cleared, and name checks are not | 
| 346 | performed on the peer certificate. | 346 | performed on the peer certificate. | 
| 347 | If | 347 | .Fa namelen | 
| 348 | should be set to the length of | ||
| 349 | .Fa name . | ||
| 350 | For historical compatibility, if | ||
| 348 | .Fa name | 351 | .Fa name | 
| 349 | is NUL-terminated, | 352 | is NUL-terminated, | 
| 350 | .Fa namelen | 353 | .Fa namelen | 
| 351 | may be zero, otherwise | 354 | may be specified as zero. | 
| 352 | .Fa namelen | ||
| 353 | must be set to the length of | ||
| 354 | .Fa name . | ||
| 355 | When a hostname is specified, certificate verification automatically | 355 | When a hostname is specified, certificate verification automatically | 
| 356 | invokes | 356 | invokes | 
| 357 | .Xr X509_check_host 3 | 357 | .Xr X509_check_host 3 | 
| @@ -360,6 +360,10 @@ with flags equal to the | |||
| 360 | argument given to | 360 | argument given to | 
| 361 | .Fn X509_VERIFY_PARAM_set_hostflags | 361 | .Fn X509_VERIFY_PARAM_set_hostflags | 
| 362 | (default zero). | 362 | (default zero). | 
| 363 | .Fn X509_VERIFY_PARAM_set1_host | ||
| 364 | will fail if | ||
| 365 | .Fa name | ||
| 366 | contains any embedded 0 bytes. | ||
| 363 | .Pp | 367 | .Pp | 
| 364 | .Fn X509_VERIFY_PARAM_add1_host | 368 | .Fn X509_VERIFY_PARAM_add1_host | 
| 365 | adds | 369 | adds | 
| @@ -376,6 +380,18 @@ No change is made if | |||
| 376 | is | 380 | is | 
| 377 | .Dv NULL | 381 | .Dv NULL | 
| 378 | or empty. | 382 | or empty. | 
| 383 | .Fa namelen | ||
| 384 | should be set to the length of | ||
| 385 | .Fa name . | ||
| 386 | For historical compatibility, if | ||
| 387 | .Fa name | ||
| 388 | is NUL-terminated, | ||
| 389 | .Fa namelen | ||
| 390 | may be specified as zero. | ||
| 391 | .Fn X509_VERIFY_PARAM_add1_host | ||
| 392 | will fail if | ||
| 393 | .Fa name | ||
| 394 | contains any embedded 0 bytes. | ||
| 379 | When multiple names are configured, the peer is considered verified when | 395 | When multiple names are configured, the peer is considered verified when | 
| 380 | any name matches. | 396 | any name matches. | 
| 381 | .Pp | 397 | .Pp | 
| @@ -390,14 +406,18 @@ identifier respectively. | |||
| 390 | .Fn X509_VERIFY_PARAM_set1_email | 406 | .Fn X509_VERIFY_PARAM_set1_email | 
| 391 | sets the expected RFC822 email address to | 407 | sets the expected RFC822 email address to | 
| 392 | .Fa email . | 408 | .Fa email . | 
| 393 | If | 409 | .Fa emaillen | 
| 410 | should be set to the length of | ||
| 411 | .Fa email . | ||
| 412 | For historical compatibility, if | ||
| 394 | .Fa email | 413 | .Fa email | 
| 395 | is NUL-terminated, | 414 | is NUL-terminated, | 
| 396 | .Fa emaillen | 415 | .Fa emaillen | 
| 397 | may be zero, otherwise | 416 | may be specified as zero, | 
| 398 | .Fa emaillen | 417 | .Fn X509_VERIFY_PARAM_set1_email | 
| 399 | must be set to the length of | 418 | will fail if | 
| 400 | .Fa email . | 419 | .Fa email | 
| 420 | is NULL, an empty string, or contains embedded 0 bytes. | ||
| 401 | When an email address is specified, certificate verification | 421 | When an email address is specified, certificate verification | 
| 402 | automatically invokes | 422 | automatically invokes | 
| 403 | .Xr X509_check_email 3 . | 423 | .Xr X509_check_email 3 . | 
| @@ -410,6 +430,12 @@ The | |||
| 410 | argument is in binary format, in network byte-order, and | 430 | argument is in binary format, in network byte-order, and | 
| 411 | .Fa iplen | 431 | .Fa iplen | 
| 412 | must be set to 4 for IPv4 and 16 for IPv6. | 432 | must be set to 4 for IPv4 and 16 for IPv6. | 
| 433 | .Fn X509_VERIFY_PARAM_set1_ip | ||
| 434 | will fail if | ||
| 435 | .Fa ip | ||
| 436 | is NULL or if | ||
| 437 | .Fa iplen | ||
| 438 | is not 4 or 16. | ||
| 413 | When an IP address is specified, | 439 | When an IP address is specified, | 
| 414 | certificate verification automatically invokes | 440 | certificate verification automatically invokes | 
| 415 | .Xr X509_check_ip 3 . | 441 | .Xr X509_check_ip 3 . | 
| @@ -422,6 +448,10 @@ The | |||
| 422 | argument is a NUL-terminal ASCII string: | 448 | argument is a NUL-terminal ASCII string: | 
| 423 | dotted decimal quad for IPv4 and colon-separated hexadecimal for IPv6. | 449 | dotted decimal quad for IPv4 and colon-separated hexadecimal for IPv6. | 
| 424 | The condensed "::" notation is supported for IPv6 addresses. | 450 | The condensed "::" notation is supported for IPv6 addresses. | 
| 451 | .Fn X509_VERIFY_PARAM_set1_ip_asc | ||
| 452 | will fail if | ||
| 453 | .Fa ipasc | ||
| 454 | is unparsable. | ||
| 425 | .Pp | 455 | .Pp | 
| 426 | .Fn X509_VERIFY_PARAM_add0_table | 456 | .Fn X509_VERIFY_PARAM_add0_table | 
| 427 | adds | 457 | adds | 
| @@ -476,14 +506,23 @@ on allocation failure. | |||
| 476 | .Fn X509_VERIFY_PARAM_set_trust , | 506 | .Fn X509_VERIFY_PARAM_set_trust , | 
| 477 | .Fn X509_VERIFY_PARAM_add0_policy , | 507 | .Fn X509_VERIFY_PARAM_add0_policy , | 
| 478 | .Fn X509_VERIFY_PARAM_set1_policies , | 508 | .Fn X509_VERIFY_PARAM_set1_policies , | 
| 509 | and | ||
| 510 | .Fn X509_VERIFY_PARAM_add0_table | ||
| 511 | return 1 for success or 0 for failure. | ||
| 512 | .Pp | ||
| 479 | .Fn X509_VERIFY_PARAM_set1_host , | 513 | .Fn X509_VERIFY_PARAM_set1_host , | 
| 480 | .Fn X509_VERIFY_PARAM_add1_host , | 514 | .Fn X509_VERIFY_PARAM_add1_host , | 
| 481 | .Fn X509_VERIFY_PARAM_set1_email , | 515 | .Fn X509_VERIFY_PARAM_set1_email , | 
| 482 | .Fn X509_VERIFY_PARAM_set1_ip , | 516 | .Fn X509_VERIFY_PARAM_set1_ip , | 
| 483 | .Fn X509_VERIFY_PARAM_set1_ip_asc , | ||
| 484 | and | 517 | and | 
| 485 | .Fn X509_VERIFY_PARAM_add0_table | 518 | .Fn X509_VERIFY_PARAM_set1_ip_asc , | 
| 486 | return 1 for success or 0 for failure. | 519 | return 1 for success or 0 for failure. | 
| 520 | A failure from these routines will poison | ||
| 521 | the | ||
| 522 | .Vt X509_VERIFY_PARAM | ||
| 523 | object so that future calls to | ||
| 524 | .Xr X509_verify_cert | ||
| 525 | using the poisoned object will fail. | ||
| 487 | .Pp | 526 | .Pp | 
| 488 | .Fn X509_VERIFY_PARAM_get_flags | 527 | .Fn X509_VERIFY_PARAM_get_flags | 
| 489 | returns the current verification flags. | 528 | returns the current verification flags. | 
| diff --git a/src/lib/libcrypto/x509/vpm_int.h b/src/lib/libcrypto/x509/vpm_int.h index 6c8061c847..7fc9fef761 100644 --- a/src/lib/libcrypto/x509/vpm_int.h +++ b/src/lib/libcrypto/x509/vpm_int.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: vpm_int.h,v 1.3 2016/12/21 15:49:29 jsing Exp $ */ | 1 | /* $OpenBSD: vpm_int.h,v 1.4 2018/04/06 07:08:20 beck Exp $ */ | 
| 2 | /* | 2 | /* | 
| 3 | * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project | 3 | * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project | 
| 4 | * 2013. | 4 | * 2013. | 
| @@ -69,6 +69,7 @@ struct X509_VERIFY_PARAM_ID_st { | |||
| 69 | size_t emaillen; | 69 | size_t emaillen; | 
| 70 | unsigned char *ip; /* If not NULL IP address to match */ | 70 | unsigned char *ip; /* If not NULL IP address to match */ | 
| 71 | size_t iplen; /* Length of IP address */ | 71 | size_t iplen; /* Length of IP address */ | 
| 72 | int poisoned; | ||
| 72 | }; | 73 | }; | 
| 73 | 74 | ||
| 74 | __END_HIDDEN_DECLS | 75 | __END_HIDDEN_DECLS | 
| diff --git a/src/lib/libcrypto/x509/x509_vfy.c b/src/lib/libcrypto/x509/x509_vfy.c index c8ccae5029..8392f509e7 100644 --- a/src/lib/libcrypto/x509/x509_vfy.c +++ b/src/lib/libcrypto/x509/x509_vfy.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: x509_vfy.c,v 1.68 2018/02/22 17:11:30 jsing Exp $ */ | 1 | /* $OpenBSD: x509_vfy.c,v 1.69 2018/04/06 07:08:20 beck Exp $ */ | 
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 
| 3 | * All rights reserved. | 3 | * All rights reserved. | 
| 4 | * | 4 | * | 
| @@ -182,10 +182,13 @@ check_id_error(X509_STORE_CTX *ctx, int errcode) | |||
| 182 | static int | 182 | static int | 
| 183 | check_hosts(X509 *x, X509_VERIFY_PARAM_ID *id) | 183 | check_hosts(X509 *x, X509_VERIFY_PARAM_ID *id) | 
| 184 | { | 184 | { | 
| 185 | size_t i; | 185 | size_t i, n; | 
| 186 | size_t n = sk_OPENSSL_STRING_num(id->hosts); | ||
| 187 | char *name; | 186 | char *name; | 
| 188 | 187 | ||
| 188 | if (id->poisoned) | ||
| 189 | return 0; | ||
| 190 | |||
| 191 | n = sk_OPENSSL_STRING_num(id->hosts); | ||
| 189 | free(id->peername); | 192 | free(id->peername); | 
| 190 | id->peername = NULL; | 193 | id->peername = NULL; | 
| 191 | 194 | ||
| @@ -205,6 +208,10 @@ check_id(X509_STORE_CTX *ctx) | |||
| 205 | X509_VERIFY_PARAM_ID *id = vpm->id; | 208 | X509_VERIFY_PARAM_ID *id = vpm->id; | 
| 206 | X509 *x = ctx->cert; | 209 | X509 *x = ctx->cert; | 
| 207 | 210 | ||
| 211 | if (id->poisoned) | ||
| 212 | if (!check_id_error(ctx, X509_V_ERR_INVALID_CALL)) | ||
| 213 | return 0; | ||
| 214 | |||
| 208 | if (id->hosts && check_hosts(x, id) <= 0) { | 215 | if (id->hosts && check_hosts(x, id) <= 0) { | 
| 209 | if (!check_id_error(ctx, X509_V_ERR_HOSTNAME_MISMATCH)) | 216 | if (!check_id_error(ctx, X509_V_ERR_HOSTNAME_MISMATCH)) | 
| 210 | return 0; | 217 | return 0; | 
| diff --git a/src/lib/libcrypto/x509/x509_vpm.c b/src/lib/libcrypto/x509/x509_vpm.c index 0897137697..baebcf7bca 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.17 2018/03/22 15:54:46 beck Exp $ */ | 1 | /* $OpenBSD: x509_vpm.c,v 1.18 2018/04/06 07:08:20 beck 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 | */ | 
| @@ -125,7 +125,7 @@ sk_deep_copy(void *sk_void, void *copy_func_void, void *free_func_void) | |||
| 125 | } | 125 | } | 
| 126 | 126 | ||
| 127 | static int | 127 | static int | 
| 128 | int_x509_param_set_hosts(X509_VERIFY_PARAM_ID *id, int mode, | 128 | x509_param_set_hosts_internal(X509_VERIFY_PARAM_ID *id, int mode, | 
| 129 | const char *name, size_t namelen) | 129 | const char *name, size_t namelen) | 
| 130 | { | 130 | { | 
| 131 | char *copy; | 131 | char *copy; | 
| @@ -134,7 +134,6 @@ int_x509_param_set_hosts(X509_VERIFY_PARAM_ID *id, int mode, | |||
| 134 | namelen = strlen(name); | 134 | namelen = strlen(name); | 
| 135 | /* | 135 | /* | 
| 136 | * Refuse names with embedded NUL bytes. | 136 | * Refuse names with embedded NUL bytes. | 
| 137 | * XXX: Do we need to push an error onto the error stack? | ||
| 138 | */ | 137 | */ | 
| 139 | if (name && memchr(name, '\0', namelen)) | 138 | if (name && memchr(name, '\0', namelen)) | 
| 140 | return 0; | 139 | return 0; | 
| @@ -197,6 +196,7 @@ x509_verify_param_zero(X509_VERIFY_PARAM *param) | |||
| 197 | free(paramid->ip); | 196 | free(paramid->ip); | 
| 198 | paramid->ip = NULL; | 197 | paramid->ip = NULL; | 
| 199 | paramid->iplen = 0; | 198 | paramid->iplen = 0; | 
| 199 | paramid->poisoned = 0; | ||
| 200 | } | 200 | } | 
| 201 | 201 | ||
| 202 | X509_VERIFY_PARAM * | 202 | X509_VERIFY_PARAM * | 
| @@ -367,24 +367,28 @@ X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, const X509_VERIFY_PARAM *from) | |||
| 367 | } | 367 | } | 
| 368 | 368 | ||
| 369 | static int | 369 | static int | 
| 370 | int_x509_param_set1(char **pdest, size_t *pdestlen, const char *src, | 370 | x509_param_set1_internal(char **pdest, size_t *pdestlen, const char *src, | 
| 371 | size_t srclen) | 371 | size_t srclen, int nonul) | 
| 372 | { | 372 | { | 
| 373 | char *tmp; | 373 | char *tmp; | 
| 374 | if (src) { | 374 | |
| 375 | if (srclen == 0) { | 375 | if (src == NULL) | 
| 376 | if ((tmp = strdup(src)) == NULL) | 376 | return 0; | 
| 377 | return 0; | 377 | |
| 378 | srclen = strlen(src); | 378 | if (srclen == 0) { | 
| 379 | } else { | 379 | srclen = strlen(src); | 
| 380 | if ((tmp = malloc(srclen)) == NULL) | 380 | if (srclen == 0) | 
| 381 | return 0; | 381 | return 0; | 
| 382 | memcpy(tmp, src, srclen); | 382 | if ((tmp = strdup(src)) == NULL) | 
| 383 | } | 383 | return 0; | 
| 384 | } else { | 384 | } else { | 
| 385 | tmp = NULL; | 385 | if (nonul && memchr(src, '\0', srclen)) | 
| 386 | srclen = 0; | 386 | return 0; | 
| 387 | if ((tmp = malloc(srclen)) == NULL) | ||
| 388 | return 0; | ||
| 389 | memcpy(tmp, src, srclen); | ||
| 387 | } | 390 | } | 
| 391 | |||
| 388 | if (*pdest) | 392 | if (*pdest) | 
| 389 | free(*pdest); | 393 | free(*pdest); | 
| 390 | *pdest = tmp; | 394 | *pdest = tmp; | 
| @@ -505,14 +509,20 @@ int | |||
| 505 | X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, | 509 | X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, | 
| 506 | const char *name, size_t namelen) | 510 | const char *name, size_t namelen) | 
| 507 | { | 511 | { | 
| 508 | return int_x509_param_set_hosts(param->id, SET_HOST, name, namelen); | 512 | if (x509_param_set_hosts_internal(param->id, SET_HOST, name, namelen)) | 
| 513 | return 1; | ||
| 514 | param->id->poisoned = 1; | ||
| 515 | return 0; | ||
| 509 | } | 516 | } | 
| 510 | 517 | ||
| 511 | int | 518 | int | 
| 512 | X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, | 519 | X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, | 
| 513 | const char *name, size_t namelen) | 520 | const char *name, size_t namelen) | 
| 514 | { | 521 | { | 
| 515 | return int_x509_param_set_hosts(param->id, ADD_HOST, name, namelen); | 522 | if (x509_param_set_hosts_internal(param->id, ADD_HOST, name, namelen)) | 
| 523 | return 1; | ||
| 524 | param->id->poisoned = 1; | ||
| 525 | return 0; | ||
| 516 | } | 526 | } | 
| 517 | 527 | ||
| 518 | void | 528 | void | 
| @@ -531,18 +541,25 @@ int | |||
| 531 | X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, const char *email, | 541 | X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, const char *email, | 
| 532 | size_t emaillen) | 542 | size_t emaillen) | 
| 533 | { | 543 | { | 
| 534 | return int_x509_param_set1(¶m->id->email, ¶m->id->emaillen, | 544 | if (x509_param_set1_internal(¶m->id->email, ¶m->id->emaillen, | 
| 535 | email, emaillen); | 545 | email, emaillen, 1)) | 
| 546 | return 1; | ||
| 547 | param->id->poisoned = 1; | ||
| 548 | return 0; | ||
| 536 | } | 549 | } | 
| 537 | 550 | ||
| 538 | int | 551 | int | 
| 539 | X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, const unsigned char *ip, | 552 | X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, const unsigned char *ip, | 
| 540 | size_t iplen) | 553 | size_t iplen) | 
| 541 | { | 554 | { | 
| 542 | if (iplen != 0 && iplen != 4 && iplen != 16) | 555 | if (iplen != 4 && iplen != 16) | 
| 543 | return 0; | 556 | goto err; | 
| 544 | return int_x509_param_set1((char **)¶m->id->ip, ¶m->id->iplen, | 557 | if (x509_param_set1_internal((char **)¶m->id->ip, ¶m->id->iplen, | 
| 545 | (char *)ip, iplen); | 558 | (char *)ip, iplen, 0)) | 
| 559 | return 1; | ||
| 560 | err: | ||
| 561 | param->id->poisoned = 1; | ||
| 562 | return 0; | ||
| 546 | } | 563 | } | 
| 547 | 564 | ||
| 548 | int | 565 | int | 
| @@ -552,8 +569,6 @@ X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param, const char *ipasc) | |||
| 552 | size_t iplen; | 569 | size_t iplen; | 
| 553 | 570 | ||
| 554 | iplen = (size_t)a2i_ipadd(ipout, ipasc); | 571 | iplen = (size_t)a2i_ipadd(ipout, ipasc); | 
| 555 | if (iplen == 0) | ||
| 556 | return 0; | ||
| 557 | return X509_VERIFY_PARAM_set1_ip(param, ipout, iplen); | 572 | return X509_VERIFY_PARAM_set1_ip(param, ipout, iplen); | 
| 558 | } | 573 | } | 
| 559 | 574 | ||
