/// <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);
        }
예제 #2
0
        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));
            }
        }