public void TestFailedVerification()
        {
            SymmetricKey key = new SymmetricKey(Resolve.RandomGenerator.Generate(32));
            SymmetricIV  iv  = new SymmetricIV(Resolve.RandomGenerator.Generate(16));
            V2AlgorithmVerifierEncryptedHeaderBlock headerBlock = new V2AlgorithmVerifierEncryptedHeaderBlock(new V2AesCrypto(key, iv, 0));

            Assert.That(headerBlock.IsVerified, Is.True, "A properly instantiated header should always have IsVerified as true");

            byte[] dataBlock = headerBlock.GetDataBlockBytes();

            V2AlgorithmVerifierEncryptedHeaderBlock newBlock = new V2AlgorithmVerifierEncryptedHeaderBlock(dataBlock);

            SymmetricKey key128 = new SymmetricKey(Resolve.RandomGenerator.Generate(16));

            newBlock.HeaderCrypto = new V2AesCrypto(key128, iv, 0);
            Assert.That(newBlock.IsVerified, Is.False, "Wrong algorithm, should not verify.");

            SymmetricKey wrongKey256 = new SymmetricKey(Resolve.RandomGenerator.Generate(32));

            newBlock.HeaderCrypto = new V2AesCrypto(wrongKey256, iv, 0);
            Assert.That(newBlock.IsVerified, Is.False, "Wrong key, should not verify.");

            SymmetricIV wrongIv = new SymmetricIV(Resolve.RandomGenerator.Generate(16));

            newBlock.HeaderCrypto = new V2AesCrypto(key, wrongIv, 0);
            Assert.That(newBlock.IsVerified, Is.False, "Wrong IV, should not verify.");

            newBlock.HeaderCrypto = new V2AesCrypto(key, iv, 256);
            Assert.That(newBlock.IsVerified, Is.False, "Wrong key stream index, should not verify.");

            newBlock.HeaderCrypto = new V2AesCrypto(key, iv, 0);
            Assert.That(newBlock.IsVerified, Is.True, "Everything is as it should, so it should verify.");
        }
        public void TestClone()
        {
            V2AlgorithmVerifierEncryptedHeaderBlock headerBlock = new V2AlgorithmVerifierEncryptedHeaderBlock(new V2AesCrypto(SymmetricKey.Zero256, SymmetricIV.Zero128, 0));

            Assert.That(headerBlock.IsVerified, Is.True, "A properly instantiated header should always have IsVerified as true");

            V2AlgorithmVerifierEncryptedHeaderBlock clone = (V2AlgorithmVerifierEncryptedHeaderBlock)headerBlock.Clone();

            Assert.That(clone.IsVerified, Is.True, "The clone should also be properly verified.");
        }
        public void TestOkVerification()
        {
            SymmetricKey key = new SymmetricKey(Resolve.RandomGenerator.Generate(32));
            SymmetricIV  iv  = new SymmetricIV(Resolve.RandomGenerator.Generate(16));
            V2AlgorithmVerifierEncryptedHeaderBlock headerBlock = new V2AlgorithmVerifierEncryptedHeaderBlock(new V2AesCrypto(key, iv, 0));

            Assert.That(headerBlock.IsVerified, Is.True, "A properly instantiated header should always have IsVerified as true");

            byte[] dataBlock = headerBlock.GetDataBlockBytes();

            V2AlgorithmVerifierEncryptedHeaderBlock newBlock = new V2AlgorithmVerifierEncryptedHeaderBlock(dataBlock);

            newBlock.HeaderCrypto = new V2AesCrypto(key, iv, 0);
            Assert.That(newBlock.IsVerified, Is.True, "It's a new block with the same key, should be ok.");
        }
Example #4
0
        public bool Load(IAsymmetricPrivateKey privateKey, Guid cryptoId, Headers headers)
        {
            if (headers == null)
            {
                throw new ArgumentNullException("headers");
            }

            ResetState();

            CryptoFactory = Resolve.CryptoFactory.Create(cryptoId);

            IEnumerable <V2AsymmetricKeyWrapHeaderBlock> keyWraps = headers.HeaderBlocks.OfType <V2AsymmetricKeyWrapHeaderBlock>();

            foreach (V2AsymmetricKeyWrapHeaderBlock keyWrap in keyWraps)
            {
                keyWrap.SetPrivateKey(CryptoFactory, privateKey);
                if (keyWrap.Crypto(0) == null)
                {
                    continue;
                }

                DocumentHeaders = new V2DocumentHeaders(keyWrap);
                if (!DocumentHeaders.Load(headers))
                {
                    throw new InvalidOperationException("If the master key was decrypted with the private key, the load should not be able to fail.");
                }

                V2AlgorithmVerifierEncryptedHeaderBlock algorithmVerifier = DocumentHeaders.Headers.FindHeaderBlock <V2AlgorithmVerifierEncryptedHeaderBlock>();
                PassphraseIsValid = algorithmVerifier != null && algorithmVerifier.IsVerified;
                if (PassphraseIsValid)
                {
                    Properties = EncryptedProperties.Create(this);
                    return(true);
                }
            }
            return(false);
        }