summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2016-11-23 10:53:23 +0100
committerNikos Mavrogiannopoulos <nmav@redhat.com>2016-11-25 12:03:37 +0100
commitd75ccdc794e16f0d155f9b854fa58868b7de1f51 (patch)
tree7fb8ce4bc1a6852fcd32e91e04baa80440ba2079
parent7dc44ad71e3e3c50140b1d6c3ce5c473268b7abd (diff)
downloadgnutls-d75ccdc794e16f0d155f9b854fa58868b7de1f51.tar.gz
gnutls_x509_aia_set: IDNA encode when needed
-rw-r--r--lib/x509/virt-san.c37
-rw-r--r--lib/x509/x509_ext.c36
-rw-r--r--lib/x509/x509_ext_int.h5
3 files changed, 47 insertions, 31 deletions
diff --git a/lib/x509/virt-san.c b/lib/x509/virt-san.c
index c1918af2d4..f3b87135b1 100644
--- a/lib/x509/virt-san.c
+++ b/lib/x509/virt-san.c
@@ -1,6 +1,6 @@
/*
- * Copyright (C) 2015 Nikos Mavrogiannopoulos
- * Copyright (C) 2015 Red Hat, Inc.
+ * Copyright (C) 2015-2016 Nikos Mavrogiannopoulos
+ * Copyright (C) 2015-2016 Red Hat, Inc.
*
* This file is part of GnuTLS.
*
@@ -25,6 +25,7 @@
#include "gnutls_int.h"
#include "x509_int.h"
+#include "x509_ext_int.h"
#include "common.h"
#include "krb5.h"
#include "virt-san.h"
@@ -65,32 +66,11 @@ int _gnutls_alt_name_assign_virt_type(struct name_st *name, unsigned type, gnutl
if (type < 1000) {
name->type = type;
- if (type == GNUTLS_SAN_DNSNAME && !raw) {
- ret = gnutls_idna_map((char*)san->data, san->size, &name->san, 0);
- if (ret < 0) {
- return gnutls_assert_val(ret);
- }
- gnutls_free(san->data);
- san->data = NULL;
- } else if (type == GNUTLS_SAN_RFC822NAME && !raw) {
- ret = _gnutls_idna_email_map((char*)san->data, san->size, &name->san);
- if (ret < 0) {
- return gnutls_assert_val(ret);
- }
- gnutls_free(san->data);
- san->data = NULL;
- } else if (type == GNUTLS_SAN_URI && !raw) {
- if (!_gnutls_str_is_print((char*)san->data, san->size)) {
- _gnutls_debug_log("non-ASCII URIs are not supported\n");
- return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
- } else {
- name->san.data = san->data;
- name->san.size = san->size;
- }
- } else {
- name->san.data = san->data;
- name->san.size = san->size;
- }
+ ret = _gnutls_alt_name_process(&name->san, type, san, raw);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+ gnutls_free(san->data);
+ san->data = NULL;
if (othername_oid) {
name->othername_oid.data = (uint8_t *) othername_oid;
@@ -99,7 +79,6 @@ int _gnutls_alt_name_assign_virt_type(struct name_st *name, unsigned type, gnutl
name->othername_oid.data = NULL;
name->othername_oid.size = 0;
}
-
} else { /* virtual types */
const char *oid = virtual_to_othername_oid(type);
diff --git a/lib/x509/x509_ext.c b/lib/x509/x509_ext.c
index 0756ed5996..c70d3e7f67 100644
--- a/lib/x509/x509_ext.c
+++ b/lib/x509/x509_ext.c
@@ -2603,6 +2603,37 @@ int gnutls_x509_aia_get(gnutls_x509_aia_t aia, unsigned int seq,
return 0;
}
+int _gnutls_alt_name_process(gnutls_datum_t *out, unsigned type, const gnutls_datum_t *san, unsigned raw)
+{
+ int ret;
+ if (type == GNUTLS_SAN_DNSNAME && !raw) {
+ ret = gnutls_idna_map((char*)san->data, san->size, out, 0);
+ if (ret < 0) {
+ return gnutls_assert_val(ret);
+ }
+ } else if (type == GNUTLS_SAN_RFC822NAME && !raw) {
+ ret = _gnutls_idna_email_map((char*)san->data, san->size, out);
+ if (ret < 0) {
+ return gnutls_assert_val(ret);
+ }
+ } else if (type == GNUTLS_SAN_URI && !raw) {
+ if (!_gnutls_str_is_print((char*)san->data, san->size)) {
+ _gnutls_debug_log("non-ASCII URIs are not supported\n");
+ return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
+ } else {
+ ret = _gnutls_set_strdatum(out, san->data, san->size);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+ }
+ } else {
+ ret = _gnutls_set_strdatum(out, san->data, san->size);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+ }
+
+ return 0;
+}
+
/**
* gnutls_x509_aia_set:
* @aia: The authority info access
@@ -2617,6 +2648,9 @@ int gnutls_x509_aia_get(gnutls_x509_aia_t aia, unsigned int seq,
* Typically the value for @oid should be %GNUTLS_OID_AD_OCSP, or
* %GNUTLS_OID_AD_CAISSUERS.
*
+ * Since version 3.5.7 the %GNUTLS_SAN_RFC822NAME, and %GNUTLS_SAN_DNSNAME,
+ * are converted to ACE format when necessary.
+ *
* Returns: On success, %GNUTLS_E_SUCCESS (0), otherwise a negative error value.
*
* Since: 3.3.0
@@ -2646,7 +2680,7 @@ int gnutls_x509_aia_set(gnutls_x509_aia_t aia,
aia->aia[indx].oid.size = 0;
}
- ret = _gnutls_set_datum(&aia->aia[indx].san, san->data, san->size);
+ ret = _gnutls_alt_name_process(&aia->aia[indx].san, san_type, san, 0);
if (ret < 0)
return gnutls_assert_val(ret);
diff --git a/lib/x509/x509_ext_int.h b/lib/x509/x509_ext_int.h
index 34d0207fb4..3bca97f30e 100644
--- a/lib/x509/x509_ext_int.h
+++ b/lib/x509/x509_ext_int.h
@@ -1,5 +1,6 @@
/*
- * Copyright (C) 2014 Free Software Foundation
+ * Copyright (C) 2014-2016 Free Software Foundation
+ * Copyright (C) 2014-2016 Red Hat, Inc.
*
* This file is part of GnuTLS.
*
@@ -28,4 +29,6 @@ struct name_st {
gnutls_datum_t othername_oid;
};
+int _gnutls_alt_name_process(gnutls_datum_t *out, unsigned type, const gnutls_datum_t *san, unsigned raw);
+
#endif