[PATCH] add gnutls_certificate_find_issuer

Joe Orton jorton at redhat.com
Fri Feb 15 11:21:50 CET 2008


This patch adds a function which finds the issuer of a given certificate 
within a credentials structure.  This is useful so that clients can 
easily recreate the complete server cert chain given only the single 
cert returned by the peer.

(e.g. in the case where gnutls_certificate_set_x509_trust_file() is 
used, the client doesn't have the individual issuer cert structures to 
compare against directly.)

This and the previously submitted patch allow the two remaining failures 
in neon's SSL test suite to be fixed :)

diff -up ./includes/gnutls/gnutls.h.findissuer ./includes/gnutls/gnutls.h
--- ./includes/gnutls/gnutls.h.findissuer	2008-02-15 10:06:48.000000000 +0000
+++ ./includes/gnutls/gnutls.h	2008-02-15 09:39:56.000000000 +0000
@@ -717,6 +717,10 @@ extern "C"
 				       gnutls_x509_crl_t * crl_list,
 				       int crl_list_size);
 
+    gnutls_x509_crt_t 
+    gnutls_certificate_find_issuer (gnutls_certificate_credentials_t cred,
+                                    gnutls_x509_crt_t crt);
+
 /* global state functions
  */
   int gnutls_global_init (void);
diff -up ./lib/gnutls_cert.c.findissuer ./lib/gnutls_cert.c
--- ./lib/gnutls_cert.c.findissuer	2007-12-17 11:12:04.000000000 +0000
+++ ./lib/gnutls_cert.c	2008-02-15 10:09:04.000000000 +0000
@@ -593,6 +593,31 @@ gnutls_certificate_verify_peers (gnutls_
 }
 
 /**
+  * gnutls_certificate_find_issuer - This function finds an issuer certificate
+  * @sc: is an #gnutls_certificate_credentials_t structure.
+  * @cert: should contain a #gnutls_x509_crt_t structure
+  *
+  * This function returns the issuer certificate of @cert, if it can
+  * be found in the listed of trusted X.509 certificates in @cred.
+  * If no issuer is found, then NULL is returned.
+  *
+  **/
+gnutls_x509_crt_t 
+gnutls_certificate_find_issuer (gnutls_certificate_credentials_t cred,
+                                gnutls_x509_crt_t cert)
+{
+  unsigned n;
+  
+  for (n = 0; n < cred->x509_ncas; n++) 
+    {
+      if (gnutls_x509_crt_check_issuer (crt, cred->x509_ca_list[n]) == 1)
+        return cred->x509_ca_list[n];
+    }
+  
+  return NULL;
+}
+
+/**
   * gnutls_certificate_expiration_time_peers - This function returns the peer's certificate expiration time
   * @session: is a gnutls session
   *





More information about the Gnutls-devel mailing list