/// <summary> /// Buils an AEADBlockCipher engine /// </summary> /// <param name="blockCipher">BlockCipher engine</param> /// <param name="mode">SymmetricBlockModes enum, symmetric block mode name</param> /// <returns>AEADBlockCipher loaded with a given BlockCipher</returns> private IAeadBlockCipher getAEADCipherMode(IBlockCipher blockCipher, SymmetricBlockMode mode) { IAeadBlockCipher bc = null; switch (mode) { case SymmetricBlockMode.AEAD_CCM: bc = new CcmBlockCipher(blockCipher); break; case SymmetricBlockMode.AEAD_EAX: bc = new EaxBlockCipher(blockCipher); break; case SymmetricBlockMode.AEAD_GCM: bc = new GcmBlockCipher(blockCipher); break; case SymmetricBlockMode.AEAD_KCCM: bc = new KCcmBlockCipher(blockCipher); break; default: this.error.setError("SB017", "AEADCipher " + mode + " not recognised."); break; } return(bc); }
private void CCMModeTests() { //test 1 byte[] key = Hex.Decode("000102030405060708090a0b0c0d0e0f"); byte[] iv = Hex.Decode("101112131415161718191a1b1c1d1e1f"); byte[] input = Hex.Decode("303132333435363738393a3b3c3d3e3f"); byte[] authText = Hex.Decode("202122232425262728292a2b2c2d2e2f"); byte[] expectedMac = Hex.Decode("26a936173a4dc9160d6e3fda3a974060"); byte[] expectedEncrypted = Hex.Decode("b91a7b8790bbcfcfe65d04e5538e98e2704454c9dd39adace0b19d03f6aab07e"); byte[] mac; byte[] encrypted = new byte[expectedEncrypted.Length]; byte[] decrypted = new byte[encrypted.Length]; byte[] expectedDecrypted = new byte[input.Length + expectedMac.Length]; Array.Copy(input, 0, expectedDecrypted, 0, input.Length); Array.Copy(expectedMac, 0, expectedDecrypted, input.Length, expectedMac.Length); int len; AeadParameters param = new AeadParameters(new KeyParameter(key), 128, iv); KCcmBlockCipher dstu7624ccm = new KCcmBlockCipher(new Dstu7624Engine(128)); dstu7624ccm.Init(true, param); dstu7624ccm.ProcessAadBytes(authText, 0, authText.Length); len = dstu7624ccm.ProcessBytes(input, 0, input.Length, encrypted, 0); dstu7624ccm.DoFinal(encrypted, len); mac = dstu7624ccm.GetMac(); if (!Arrays.AreEqual(mac, expectedMac)) { Fail("Failed CCM mac test 1 - expected " + Hex.ToHexString(expectedMac) + " got " + Hex.ToHexString(mac)); } if (!Arrays.AreEqual(encrypted, expectedEncrypted)) { Fail("Failed CCM encrypt test 1 - expected " + Hex.ToHexString(expectedEncrypted) + " got " + Hex.ToHexString(encrypted)); } dstu7624ccm.Init(false, param); dstu7624ccm.ProcessAadBytes(authText, 0, authText.Length); len = dstu7624ccm.ProcessBytes(expectedEncrypted, 0, expectedEncrypted.Length, decrypted, 0); dstu7624ccm.DoFinal(decrypted, len); if (!Arrays.AreEqual(decrypted, expectedDecrypted)) { Fail("Failed CCM decrypt/verify mac test 1 - expected " + Hex.ToHexString(expectedDecrypted) + " got " + Hex.ToHexString(decrypted)); } //test 2 key = Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"); iv = Hex.Decode("202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F"); input = Hex.Decode("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F"); authText = Hex.Decode("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F"); expectedMac = Hex.Decode("9AB831B4B0BF0FDBC36E4B4FD58F0F00"); expectedEncrypted = Hex.Decode("7EC15C54BB553CB1437BE0EFDD2E810F6058497EBCE4408A08A73FADF3F459D56B0103702D13AB73ACD2EB33A8B5E9CFFF5EB21865A6B499C10C810C4BAEBE809C48AD90A9E12A68380EF1C1B7C83EE1"); mac = new byte[expectedMac.Length]; encrypted = new byte[expectedEncrypted.Length]; decrypted = new byte[encrypted.Length]; expectedDecrypted = new byte[input.Length + expectedMac.Length]; Array.Copy(input, 0, expectedDecrypted, 0, input.Length); Array.Copy(expectedMac, 0, expectedDecrypted, input.Length, expectedMac.Length); param = new AeadParameters(new KeyParameter(key), 128, iv); dstu7624ccm = new KCcmBlockCipher(new Dstu7624Engine(256)); dstu7624ccm.Init(true, param); dstu7624ccm.ProcessAadBytes(authText, 0, authText.Length); len = dstu7624ccm.ProcessBytes(input, 0, input.Length, encrypted, 0); dstu7624ccm.DoFinal(encrypted, len); mac = dstu7624ccm.GetMac(); if (!Arrays.AreEqual(mac, expectedMac)) { Fail("Failed CCM mac test 2 - expected " + Hex.ToHexString(expectedMac) + " got " + Hex.ToHexString(mac)); } if (!Arrays.AreEqual(encrypted, expectedEncrypted)) { Fail("Failed CCM encrypt test 2 - expected " + Hex.ToHexString(expectedEncrypted) + " got " + Hex.ToHexString(encrypted)); } dstu7624ccm.Init(false, param); dstu7624ccm.ProcessAadBytes(authText, 0, authText.Length); len = dstu7624ccm.ProcessBytes(expectedEncrypted, 0, expectedEncrypted.Length, decrypted, 0); dstu7624ccm.DoFinal(decrypted, len); if (!Arrays.AreEqual(decrypted, expectedDecrypted)) { Fail("Failed CCM decrypt/verify mac test 2 - expected " + Hex.ToHexString(expectedDecrypted) + " got " + Hex.ToHexString(decrypted)); } //test 3 key = Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F"); iv = Hex.Decode("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F"); input = Hex.Decode("808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF"); authText = Hex.Decode("606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F"); expectedMac = Hex.Decode("924FA0326824355595C98028E84D86279CEA9135FAB35F22054AE3203E68AE46"); expectedEncrypted = Hex.Decode("3EBDB4584B5169A26FBEBA0295B4223F58D5D8A031F2950A1D7764FAB97BA058E9E2DAB90FF0C519AA88435155A71B7B53BB100F5D20AFFAC0552F5F2813DEE8DD3653491737B9615A5CCD83DB32F1E479BF227C050325BBBFF60BCA9558D7FE"); mac = new byte[expectedMac.Length]; encrypted = new byte[expectedEncrypted.Length]; decrypted = new byte[encrypted.Length]; expectedDecrypted = new byte[input.Length + expectedMac.Length]; Array.Copy(input, 0, expectedDecrypted, 0, input.Length); Array.Copy(expectedMac, 0, expectedDecrypted, input.Length, expectedMac.Length); param = new AeadParameters(new KeyParameter(key), 256, iv); dstu7624ccm = new KCcmBlockCipher(new Dstu7624Engine(256), 6); dstu7624ccm.Init(true, param); dstu7624ccm.ProcessAadBytes(authText, 0, authText.Length); len = dstu7624ccm.ProcessBytes(input, 0, input.Length, encrypted, 0); dstu7624ccm.DoFinal(encrypted, len); mac = dstu7624ccm.GetMac(); if (!Arrays.AreEqual(mac, expectedMac)) { Fail("Failed CCM mac test 3 - expected " + Hex.ToHexString(expectedMac) + " got " + Hex.ToHexString(mac)); } if (!Arrays.AreEqual(encrypted, expectedEncrypted)) { Fail("Failed CCM encrypt test 3 - expected " + Hex.ToHexString(expectedEncrypted) + " got " + Hex.ToHexString(encrypted)); } dstu7624ccm.Init(false, param); dstu7624ccm.ProcessAadBytes(authText, 0, authText.Length); len = dstu7624ccm.ProcessBytes(expectedEncrypted, 0, expectedEncrypted.Length, decrypted, 0); dstu7624ccm.DoFinal(decrypted, len); if (!Arrays.AreEqual(decrypted, expectedDecrypted)) { Fail("Failed CCM decrypt/verify mac test 3 - expected " + Hex.ToHexString(expectedDecrypted) + " got " + Hex.ToHexString(decrypted)); } //test 4 key = Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F"); iv = Hex.Decode("404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F"); input = Hex.Decode("C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF"); authText = Hex.Decode("808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF"); expectedMac = Hex.Decode("D4155EC3D888C8D32FE184AC260FD60F567705E1DF362A6F1F9C287156AA96D91BC4C56F9709E72F3D79CF0A9AC8BDC2BA836BE50E823AB50FB1B39080390923"); expectedEncrypted = Hex.Decode("220642D7277D104788CF97B10210984F506435512F7BF153C5CDABFECC10AFB4A2E2FC51F616AF80FFDD0607FAD4F542B8EF0667717CE3EAAA8FBC303CE76C99BD8F80CE149143C04FC2490272A31B029DDADA82F055FE4ABEF452A7D438B21E59C1D8B3DD4606BAD66A6F36300EF3CE0E5F3BB59F11416E80B7FC5A8E8B057A"); mac = new byte[expectedMac.Length]; encrypted = new byte[expectedEncrypted.Length]; decrypted = new byte[encrypted.Length]; expectedDecrypted = new byte[input.Length + expectedMac.Length]; Array.Copy(input, 0, expectedDecrypted, 0, input.Length); Array.Copy(expectedMac, 0, expectedDecrypted, input.Length, expectedMac.Length); param = new AeadParameters(new KeyParameter(key), 512, iv); dstu7624ccm = new KCcmBlockCipher(new Dstu7624Engine(512), 8); dstu7624ccm.Init(true, param); dstu7624ccm.ProcessAadBytes(authText, 0, authText.Length); len = dstu7624ccm.ProcessBytes(input, 0, input.Length, encrypted, 0); dstu7624ccm.DoFinal(encrypted, len); mac = dstu7624ccm.GetMac(); if (!Arrays.AreEqual(mac, expectedMac)) { Fail("Failed CCM mac test 4 - expected " + Hex.ToHexString(expectedMac) + " got " + Hex.ToHexString(mac)); } if (!Arrays.AreEqual(encrypted, expectedEncrypted)) { Fail("Failed CCM encrypt test 4 - expected " + Hex.ToHexString(expectedEncrypted) + " got " + Hex.ToHexString(encrypted)); } dstu7624ccm.Init(false, param); dstu7624ccm.ProcessAadBytes(authText, 0, authText.Length); len = dstu7624ccm.ProcessBytes(expectedEncrypted, 0, expectedEncrypted.Length, decrypted, 0); dstu7624ccm.DoFinal(decrypted, len); if (!Arrays.AreEqual(decrypted, expectedDecrypted)) { Fail("Failed CCM decrypt/verify mac test 4 - expected " + Hex.ToHexString(expectedDecrypted) + " got " + Hex.ToHexString(decrypted)); } }