-/* 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
+ }
+}