copying the latest Sys.Web.Services from trunk.
[mono.git] / mcs / class / Mono.Security / Mono.Security.Protocol.Tls / TlsStream.cs
index c6ebee5de8d7befcae195fbad060c1439b9ee6f9..cb112e9bdad92d7ca5416e4ee6de9554f8ef6427 100644 (file)
-/* Transport Security Layer (TLS)\r
- * Copyright (c) 2003 Carlos Guzmán Álvarez\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
-using System.Net;\r
-\r
-namespace Mono.Security.Protocol.Tls\r
-{\r
-       internal class TlsStream : Stream\r
-       {\r
-               #region FIELDS\r
-\r
-               private bool                            canRead;\r
-               private bool                            canWrite;\r
-               private MemoryStream            buffer;\r
-\r
-               #endregion\r
-\r
-               #region PROPERTIES\r
-\r
-               public bool EOF\r
-               {\r
-                       get \r
-                       {\r
-                               if (this.Position < this.Length)\r
-                               {\r
-                                       return false;\r
-                               }\r
-                               else\r
-                               {\r
-                                       return true;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               #endregion\r
-\r
-               #region STREAM_PROPERTIES\r
-\r
-               public override bool CanWrite\r
-               {\r
-                       get { return canWrite; }\r
-               }\r
-\r
-               public override bool CanRead\r
-               {\r
-                       get { return canRead; }\r
-               }\r
-\r
-               public override bool CanSeek\r
-               {\r
-                       get { return buffer.CanSeek; }\r
-               }\r
-\r
-               public override long Position\r
-               {\r
-                       get { return buffer.Position; }\r
-                       set { buffer.Position = value; }\r
-               }\r
-\r
-               public override long Length\r
-               {\r
-                       get { return buffer.Length; }\r
-               }\r
-\r
-               #endregion\r
-\r
-               #region CONSTRUCTORS\r
-\r
-               public TlsStream() : base()\r
-               {\r
-                       this.buffer             = new MemoryStream(0);\r
-                       this.canRead    = false;\r
-                       this.canWrite   = true;\r
-               }\r
-\r
-               public TlsStream(byte[] data) : base()\r
-               {\r
-                       this.buffer             = new MemoryStream(data);\r
-                       this.canRead    = true;\r
-                       this.canWrite   = false;\r
-               }\r
-\r
-               #endregion\r
-\r
-               #region SPECIFIC_READ_METHODS\r
-\r
-               public new byte ReadByte()\r
-               {\r
-                       return (byte)base.ReadByte();\r
-               }\r
-\r
-               public short ReadInt16()\r
-               {\r
-                       byte[] bytes = this.ReadBytes(2);\r
-\r
-                       return IPAddress.HostToNetworkOrder(BitConverter.ToInt16(bytes, 0));\r
-               }\r
-\r
-               public int ReadInt24()\r
-               {\r
-                       byte[] b = this.ReadBytes(3);\r
-                       \r
-                       return ((b[0] & 0xff) << 16) | ((b[1] & 0xff) << 8) | (b[2] & 0xff);\r
-               }\r
-\r
-               public int ReadInt32()\r
-               {\r
-                       byte[] bytes = this.ReadBytes(4);\r
-\r
-                       return IPAddress.HostToNetworkOrder(BitConverter.ToInt32(bytes, 0));\r
-               }\r
-\r
-               public long ReadInt64()\r
-               {\r
-                       byte[] bytes = this.ReadBytes(8);\r
-                                               \r
-                       return IPAddress.HostToNetworkOrder(BitConverter.ToInt64(bytes, 0));\r
-               }\r
-\r
-               public byte[] ReadBytes(int count)\r
-               {\r
-                       byte[] bytes = new byte[count];\r
-                       this.Read(bytes, 0, count);\r
-\r
-                       return bytes;\r
-               }\r
-\r
-               #endregion\r
-\r
-               #region SPECIFIC_WRITE_METHODS\r
-\r
-               public void Write(byte value)\r
-               {\r
-                       WriteByte(value);\r
-               }\r
-\r
-               public void Write(short value)\r
-               {\r
-                       byte[] bytes = BitConverter.GetBytes((short)IPAddress.HostToNetworkOrder(value));\r
-                       Write(bytes);\r
-               }\r
-\r
-               public void WriteInt24(int value)\r
-               {\r
-                       int int24 = IPAddress.HostToNetworkOrder(value);\r
-                       byte[] content = new byte[3];\r
-                               \r
-                       System.Array.Copy(BitConverter.GetBytes(int24), 1, content, 0, 3);\r
-\r
-                       Write(content);\r
-               }\r
-\r
-               public void Write(int value)\r
-               {\r
-                       byte[] bytes = BitConverter.GetBytes((int)IPAddress.HostToNetworkOrder(value));\r
-                       Write(bytes);\r
-               }\r
-\r
-               public void Write(long value)\r
-               {\r
-                       byte[] bytes = BitConverter.GetBytes((long)IPAddress.HostToNetworkOrder(value));\r
-                       Write(bytes);\r
-               }\r
-\r
-               public void Write(byte[] buffer)\r
-               {\r
-                       Write(buffer, 0, buffer.Length);\r
-               }\r
-\r
-               #endregion\r
-\r
-               #region METHODS\r
-\r
-               public void Reset()\r
-               {\r
-                       buffer.SetLength(0);\r
-                       buffer.Position = 0;\r
-               }\r
-\r
-               public byte[] ToArray()\r
-               {\r
-                       return buffer.ToArray();\r
-               }\r
-\r
-               #endregion\r
-\r
-               #region STREAM_METHODS\r
-\r
-               public override void Flush()\r
-               {\r
-                       buffer.Flush();\r
-               }\r
-\r
-               public override void SetLength(long length)\r
-               {\r
-                       buffer.SetLength(length);\r
-               }\r
-\r
-               public override long Seek(long offset, System.IO.SeekOrigin loc)\r
-               {\r
-                       return buffer.Seek(offset, loc);\r
-               }\r
-\r
-               public override int Read(byte[] buffer, int offset, int count)\r
-               {\r
-                       if (canRead)\r
-                       {\r
-                               return this.buffer.Read(buffer, offset, count);\r
-                       }\r
-                       throw new InvalidOperationException("Read operations are not allowed by this stream");\r
-               }\r
-\r
-               public override void Write(byte[] buffer, int offset, int count)\r
-               {\r
-                       if (canWrite)\r
-                       {\r
-                               this.buffer.Write(buffer, offset, count);\r
-                       }\r
-                       else\r
-                       {\r
-                               throw new InvalidOperationException("Write operations are not allowed by this stream");\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 System.Net;
+
+namespace Mono.Security.Protocol.Tls
+{
+       internal class TlsStream : Stream
+       {
+               #region Fields
+
+               private bool                            canRead;
+               private bool                            canWrite;
+               private MemoryStream            buffer;
+
+               #endregion
+
+               #region Properties
+
+               public bool EOF
+               {
+                       get 
+                       {
+                               if (this.Position < this.Length)
+                               {
+                                       return false;
+                               }
+                               else
+                               {
+                                       return true;
+                               }
+                       }
+               }
+
+               #endregion
+
+               #region Stream Properties
+
+               public override bool CanWrite
+               {
+                       get { return this.canWrite; }
+               }
+
+               public override bool CanRead
+               {
+                       get { return this.canRead; }
+               }
+
+               public override bool CanSeek
+               {
+                       get { return this.buffer.CanSeek; }
+               }
+
+               public override long Position
+               {
+                       get { return this.buffer.Position; }
+                       set { this.buffer.Position = value; }
+               }
+
+               public override long Length
+               {
+                       get { return this.buffer.Length; }
+               }
+
+               #endregion
+
+               #region Constructors
+
+               public TlsStream() : base()
+               {
+                       this.buffer             = new MemoryStream(0);
+                       this.canRead    = false;
+                       this.canWrite   = true;
+               }
+
+               public TlsStream(byte[] data) : base()
+               {
+                       this.buffer             = new MemoryStream(data);
+                       this.canRead    = true;
+                       this.canWrite   = false;
+               }
+
+               #endregion
+
+               #region Specific Read Methods
+
+               public new byte ReadByte()
+               {
+                       return (byte)base.ReadByte();
+               }
+
+               public short ReadInt16()
+               {
+                       byte[] bytes = this.ReadBytes(2);
+
+                       return IPAddress.HostToNetworkOrder(BitConverter.ToInt16(bytes, 0));
+               }
+
+               public int ReadInt24()
+               {
+                       byte[] b = this.ReadBytes(3);
+                       
+                       return ((b[0] & 0xff) << 16) | ((b[1] & 0xff) << 8) | (b[2] & 0xff);
+               }
+
+               public int ReadInt32()
+               {
+                       byte[] bytes = this.ReadBytes(4);
+
+                       return IPAddress.HostToNetworkOrder(BitConverter.ToInt32(bytes, 0));
+               }
+
+               public long ReadInt64()
+               {
+                       byte[] bytes = this.ReadBytes(8);
+                                               
+                       return IPAddress.HostToNetworkOrder(BitConverter.ToInt64(bytes, 0));
+               }
+
+               public byte[] ReadBytes(int count)
+               {
+                       byte[] bytes = new byte[count];
+                       this.Read(bytes, 0, count);
+
+                       return bytes;
+               }
+
+               #endregion
+
+               #region Specific Write Methods
+
+               public void Write(byte value)
+               {
+                       this.WriteByte(value);
+               }
+
+               public void Write(short value)
+               {
+                       byte[] bytes = BitConverter.GetBytes((short)IPAddress.HostToNetworkOrder(value));
+                       this.Write(bytes);
+               }
+
+               public void WriteInt24(int value)
+               {
+                       int int24 = IPAddress.HostToNetworkOrder(value);
+                       byte[] content = new byte[3];
+                               
+                       Buffer.BlockCopy(BitConverter.GetBytes(int24), 1, content, 0, 3);
+
+                       this.Write(content);
+               }
+
+               public void Write(int value)
+               {
+                       byte[] bytes = BitConverter.GetBytes((int)IPAddress.HostToNetworkOrder(value));
+                       this.Write(bytes);
+               }
+
+               public void Write(long value)
+               {
+                       byte[] bytes = BitConverter.GetBytes((long)IPAddress.HostToNetworkOrder(value));
+                       this.Write(bytes);
+               }
+
+               public void Write(byte[] buffer)
+               {
+                       this.Write(buffer, 0, buffer.Length);
+               }
+
+               #endregion
+
+               #region Methods
+
+               public void Reset()
+               {
+                       this.buffer.SetLength(0);
+                       this.buffer.Position = 0;
+               }
+
+               public byte[] ToArray()
+               {
+                       return this.buffer.ToArray();
+               }
+
+               #endregion
+
+               #region Stream Methods
+
+               public override void Flush()
+               {
+                       this.buffer.Flush();
+               }
+
+               public override void SetLength(long length)
+               {
+                       this.buffer.SetLength(length);
+               }
+
+               public override long Seek(long offset, System.IO.SeekOrigin loc)
+               {
+                       return this.buffer.Seek(offset, loc);
+               }
+
+               public override int Read(byte[] buffer, int offset, int count)
+               {
+                       if (this.canRead)
+                       {
+                               return this.buffer.Read(buffer, offset, count);
+                       }
+                       throw new InvalidOperationException("Read operations are not allowed by this stream");
+               }
+
+               public override void Write(byte[] buffer, int offset, int count)
+               {
+                       if (this.canWrite)
+                       {
+                               this.buffer.Write(buffer, offset, count);
+                       }
+                       else
+                       {
+                               throw new InvalidOperationException("Write operations are not allowed by this stream");
+                       }
+               }
+
+               #endregion
+       }
+}