X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FMono.Security%2FMono.Security.Protocol.Tls.Handshake.Client%2FTlsClientHello.cs;h=42ca34523a44e8215bb767e030d0b2cb1581a327;hb=8bb9b4409d3f73fdf5ec2afc3b9add6bd33f712f;hp=9800ce04c0b26d99bf40b311616c3042c5c7825c;hpb=f84f760a1c8a8c0ec6ae16b7f38d14a49d329ad7;p=mono.git diff --git a/mcs/class/Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsClientHello.cs b/mcs/class/Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsClientHello.cs index 9800ce04c0b..42ca34523a4 100644 --- a/mcs/class/Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsClientHello.cs +++ b/mcs/class/Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsClientHello.cs @@ -23,6 +23,7 @@ // using System; +using System.Net; using System.Security.Cryptography; namespace Mono.Security.Protocol.Tls.Handshake.Client @@ -63,15 +64,10 @@ namespace Mono.Security.Protocol.Tls.Handshake.Client #region Protected Methods protected override void ProcessAsSsl3() - { - this.ProcessAsTls1(); - } - - protected override void ProcessAsTls1() { // Client Version this.Write(this.Context.Protocol); - + // Random bytes - Unix time + Radom bytes [28] TlsStream clientRandom = new TlsStream(); clientRandom.Write(this.Context.GetUnixTime()); @@ -113,6 +109,31 @@ namespace Mono.Security.Protocol.Tls.Handshake.Client this.Write((byte)this.Context.CompressionMethod); } + protected override void ProcessAsTls1() + { + ProcessAsSsl3 (); + + // If applicable add the "server_name" extension to the hello message + // http://www.ietf.org/rfc/rfc3546.txt + string host = Context.ClientSettings.TargetHost; + // Our TargetHost might be an address (not a host *name*) - see bug #8553 + // RFC3546 -> Literal IPv4 and IPv6 addresses are not permitted in "HostName". + IPAddress addr; + if (IPAddress.TryParse (host, out addr)) + return; + + TlsStream extensions = new TlsStream (); + byte[] server_name = System.Text.Encoding.UTF8.GetBytes (host); + extensions.Write ((short) 0x0000); // ExtensionType: server_name (0) + extensions.Write ((short) (server_name.Length + 5)); // ServerNameList (length) + extensions.Write ((short) (server_name.Length + 3)); // ServerName (length) + extensions.Write ((byte) 0x00); // NameType: host_name (0) + extensions.Write ((short) server_name.Length); // HostName (length) + extensions.Write (server_name); // HostName (UTF8) + this.Write ((short) extensions.Length); + this.Write (extensions.ToArray ()); + } + #endregion } } \ No newline at end of file