[BTLS]: Send server name extension on the client.
authorMartin Baulig <martin.baulig@xamarin.com>
Sat, 1 Oct 2016 19:19:22 +0000 (21:19 +0200)
committerMartin Baulig <martin.baulig@xamarin.com>
Sat, 1 Oct 2016 19:33:22 +0000 (21:33 +0200)
(cherry picked from commit 2602c52de4773fe028b36d13d14555036835aa4e)

mcs/class/System/Mono.Btls/MonoBtlsContext.cs
mcs/class/System/Mono.Btls/MonoBtlsSsl.cs
mono/btls/btls-ssl.c
mono/btls/btls-ssl.h
mono/metadata/icall-def.h

index f40107b674b943ec6b96771dc7851ab6676462d4..67b1a203cb81538e6cb77c6e498dd16544fcfe82 100644 (file)
@@ -134,6 +134,8 @@ namespace Mono.Btls
 
                        if (IsServer) {
                                SetPrivateCertificate (nativeServerCertificate);
+                       } else {
+                               ssl.SetServerName (TargetHost);
                        }
                }
 
index 933239de69b2ac6429cae2b7c80dfe47e8e1c9cb..b24ed079ab1c8fa243c266f3b481bc7c3b4d2065 100644 (file)
@@ -121,6 +121,9 @@ namespace Mono.Btls
                [MethodImpl (MethodImplOptions.InternalCall)]
                extern static int mono_btls_ssl_set_verify_param (IntPtr handle, IntPtr param);
 
+               [MethodImpl (MethodImplOptions.InternalCall)]
+               extern static int mono_btls_ssl_set_server_name (IntPtr handle, IntPtr name);
+
                static BoringSslHandle Create_internal (MonoBtlsSslCtx ctx)
                {
                        var handle = mono_btls_ssl_new (ctx.Handle.DangerousGetHandle ());
@@ -391,6 +394,21 @@ namespace Mono.Btls
                        CheckError (ret);
                }
 
+               public void SetServerName (string name)
+               {
+                       CheckThrow ();
+                       IntPtr namePtr = IntPtr.Zero;
+                       try {
+                               namePtr = Marshal.StringToHGlobalAnsi (name);
+                               var ret = mono_btls_ssl_set_server_name (
+                                       Handle.DangerousGetHandle (), namePtr);
+                               CheckError (ret);
+                       } finally {
+                               if (namePtr != IntPtr.Zero)
+                                       Marshal.FreeHGlobal (namePtr);
+                       }
+               }
+
                protected override void Close ()
                {
                        mono_btls_ssl_close (Handle.DangerousGetHandle ());
index f3e3f491464916e58e4719b0a172a249e7806410..fa3e53d4cdf86cfa6de30b1c15802ca3c4ce2105 100644 (file)
@@ -201,3 +201,9 @@ mono_btls_ssl_set_verify_param (MonoBtlsSsl *ptr, const MonoBtlsX509VerifyParam
 {
        return SSL_set1_param (ptr->ssl, mono_btls_x509_verify_param_peek_param (param));
 }
+
+int
+mono_btls_ssl_set_server_name (MonoBtlsSsl *ptr, const char *name)
+{
+       return SSL_set_tlsext_host_name (ptr->ssl, name);
+}
index 7abaeea56f4a0db7e1b1065d11f75fa62bcd6992..10da4364881a7fc51177e9224278e09dfe0d2640 100644 (file)
@@ -74,6 +74,9 @@ mono_btls_ssl_get_error (MonoBtlsSsl *ptr, int ret_code);
 int
 mono_btls_ssl_set_verify_param (MonoBtlsSsl *ptr, const MonoBtlsX509VerifyParam *param);
 
+int
+mono_btls_ssl_set_server_name (MonoBtlsSsl *ptr, const char *name);
+
 void
 mono_btls_ssl_destroy (MonoBtlsSsl *ptr);
 
index c5a9528eb6c1b139c6cf74622ccbcbc8cc4fc8d7..e50ab3777f6728d5ee4ecd373252f6dd529ae61d 100644 (file)
@@ -146,10 +146,11 @@ ICALL(BTLS_SSL_15, "mono_btls_ssl_set_bio", mono_btls_ssl_set_bio)
 ICALL(BTLS_SSL_16, "mono_btls_ssl_set_cipher_list", mono_btls_ssl_set_cipher_list)
 ICALL(BTLS_SSL_17, "mono_btls_ssl_set_max_version", mono_btls_ssl_set_max_version)
 ICALL(BTLS_SSL_18, "mono_btls_ssl_set_min_version", mono_btls_ssl_set_min_version)
-ICALL(BTLS_SSL_19, "mono_btls_ssl_set_verify_param", mono_btls_ssl_set_verify_param)
-ICALL(BTLS_SSL_20, "mono_btls_ssl_use_certificate", mono_btls_ssl_use_certificate)
-ICALL(BTLS_SSL_21, "mono_btls_ssl_use_private_key", mono_btls_ssl_use_private_key)
-ICALL(BTLS_SSL_22, "mono_btls_ssl_write", mono_btls_ssl_write)
+ICALL(BTLS_SSL_19, "mono_btls_ssl_set_server_name", mono_btls_ssl_set_server_name)
+ICALL(BTLS_SSL_20, "mono_btls_ssl_set_verify_param", mono_btls_ssl_set_verify_param)
+ICALL(BTLS_SSL_21, "mono_btls_ssl_use_certificate", mono_btls_ssl_use_certificate)
+ICALL(BTLS_SSL_22, "mono_btls_ssl_use_private_key", mono_btls_ssl_use_private_key)
+ICALL(BTLS_SSL_23, "mono_btls_ssl_write", mono_btls_ssl_write)
 
 ICALL_TYPE(BTLS_SSL_CTX, "Mono.Btls.MonoBtlsSslCtx", BTLS_SSL_CTX_1)
 ICALL(BTLS_SSL_CTX_1, "mono_btls_ssl_ctx_debug_printf", mono_btls_ssl_ctx_debug_printf)