private void LookForHeaderBlock() { byte[] lengthBytes = new byte[sizeof(Int32)]; if (!_inputStream.ReadExact(lengthBytes)) { CurrentItemType = AxCryptItemType.EndOfStream; return; } Int32 headerBlockLength = BitConverter.ToInt32(lengthBytes, 0) - 5; if (headerBlockLength < 0 || headerBlockLength > 0xfffff) { throw new FileFormatException("Invalid headerBlockLength {0}".InvariantFormat(headerBlockLength), ErrorStatus.FileFormatError); } int blockType = _inputStream.ReadByte(); if (blockType > 127) { throw new FileFormatException("Invalid block type {0}".InvariantFormat(blockType), ErrorStatus.FileFormatError); } HeaderBlockType headerBlockType = (HeaderBlockType)blockType; byte[] dataBLock = new byte[headerBlockLength]; if (!_inputStream.ReadExact(dataBLock)) { CurrentItemType = AxCryptItemType.EndOfStream; return; } ParseHeaderBlock(headerBlockType, dataBLock); DataHeaderBlock dataHeaderBlock = CurrentHeaderBlock as DataHeaderBlock; if (dataHeaderBlock != null) { CurrentItemType = AxCryptItemType.Data; } }
private void WriteInternal(Stream cipherStream, Stream hmacStream) { cipherStream.Position = 0; AxCrypt1Guid.Write(cipherStream); PreambleHeaderBlock preambleHaderBlock = FindHeaderBlock <PreambleHeaderBlock>(); preambleHaderBlock.Write(cipherStream); foreach (HeaderBlock headerBlock in _headerBlocks) { if (headerBlock is DataHeaderBlock) { continue; } if (headerBlock is PreambleHeaderBlock) { continue; } headerBlock.Write(hmacStream); } DataHeaderBlock dataHeaderBlock = FindHeaderBlock <DataHeaderBlock>(); dataHeaderBlock.Write(hmacStream); }
private void ParseHeaderBlock(HeaderBlockType headerBlockType, byte[] dataBlock) { bool isFirst = CurrentItemType == AxCryptItemType.MagicGuid; CurrentItemType = AxCryptItemType.HeaderBlock; if (headerBlockType == HeaderBlockType.Preamble) { if (!isFirst) { throw new FileFormatException("Preamble can only be first.", ErrorStatus.FileFormatError); } CurrentHeaderBlock = new PreambleHeaderBlock(dataBlock); _sendDataToHmacStream = true; return; } else { if (isFirst) { throw new FileFormatException("Preamble must be first.", ErrorStatus.FileFormatError); } } switch (headerBlockType) { case HeaderBlockType.Version: CurrentHeaderBlock = new VersionHeaderBlock(dataBlock); break; case HeaderBlockType.KeyWrap1: CurrentHeaderBlock = new KeyWrap1HeaderBlock(dataBlock); break; case HeaderBlockType.KeyWrap2: CurrentHeaderBlock = new KeyWrap2HeaderBlock(dataBlock); break; case HeaderBlockType.IdTag: CurrentHeaderBlock = new IdTagHeaderBlock(dataBlock); break; case HeaderBlockType.Data: CurrentHeaderBlock = new DataHeaderBlock(dataBlock); break; case HeaderBlockType.FileNameInfo: CurrentHeaderBlock = new FileNameInfoHeaderBlock(dataBlock); break; case HeaderBlockType.EncryptionInfo: CurrentHeaderBlock = new EncryptionInfoHeaderBlock(dataBlock); break; case HeaderBlockType.CompressionInfo: CurrentHeaderBlock = new CompressionInfoHeaderBlock(dataBlock); break; case HeaderBlockType.FileInfo: CurrentHeaderBlock = new FileInfoHeaderBlock(dataBlock); break; case HeaderBlockType.Compression: CurrentHeaderBlock = new CompressionHeaderBlock(dataBlock); break; case HeaderBlockType.UnicodeFileNameInfo: CurrentHeaderBlock = new UnicodeFileNameInfoHeaderBlock(dataBlock); break; case HeaderBlockType.Encrypted: case HeaderBlockType.None: case HeaderBlockType.Any: throw new FileFormatException("Illegal header block type.", ErrorStatus.FileFormatError); default: CurrentHeaderBlock = new UnrecognizedHeaderBlock(headerBlockType, dataBlock); break; } if (_sendDataToHmacStream) { CurrentHeaderBlock.Write(_hmacBufferStream); } return; }
private void ParseHeaderBlock(HeaderBlockType headerBlockType, byte[] dataBlock) { bool isFirst = CurrentItemType == AxCryptItemType.MagicGuid; CurrentItemType = AxCryptItemType.HeaderBlock; if (headerBlockType == HeaderBlockType.Preamble) { if (!isFirst) { throw new FileFormatException("Preamble can only be first.", ErrorStatus.FileFormatError); } CurrentHeaderBlock = new PreambleHeaderBlock(dataBlock); _sendDataToHmacStream = true; return; } else { if (isFirst) { throw new FileFormatException("Preamble must be first.", ErrorStatus.FileFormatError); } } switch (headerBlockType) { case HeaderBlockType.Version: CurrentHeaderBlock = new VersionHeaderBlock(dataBlock); break; case HeaderBlockType.KeyWrap1: CurrentHeaderBlock = new KeyWrap1HeaderBlock(dataBlock); break; case HeaderBlockType.KeyWrap2: CurrentHeaderBlock = new KeyWrap2HeaderBlock(dataBlock); break; case HeaderBlockType.IdTag: CurrentHeaderBlock = new IdTagHeaderBlock(dataBlock); break; case HeaderBlockType.Data: CurrentHeaderBlock = new DataHeaderBlock(dataBlock); break; case HeaderBlockType.FileNameInfo: CurrentHeaderBlock = new FileNameInfoHeaderBlock(dataBlock); break; case HeaderBlockType.EncryptionInfo: CurrentHeaderBlock = new EncryptionInfoHeaderBlock(dataBlock); break; case HeaderBlockType.CompressionInfo: CurrentHeaderBlock = new CompressionInfoHeaderBlock(dataBlock); break; case HeaderBlockType.FileInfo: CurrentHeaderBlock = new FileInfoHeaderBlock(dataBlock); break; case HeaderBlockType.Compression: CurrentHeaderBlock = new CompressionHeaderBlock(dataBlock); break; case HeaderBlockType.UnicodeFileNameInfo: CurrentHeaderBlock = new UnicodeFileNameInfoHeaderBlock(dataBlock); break; case HeaderBlockType.Encrypted: case HeaderBlockType.None: case HeaderBlockType.Any: throw new FileFormatException("Illegal header block type.", ErrorStatus.FileFormatError); default: CurrentHeaderBlock = new UnrecognizedHeaderBlock(headerBlockType, dataBlock); break; } if (_sendDataToHmacStream) { CurrentHeaderBlock.Write(_hmacBufferStream); } return; }