summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2014-07-21 11:15:35 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2014-07-21 11:15:35 +0700
commite4f294fd80d11226b2fe0e0acd5dd2a59b929dbc (patch)
treed29cb025d6bd4ab0eea7c2578c50ae06e1c1f538
parentAsterisk the default coordinates for each curve (diff)
downloadBouncyCastle.NET-ed25519-e4f294fd80d11226b2fe0e0acd5dd2a59b929dbc.tar.xz
De-tabify
-rw-r--r--crypto/test/src/crypto/test/GCMTest.cs916
1 files changed, 458 insertions, 458 deletions
diff --git a/crypto/test/src/crypto/test/GCMTest.cs b/crypto/test/src/crypto/test/GCMTest.cs
index 60630c6e4..4fe185be7 100644
--- a/crypto/test/src/crypto/test/GCMTest.cs
+++ b/crypto/test/src/crypto/test/GCMTest.cs
@@ -14,358 +14,358 @@ using Org.BouncyCastle.Utilities.Test;
 
 namespace Org.BouncyCastle.Crypto.Tests
 {
-	/// <summary>
-	/// Test vectors from "The Galois/Counter Mode of Operation (GCM)", McGrew/Viega, Appendix B
-	/// </summary>
-	[TestFixture]
-	public class GcmTest
-		: SimpleTest
-	{
-		private static readonly string[][] TestVectors = new string[][]
-		{
-			new string[]
-			{
-				"Test Case 1",
-				"00000000000000000000000000000000",
-				"",
-				"",
-				"000000000000000000000000",
-				"",
-				"58e2fccefa7e3061367f1d57a4e7455a",
-			},
-			new string[]
-			{
-				"Test Case 2",
-				"00000000000000000000000000000000",
-				"00000000000000000000000000000000",
-				"",
-				"000000000000000000000000",
-				"0388dace60b6a392f328c2b971b2fe78",
-				"ab6e47d42cec13bdf53a67b21257bddf",
-			},
-			new string[]
-			{
-				"Test Case 3",
-				"feffe9928665731c6d6a8f9467308308",
-				"d9313225f88406e5a55909c5aff5269a"
-				+ "86a7a9531534f7da2e4c303d8a318a72"
-				+ "1c3c0c95956809532fcf0e2449a6b525"
-				+ "b16aedf5aa0de657ba637b391aafd255",
-				"",
-				"cafebabefacedbaddecaf888",
-				"42831ec2217774244b7221b784d0d49c"
-				+ "e3aa212f2c02a4e035c17e2329aca12e"
-				+ "21d514b25466931c7d8f6a5aac84aa05"
-				+ "1ba30b396a0aac973d58e091473f5985",
-				"4d5c2af327cd64a62cf35abd2ba6fab4",
-			},
-			new string[]
-			{
-				"Test Case 4",
-				"feffe9928665731c6d6a8f9467308308",
-				"d9313225f88406e5a55909c5aff5269a"
-				+ "86a7a9531534f7da2e4c303d8a318a72"
-				+ "1c3c0c95956809532fcf0e2449a6b525"
-				+ "b16aedf5aa0de657ba637b39",
-				"feedfacedeadbeeffeedfacedeadbeef"
-				+ "abaddad2",
-				"cafebabefacedbaddecaf888",
-				"42831ec2217774244b7221b784d0d49c"
-				+ "e3aa212f2c02a4e035c17e2329aca12e"
-				+ "21d514b25466931c7d8f6a5aac84aa05"
-				+ "1ba30b396a0aac973d58e091",
-				"5bc94fbc3221a5db94fae95ae7121a47",
-			},
-			new string[]
-			{
-				"Test Case 5",
-				"feffe9928665731c6d6a8f9467308308",
-				"d9313225f88406e5a55909c5aff5269a"
-				+ "86a7a9531534f7da2e4c303d8a318a72"
-				+ "1c3c0c95956809532fcf0e2449a6b525"
-				+ "b16aedf5aa0de657ba637b39",
-				"feedfacedeadbeeffeedfacedeadbeef"
-				+ "abaddad2",
-				"cafebabefacedbad",
-				"61353b4c2806934a777ff51fa22a4755"
-				+ "699b2a714fcdc6f83766e5f97b6c7423"
-				+ "73806900e49f24b22b097544d4896b42"
-				+ "4989b5e1ebac0f07c23f4598",
-				"3612d2e79e3b0785561be14aaca2fccb",
-			},
-			new string[]
-			{
-				"Test Case 6",
-				"feffe9928665731c6d6a8f9467308308",
-				"d9313225f88406e5a55909c5aff5269a"
-				+ "86a7a9531534f7da2e4c303d8a318a72"
-				+ "1c3c0c95956809532fcf0e2449a6b525"
-				+ "b16aedf5aa0de657ba637b39",
-				"feedfacedeadbeeffeedfacedeadbeef"
-				+ "abaddad2",
-				"9313225df88406e555909c5aff5269aa"
-				+ "6a7a9538534f7da1e4c303d2a318a728"
-				+ "c3c0c95156809539fcf0e2429a6b5254"
-				+ "16aedbf5a0de6a57a637b39b",
-				"8ce24998625615b603a033aca13fb894"
-				+ "be9112a5c3a211a8ba262a3cca7e2ca7"
-				+ "01e4a9a4fba43c90ccdcb281d48c7c6f"
-				+ "d62875d2aca417034c34aee5",
-				"619cc5aefffe0bfa462af43c1699d050",
-			},
-			new string[]
-			{
-				"Test Case 7",
-				"00000000000000000000000000000000"
-				+ "0000000000000000",
-				"",
-				"",
-				"000000000000000000000000",
-				"",
-				"cd33b28ac773f74ba00ed1f312572435",
-			},
-			new string[]
-			{
-				"Test Case 8",
-				"00000000000000000000000000000000"
-				+ "0000000000000000",
-				"00000000000000000000000000000000",
-				"",
-				"000000000000000000000000",
-				"98e7247c07f0fe411c267e4384b0f600",
-				"2ff58d80033927ab8ef4d4587514f0fb",
-			},
-			new string[]
-			{
-				"Test Case 9",
-				"feffe9928665731c6d6a8f9467308308"
-				+ "feffe9928665731c",
-				"d9313225f88406e5a55909c5aff5269a"
-				+ "86a7a9531534f7da2e4c303d8a318a72"
-				+ "1c3c0c95956809532fcf0e2449a6b525"
-				+ "b16aedf5aa0de657ba637b391aafd255",
-				"",
-				"cafebabefacedbaddecaf888",
-				"3980ca0b3c00e841eb06fac4872a2757"
-				+ "859e1ceaa6efd984628593b40ca1e19c"
-				+ "7d773d00c144c525ac619d18c84a3f47"
-				+ "18e2448b2fe324d9ccda2710acade256",
-				"9924a7c8587336bfb118024db8674a14",
-			},
-			new string[]
-			{
-				"Test Case 10",
-				"feffe9928665731c6d6a8f9467308308"
-				+ "feffe9928665731c",
-				"d9313225f88406e5a55909c5aff5269a"
-				+ "86a7a9531534f7da2e4c303d8a318a72"
-				+ "1c3c0c95956809532fcf0e2449a6b525"
-				+ "b16aedf5aa0de657ba637b39",
-				"feedfacedeadbeeffeedfacedeadbeef"
-				+ "abaddad2",
-				"cafebabefacedbaddecaf888",
-				"3980ca0b3c00e841eb06fac4872a2757"
-				+ "859e1ceaa6efd984628593b40ca1e19c"
-				+ "7d773d00c144c525ac619d18c84a3f47"
-				+ "18e2448b2fe324d9ccda2710",
-				"2519498e80f1478f37ba55bd6d27618c",
-			},
-			new string[]
-			{
-				"Test Case 11",
-				"feffe9928665731c6d6a8f9467308308"
-				+ "feffe9928665731c",
-				"d9313225f88406e5a55909c5aff5269a"
-				+ "86a7a9531534f7da2e4c303d8a318a72"
-				+ "1c3c0c95956809532fcf0e2449a6b525"
-				+ "b16aedf5aa0de657ba637b39",
-				"feedfacedeadbeeffeedfacedeadbeef"
-				+ "abaddad2",
-				"cafebabefacedbad",
-				"0f10f599ae14a154ed24b36e25324db8"
-				+ "c566632ef2bbb34f8347280fc4507057"
-				+ "fddc29df9a471f75c66541d4d4dad1c9"
-				+ "e93a19a58e8b473fa0f062f7",
-				"65dcc57fcf623a24094fcca40d3533f8",
-			},
-			new string[]
-			{
-				"Test Case 12",
-				"feffe9928665731c6d6a8f9467308308"
-				+ "feffe9928665731c",
-				"d9313225f88406e5a55909c5aff5269a"
-				+ "86a7a9531534f7da2e4c303d8a318a72"
-				+ "1c3c0c95956809532fcf0e2449a6b525"
-				+ "b16aedf5aa0de657ba637b39",
-				"feedfacedeadbeeffeedfacedeadbeef"
-				+ "abaddad2",
-				"9313225df88406e555909c5aff5269aa"
-				+ "6a7a9538534f7da1e4c303d2a318a728"
-				+ "c3c0c95156809539fcf0e2429a6b5254"
-				+ "16aedbf5a0de6a57a637b39b",
-				"d27e88681ce3243c4830165a8fdcf9ff"
-				+ "1de9a1d8e6b447ef6ef7b79828666e45"
-				+ "81e79012af34ddd9e2f037589b292db3"
-				+ "e67c036745fa22e7e9b7373b",
-				"dcf566ff291c25bbb8568fc3d376a6d9",
-			},
-			new string[]
-			{
-				"Test Case 13",
-				"00000000000000000000000000000000"
-				+ "00000000000000000000000000000000",
-				"",
-				"",
-				"000000000000000000000000",
-				"",
-				"530f8afbc74536b9a963b4f1c4cb738b",
-			},
-			new string[]
-			{
-				"Test Case 14",
-				"00000000000000000000000000000000"
-				+ "00000000000000000000000000000000",
-				"00000000000000000000000000000000",
-				"",
-				"000000000000000000000000",
-				"cea7403d4d606b6e074ec5d3baf39d18",
-				"d0d1c8a799996bf0265b98b5d48ab919",
-			},
-			new string[]
-			{
-				"Test Case 15",
-				"feffe9928665731c6d6a8f9467308308"
-				+ "feffe9928665731c6d6a8f9467308308",
-				"d9313225f88406e5a55909c5aff5269a"
-				+ "86a7a9531534f7da2e4c303d8a318a72"
-				+ "1c3c0c95956809532fcf0e2449a6b525"
-				+ "b16aedf5aa0de657ba637b391aafd255",
-				"",
-				"cafebabefacedbaddecaf888",
-				"522dc1f099567d07f47f37a32a84427d"
-				+ "643a8cdcbfe5c0c97598a2bd2555d1aa"
-				+ "8cb08e48590dbb3da7b08b1056828838"
-				+ "c5f61e6393ba7a0abcc9f662898015ad",
-				"b094dac5d93471bdec1a502270e3cc6c",
-			},
-			new string[]
-			{
-				"Test Case 16",
-				"feffe9928665731c6d6a8f9467308308"
-				+ "feffe9928665731c6d6a8f9467308308",
-				"d9313225f88406e5a55909c5aff5269a"
-				+ "86a7a9531534f7da2e4c303d8a318a72"
-				+ "1c3c0c95956809532fcf0e2449a6b525"
-				+ "b16aedf5aa0de657ba637b39",
-				"feedfacedeadbeeffeedfacedeadbeef"
-				+ "abaddad2",
-				"cafebabefacedbaddecaf888",
-				"522dc1f099567d07f47f37a32a84427d"
-				+ "643a8cdcbfe5c0c97598a2bd2555d1aa"
-				+ "8cb08e48590dbb3da7b08b1056828838"
-				+ "c5f61e6393ba7a0abcc9f662",
-				"76fc6ece0f4e1768cddf8853bb2d551b",
-			},
-			new string[]
-			{
-				"Test Case 17",
-				"feffe9928665731c6d6a8f9467308308"
-				+ "feffe9928665731c6d6a8f9467308308",
-				"d9313225f88406e5a55909c5aff5269a"
-				+ "86a7a9531534f7da2e4c303d8a318a72"
-				+ "1c3c0c95956809532fcf0e2449a6b525"
-				+ "b16aedf5aa0de657ba637b39",
-				"feedfacedeadbeeffeedfacedeadbeef"
-				+ "abaddad2",
-				"cafebabefacedbad",
-				"c3762df1ca787d32ae47c13bf19844cb"
-				+ "af1ae14d0b976afac52ff7d79bba9de0"
-				+ "feb582d33934a4f0954cc2363bc73f78"
-				+ "62ac430e64abe499f47c9b1f",
-				"3a337dbf46a792c45e454913fe2ea8f2",
-			},
-			new string[]
-			{
-				"Test Case 18",
-				"feffe9928665731c6d6a8f9467308308"
-				+ "feffe9928665731c6d6a8f9467308308",
-				"d9313225f88406e5a55909c5aff5269a"
-				+ "86a7a9531534f7da2e4c303d8a318a72"
-				+ "1c3c0c95956809532fcf0e2449a6b525"
-				+ "b16aedf5aa0de657ba637b39",
-				"feedfacedeadbeeffeedfacedeadbeef"
-				+ "abaddad2",
-				"9313225df88406e555909c5aff5269aa"
-				+ "6a7a9538534f7da1e4c303d2a318a728"
-				+ "c3c0c95156809539fcf0e2429a6b5254"
-				+ "16aedbf5a0de6a57a637b39b",
-				"5a8def2f0c9e53f1f75d7853659e2a20"
-				+ "eeb2b22aafde6419a058ab4f6f746bf4"
-				+ "0fc0c3b780f244452da3ebf1c5d82cde"
-				+ "a2418997200ef82e44ae7e3f",
-				"a44a8266ee1c8eb0c8b5d4cf5ae9f19a",
-			},
-		};
-
-		public override string Name
-		{
-			get { return "GCM"; }
-		}
-
-		public override void PerformTest()
-		{
-			for (int i = 0; i < TestVectors.Length; ++i)
-			{
-				runTestCase(TestVectors[i]);
-			}
-
-			randomTests();
-		}    
-
-		private void runTestCase(
-			string[] testVector)
-		{
-			for (int macLength = 12; macLength <= 16; ++macLength)
-			{
-				runTestCase(testVector, macLength);
-			}
-		}
-
-		private void runTestCase(
-			string[]	testVector,
-			int			macLength)
-		{
-			int pos = 0;
-			string testName = testVector[pos++];
-			byte[] K = Hex.Decode(testVector[pos++]);
-			byte[] P = Hex.Decode(testVector[pos++]);
-			byte[] A = Hex.Decode(testVector[pos++]);
-			byte[] IV = Hex.Decode(testVector[pos++]);
-			byte[] C = Hex.Decode(testVector[pos++]);
-
-			// For short MAC, take leading bytes
-			byte[] t = Hex.Decode(testVector[pos++]);
-			byte[] T = new byte[macLength];
-			Array.Copy(t, T, T.Length);
-
-			// Default multiplier
+    /// <summary>
+    /// Test vectors from "The Galois/Counter Mode of Operation (GCM)", McGrew/Viega, Appendix B
+    /// </summary>
+    [TestFixture]
+    public class GcmTest
+        : SimpleTest
+    {
+        private static readonly string[][] TestVectors = new string[][]
+        {
+            new string[]
+            {
+                "Test Case 1",
+                "00000000000000000000000000000000",
+                "",
+                "",
+                "000000000000000000000000",
+                "",
+                "58e2fccefa7e3061367f1d57a4e7455a",
+            },
+            new string[]
+            {
+                "Test Case 2",
+                "00000000000000000000000000000000",
+                "00000000000000000000000000000000",
+                "",
+                "000000000000000000000000",
+                "0388dace60b6a392f328c2b971b2fe78",
+                "ab6e47d42cec13bdf53a67b21257bddf",
+            },
+            new string[]
+            {
+                "Test Case 3",
+                "feffe9928665731c6d6a8f9467308308",
+                "d9313225f88406e5a55909c5aff5269a"
+                + "86a7a9531534f7da2e4c303d8a318a72"
+                + "1c3c0c95956809532fcf0e2449a6b525"
+                + "b16aedf5aa0de657ba637b391aafd255",
+                "",
+                "cafebabefacedbaddecaf888",
+                "42831ec2217774244b7221b784d0d49c"
+                + "e3aa212f2c02a4e035c17e2329aca12e"
+                + "21d514b25466931c7d8f6a5aac84aa05"
+                + "1ba30b396a0aac973d58e091473f5985",
+                "4d5c2af327cd64a62cf35abd2ba6fab4",
+            },
+            new string[]
+            {
+                "Test Case 4",
+                "feffe9928665731c6d6a8f9467308308",
+                "d9313225f88406e5a55909c5aff5269a"
+                + "86a7a9531534f7da2e4c303d8a318a72"
+                + "1c3c0c95956809532fcf0e2449a6b525"
+                + "b16aedf5aa0de657ba637b39",
+                "feedfacedeadbeeffeedfacedeadbeef"
+                + "abaddad2",
+                "cafebabefacedbaddecaf888",
+                "42831ec2217774244b7221b784d0d49c"
+                + "e3aa212f2c02a4e035c17e2329aca12e"
+                + "21d514b25466931c7d8f6a5aac84aa05"
+                + "1ba30b396a0aac973d58e091",
+                "5bc94fbc3221a5db94fae95ae7121a47",
+            },
+            new string[]
+            {
+                "Test Case 5",
+                "feffe9928665731c6d6a8f9467308308",
+                "d9313225f88406e5a55909c5aff5269a"
+                + "86a7a9531534f7da2e4c303d8a318a72"
+                + "1c3c0c95956809532fcf0e2449a6b525"
+                + "b16aedf5aa0de657ba637b39",
+                "feedfacedeadbeeffeedfacedeadbeef"
+                + "abaddad2",
+                "cafebabefacedbad",
+                "61353b4c2806934a777ff51fa22a4755"
+                + "699b2a714fcdc6f83766e5f97b6c7423"
+                + "73806900e49f24b22b097544d4896b42"
+                + "4989b5e1ebac0f07c23f4598",
+                "3612d2e79e3b0785561be14aaca2fccb",
+            },
+            new string[]
+            {
+                "Test Case 6",
+                "feffe9928665731c6d6a8f9467308308",
+                "d9313225f88406e5a55909c5aff5269a"
+                + "86a7a9531534f7da2e4c303d8a318a72"
+                + "1c3c0c95956809532fcf0e2449a6b525"
+                + "b16aedf5aa0de657ba637b39",
+                "feedfacedeadbeeffeedfacedeadbeef"
+                + "abaddad2",
+                "9313225df88406e555909c5aff5269aa"
+                + "6a7a9538534f7da1e4c303d2a318a728"
+                + "c3c0c95156809539fcf0e2429a6b5254"
+                + "16aedbf5a0de6a57a637b39b",
+                "8ce24998625615b603a033aca13fb894"
+                + "be9112a5c3a211a8ba262a3cca7e2ca7"
+                + "01e4a9a4fba43c90ccdcb281d48c7c6f"
+                + "d62875d2aca417034c34aee5",
+                "619cc5aefffe0bfa462af43c1699d050",
+            },
+            new string[]
+            {
+                "Test Case 7",
+                "00000000000000000000000000000000"
+                + "0000000000000000",
+                "",
+                "",
+                "000000000000000000000000",
+                "",
+                "cd33b28ac773f74ba00ed1f312572435",
+            },
+            new string[]
+            {
+                "Test Case 8",
+                "00000000000000000000000000000000"
+                + "0000000000000000",
+                "00000000000000000000000000000000",
+                "",
+                "000000000000000000000000",
+                "98e7247c07f0fe411c267e4384b0f600",
+                "2ff58d80033927ab8ef4d4587514f0fb",
+            },
+            new string[]
+            {
+                "Test Case 9",
+                "feffe9928665731c6d6a8f9467308308"
+                + "feffe9928665731c",
+                "d9313225f88406e5a55909c5aff5269a"
+                + "86a7a9531534f7da2e4c303d8a318a72"
+                + "1c3c0c95956809532fcf0e2449a6b525"
+                + "b16aedf5aa0de657ba637b391aafd255",
+                "",
+                "cafebabefacedbaddecaf888",
+                "3980ca0b3c00e841eb06fac4872a2757"
+                + "859e1ceaa6efd984628593b40ca1e19c"
+                + "7d773d00c144c525ac619d18c84a3f47"
+                + "18e2448b2fe324d9ccda2710acade256",
+                "9924a7c8587336bfb118024db8674a14",
+            },
+            new string[]
+            {
+                "Test Case 10",
+                "feffe9928665731c6d6a8f9467308308"
+                + "feffe9928665731c",
+                "d9313225f88406e5a55909c5aff5269a"
+                + "86a7a9531534f7da2e4c303d8a318a72"
+                + "1c3c0c95956809532fcf0e2449a6b525"
+                + "b16aedf5aa0de657ba637b39",
+                "feedfacedeadbeeffeedfacedeadbeef"
+                + "abaddad2",
+                "cafebabefacedbaddecaf888",
+                "3980ca0b3c00e841eb06fac4872a2757"
+                + "859e1ceaa6efd984628593b40ca1e19c"
+                + "7d773d00c144c525ac619d18c84a3f47"
+                + "18e2448b2fe324d9ccda2710",
+                "2519498e80f1478f37ba55bd6d27618c",
+            },
+            new string[]
+            {
+                "Test Case 11",
+                "feffe9928665731c6d6a8f9467308308"
+                + "feffe9928665731c",
+                "d9313225f88406e5a55909c5aff5269a"
+                + "86a7a9531534f7da2e4c303d8a318a72"
+                + "1c3c0c95956809532fcf0e2449a6b525"
+                + "b16aedf5aa0de657ba637b39",
+                "feedfacedeadbeeffeedfacedeadbeef"
+                + "abaddad2",
+                "cafebabefacedbad",
+                "0f10f599ae14a154ed24b36e25324db8"
+                + "c566632ef2bbb34f8347280fc4507057"
+                + "fddc29df9a471f75c66541d4d4dad1c9"
+                + "e93a19a58e8b473fa0f062f7",
+                "65dcc57fcf623a24094fcca40d3533f8",
+            },
+            new string[]
+            {
+                "Test Case 12",
+                "feffe9928665731c6d6a8f9467308308"
+                + "feffe9928665731c",
+                "d9313225f88406e5a55909c5aff5269a"
+                + "86a7a9531534f7da2e4c303d8a318a72"
+                + "1c3c0c95956809532fcf0e2449a6b525"
+                + "b16aedf5aa0de657ba637b39",
+                "feedfacedeadbeeffeedfacedeadbeef"
+                + "abaddad2",
+                "9313225df88406e555909c5aff5269aa"
+                + "6a7a9538534f7da1e4c303d2a318a728"
+                + "c3c0c95156809539fcf0e2429a6b5254"
+                + "16aedbf5a0de6a57a637b39b",
+                "d27e88681ce3243c4830165a8fdcf9ff"
+                + "1de9a1d8e6b447ef6ef7b79828666e45"
+                + "81e79012af34ddd9e2f037589b292db3"
+                + "e67c036745fa22e7e9b7373b",
+                "dcf566ff291c25bbb8568fc3d376a6d9",
+            },
+            new string[]
+            {
+                "Test Case 13",
+                "00000000000000000000000000000000"
+                + "00000000000000000000000000000000",
+                "",
+                "",
+                "000000000000000000000000",
+                "",
+                "530f8afbc74536b9a963b4f1c4cb738b",
+            },
+            new string[]
+            {
+                "Test Case 14",
+                "00000000000000000000000000000000"
+                + "00000000000000000000000000000000",
+                "00000000000000000000000000000000",
+                "",
+                "000000000000000000000000",
+                "cea7403d4d606b6e074ec5d3baf39d18",
+                "d0d1c8a799996bf0265b98b5d48ab919",
+            },
+            new string[]
+            {
+                "Test Case 15",
+                "feffe9928665731c6d6a8f9467308308"
+                + "feffe9928665731c6d6a8f9467308308",
+                "d9313225f88406e5a55909c5aff5269a"
+                + "86a7a9531534f7da2e4c303d8a318a72"
+                + "1c3c0c95956809532fcf0e2449a6b525"
+                + "b16aedf5aa0de657ba637b391aafd255",
+                "",
+                "cafebabefacedbaddecaf888",
+                "522dc1f099567d07f47f37a32a84427d"
+                + "643a8cdcbfe5c0c97598a2bd2555d1aa"
+                + "8cb08e48590dbb3da7b08b1056828838"
+                + "c5f61e6393ba7a0abcc9f662898015ad",
+                "b094dac5d93471bdec1a502270e3cc6c",
+            },
+            new string[]
+            {
+                "Test Case 16",
+                "feffe9928665731c6d6a8f9467308308"
+                + "feffe9928665731c6d6a8f9467308308",
+                "d9313225f88406e5a55909c5aff5269a"
+                + "86a7a9531534f7da2e4c303d8a318a72"
+                + "1c3c0c95956809532fcf0e2449a6b525"
+                + "b16aedf5aa0de657ba637b39",
+                "feedfacedeadbeeffeedfacedeadbeef"
+                + "abaddad2",
+                "cafebabefacedbaddecaf888",
+                "522dc1f099567d07f47f37a32a84427d"
+                + "643a8cdcbfe5c0c97598a2bd2555d1aa"
+                + "8cb08e48590dbb3da7b08b1056828838"
+                + "c5f61e6393ba7a0abcc9f662",
+                "76fc6ece0f4e1768cddf8853bb2d551b",
+            },
+            new string[]
+            {
+                "Test Case 17",
+                "feffe9928665731c6d6a8f9467308308"
+                + "feffe9928665731c6d6a8f9467308308",
+                "d9313225f88406e5a55909c5aff5269a"
+                + "86a7a9531534f7da2e4c303d8a318a72"
+                + "1c3c0c95956809532fcf0e2449a6b525"
+                + "b16aedf5aa0de657ba637b39",
+                "feedfacedeadbeeffeedfacedeadbeef"
+                + "abaddad2",
+                "cafebabefacedbad",
+                "c3762df1ca787d32ae47c13bf19844cb"
+                + "af1ae14d0b976afac52ff7d79bba9de0"
+                + "feb582d33934a4f0954cc2363bc73f78"
+                + "62ac430e64abe499f47c9b1f",
+                "3a337dbf46a792c45e454913fe2ea8f2",
+            },
+            new string[]
+            {
+                "Test Case 18",
+                "feffe9928665731c6d6a8f9467308308"
+                + "feffe9928665731c6d6a8f9467308308",
+                "d9313225f88406e5a55909c5aff5269a"
+                + "86a7a9531534f7da2e4c303d8a318a72"
+                + "1c3c0c95956809532fcf0e2449a6b525"
+                + "b16aedf5aa0de657ba637b39",
+                "feedfacedeadbeeffeedfacedeadbeef"
+                + "abaddad2",
+                "9313225df88406e555909c5aff5269aa"
+                + "6a7a9538534f7da1e4c303d2a318a728"
+                + "c3c0c95156809539fcf0e2429a6b5254"
+                + "16aedbf5a0de6a57a637b39b",
+                "5a8def2f0c9e53f1f75d7853659e2a20"
+                + "eeb2b22aafde6419a058ab4f6f746bf4"
+                + "0fc0c3b780f244452da3ebf1c5d82cde"
+                + "a2418997200ef82e44ae7e3f",
+                "a44a8266ee1c8eb0c8b5d4cf5ae9f19a",
+            },
+        };
+
+        public override string Name
+        {
+            get { return "GCM"; }
+        }
+
+        public override void PerformTest()
+        {
+            for (int i = 0; i < TestVectors.Length; ++i)
+            {
+                runTestCase(TestVectors[i]);
+            }
+
+            randomTests();
+        }    
+
+        private void runTestCase(
+            string[] testVector)
+        {
+            for (int macLength = 12; macLength <= 16; ++macLength)
+            {
+                runTestCase(testVector, macLength);
+            }
+        }
+
+        private void runTestCase(
+            string[]	testVector,
+            int			macLength)
+        {
+            int pos = 0;
+            string testName = testVector[pos++];
+            byte[] K = Hex.Decode(testVector[pos++]);
+            byte[] P = Hex.Decode(testVector[pos++]);
+            byte[] A = Hex.Decode(testVector[pos++]);
+            byte[] IV = Hex.Decode(testVector[pos++]);
+            byte[] C = Hex.Decode(testVector[pos++]);
+
+            // For short MAC, take leading bytes
+            byte[] t = Hex.Decode(testVector[pos++]);
+            byte[] T = new byte[macLength];
+            Array.Copy(t, T, T.Length);
+
+            // Default multiplier
             runTestCase(null, null, testName, K, IV, A, P, C, T);
 
             runTestCase(new BasicGcmMultiplier(), new BasicGcmMultiplier(), testName, K, IV, A, P, C, T);
             runTestCase(new Tables8kGcmMultiplier(), new Tables8kGcmMultiplier(), testName, K, IV, A, P, C, T);
             runTestCase(new Tables64kGcmMultiplier(), new Tables64kGcmMultiplier(), testName, K, IV, A, P, C, T);
-		}
+        }
 
         private void runTestCase(
-			IGcmMultiplier	encM,
-			IGcmMultiplier	decM,
-			string			testName,
+            IGcmMultiplier	encM,
+            IGcmMultiplier	decM,
+            string			testName,
             byte[]          K,
             byte[]          IV,
             byte[]          A,
             byte[]          P,
-			byte[]			C,
-			byte[]			T)
+            byte[]			C,
+            byte[]			T)
         {
             byte[] fa = new byte[A.Length / 2];
             byte[] la = new byte[A.Length - (A.Length / 2)];
@@ -391,7 +391,7 @@ namespace Org.BouncyCastle.Crypto.Tests
         {
             AeadParameters parameters = new AeadParameters(new KeyParameter(K), T.Length * 8, IV, A);
             GcmBlockCipher encCipher = initCipher(encM, true, parameters);
-			GcmBlockCipher decCipher = initCipher(decM, false, parameters);
+            GcmBlockCipher decCipher = initCipher(decM, false, parameters);
             checkTestCase(encCipher, decCipher, testName, SA, P, C, T);
             checkTestCase(encCipher, decCipher, testName + " (reused)", SA, P, C, T);
 
@@ -403,119 +403,119 @@ namespace Org.BouncyCastle.Crypto.Tests
             checkTestCase(encCipher, decCipher, testName + " (key reuse)", SA, P, C, T);
         }
 
-		private GcmBlockCipher initCipher(
-			IGcmMultiplier	m,
-			bool			forEncryption,
-			AeadParameters	parameters)
-		{
-			GcmBlockCipher c = new GcmBlockCipher(new AesFastEngine(), m);
-			c.Init(forEncryption, parameters);
-			return c;
-		}
-
-		private void checkTestCase(
-			GcmBlockCipher	encCipher,
-			GcmBlockCipher	decCipher,
-			string			testName,
+        private GcmBlockCipher initCipher(
+            IGcmMultiplier	m,
+            bool			forEncryption,
+            AeadParameters	parameters)
+        {
+            GcmBlockCipher c = new GcmBlockCipher(new AesFastEngine(), m);
+            c.Init(forEncryption, parameters);
+            return c;
+        }
+
+        private void checkTestCase(
+            GcmBlockCipher	encCipher,
+            GcmBlockCipher	decCipher,
+            string			testName,
             byte[]          SA,
             byte[]          P,
-			byte[]			C,
-			byte[]			T)
-		{
-			byte[] enc = new byte[encCipher.GetOutputSize(P.Length)];
+            byte[]			C,
+            byte[]			T)
+        {
+            byte[] enc = new byte[encCipher.GetOutputSize(P.Length)];
             if (SA != null)
             {
                 encCipher.ProcessAadBytes(SA, 0, SA.Length);
             }
             int len = encCipher.ProcessBytes(P, 0, P.Length, enc, 0);
-			len += encCipher.DoFinal(enc, len);
+            len += encCipher.DoFinal(enc, len);
 
-			if (enc.Length != len)
-			{
+            if (enc.Length != len)
+            {
 //				Console.WriteLine("" + enc.Length + "/" + len);
-				Fail("encryption reported incorrect length: " + testName);
-			}
+                Fail("encryption reported incorrect length: " + testName);
+            }
 
-			byte[] mac = encCipher.GetMac();
+            byte[] mac = encCipher.GetMac();
 
-			byte[] data = new byte[P.Length];
-			Array.Copy(enc, data, data.Length);
-			byte[] tail = new byte[enc.Length - P.Length];
-			Array.Copy(enc, P.Length, tail, 0, tail.Length);
+            byte[] data = new byte[P.Length];
+            Array.Copy(enc, data, data.Length);
+            byte[] tail = new byte[enc.Length - P.Length];
+            Array.Copy(enc, P.Length, tail, 0, tail.Length);
 
-			if (!AreEqual(C, data))
-			{
-				Fail("incorrect encrypt in: " + testName);
-			}
+            if (!AreEqual(C, data))
+            {
+                Fail("incorrect encrypt in: " + testName);
+            }
 
-			if (!AreEqual(T, mac))
-			{
-				Fail("GetMac() returned wrong mac in: " + testName);
-			}
+            if (!AreEqual(T, mac))
+            {
+                Fail("GetMac() returned wrong mac in: " + testName);
+            }
 
-			if (!AreEqual(T, tail))
-			{
-				Fail("stream contained wrong mac in: " + testName);
-			}
+            if (!AreEqual(T, tail))
+            {
+                Fail("stream contained wrong mac in: " + testName);
+            }
 
-			byte[] dec = new byte[decCipher.GetOutputSize(enc.Length)];
+            byte[] dec = new byte[decCipher.GetOutputSize(enc.Length)];
             if (SA != null)
             {
                 decCipher.ProcessAadBytes(SA, 0, SA.Length);
             }
             len = decCipher.ProcessBytes(enc, 0, enc.Length, dec, 0);
-			len += decCipher.DoFinal(dec, len);
-			mac = decCipher.GetMac();
+            len += decCipher.DoFinal(dec, len);
+            mac = decCipher.GetMac();
 
-			data = new byte[C.Length];
-			Array.Copy(dec, data, data.Length);
+            data = new byte[C.Length];
+            Array.Copy(dec, data, data.Length);
 
-			if (!AreEqual(P, data))
-			{
-				Fail("incorrect decrypt in: " + testName);
-			}
-		}
+            if (!AreEqual(P, data))
+            {
+                Fail("incorrect decrypt in: " + testName);
+            }
+        }
 
         private void randomTests()
-		{
-			SecureRandom srng = new SecureRandom();
-			for (int i = 0; i < 10; ++i)
-			{
+        {
+            SecureRandom srng = new SecureRandom();
+            for (int i = 0; i < 10; ++i)
+            {
                 randomTest(srng, null);
                 randomTest(srng, new BasicGcmMultiplier()); 
-				randomTest(srng, new Tables8kGcmMultiplier());
+                randomTest(srng, new Tables8kGcmMultiplier());
                 randomTest(srng, new Tables64kGcmMultiplier()); 
-			}
-		}
+            }
+        }
 
-		private void randomTest(
-			SecureRandom	srng,
-			IGcmMultiplier	m)
-		{
-			int kLength = 16 + 8 * srng.Next(3);
-			byte[] K = new byte[kLength];
-			srng.NextBytes(K);
+        private void randomTest(
+            SecureRandom	srng,
+            IGcmMultiplier	m)
+        {
+            int kLength = 16 + 8 * srng.Next(3);
+            byte[] K = new byte[kLength];
+            srng.NextBytes(K);
 
-			int pLength = srng.Next(65536);
-			byte[] P = new byte[pLength];
-			srng.NextBytes(P);
+            int pLength = srng.Next(65536);
+            byte[] P = new byte[pLength];
+            srng.NextBytes(P);
 
-			int aLength = srng.Next(256);
-			byte[] A = new byte[aLength];
-			srng.NextBytes(A);
+            int aLength = srng.Next(256);
+            byte[] A = new byte[aLength];
+            srng.NextBytes(A);
 
             int saLength = srng.Next(256);
             byte[] SA = new byte[saLength];
             srng.NextBytes(SA);
 
-			int ivLength = 1 + srng.Next(256);
-			byte[] IV = new byte[ivLength];
-			srng.NextBytes(IV);
+            int ivLength = 1 + srng.Next(256);
+            byte[] IV = new byte[ivLength];
+            srng.NextBytes(IV);
 
-			GcmBlockCipher cipher = new GcmBlockCipher(new AesFastEngine(), m);
-			AeadParameters parameters = new AeadParameters(new KeyParameter(K), 16 * 8, IV, A);
-			cipher.Init(true, parameters);
-			byte[] C = new byte[cipher.GetOutputSize(P.Length)];
+            GcmBlockCipher cipher = new GcmBlockCipher(new AesFastEngine(), m);
+            AeadParameters parameters = new AeadParameters(new KeyParameter(K), 16 * 8, IV, A);
+            cipher.Init(true, parameters);
+            byte[] C = new byte[cipher.GetOutputSize(P.Length)];
             int predicted = cipher.GetUpdateOutputSize(P.Length);
 
             int split = srng.Next(SA.Length + 1);
@@ -530,22 +530,22 @@ namespace Org.BouncyCastle.Crypto.Tests
 
             len += cipher.DoFinal(C, len);
 
-			if (C.Length != len)
-			{
-				Fail("encryption reported incorrect length in randomised test");
-			}
+            if (C.Length != len)
+            {
+                Fail("encryption reported incorrect length in randomised test");
+            }
 
-			byte[] encT = cipher.GetMac();
-			byte[] tail = new byte[C.Length - P.Length];
-			Array.Copy(C, P.Length, tail, 0, tail.Length);
+            byte[] encT = cipher.GetMac();
+            byte[] tail = new byte[C.Length - P.Length];
+            Array.Copy(C, P.Length, tail, 0, tail.Length);
 
-			if (!AreEqual(encT, tail))
-			{
-				Fail("stream contained wrong mac in randomised test");
-			}
+            if (!AreEqual(encT, tail))
+            {
+                Fail("stream contained wrong mac in randomised test");
+            }
 
-			cipher.Init(false, parameters);
-			byte[] decP = new byte[cipher.GetOutputSize(C.Length)];
+            cipher.Init(false, parameters);
+            byte[] decP = new byte[cipher.GetOutputSize(C.Length)];
             predicted = cipher.GetUpdateOutputSize(C.Length);
 
             split = srng.Next(SA.Length + 1);
@@ -560,30 +560,30 @@ namespace Org.BouncyCastle.Crypto.Tests
 
             len += cipher.DoFinal(decP, len);
 
-			if (!AreEqual(P, decP))
-			{
-				Fail("incorrect decrypt in randomised test");
-			}
-
-			byte[] decT = cipher.GetMac();
-			if (!AreEqual(encT, decT))
-			{
-				Fail("decryption produced different mac from encryption");
-			}
-		}
-
-		public static void Main(
-			string[] args)
-		{
-			RunTest(new GcmTest());
-		}
-
-		[Test]
-		public void TestFunction()
-		{
-			string resultText = Perform().ToString();
-
-			Assert.AreEqual(Name + ": Okay", resultText);
-		}
-	}
+            if (!AreEqual(P, decP))
+            {
+                Fail("incorrect decrypt in randomised test");
+            }
+
+            byte[] decT = cipher.GetMac();
+            if (!AreEqual(encT, decT))
+            {
+                Fail("decryption produced different mac from encryption");
+            }
+        }
+
+        public static void Main(
+            string[] args)
+        {
+            RunTest(new GcmTest());
+        }
+
+        [Test]
+        public void TestFunction()
+        {
+            string resultText = Perform().ToString();
+
+            Assert.AreEqual(Name + ": Okay", resultText);
+        }
+    }
 }