summaryrefslogtreecommitdiff
path: root/lib/x509/email-verify.c
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2016-11-23 13:12:08 +0100
committerNikos Mavrogiannopoulos <nmav@redhat.com>2016-11-23 15:02:21 +0100
commit86392e5115bb8629b67dbd535359bbc6df30460d (patch)
tree99eb821d060a081ef03a0938e30fb41aaa827fe0 /lib/x509/email-verify.c
parentf8ca14a1b0b6164be9ff03a3e69f77f0777b3d6d (diff)
downloadgnutls-86392e5115bb8629b67dbd535359bbc6df30460d.tar.gz
IDNA code re-organization
That introduces the internal function gnutls_idna_map(), which utilizes libidn and libunistring to convert hostnames to IDNA ACE form.
Diffstat (limited to 'lib/x509/email-verify.c')
-rw-r--r--lib/x509/email-verify.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/lib/x509/email-verify.c b/lib/x509/email-verify.c
index e6a3b1773c..a96d5ca192 100644
--- a/lib/x509/email-verify.c
+++ b/lib/x509/email-verify.c
@@ -25,7 +25,6 @@
#include <common.h>
#include "errors.h"
#include <system.h>
-#include <gnutls-idna.h>
static int has_embedded_null(const char *str, unsigned size)
{
@@ -52,16 +51,19 @@ gnutls_x509_crt_check_email(gnutls_x509_crt_t cert,
char rfc822name[MAX_CN];
size_t rfc822namesize;
int found_rfc822name = 0;
- int ret = 0, rc;
+ int ret = 0;
int i = 0;
char *a_email;
char *a_rfc822name;
+ gnutls_datum_t out;
/* convert the provided email to ACE-Labels domain. */
- rc = idna_to_ascii_8z (email, &a_email, 0);
- if (rc != IDNA_SUCCESS) {
- _gnutls_debug_log("unable to convert email %s to IDNA format: %s\n", email, idna_strerror (rc));
+ ret = gnutls_idna_map(email, strlen(email), &out, 0);
+ if (ret < 0) {
+ _gnutls_debug_log("unable to convert email %s to IDNA format\n", email);
a_email = (char*)email;
+ } else {
+ a_email = (char*)out.data;
}
/* try matching against:
@@ -92,14 +94,16 @@ gnutls_x509_crt_check_email(gnutls_x509_crt_t cert,
continue;
}
- rc = idna_to_ascii_8z (rfc822name, &a_rfc822name, 0);
- if (rc != IDNA_SUCCESS) {
- _gnutls_debug_log("unable to convert rfc822name %s to IDNA format: %s\n", rfc822name, idna_strerror (rc));
+ ret = gnutls_idna_map(rfc822name, rfc822namesize, &out, 0);
+ if (ret < 0) {
+ _gnutls_debug_log("unable to convert rfc822name %s to IDNA format\n", rfc822name);
continue;
}
+ a_rfc822name = (char*)out.data;
+
ret = _gnutls_hostname_compare(a_rfc822name, strlen(a_rfc822name), a_email, GNUTLS_VERIFY_DO_NOT_ALLOW_WILDCARDS);
- idn_free(a_rfc822name);
+ gnutls_free(a_rfc822name);
if (ret != 0) {
ret = 1;
@@ -138,16 +142,18 @@ gnutls_x509_crt_check_email(gnutls_x509_crt_t cert,
goto cleanup;
}
- rc = idna_to_ascii_8z (rfc822name, &a_rfc822name, 0);
- if (rc != IDNA_SUCCESS) {
- _gnutls_debug_log("unable to convert EMAIL %s to IDNA format: %s\n", rfc822name, idna_strerror (rc));
+ ret = gnutls_idna_map (rfc822name, rfc822namesize, &out, 0);
+ if (ret < 0) {
+ _gnutls_debug_log("unable to convert EMAIL %s to IDNA format\n", rfc822name);
ret = 0;
goto cleanup;
}
+ a_rfc822name = (char*)out.data;
+
ret = _gnutls_hostname_compare(a_rfc822name, strlen(a_rfc822name), a_email, GNUTLS_VERIFY_DO_NOT_ALLOW_WILDCARDS);
- idn_free(a_rfc822name);
+ gnutls_free(a_rfc822name);
if (ret != 0) {
ret = 1;
@@ -160,7 +166,7 @@ gnutls_x509_crt_check_email(gnutls_x509_crt_t cert,
ret = 0;
cleanup:
if (a_email != email) {
- idn_free(a_email);
+ gnutls_free(a_email);
}
return ret;
}