summary refs log tree commit diff
path: root/crypto/src/util/encoders/HexEncoder.cs
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/util/encoders/HexEncoder.cs')
-rw-r--r--crypto/src/util/encoders/HexEncoder.cs309
1 files changed, 161 insertions, 148 deletions
diff --git a/crypto/src/util/encoders/HexEncoder.cs b/crypto/src/util/encoders/HexEncoder.cs
index e69a78b0b..af526e0da 100644
--- a/crypto/src/util/encoders/HexEncoder.cs
+++ b/crypto/src/util/encoders/HexEncoder.cs
@@ -3,56 +3,63 @@ using System.IO;
 
 namespace Org.BouncyCastle.Utilities.Encoders
 {
-	public class HexEncoder
-		: IEncoder
-	{
-		private static readonly byte[] encodingTable =
-		{
-			(byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', (byte)'7',
-			(byte)'8', (byte)'9', (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f'
-		};
-
-        private static readonly byte[] decodingTable = ConstructDecodingTable(encodingTable);
-
-        private static byte[] ConstructDecodingTable(byte[] et)
-		{
-            byte[] dt = new byte[128];
-			for (int i = 0; i < et.Length; i++)
-			{
-				dt[et[i]] = (byte)i;
-			}
-
-			dt['A'] = dt['a'];
-			dt['B'] = dt['b'];
-			dt['C'] = dt['c'];
-			dt['D'] = dt['d'];
-			dt['E'] = dt['e'];
-			dt['F'] = dt['f'];
-
-            return dt;
-		}
+    public class HexEncoder
+        : IEncoder
+    {
+        protected readonly byte[] encodingTable =
+        {
+            (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', (byte)'7',
+            (byte)'8', (byte)'9', (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f'
+        };
+
+        /*
+         * set up the decoding table.
+         */
+        protected readonly byte[] decodingTable = new byte[128];
+
+        protected void InitialiseDecodingTable()
+        {
+            Arrays.Fill(decodingTable, (byte)0xff);
+
+            for (int i = 0; i < encodingTable.Length; i++)
+            {
+                decodingTable[encodingTable[i]] = (byte)i;
+            }
+
+            decodingTable['A'] = decodingTable['a'];
+            decodingTable['B'] = decodingTable['b'];
+            decodingTable['C'] = decodingTable['c'];
+            decodingTable['D'] = decodingTable['d'];
+            decodingTable['E'] = decodingTable['e'];
+            decodingTable['F'] = decodingTable['f'];
+        }
+
+        public HexEncoder()
+        {
+            InitialiseDecodingTable();
+        }
 
         /**
-		* encode the input data producing a Hex output stream.
-		*
-		* @return the number of bytes produced.
-		*/
-		public int Encode(
-			byte[]	data,
-			int		off,
-			int		length,
-			Stream	outStream)
-		{
-			for (int i = off; i < (off + length); i++)
-			{
-				int v = data[i];
-
-				outStream.WriteByte(encodingTable[v >> 4]);
-				outStream.WriteByte(encodingTable[v & 0xf]);
-			}
-
-			return length * 2;
-		}
+        * encode the input data producing a Hex output stream.
+        *
+        * @return the number of bytes produced.
+        */
+        public int Encode(
+            byte[]	data,
+            int		off,
+            int		length,
+            Stream	outStream)
+        {
+            for (int i = off; i < (off + length); i++)
+            {
+                int v = data[i];
+
+                outStream.WriteByte(encodingTable[v >> 4]);
+                outStream.WriteByte(encodingTable[v & 0xf]);
+            }
+
+            return length * 2;
+        }
 
         private static bool Ignore(char c)
         {
@@ -60,104 +67,110 @@ namespace Org.BouncyCastle.Utilities.Encoders
         }
 
         /**
-		* decode the Hex encoded byte data writing it to the given output stream,
-		* whitespace characters will be ignored.
-		*
-		* @return the number of bytes produced.
-		*/
-		public int Decode(
-			byte[]	data,
-			int		off,
-			int		length,
-			Stream	outStream)
-		{
-			byte b1, b2;
-			int outLen = 0;
-			int end = off + length;
-
-			while (end > off)
-			{
-				if (!Ignore((char)data[end - 1]))
-				{
-					break;
-				}
-
-				end--;
-			}
-
-			int i = off;
-			while (i < end)
-			{
-				while (i < end && Ignore((char)data[i]))
-				{
-					i++;
-				}
-
-				b1 = decodingTable[data[i++]];
-
-				while (i < end && Ignore((char)data[i]))
-				{
-					i++;
-				}
-
-				b2 = decodingTable[data[i++]];
-
-				outStream.WriteByte((byte)((b1 << 4) | b2));
-
-				outLen++;
-			}
-
-			return outLen;
-		}
-
-		/**
-		* decode the Hex encoded string data writing it to the given output stream,
-		* whitespace characters will be ignored.
-		*
-		* @return the number of bytes produced.
-		*/
-		public int DecodeString(
-			string	data,
-			Stream	outStream)
-		{
-			byte    b1, b2;
-			int     length = 0;
-
-			int     end = data.Length;
-
-			while (end > 0)
-			{
-				if (!Ignore(data[end - 1]))
-				{
-					break;
-				}
-
-				end--;
-			}
-
-			int i = 0;
-			while (i < end)
-			{
-				while (i < end && Ignore(data[i]))
-				{
-					i++;
-				}
-
-				b1 = decodingTable[data[i++]];
-
-				while (i < end && Ignore(data[i]))
-				{
-					i++;
-				}
-
-				b2 = decodingTable[data[i++]];
-
-				outStream.WriteByte((byte)((b1 << 4) | b2));
-
-				length++;
-			}
-
-			return length;
-		}
-	}
+        * decode the Hex encoded byte data writing it to the given output stream,
+        * whitespace characters will be ignored.
+        *
+        * @return the number of bytes produced.
+        */
+        public int Decode(
+            byte[]	data,
+            int		off,
+            int		length,
+            Stream	outStream)
+        {
+            byte b1, b2;
+            int outLen = 0;
+            int end = off + length;
+
+            while (end > off)
+            {
+                if (!Ignore((char)data[end - 1]))
+                {
+                    break;
+                }
+
+                end--;
+            }
+
+            int i = off;
+            while (i < end)
+            {
+                while (i < end && Ignore((char)data[i]))
+                {
+                    i++;
+                }
+
+                b1 = decodingTable[data[i++]];
+
+                while (i < end && Ignore((char)data[i]))
+                {
+                    i++;
+                }
+
+                b2 = decodingTable[data[i++]];
+
+                if ((b1 | b2) >= 0x80)
+                    throw new IOException("invalid characters encountered in Hex data");
+
+                outStream.WriteByte((byte)((b1 << 4) | b2));
+
+                outLen++;
+            }
+
+            return outLen;
+        }
+
+        /**
+        * decode the Hex encoded string data writing it to the given output stream,
+        * whitespace characters will be ignored.
+        *
+        * @return the number of bytes produced.
+        */
+        public int DecodeString(
+            string	data,
+            Stream	outStream)
+        {
+            byte    b1, b2;
+            int     length = 0;
+
+            int     end = data.Length;
+
+            while (end > 0)
+            {
+                if (!Ignore(data[end - 1]))
+                {
+                    break;
+                }
+
+                end--;
+            }
+
+            int i = 0;
+            while (i < end)
+            {
+                while (i < end && Ignore(data[i]))
+                {
+                    i++;
+                }
+
+                b1 = decodingTable[data[i++]];
+
+                while (i < end && Ignore(data[i]))
+                {
+                    i++;
+                }
+
+                b2 = decodingTable[data[i++]];
+
+                if ((b1 | b2) >= 0x80)
+                    throw new IOException("invalid characters encountered in Hex data");
+
+                outStream.WriteByte((byte)((b1 << 4) | b2));
+
+                length++;
+            }
+
+            return length;
+        }
+    }
 }