Ejemplo n.º 1
0
		protected override void ProcessAsSsl3()
		{
			// Client Version
			this.Write(this.Context.Protocol);

			// Random bytes - Unix time + Radom bytes [28]
			TlsStream clientRandom = new TlsStream();
			clientRandom.Write(this.Context.GetUnixTime());
			clientRandom.Write(this.Context.GetSecureRandomBytes(28));
			this.random = clientRandom.ToArray();
			clientRandom.Reset();

			this.Write(this.random);

			// Session id
			// Check if we have a cache session we could reuse
			this.Context.SessionId = ClientSessionCache.FromHost (this.Context.ClientSettings.TargetHost);
			if (this.Context.SessionId != null)
			{
				this.Write((byte)this.Context.SessionId.Length);
				if (this.Context.SessionId.Length > 0)
				{
					this.Write(this.Context.SessionId);
				}
			}
			else
			{
				this.Write((byte)0);
			}
			
			// Write length of Cipher suites			
			this.Write((short)(this.Context.SupportedCiphers.Count*2));

			// Write Supported Cipher suites
			for (int i = 0; i < this.Context.SupportedCiphers.Count; i++)
			{
				this.Write((short)this.Context.SupportedCiphers[i].Code);
			}

			// Compression methods length
			this.Write((byte)1);
			
			// Compression methods ( 0 = none )
			this.Write((byte)this.Context.CompressionMethod);
		}
Ejemplo n.º 2
0
		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 ());
		}