Add ntbtls_set_hostname.
authorWerner Koch <wk@gnupg.org>
Thu, 2 Oct 2014 08:17:42 +0000 (10:17 +0200)
committerWerner Koch <wk@gnupg.org>
Thu, 2 Oct 2014 08:41:55 +0000 (10:41 +0200)
src/context.h
src/libntbtls.def
src/libntbtls.vers
src/ntbtls-cli.c
src/ntbtls-int.h
src/ntbtls.h.in
src/protocol-cli.c
src/protocol-srv.c
src/protocol.c
src/visibility.c
src/visibility.h

index 5f0815b..2c8b380 100644 (file)
@@ -423,8 +423,7 @@ struct _ntbtls_context_s
   /*
    * SNI extension
    */
-  unsigned char *hostname;
-  size_t hostname_len;
+  char *hostname;
 
   /*
    * ALPN extension
index 494b273..c4aa2a7 100644 (file)
@@ -28,6 +28,8 @@ EXPORTS
     ntbtls_release                        @4
     ntbtls_set_transport                  @5
     ntbtls_get_stream                     @6
-    ntbtls_handshake                      @7
+    ntbtls_set_hostname                   @7
+
+    ntbtls_handshake                      @8
 
 ; END
index e97f20c..32d7774 100644 (file)
@@ -28,6 +28,8 @@ NTBTLS_1.0 {
     ntbtls_release;
     ntbtls_set_transport;
     ntbtls_get_stream;
+    ntbtls_set_hostname;
+
     ntbtls_handshake;
 
 
index de3f170..6baf5af 100644 (file)
@@ -36,6 +36,7 @@
 
 static int verbose;
 static int errorcount;
+static char *opt_hostname;
 
 \f
 /*
@@ -215,6 +216,14 @@ simple_client (const char *server, int port)
     die ("ntbtls_get_stream failed: %s <%s>\n",
          gpg_strerror (err), gpg_strsource (err));
 
+  if (opt_hostname)
+    {
+      err = ntbtls_set_hostname (tls, opt_hostname);
+      if (err)
+        die ("ntbtls_set_hostname failed: %s <%s>\n",
+             gpg_strerror (err), gpg_strsource (err));
+    }
+
   info ("starting handshake");
   while ((err = ntbtls_handshake (tls)))
     {
@@ -296,6 +305,14 @@ main (int argc, char **argv)
           else
             port = 8443;
         }
+      else if (!strcmp (*argv, "--hostname"))
+        {
+          if (argc < 2)
+            die ("argument missing for option '%s'\n", *argv);
+          argc--; argv++;
+          opt_hostname = *argv;
+          argc--; argv++;
+        }
       else if (!strncmp (*argv, "--", 2) && (*argv)[2])
         die ("Invalid option '%s'\n", *argv);
     }
index 2184ae9..41047ee 100644 (file)
@@ -318,6 +318,8 @@ gpg_error_t _ntbtls_set_transport (ntbtls_t tls,
 gpg_error_t _ntbtls_get_stream (ntbtls_t tls,
                                 gpgrt_stream_t *r_readfp,
                                 gpgrt_stream_t *r_writefp);
+gpg_error_t _ntbtls_set_hostname (ntbtls_t tls, const char *hostname);
+
 gpg_error_t _ntbtls_handshake (ntbtls_t tls);
 
 
index ecd84b3..bebeb5f 100644 (file)
@@ -69,6 +69,8 @@ gpg_error_t ntbtls_get_stream (ntbtls_t tls,
                                gpgrt_stream_t *r_readfp,
                                gpgrt_stream_t *r_writefp);
 
+gpg_error_t ntbtls_set_hostname (ntbtls_t tls, const char *hostname);
+
 gpg_error_t ntbtls_handshake (ntbtls_t tls);
 
 
index bf7056f..2194d85 100644 (file)
 
 
 static void
-write_hostname_ext (ntbtls_t ssl, unsigned char *buf, size_t * olen)
+write_hostname_ext (ntbtls_t tls, unsigned char *buf, size_t * olen)
 {
   unsigned char *p = buf;
+  size_t len;
 
   *olen = 0;
 
-  if (ssl->hostname == NULL)
+  if (!tls->hostname)
     return;
 
-  debug_msg (3, "client hello, adding server name extension: %s",
-             ssl->hostname);
+  debug_msg (3, "client hello, adding server name extension: '%s'",
+             tls->hostname);
+
+  len = strlen (tls->hostname);
 
   /*
    * struct {
@@ -64,19 +67,19 @@ write_hostname_ext (ntbtls_t ssl, unsigned char *buf, size_t * olen)
   *p++ = (unsigned char) ((TLS_EXT_SERVERNAME >> 8) & 0xFF);
   *p++ = (unsigned char) ((TLS_EXT_SERVERNAME) & 0xFF);
 
-  *p++ = (unsigned char) (((ssl->hostname_len + 5) >> 8) & 0xFF);
-  *p++ = (unsigned char) (((ssl->hostname_len + 5)) & 0xFF);
+  *p++ = (unsigned char) (((len + 5) >> 8) & 0xFF);
+  *p++ = (unsigned char) (((len + 5)) & 0xFF);
 
-  *p++ = (unsigned char) (((ssl->hostname_len + 3) >> 8) & 0xFF);
-  *p++ = (unsigned char) (((ssl->hostname_len + 3)) & 0xFF);
+  *p++ = (unsigned char) (((len + 3) >> 8) & 0xFF);
+  *p++ = (unsigned char) (((len + 3)) & 0xFF);
 
   *p++ = (unsigned char) ((TLS_EXT_SERVERNAME) & 0xFF);
-  *p++ = (unsigned char) ((ssl->hostname_len >> 8) & 0xFF);
-  *p++ = (unsigned char) ((ssl->hostname_len) & 0xFF);
+  *p++ = (unsigned char) ((len >> 8) & 0xFF);
+  *p++ = (unsigned char) ((len) & 0xFF);
 
-  memcpy (p, ssl->hostname, ssl->hostname_len);
+  memcpy (p, tls->hostname, len);
 
-  *olen = ssl->hostname_len + 9;
+  *olen = len + 9;
 }
 
 
index 0d0fc90..7317ea3 100644 (file)
@@ -323,6 +323,8 @@ ssl_sni_wrapper (ntbtls_t ssl, const unsigned char *name, size_t len)
   int ret;
   ssl_key_cert *key_cert_ori = ssl->key_cert;
 
+  /* Fixme: Turn HOSTNAME into a C string and bail out if it has
+     embedded nuls.  */
   ssl->key_cert = NULL;
   ret = ssl->f_sni (ssl->p_sni, ssl, name, len);
   ssl->handshake->sni_key_cert = ssl->key_cert;
index 331eb3e..b1c2e23 100644 (file)
@@ -2803,12 +2803,7 @@ _ntbtls_release (ntbtls_t tls)
       free (tls->ticket_keys);
     }
 
-  if (tls->hostname)
-    {
-      wipememory (tls->hostname, tls->hostname_len);
-      free (tls->hostname);
-      tls->hostname_len = 0;
-    }
+  free (tls->hostname);
 
   if (tls->psk)
     {
@@ -3256,26 +3251,31 @@ _ntbtls_set_session (ntbtls_t tls, const session_t session)
 /* } */
 
 
-/* int */
-/* ssl_set_hostname (ntbtls_t ssl, const char *hostname) */
-/* { */
-/*   if (hostname == NULL) */
-/*     return gpg_error (GPG_ERR_INV_ARG); */
+gpg_error_t
+_ntbtls_set_hostname (ntbtls_t tls, const char *hostname)
+{
+  size_t len;
 
-/*   ssl->hostname_len = strlen (hostname); */
+  if (!tls)
+    return gpg_error (GPG_ERR_INV_ARG);
 
-/*   if (ssl->hostname_len + 1 == 0) */
-/*     return gpg_error (GPG_ERR_INV_ARG); */
+  if (!hostname)
+    {
+      free (tls->hostname);
+      tls->hostname = NULL;
+    }
 
-/*   ssl->hostname = malloc (ssl->hostname_len + 1); */
-/*   if (!ssl->hostname) */
-/*     return gpg_error_from_syserror (); */
+  len = strlen (hostname);
+  if ( len + 1 < len )
+    return gpg_error (GPG_ERR_EOVERFLOW);
 
-/*   memcpy (ssl->hostname, hostname, ssl->hostname_len); */
-/*   ssl->hostname[ssl->hostname_len] = '\0'; */
+  tls->hostname = malloc (len + 1);
+  if (!tls->hostname)
+    return gpg_error_from_syserror ();
+  strcpy (tls->hostname, hostname);
 
-/*   return 0; */
-/* } */
+  return 0;
+}
 
 
 /* void */
index d25d3e0..c4e0c71 100644 (file)
@@ -69,6 +69,12 @@ ntbtls_get_stream (ntbtls_t tls,
 
 
 gpg_error_t
+ntbtls_set_hostname (ntbtls_t tls, const char *hostname)
+{
+  return _ntbtls_set_hostname (tls, hostname);
+}
+
+gpg_error_t
 ntbtls_handshake (ntbtls_t tls)
 {
   return _ntbtls_handshake (tls);
index e5fe0d5..fe9b035 100644 (file)
@@ -47,6 +47,7 @@ MARK_VISIBLE (ntbtls_new)
 MARK_VISIBLE (ntbtls_release)
 MARK_VISIBLE (ntbtls_set_transport)
 MARK_VISIBLE (ntbtls_get_stream)
+MARK_VISIBLE (ntbtls_set_hostname)
 MARK_VISIBLE (ntbtls_handshake)
 
 
@@ -64,6 +65,7 @@ MARK_VISIBLE (ntbtls_handshake)
 #define ntbtls_released              _ntbtls_USE_THE_UNDERSCORED_FUNCTION
 #define ntbtls_set_transport         _ntbtls_USE_THE_UNDERSCORED_FUNCTION
 #define ntbtls_get_stream            _ntbtls_USE_THE_UNDERSCORED_FUNCTION
+#define ntbtls_set_hostname          _ntbtls_USE_THE_UNDERSCORED_FUNCTION
 #define ntbtls_handshake             _ntbtls_USE_THE_UNDERSCORED_FUNCTION