Merge pull request #3950 from mono/work-btls-sni-2
authorMartin Baulig <martin.baulig@xamarin.com>
Wed, 16 Nov 2016 20:48:14 +0000 (21:48 +0100)
committerMartin Baulig <martin.baulig@xamarin.com>
Wed, 16 Nov 2016 20:50:36 +0000 (21:50 +0100)
[BTLS]: Add MonoBtlsSsl.GetServerName() and set MonoTlsConnectionInfo.PeerDomainName
(cherry picked from commit e6aa904d9d47186f01e92afc1d1f6d334aa46d1e)

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

index 051656ce0536f5bff3e4a82fc9f2ed76d344f823..343ecc47e45759d2347c4e8d98b6e019eb3e8a6e 100644 (file)
@@ -270,11 +270,13 @@ namespace Mono.Btls
 
                        var cipher = (CipherSuiteCode)ssl.GetCipher ();
                        var protocol = (TlsProtocolCode)ssl.GetVersion ();
+                       var serverName = ssl.GetServerName ();
                        Debug ("GET CONNECTION INFO: {0:x}:{0} {1:x}:{1} {2}", cipher, protocol, (TlsProtocolCode)protocol);
 
                        connectionInfo = new MonoTlsConnectionInfo {
                                CipherSuiteCode = cipher,
-                               ProtocolVersion = GetProtocol (protocol)
+                               ProtocolVersion = GetProtocol (protocol),
+                               PeerDomainName = serverName
                        };
                }
 
index d7510901357fdb925c7cd32cd7df98e6794cf912..8ef902f3a1ce41404460b053a85b8df59ed44063 100644 (file)
@@ -124,6 +124,9 @@ namespace Mono.Btls
                [DllImport (BTLS_DYLIB)]
                extern static int mono_btls_ssl_set_server_name (IntPtr handle, IntPtr name);
 
+               [DllImport (BTLS_DYLIB)]
+               extern static IntPtr mono_btls_ssl_get_server_name (IntPtr handle);
+
                static BoringSslHandle Create_internal (MonoBtlsSslCtx ctx)
                {
                        var handle = mono_btls_ssl_new (ctx.Handle.DangerousGetHandle ());
@@ -409,6 +412,16 @@ namespace Mono.Btls
                        }
                }
 
+               public string GetServerName ()
+               {
+                       CheckThrow ();
+                       var namePtr = mono_btls_ssl_get_server_name (
+                               Handle.DangerousGetHandle ());
+                       if (namePtr == IntPtr.Zero)
+                               return null;
+                       return Marshal.PtrToStringAnsi (namePtr);
+               }
+
                protected override void Close ()
                {
                        mono_btls_ssl_close (Handle.DangerousGetHandle ());
index f18d6c19247d968557f054379b1a22e1d54b2571..dda74ec4b5eae5788dd0015565be95f576f9ef5c 100644 (file)
@@ -207,3 +207,9 @@ mono_btls_ssl_set_server_name (MonoBtlsSsl *ptr, const char *name)
 {
        return SSL_set_tlsext_host_name (ptr->ssl, name);
 }
+
+MONO_API const char *
+mono_btls_ssl_get_server_name (MonoBtlsSsl *ptr)
+{
+       return SSL_get_servername (ptr->ssl, TLSEXT_NAMETYPE_host_name);
+}
index 10da4364881a7fc51177e9224278e09dfe0d2640..98b017340e1b1a956da2bafdaf056e5bd3c0b33b 100644 (file)
@@ -77,6 +77,9 @@ mono_btls_ssl_set_verify_param (MonoBtlsSsl *ptr, const MonoBtlsX509VerifyParam
 int
 mono_btls_ssl_set_server_name (MonoBtlsSsl *ptr, const char *name);
 
+const char *
+mono_btls_ssl_get_server_name (MonoBtlsSsl *ptr);
+
 void
 mono_btls_ssl_destroy (MonoBtlsSsl *ptr);