Warnings
[mono.git] / mcs / class / Mono.Security / Mono.Security.Protocol.Tls / ServerRecordProtocol.cs
index 1e6f99297303dcb0ddd89c81fb80ee6bcb895270..015a3d2edd6c1f1523330c4cdb2312ef4e16057b 100644 (file)
-/* Transport Security Layer (TLS)\r
- * Copyright (c) 2003-2004 Carlos Guzman Alvarez\r
- * \r
- * Permission is hereby granted, free of charge, to any person \r
- * obtaining a copy of this software and associated documentation \r
- * files (the "Software"), to deal in the Software without restriction, \r
- * including without limitation the rights to use, copy, modify, merge, \r
- * publish, distribute, sublicense, and/or sell copies of the Software, \r
- * and to permit persons to whom the Software is furnished to do so, \r
- * subject to the following conditions:\r
- * \r
- * The above copyright notice and this permission notice shall be included \r
- * in all copies or substantial portions of the Software.\r
- * \r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, \r
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES \r
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND \r
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \r
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, \r
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, \r
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \r
- * DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-using System;\r
-using System.IO;\r
-\r
-using Mono.Security.Protocol.Tls.Handshake;\r
-using Mono.Security.Protocol.Tls.Handshake.Server;\r
-\r
-namespace Mono.Security.Protocol.Tls\r
-{\r
-       internal class ServerRecordProtocol : RecordProtocol\r
-       {\r
-               #region Constructors\r
-\r
-               public ServerRecordProtocol(\r
-                       Stream                  innerStream, \r
-                       ServerContext   context) : base(innerStream, context)\r
-               {\r
-               }\r
-\r
-               #endregion\r
-\r
-               #region Send Messages\r
-\r
-               public override void SendRecord(HandshakeType type)\r
-               {\r
-                       // Create the record message\r
-                       HandshakeMessage msg = this.createServerHandshakeMessage(type);\r
-                       \r
-                       // Write record\r
-                       this.SendRecord(msg.ContentType, msg.EncodeMessage());\r
-\r
-                       // Update session\r
-                       msg.Update();\r
-\r
-                       // Reset message contents\r
-                       msg.Reset();\r
-               }\r
-\r
-               #endregion\r
-\r
-               #region Handshake Processing Methods\r
-\r
-               protected override void ProcessHandshakeMessage(TlsStream handMsg)\r
-               {\r
-                       HandshakeType           handshakeType   = (HandshakeType)handMsg.ReadByte();\r
-                       HandshakeMessage        message                 = null;\r
-\r
-                       // Read message length\r
-                       int length = handMsg.ReadInt24();\r
-\r
-                       // Read message data\r
-                       byte[] data = new byte[length];\r
-                       handMsg.Read(data, 0, length);\r
-\r
-                       // Create and process the server message\r
-                       message = this.createClientHandshakeMessage(handshakeType, data);\r
-\r
-                       // Update the last handshake message\r
-                       this.Context.LastHandshakeMsg = handshakeType;\r
-\r
-                       // Update session\r
-                       if (message != null)\r
-                       {\r
-                               message.Update();\r
-                       }\r
-               }\r
-\r
-               #endregion\r
-\r
-               #region Server Handshake Message Factories\r
-\r
-               private HandshakeMessage createClientHandshakeMessage(\r
-                       HandshakeType type, byte[] buffer)\r
-               {\r
-                       switch (type)\r
-                       {\r
-                               case HandshakeType.ClientHello:\r
-                                       return new TlsClientHello(this.context, buffer);\r
-\r
-                               case HandshakeType.Certificate:\r
-                                       return new TlsClientCertificate(this.context, buffer);\r
-\r
-                               case HandshakeType.ClientKeyExchange:\r
-                                       return new TlsClientKeyExchange(this.context, buffer);\r
-\r
-                               case HandshakeType.CertificateVerify:\r
-                                       return new TlsClientCertificateVerify(this.context, buffer);\r
-\r
-                               case HandshakeType.Finished:\r
-                                       return new TlsClientFinished(this.context, buffer);\r
-\r
-                               default:\r
-                                       throw this.context.CreateException("Unknown server handshake message received ({0})", type.ToString());\r
-                       }\r
-               }\r
-\r
-               private HandshakeMessage createServerHandshakeMessage(\r
-                       HandshakeType type)\r
-               {\r
-                       switch (type)\r
-                       {\r
-                               case HandshakeType.HelloRequest:\r
-                                       this.SendRecord(HandshakeType.ClientHello);\r
-                                       return null;\r
-\r
-                               case HandshakeType.ServerHello:\r
-                                       return new TlsServerHello(this.context);\r
-\r
-                               case HandshakeType.Certificate:\r
-                                       return new TlsServerCertificate(this.context);\r
-\r
-                               case HandshakeType.ServerKeyExchange:\r
-                                       return new TlsServerKeyExchange(this.context);\r
-\r
-                               case HandshakeType.CertificateRequest:\r
-                                       return new TlsServerCertificateRequest(this.context);\r
-\r
-                               case HandshakeType.ServerHelloDone:\r
-                                       return new TlsServerHelloDone(this.context);\r
-\r
-                               case HandshakeType.Finished:\r
-                                       return new TlsServerFinished(this.context);\r
-\r
-                               default:\r
-                                       throw new InvalidOperationException("Unknown server handshake message type: " + type.ToString() );                                      \r
-                       }\r
-               }\r
-\r
-               #endregion\r
-       }\r
-}\r
+/* Transport Security Layer (TLS)
+ * Copyright (c) 2003-2004 Carlos Guzman Alvarez
+ * 
+ * Permission is hereby granted, free of charge, to any person 
+ * obtaining a copy of this software and associated documentation 
+ * files (the "Software"), to deal in the Software without restriction, 
+ * including without limitation the rights to use, copy, modify, merge, 
+ * publish, distribute, sublicense, and/or sell copies of the Software, 
+ * and to permit persons to whom the Software is furnished to do so, 
+ * subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included 
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
+ * HOLDERS BE 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.
+ */
+
+using System;
+using System.IO;
+
+using Mono.Security.Protocol.Tls.Handshake;
+using Mono.Security.Protocol.Tls.Handshake.Server;
+
+namespace Mono.Security.Protocol.Tls
+{
+       internal class ServerRecordProtocol : RecordProtocol
+       {
+               #region Constructors
+
+               public ServerRecordProtocol(
+                       Stream                  innerStream, 
+                       ServerContext   context) : base(innerStream, context)
+               {
+               }
+
+               #endregion
+
+               #region Send Messages
+
+               public override void SendRecord(HandshakeType type)
+               {
+                       // Create the record message
+                       HandshakeMessage msg = this.createServerHandshakeMessage(type);
+                       
+                       // Write record
+                       this.SendRecord(msg.ContentType, msg.EncodeMessage());
+
+                       // Update session
+                       msg.Update();
+
+                       // Reset message contents
+                       msg.Reset();
+               }
+
+               #endregion
+
+               #region Handshake Processing Methods
+
+               protected override void ProcessChangeCipherSpec()
+               {
+                       // Reset sequence numbers
+                       this.context.ReadSequenceNumber = 0;
+
+                       // Make the pending state to be the current state
+                       this.context.IsActual = true;
+               }
+
+               protected override void ProcessHandshakeMessage(TlsStream handMsg)
+               {
+                       HandshakeType           handshakeType   = (HandshakeType)handMsg.ReadByte();
+                       HandshakeMessage        message                 = null;
+
+                       // Read message length
+                       int length = handMsg.ReadInt24();
+
+                       // Read message data
+                       byte[] data = new byte[length];
+                       handMsg.Read(data, 0, length);
+
+                       // Create and process the server message
+                       message = this.createClientHandshakeMessage(handshakeType, data);
+
+                       // Update the last handshake message
+                       this.Context.LastHandshakeMsg = handshakeType;
+
+                       // Update session
+                       if (message != null)
+                       {
+                               message.Update();
+                       }
+               }
+
+               #endregion
+
+               #region Server Handshake Message Factories
+
+               private HandshakeMessage createClientHandshakeMessage(
+                       HandshakeType type, byte[] buffer)
+               {
+                       switch (type)
+                       {
+                               case HandshakeType.ClientHello:
+                                       return new TlsClientHello(this.context, buffer);
+
+                               case HandshakeType.Certificate:
+                                       return new TlsClientCertificate(this.context, buffer);
+
+                               case HandshakeType.ClientKeyExchange:
+                                       return new TlsClientKeyExchange(this.context, buffer);
+
+                               case HandshakeType.CertificateVerify:
+                                       return new TlsClientCertificateVerify(this.context, buffer);
+
+                               case HandshakeType.Finished:
+                                       return new TlsClientFinished(this.context, buffer);
+
+                               default:
+                                       throw new TlsException(
+                                               AlertDescription.UnexpectedMessage,
+                                               String.Format("Unknown server handshake message received ({0})", type.ToString()));
+                       }
+               }
+
+               private HandshakeMessage createServerHandshakeMessage(
+                       HandshakeType type)
+               {
+                       switch (type)
+                       {
+                               case HandshakeType.HelloRequest:
+                                       this.SendRecord(HandshakeType.ClientHello);
+                                       return null;
+
+                               case HandshakeType.ServerHello:
+                                       return new TlsServerHello(this.context);
+
+                               case HandshakeType.Certificate:
+                                       return new TlsServerCertificate(this.context);
+
+                               case HandshakeType.ServerKeyExchange:
+                                       return new TlsServerKeyExchange(this.context);
+
+                               case HandshakeType.CertificateRequest:
+                                       return new TlsServerCertificateRequest(this.context);
+
+                               case HandshakeType.ServerHelloDone:
+                                       return new TlsServerHelloDone(this.context);
+
+                               case HandshakeType.Finished:
+                                       return new TlsServerFinished(this.context);
+
+                               default:
+                                       throw new InvalidOperationException("Unknown server handshake message type: " + type.ToString() );                                      
+                       }
+               }
+
+               #endregion
+       }
+}