Exemplo n.º 1
0
        public void ShouldEncryptWithPlainTextSuccessfullyNewEngine()
        {
            var key       = new BitString("FEFFE992 8665731C 6D6A8F94 67308308");
            var iv        = new BitString("CAFEBABE FACEDBAD DECAF888");
            var aad       = new BitString(0);
            var plainText = new BitString("D9313225 F88406E5 A55909C5 AFF5269A 86A7A953 1534F7DA 2E4C303D 8A318A72 1C3C0C95 95680953 2FCF0E24 49A6B525 B16AEDF5 AA0DE657 BA637B39 1AAFD255");

            var gcmEncryptParam = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Encrypt,
                iv,
                key,
                plainText,
                aad,
                128
                );

            var results = _subject.ProcessPayload(gcmEncryptParam);

            Assert.IsTrue(results.Success);

            var gcmDecryptParam = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Decrypt,
                iv,
                key,
                results.Result,
                aad,
                results.Tag
                );

            var dResults = _subject.ProcessPayload(gcmDecryptParam);

            Assert.IsTrue(dResults.Success);
            Assert.AreEqual(plainText, dResults.Result);
            Assert.AreEqual(new BitString("4D5C2AF3 27CD64A6 2CF35ABD 2BA6FAB4"), results.Tag);
        }
Exemplo n.º 2
0
        public void ShouldEncryptAndDecryptWithValidatedTag()
        {
            var testData = GetTestData();

            // Perform encryption operation and assert
            var encryptParam = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Encrypt,
                testData.Nonce,
                testData.Key,
                testData.Payload,
                testData.AssocData,
                128
                );
            var encryptionResult = _newSubject.ProcessPayload(encryptParam);

            Assert.IsTrue(encryptionResult.Success, $"{nameof(encryptionResult.Success)} Encrypt");
            Assert.AreEqual(testData.CipherText, encryptionResult.Result, nameof(testData.CipherText));

            // Validate the decryption operation / tag
            var decryptParam = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Decrypt,
                testData.Nonce,
                testData.Key,
                encryptionResult.Result,
                testData.AssocData,
                128
                );
            var decryptionResult = _newSubject.ProcessPayload(decryptParam);

            Assert.IsTrue(decryptionResult.Success, $"{nameof(decryptionResult.Success)} Decrypt");
            Assert.AreEqual(testData.Payload, decryptionResult.Result);
        }
Exemplo n.º 3
0
        public void ShouldEncryptSuccessfullyNewEngine()
        {
            var key       = new BitString("FEFFE992 8665731C 6D6A8F94 67308308");
            var iv        = new BitString("CAFEBABE FACEDBAD DECAF888");
            var aad       = new BitString(0);
            var plainText = new BitString(0);

            var gcmEncryptParam = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Encrypt,
                iv,
                key,
                plainText,
                aad,
                128
                );

            var results = _subject.ProcessPayload(gcmEncryptParam);

            Assert.IsTrue(results.Success);

            var gcmDecryptParam = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Decrypt,
                iv,
                key,
                results.Result,
                aad,
                results.Tag
                );

            var dResults = _subject.ProcessPayload(gcmDecryptParam);

            Assert.IsTrue(dResults.Success);

            Assert.AreEqual(new BitString("3247184B 3C4F69A4 4DBCD228 87BBB418"), results.Tag);
        }
Exemplo n.º 4
0
        public void ShouldEncryptAndDecryptSuccessfullyNewEngine(
            string testLabel,
            string keyString,
            string ivString,
            string aadString,
            string plainTextString,
            string cipherTextString,
            string tagString,
            int tagLength
            )
        {
            BitString key        = new BitString(keyString);
            BitString iv         = new BitString(ivString);
            BitString aad        = new BitString(aadString);
            BitString plainText  = new BitString(plainTextString);
            BitString cipherText = new BitString(cipherTextString);
            BitString tag        = new BitString(tagString);

            var param         = new AeadModeBlockCipherParameters(BlockCipherDirections.Encrypt, iv, key, plainText, aad, tagLength);
            var encryptResult = _subject.ProcessPayload(param);

            Assert.IsTrue(encryptResult.Success, "Encrypt");
            Assert.AreEqual(tag.ToHex(), encryptResult.Tag.ToHex(), nameof(encryptResult.Tag));

            var param2        = new AeadModeBlockCipherParameters(BlockCipherDirections.Decrypt, iv, key, encryptResult.Result, aad, tag);
            var decryptResult = _subject.ProcessPayload(param2);

            Assert.IsTrue(decryptResult.Success, "Decrypt");

            Assert.AreEqual(plainText.ToHex(), decryptResult.Result.ToHex(), nameof(plainText));
        }
Exemplo n.º 5
0
        public void ShouldFailDueToInvalidTag(int indexToChange)
        {
            var testData = GetTestData();

            // Perform encryption operation and assert
            var encryptParam = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Encrypt,
                testData.Nonce,
                testData.Key,
                testData.Payload,
                testData.AssocData,
                128
                );
            var encryptionResult = _newSubject.ProcessPayload(encryptParam);

            Assert.IsTrue(encryptionResult.Success, $"{nameof(encryptionResult.Success)} Encrypt");
            Assert.AreEqual(testData.CipherText, encryptionResult.Result, nameof(testData.CipherText));

            // Change a byte value to invalidate the decryption
            var encryptionResultBytes = encryptionResult.Result.ToBytes();

            if (encryptionResultBytes.Length >= indexToChange)
            {
                if (encryptionResultBytes[indexToChange] == 255)
                {
                    encryptionResultBytes[indexToChange]--;
                }
                else
                {
                    encryptionResultBytes[indexToChange]++;
                }
            }

            var newCipherText = new BitString(encryptionResultBytes);

            // Validate the decryption operation / tag
            var decryptParam = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Decrypt,
                testData.Nonce,
                testData.Key,
                newCipherText,
                testData.AssocData,
                128
                );
            var decryptionResult = _newSubject.ProcessPayload(decryptParam);

            Assert.IsFalse(decryptionResult.Success, $"{nameof(decryptionResult.Success)} Decrypt");
            Assert.AreEqual(CcmBlockCipher.INVALID_TAG_MESSAGE, decryptionResult.ErrorMessage);
        }
Exemplo n.º 6
0
        public void ShouldEncryptCorrectly(string plaintextHex, string aadHex, string keyHex, string nonceHex, string expectedHex)
        {
            var plaintext = new BitString(plaintextHex);
            var aad       = new BitString(aadHex);
            var key       = new BitString(keyHex);
            var nonce     = new BitString(nonceHex);

            var expectedResult = new BitString(expectedHex);

            var param = new AeadModeBlockCipherParameters(BlockCipherDirections.Encrypt, nonce, key, plaintext,
                                                          aad, 0);
            var result = _subject.ProcessPayload(param);

            Assert.AreEqual(expectedResult.ToHex(), result.Result.ToHex(), "Result");
        }
Exemplo n.º 7
0
        public void ShouldReportErrorOnInvalidDecryptionTagNewEngine(
            string testLabel,
            string keyString,
            string ivString,
            string aadString,
            string plainTextString,
            string cipherTextString,
            string tagString,
            int tagLength
            )
        {
            BitString key        = new BitString(keyString);
            BitString iv         = new BitString(ivString);
            BitString aad        = new BitString(aadString);
            BitString plainText  = new BitString(plainTextString);
            BitString cipherText = new BitString(cipherTextString);
            BitString tag        = new BitString(tagString);

            var gcmEncryptParam = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Encrypt,
                iv,
                key,
                plainText,
                aad,
                tag.BitLength
                );

            var encryptResult = _subject.ProcessPayload(gcmEncryptParam);

            Assert.That(encryptResult.Success, nameof(_subject.ProcessPayload));
            Assert.That(tag.Equals(encryptResult.Tag), nameof(encryptResult.Tag));

            var xoredTag = encryptResult.Tag.XOR(GetBitStringOfLengthWithAll1s(encryptResult.Tag.BitLength));

            var gcmDecryptParam = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Decrypt,
                iv,
                key,
                encryptResult.Result,
                aad,
                xoredTag
                );
            var decryptResult = _subject.ProcessPayload(gcmDecryptParam);

            Assert.IsFalse(decryptResult.Success, nameof(_subject.ProcessPayload));
            Assert.AreEqual("Tags do not match", decryptResult.ErrorMessage, nameof(decryptResult.ErrorMessage));
        }
Exemplo n.º 8
0
        public void ShouldGetDifferingPlainTextAfterDecryptionWithModifiedCipherTextNewEngine(
            string testLabel,
            string keyString,
            string ivString,
            string aadString,
            string plainTextString,
            string cipherTextString,
            string tagString,
            int tagLength
            )
        {
            BitString key        = new BitString(keyString);
            BitString iv         = new BitString(ivString);
            BitString aad        = new BitString(aadString);
            BitString plainText  = new BitString(plainTextString);
            BitString cipherText = new BitString(cipherTextString);
            BitString tag        = new BitString(tagString);

            var gcmEncryptParam = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Encrypt,
                iv,
                key,
                plainText,
                aad,
                tag.BitLength
                );

            var encryptResult = _subject.ProcessPayload(gcmEncryptParam);

            Assert.That(encryptResult.Success, nameof(_subject.ProcessPayload));
            Assert.That(tag.Equals(encryptResult.Tag), nameof(encryptResult.Tag));

            var xoredTag = encryptResult.Tag.XOR(GetBitStringOfLengthWithAll1s(encryptResult.Tag.BitLength));

            var gcmDecryptParam = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Decrypt,
                iv,
                key,
                encryptResult.Result,
                aad,
                xoredTag
                );
            var decryptResult = _subject.ProcessPayload(gcmDecryptParam);

            Assert.AreNotEqual(plainText, decryptResult.Result, nameof(plainText));
        }
Exemplo n.º 9
0
        public void ShouldDecryptCorrectly(string cipherTextHex, string aadHex, string keyHex, string nonceHex, string expectedPlaintextHex, bool expectedResult)
        {
            var cipherText = new BitString(cipherTextHex);
            var aad        = new BitString(aadHex);
            var key        = new BitString(keyHex);
            var nonce      = new BitString(nonceHex);

            var expectedPlaintext = new BitString(expectedPlaintextHex);

            var param  = new AeadModeBlockCipherParameters(BlockCipherDirections.Decrypt, nonce, key, cipherText, aad, new BitString(0));
            var result = _subject.ProcessPayload(param);

            Assert.AreEqual(expectedResult, result.Success);

            if (expectedResult)
            {
                Assert.AreEqual(expectedPlaintext, result.Result);
            }
        }
Exemplo n.º 10
0
        public void ShouldEncryptDecrypt(int ptLen, int aadLen, int keyLen)
        {
            var rand = new Random800_90();

            var plaintext = rand.GetRandomBitString(ptLen);
            var aad       = rand.GetRandomBitString(aadLen);
            var key       = rand.GetRandomBitString(keyLen);
            var iv        = rand.GetRandomBitString(96);

            var param  = new AeadModeBlockCipherParameters(BlockCipherDirections.Encrypt, iv, key, plaintext, aad, 0);
            var result = _subject.ProcessPayload(param);

            Assert.IsTrue(result.Success);

            var param2  = new AeadModeBlockCipherParameters(BlockCipherDirections.Decrypt, iv, key, result.Result, aad, new BitString(0));
            var result2 = _subject.ProcessPayload(param2);

            Assert.IsTrue(result.Success);
        }
Exemplo n.º 11
0
        public void NewEngineTests(
            string nonceStr,
            string keyStr,
            string aadStr,
            string payloadStr,
            string ctStr,
            int tagLength
            )
        {
            var nonce      = new BitString(nonceStr);
            var key        = new BitString(keyStr);
            var aad        = new BitString(aadStr);
            var payload    = new BitString(payloadStr);
            var expectedCt = new BitString(ctStr);

            // Perform encryption operation and assert
            var encryptParam = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Encrypt,
                nonce,
                key,
                payload,
                aad,
                tagLength
                );
            var encryptionResult = _newSubject.ProcessPayload(encryptParam);

            Assert.IsTrue(encryptionResult.Success, $"{nameof(encryptionResult.Success)} Encrypt");
            Assert.AreEqual(expectedCt, encryptionResult.Result, nameof(expectedCt));

            // Validate the decryption operation / tag
            var decryptParam = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Decrypt,
                nonce,
                key,
                encryptionResult.Result,
                aad,
                tagLength
                );
            var decryptionResult = _newSubject.ProcessPayload(decryptParam);

            Assert.IsTrue(decryptionResult.Success, $"{nameof(decryptionResult.Success)} Decrypt");
            Assert.AreEqual(payload, decryptionResult.Result);
        }
Exemplo n.º 12
0
        protected override BitString Mac(BitString macData)
        {
            var param = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Encrypt,
                _keyConfirmationParameters.CcmNonce,
                _keyConfirmationParameters.DerivedKeyingMaterial,
                new BitString(0),
                macData,
                _keyConfirmationParameters.MacLength
                );

            var result = _ccm.ProcessPayload(param);

            if (!result.Success)
            {
                throw new Exception(result.ErrorMessage);
            }

            return(result.Result);
        }
Exemplo n.º 13
0
        public void AESGCM_XPNNewEngine()
        {
            BitString aad       = new BitString("56d1dc66b2ae1c5c972aa1c22025c74b");
            BitString plainText = new BitString("f15e9ceb86dd8309767c3f675eb5503c");
            BitString key       = new BitString("b9eac5c6 50daeab9 c15aec8d 362cfd1f ccef9d20 fe3c0e54 fd321554 8d203f0d");
            BitString iv        = new BitString("04527842 a98b3336 2a09067c");
            BitString salt      = new BitString("12345678 87654388 44888844");
            BitString newIV;

            newIV = iv.XOR(salt);

            var param         = new AeadModeBlockCipherParameters(BlockCipherDirections.Encrypt, newIV, key, plainText, aad, 128);
            var encryptResult = _subject.ProcessPayload(param);

            Assert.IsTrue(encryptResult.Success);
            Assert.AreEqual(encryptResult.Tag, new BitString("e47971b2 c83ed28a d66fb896 2478d01f"), nameof(encryptResult.Tag));

            var param2        = new AeadModeBlockCipherParameters(BlockCipherDirections.Decrypt, newIV, key, encryptResult.Result, aad, encryptResult.Tag);
            var decryptResult = _subject.ProcessPayload(param2);

            Assert.IsTrue(decryptResult.Success);
        }
Exemplo n.º 14
0
        public void ShouldEncryptNon96BitIvsCorrectlyNewEngine(
            string testLabel,
            BitString key,
            BitString iv,
            BitString pt,
            BitString aad,
            BitString expectedCt,
            BitString expectedTag
            )
        {
            var gcmParam = new AeadModeBlockCipherParameters(
                BlockCipherDirections.Encrypt,
                iv,
                key,
                pt,
                aad,
                expectedTag.BitLength
                );

            var result = _subject.ProcessPayload(gcmParam);

            Assert.AreEqual(result.Result.ToHex(), expectedCt.ToHex(), nameof(expectedCt));
            Assert.AreEqual(result.Tag.ToHex(), expectedTag.ToHex(), nameof(expectedTag));
        }