summary refs log tree commit diff
path: root/crypto/src/tls/HandshakeMessageInput.cs
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/tls/HandshakeMessageInput.cs')
-rw-r--r--crypto/src/tls/HandshakeMessageInput.cs36
1 files changed, 35 insertions, 1 deletions
diff --git a/crypto/src/tls/HandshakeMessageInput.cs b/crypto/src/tls/HandshakeMessageInput.cs
index d7cd19994..c15112cc0 100644
--- a/crypto/src/tls/HandshakeMessageInput.cs
+++ b/crypto/src/tls/HandshakeMessageInput.cs
@@ -6,17 +6,51 @@ using Org.BouncyCastle.Utilities.IO;
 
 namespace Org.BouncyCastle.Tls
 {
+    // TODO Rewrite without MemoryStream
     public sealed class HandshakeMessageInput
         : MemoryStream
     {
+        private readonly int m_offset;
+
         internal HandshakeMessageInput(byte[] buf, int offset, int length)
-            : base(buf, offset, length, false)
+            : base(buf, offset, length, false, true)
         {
+#if PORTABLE
+            this.m_offset = 0;
+#else
+            this.m_offset = offset;
+#endif
         }
 
         public void UpdateHash(TlsHash hash)
         {
             Streams.WriteBufTo(this, new TlsHashSink(hash));
         }
+
+        internal void UpdateHashPrefix(TlsHash hash, int bindersSize)
+        {
+#if PORTABLE
+            byte[] buf = ToArray();
+            int count = buf.Length;
+#else
+            byte[] buf = GetBuffer();
+            int count = (int)Length;
+#endif
+
+            hash.Update(buf, m_offset, count - bindersSize);
+        }
+
+        internal void UpdateHashSuffix(TlsHash hash, int bindersSize)
+        {
+#if PORTABLE
+            byte[] buf = ToArray();
+            int count = buf.Length;
+#else
+            byte[] buf = GetBuffer();
+            int count = (int)Length;
+#endif
+
+            hash.Update(buf, m_offset + count - bindersSize, bindersSize);
+        }
     }
 }