Signed-off-by: Adriaan de Jong <dej...@fox-it.com>
---
 ssl_verify.c          |   28 ++++++++++++++--------------
 ssl_verify_backend.h  |   11 ++---------
 ssl_verify_openssl.c  |   17 +++++++----------
 ssl_verify_polarssl.c |   17 +++--------------
 4 files changed, 26 insertions(+), 47 deletions(-)

diff --git a/ssl_verify.c b/ssl_verify.c
index 06585d8..352118a 100644
--- a/ssl_verify.c
+++ b/ssl_verify.c
@@ -377,6 +377,8 @@ verify_cert_set_env(struct env_set *es, x509_cert_t 
*peer_cert, int cert_depth,
     )
 {
   char envname[64];
+  char *serial = NULL;
+  struct gc_arena gc = gc_new ();

   /* Save X509 fields in environment */
 #ifdef ENABLE_X509_TRACK
@@ -399,25 +401,21 @@ verify_cert_set_env(struct env_set *es, x509_cert_t 
*peer_cert, int cert_depth,
 #ifdef ENABLE_EUREPHIA
   /* export X509 cert SHA1 fingerprint */
   {
-    struct gc_arena gc = gc_new ();
     unsigned char *sha1_hash = x509_get_sha1_hash(peer_cert);

     openvpn_snprintf (envname, sizeof(envname), "tls_digest_%d", cert_depth);
     setenv_str (es, envname, format_hex_ex(sha1_hash, SHA_DIGEST_LENGTH, 0, 1,
                                          ":", &gc));
     x509_free_sha1_hash(sha1_hash);
-    gc_free(&gc);
   }
 #endif

-  /* export serial number as environmental variable,
-     use bignum in case serial number is large */
-  {
-    char *serial = x509_get_serial(peer_cert);
-    openvpn_snprintf (envname, sizeof(envname), "tls_serial_%d", cert_depth);
-    setenv_str (es, envname, serial);
-    x509_free_serial(serial);
-  }
+  /* export serial number as environmental variable */
+  serial = x509_get_serial(peer_cert, &gc);
+  openvpn_snprintf (envname, sizeof(envname), "tls_serial_%d", cert_depth);
+  setenv_str (es, envname, serial);
+
+  gc_free(&gc);
 }

 /*
@@ -537,24 +535,26 @@ verify_check_crl_dir(const char *crl_dir, x509_cert_t 
*cert)
 {
   char fn[256];
   int fd;
-  char *serial = x509_get_serial(cert);
+  struct gc_arena gc = gc_new();
+
+  char *serial = x509_get_serial(cert, &gc);

   if (!openvpn_snprintf(fn, sizeof(fn), "%s%c%s", crl_dir, OS_SPECIFIC_DIRSEP, 
serial))
     {
       msg (D_HANDSHAKE, "VERIFY CRL: filename overflow");
-      x509_free_serial(serial);
+      gc_free(&gc);
       return FAILURE;
     }
   fd = openvpn_open (fn, O_RDONLY, 0);
   if (fd >= 0)
     {
       msg (D_HANDSHAKE, "VERIFY CRL: certificate serial number %s is revoked", 
serial);
-      x509_free_serial(serial);
       close(fd);
+      gc_free(&gc);
       return FAILURE;
     }

-  x509_free_serial(serial);
+  gc_free(&gc);

   return SUCCESS;
 }
diff --git a/ssl_verify_backend.h b/ssl_verify_backend.h
index a1fd682..5c69b11 100644
--- a/ssl_verify_backend.h
+++ b/ssl_verify_backend.h
@@ -125,20 +125,13 @@ result_t x509_get_username (char *common_name, int cn_len,
  * Return the certificate's serial number.
  *
  * The serial number is returned as a string, since it might be a bignum.
- * The returned string must be freed with \c verify_free_serial()
  *
  * @param cert         Certificate to retrieve the serial number from.
+ * @param gc           Garbage collection arena to use when allocating string.
  *
  * @return             The certificate's serial number.
  */
-char *x509_get_serial (x509_cert_t *cert);
-
-/*
- * Free a serial number string as returned by \c verify_get_serial()
- *
- * @param serial       The string to be freed.
- */
-void x509_free_serial (char *serial);
+char *x509_get_serial (x509_cert_t *cert, struct gc_arena *gc);

 /*
  * Save X509 fields to environment, using the naming convention:
diff --git a/ssl_verify_openssl.c b/ssl_verify_openssl.c
index 473835e..6d31bb3 100644
--- a/ssl_verify_openssl.c
+++ b/ssl_verify_openssl.c
@@ -213,25 +213,22 @@ x509_get_username (char *common_name, int cn_len,
 }

 char *
-x509_get_serial (x509_cert_t *cert)
+x509_get_serial (x509_cert_t *cert, struct gc_arena *gc)
 {
   ASN1_INTEGER *asn1_i;
   BIGNUM *bignum;
-  char *serial;
+  char *openssl_serial, *serial;

   asn1_i = X509_get_serialNumber(cert);
   bignum = ASN1_INTEGER_to_BN(asn1_i, NULL);
-  serial = BN_bn2dec(bignum);
+  openssl_serial = BN_bn2dec(bignum);
+
+  serial = string_alloc(openssl_serial, gc);

   BN_free(bignum);
-  return serial;
-}
+  OPENSSL_free(openssl_serial);

-void
-x509_free_serial (char *serial)
-{
-  if (serial)
-    OPENSSL_free(serial);
+  return serial;
 }

 unsigned char *
diff --git a/ssl_verify_polarssl.c b/ssl_verify_polarssl.c
index c4afb24..065b30d 100644
--- a/ssl_verify_polarssl.c
+++ b/ssl_verify_polarssl.c
@@ -119,32 +119,21 @@ x509_get_username (char *cn, int cn_len,
 }

 char *
-x509_get_serial (x509_cert *cert)
+x509_get_serial (x509_cert *cert, struct gc_arena *gc)
 {
   int ret = 0;
   int i = 0;
   char *buf = NULL;
   size_t len = cert->serial.len * 3;

-  buf = malloc(len);
-  ASSERT(buf);
+  buf = gc_malloc(len, true, gc);

   if(x509parse_serial_gets(buf, len-1, &cert->serial) < 0)
-    {
-      free(buf);
-      buf = NULL;
-    }
+    buf = NULL;

   return buf;
 }

-void
-x509_free_serial (char *serial)
-{
-  if (serial)
-    free(serial);
-}
-
 unsigned char *
 x509_get_sha1_hash (x509_cert *cert)
 {
-- 
1.7.5.4


Reply via email to