summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/x509/x509_alt.c50
-rw-r--r--src/lib/libcrypto/x509/x509_constraints.c16
-rw-r--r--src/lib/libcrypto/x509/x509_internal.h4
3 files changed, 61 insertions, 9 deletions
diff --git a/src/lib/libcrypto/x509/x509_alt.c b/src/lib/libcrypto/x509/x509_alt.c
index 5b9f490bae..02a4a3a377 100644
--- a/src/lib/libcrypto/x509/x509_alt.c
+++ b/src/lib/libcrypto/x509/x509_alt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: x509_alt.c,v 1.2 2021/08/24 15:23:03 tb Exp $ */ 1/* $OpenBSD: x509_alt.c,v 1.3 2021/10/26 09:09:53 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. 3 * project.
4 */ 4 */
@@ -63,6 +63,8 @@
63#include <openssl/err.h> 63#include <openssl/err.h>
64#include <openssl/x509v3.h> 64#include <openssl/x509v3.h>
65 65
66#include "x509_internal.h"
67
66static GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method, 68static GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method,
67 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); 69 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval);
68static GENERAL_NAMES *v2i_issuer_alt(X509V3_EXT_METHOD *method, 70static GENERAL_NAMES *v2i_issuer_alt(X509V3_EXT_METHOD *method,
@@ -612,8 +614,11 @@ GENERAL_NAME *
612v2i_GENERAL_NAME_ex(GENERAL_NAME *out, const X509V3_EXT_METHOD *method, 614v2i_GENERAL_NAME_ex(GENERAL_NAME *out, const X509V3_EXT_METHOD *method,
613 X509V3_CTX *ctx, CONF_VALUE *cnf, int is_nc) 615 X509V3_CTX *ctx, CONF_VALUE *cnf, int is_nc)
614{ 616{
615 int type; 617 uint8_t *bytes = NULL;
616 char *name, *value; 618 char *name, *value;
619 GENERAL_NAME *ret;
620 size_t len = 0;
621 int type;
617 622
618 name = cnf->name; 623 name = cnf->name;
619 value = cnf->value; 624 value = cnf->value;
@@ -643,7 +648,46 @@ v2i_GENERAL_NAME_ex(GENERAL_NAME *out, const X509V3_EXT_METHOD *method,
643 return NULL; 648 return NULL;
644 } 649 }
645 650
646 return a2i_GENERAL_NAME(out, method, ctx, type, value, is_nc); 651 ret = a2i_GENERAL_NAME(out, method, ctx, type, value, is_nc);
652
653 /* Validate what we have for sanity */
654 type = x509_constraints_general_to_bytes(ret, &bytes, &len);
655 switch(type) {
656 case GEN_DNS:
657 if (!x509_constraints_valid_sandns(bytes, len)) {
658 X509V3error(X509V3_R_BAD_OBJECT);
659 ERR_asprintf_error_data("name=%s value='%s'", name, bytes);
660 goto err;
661 }
662 break;
663 case GEN_URI:
664 if (!x509_constraints_uri_host(bytes, len, NULL)) {
665 X509V3error(X509V3_R_BAD_OBJECT);
666 ERR_asprintf_error_data("name=%s value='%s'", name, bytes);
667 goto err;
668 }
669 break;
670 case GEN_EMAIL:
671 if (!x509_constraints_parse_mailbox(bytes, len, NULL)) {
672 X509V3error(X509V3_R_BAD_OBJECT);
673 ERR_asprintf_error_data("name=%s value='%s'", name, bytes);
674 goto err;
675 }
676 break;
677 case GEN_IPADD:
678 if (len != 4 && len != 16) {
679 X509V3error(X509V3_R_BAD_IP_ADDRESS);
680 ERR_asprintf_error_data("name=%s len=%zu", name, len);
681 goto err;
682 }
683 break;
684 default:
685 break;
686 }
687 return ret;
688 err:
689 GENERAL_NAME_free(ret);
690 return NULL;
647} 691}
648 692
649static int 693static int
diff --git a/src/lib/libcrypto/x509/x509_constraints.c b/src/lib/libcrypto/x509/x509_constraints.c
index db33bf1aa4..f5e1050bb1 100644
--- a/src/lib/libcrypto/x509/x509_constraints.c
+++ b/src/lib/libcrypto/x509/x509_constraints.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: x509_constraints.c,v 1.17 2021/09/23 15:49:48 jsing Exp $ */ 1/* $OpenBSD: x509_constraints.c,v 1.18 2021/10/26 09:09:53 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2020 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2020 Bob Beck <beck@openbsd.org>
4 * 4 *
@@ -424,9 +424,14 @@ x509_constraints_parse_mailbox(uint8_t *candidate, size_t len,
424 strlen(candidate_domain))) 424 strlen(candidate_domain)))
425 goto bad; 425 goto bad;
426 426
427 name->local = candidate_local; 427 if (name != NULL) {
428 name->name = candidate_domain; 428 name->local = candidate_local;
429 name->type = GEN_EMAIL; 429 name->name = candidate_domain;
430 name->type = GEN_EMAIL;
431 } else {
432 free(candidate_local);
433 free(candidate_domain);
434 }
430 return 1; 435 return 1;
431 bad: 436 bad:
432 free(candidate_local); 437 free(candidate_local);
@@ -511,7 +516,8 @@ x509_constraints_uri_host(uint8_t *uri, size_t len, char **hostpart)
511 host = authority; 516 host = authority;
512 if (!x509_constraints_valid_host(host, hostlen)) 517 if (!x509_constraints_valid_host(host, hostlen))
513 return 0; 518 return 0;
514 *hostpart = strndup(host, hostlen); 519 if (hostpart != NULL)
520 *hostpart = strndup(host, hostlen);
515 return 1; 521 return 1;
516} 522}
517 523
diff --git a/src/lib/libcrypto/x509/x509_internal.h b/src/lib/libcrypto/x509/x509_internal.h
index 8891aecb13..90fafccae0 100644
--- a/src/lib/libcrypto/x509/x509_internal.h
+++ b/src/lib/libcrypto/x509/x509_internal.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: x509_internal.h,v 1.12 2021/09/03 08:58:53 beck Exp $ */ 1/* $OpenBSD: x509_internal.h,v 1.13 2021/10/26 09:09:53 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2020 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2020 Bob Beck <beck@openbsd.org>
4 * 4 *
@@ -106,6 +106,8 @@ struct x509_constraints_names *x509_constraints_names_dup(
106 struct x509_constraints_names *names); 106 struct x509_constraints_names *names);
107void x509_constraints_names_clear(struct x509_constraints_names *names); 107void x509_constraints_names_clear(struct x509_constraints_names *names);
108struct x509_constraints_names *x509_constraints_names_new(size_t names_max); 108struct x509_constraints_names *x509_constraints_names_new(size_t names_max);
109int x509_constraints_general_to_bytes(GENERAL_NAME *name, uint8_t **bytes,
110 size_t *len);
109void x509_constraints_names_free(struct x509_constraints_names *names); 111void x509_constraints_names_free(struct x509_constraints_names *names);
110int x509_constraints_valid_host(uint8_t *name, size_t len); 112int x509_constraints_valid_host(uint8_t *name, size_t len);
111int x509_constraints_valid_sandns(uint8_t *name, size_t len); 113int x509_constraints_valid_sandns(uint8_t *name, size_t len);