public V2DocumentHeaders(EncryptionParameters encryptionParameters, long keyWrapIterations)
        {
            if (encryptionParameters == null)
            {
                throw new ArgumentNullException("encryptionParameters");
            }

            _headers = new Headers();

            _headers.HeaderBlocks.Add(new PreambleHeaderBlock());
            _headers.HeaderBlocks.Add(new VersionHeaderBlock(_version));

            ICryptoFactory       cryptoFactory    = Resolve.CryptoFactory.Create(encryptionParameters.CryptoId);
            IDerivedKey          keyEncryptingKey = cryptoFactory.CreateDerivedKey(encryptionParameters.Passphrase);
            V2KeyWrapHeaderBlock keyWrap          = new V2KeyWrapHeaderBlock(cryptoFactory, keyEncryptingKey, keyWrapIterations);

            _headers.HeaderBlocks.Add(keyWrap);
            _keyStreamFactory = keyWrap;

            foreach (UserPublicKey publicKey in encryptionParameters.PublicKeys)
            {
                _headers.HeaderBlocks.Add(new V2AsymmetricKeyWrapHeaderBlock(publicKey, keyWrap.MasterKey, keyWrap.MasterIV));
            }
            _headers.HeaderBlocks.Add(new V2AsymmetricRecipientsEncryptedHeaderBlock(GetHeaderCrypto(HeaderBlockType.AsymmetricRecipients))
            {
                Recipients = new Recipients(encryptionParameters.PublicKeys)
            });
            _headers.HeaderBlocks.Add(new FileInfoEncryptedHeaderBlock(GetHeaderCrypto(HeaderBlockType.FileInfo)));
            _headers.HeaderBlocks.Add(new V2CompressionEncryptedHeaderBlock(GetHeaderCrypto(HeaderBlockType.Compression)));
            _headers.HeaderBlocks.Add(new V2UnicodeFileNameInfoEncryptedHeaderBlock(GetHeaderCrypto(HeaderBlockType.UnicodeFileNameInfo)));
            _headers.HeaderBlocks.Add(new V2AlgorithmVerifierEncryptedHeaderBlock(GetHeaderCrypto(HeaderBlockType.AlgorithmVerifier)));
            _headers.HeaderBlocks.Add(new DataHeaderBlock());

            SetDataEncryptingCryptoForEncryptedHeaderBlocks(_headers.HeaderBlocks);
        }
 public V2DocumentHeaders(IKeyStreamCryptoFactory keyStreamCryptoFactory)
 {
     _keyStreamFactory = keyStreamCryptoFactory;
     _headers          = new Headers();
 }