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); }
private bool IsMasterKeyKnown(Headers headers) { V2KeyWrapHeaderBlock keyHeaderBlock = headers.FindHeaderBlock <V2KeyWrapHeaderBlock>(); if (keyHeaderBlock.MasterKey != null) { return(true); } if (_keyStreamFactory != null && _keyStreamFactory.Crypto(0) != null) { return(true); } return(false); }
public override object Clone() { V2KeyWrapHeaderBlock block = new V2KeyWrapHeaderBlock((byte[])GetDataBlockBytesReference().Clone()); return(block); }