Merge pull request #216 from ilkerde/master
[mono.git] / mcs / class / Mono.Security / Mono.Security.Protocol.Tls.Handshake.Client / TlsClientKeyExchange.cs
index cb4a1721150c118a70e2d6d8fdedd82b229e7b9f..3534d8331707ad0a7429ddd7ea5b6489cfe5490e 100644 (file)
@@ -1,6 +1,6 @@
 // Transport Security Layer (TLS)
 // Copyright (c) 2003-2004 Carlos Guzman Alvarez
-
+// Copyright (C) 2006 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//\r
-\r
+//
+
 using System;
-using System.IO;
 using System.Security.Cryptography;
 
 using Mono.Security.Cryptography;
@@ -45,43 +44,22 @@ namespace Mono.Security.Protocol.Tls.Handshake.Client
 
                protected override void ProcessAsSsl3()
                {
-                       // Compute pre master secret
-                       byte[] preMasterSecret = this.Context.Cipher.CreatePremasterSecret();
-
-                       // Create a new RSA key
-                       RSA rsa = null;
-                       if (this.Context.ServerSettings.ServerKeyExchange) 
-                       {
-                               // this is the case for "exportable" ciphers
-                               rsa = new RSAManaged ();
-                               rsa.ImportParameters (this.Context.ServerSettings.RsaParameters);
-                       }
-                       else 
-                       {
-                               rsa = this.Context.ServerSettings.CertificateRSA;
-                       }
-                       
-                       // Encrypt premaster_sercret
-                       RSAPKCS1KeyExchangeFormatter formatter = new RSAPKCS1KeyExchangeFormatter(rsa);
-
-                       // Write the preMasterSecret encrypted
-                       byte[] buffer = formatter.CreateKeyExchange(preMasterSecret);
-                       this.Write(buffer);
-
-                       // Create master secret
-                       this.Context.Cipher.ComputeMasterSecret(preMasterSecret);
-
-                       // Create keys
-                       this.Context.Cipher.ComputeKeys();
-
-                       // Clear resources
-                       rsa.Clear();
+                       // a large chunk of code is common to both SSL3 and TLS1
+                       // SSL3 doesn't send the length of the buffer
+                       ProcessCommon (false);
                }
 
                protected override void ProcessAsTls1()
+               {
+                       // a large chunk of code is common to both SSL3 and TLS1
+                       // TLS1 does send the length of the buffer
+                       ProcessCommon (true);
+               }
+
+               public void ProcessCommon (bool sendLength)
                {
                        // Compute pre master secret
-                       byte[] preMasterSecret = this.Context.Cipher.CreatePremasterSecret();
+                       byte[] preMasterSecret = this.Context.Negotiating.Cipher.CreatePremasterSecret ();
 
                        // Create a new RSA key
                        RSA rsa = null;
@@ -91,27 +69,28 @@ namespace Mono.Security.Protocol.Tls.Handshake.Client
                                rsa = new RSAManaged ();
                                rsa.ImportParameters (this.Context.ServerSettings.RsaParameters);
                        }
-                       else 
+                       else
                        {
                                rsa = this.Context.ServerSettings.CertificateRSA;
                        }
-                       
+
                        // Encrypt premaster_sercret
-                       RSAPKCS1KeyExchangeFormatter formatter = new RSAPKCS1KeyExchangeFormatter(rsa);
+                       RSAPKCS1KeyExchangeFormatter formatter = new RSAPKCS1KeyExchangeFormatter (rsa);
 
                        // Write the preMasterSecret encrypted
-                       byte[] buffer = formatter.CreateKeyExchange(preMasterSecret);
-                       this.Write((short)buffer.Length);
-                       this.Write(buffer);
+                       byte[] buffer = formatter.CreateKeyExchange (preMasterSecret);
+                       if (sendLength)
+                               this.Write ((short) buffer.Length);
+                       this.Write (buffer);
 
                        // Create master secret
-                       this.Context.Cipher.ComputeMasterSecret(preMasterSecret);
+                       this.Context.Negotiating.Cipher.ComputeMasterSecret (preMasterSecret);
 
                        // Create keys
-                       this.Context.Cipher.ComputeKeys();
+                       this.Context.Negotiating.Cipher.ComputeKeys ();
 
                        // Clear resources
-                       rsa.Clear();
+                       rsa.Clear ();
                }
 
                #endregion