private void ParseHeaderBlock(HeaderBlockType headerBlockType, byte[] dataBlock) { bool isFirst = CurrentItemType == AxCryptItemType.MagicGuid; switch (headerBlockType) { case HeaderBlockType.Preamble: if (!isFirst) { throw new FileFormatException("Preamble can only be first.", ErrorStatus.FileFormatError); } break; case HeaderBlockType.Encrypted: case HeaderBlockType.None: case HeaderBlockType.Any: throw new FileFormatException("Illegal header block type.", ErrorStatus.FileFormatError); default: if (isFirst) { throw new FileFormatException("Preamble must be first.", ErrorStatus.FileFormatError); } break; } CurrentItemType = AxCryptItemType.HeaderBlock; CurrentHeaderBlock = HeaderBlockFactory(headerBlockType, dataBlock); return; }
protected HeaderBlock(HeaderBlockType headerBlockType, byte[] dataBlock) { if (dataBlock == null) { throw new ArgumentNullException("dataBlock"); } HeaderBlockType = headerBlockType; _dataBlock = (byte[])dataBlock.Clone(); }
protected override HeaderBlock HeaderBlockFactory(HeaderBlockType headerBlockType, byte[] dataBlock) { switch (headerBlockType) { case HeaderBlockType.Preamble: return(new PreambleHeaderBlock(dataBlock)); case HeaderBlockType.Version: return(new VersionHeaderBlock(dataBlock)); case HeaderBlockType.Data: return(new DataHeaderBlock(dataBlock)); } return(new UnrecognizedHeaderBlock(headerBlockType, dataBlock)); }
protected override HeaderBlock HeaderBlockFactory(HeaderBlockType headerBlockType, byte[] dataBlock) { switch (headerBlockType) { case HeaderBlockType.Preamble: return(new PreambleHeaderBlock(dataBlock)); case HeaderBlockType.Version: return(new VersionHeaderBlock(dataBlock)); case HeaderBlockType.V2KeyWrap: return(new V2KeyWrapHeaderBlock(dataBlock)); case HeaderBlockType.V2AsymmetricKeyWrap: return(new V2AsymmetricKeyWrapHeaderBlock(dataBlock)); case HeaderBlockType.AsymmetricRecipients: return(new V2AsymmetricRecipientsEncryptedHeaderBlock(dataBlock)); case HeaderBlockType.Data: return(new DataHeaderBlock(dataBlock)); case HeaderBlockType.FileInfo: return(new FileInfoEncryptedHeaderBlock(dataBlock)); case HeaderBlockType.Compression: return(new V2CompressionEncryptedHeaderBlock(dataBlock)); case HeaderBlockType.UnicodeFileNameInfo: return(new V2UnicodeFileNameInfoEncryptedHeaderBlock(dataBlock)); case HeaderBlockType.PlaintextLengths: return(new V2PlaintextLengthsEncryptedHeaderBlock(dataBlock)); case HeaderBlockType.V2Hmac: return(new V2HmacHeaderBlock(dataBlock)); case HeaderBlockType.AlgorithmVerifier: return(new V2AlgorithmVerifierEncryptedHeaderBlock(dataBlock)); case HeaderBlockType.EncryptedDataPart: return(new EncryptedDataPartBlock(dataBlock)); } return(new UnrecognizedHeaderBlock(headerBlockType, dataBlock)); }
protected override HeaderBlock HeaderBlockFactory(HeaderBlockType headerBlockType, byte[] dataBlock) { switch (headerBlockType) { case HeaderBlockType.Preamble: return(new PreambleHeaderBlock(dataBlock)); case HeaderBlockType.Version: return(new VersionHeaderBlock(dataBlock)); case HeaderBlockType.KeyWrap1: return(new V1KeyWrap1HeaderBlock(dataBlock)); case HeaderBlockType.KeyWrap2: return(new V1KeyWrap2HeaderBlock(dataBlock)); case HeaderBlockType.IdTag: return(new V1IdTagHeaderBlock(dataBlock)); case HeaderBlockType.Data: return(new DataHeaderBlock(dataBlock)); case HeaderBlockType.FileNameInfo: return(new V1FileNameInfoEncryptedHeaderBlock(dataBlock)); case HeaderBlockType.EncryptionInfo: return(new V1EncryptionInfoEncryptedHeaderBlock(dataBlock)); case HeaderBlockType.CompressionInfo: return(new V1CompressionInfoEncryptedHeaderBlock(dataBlock)); case HeaderBlockType.FileInfo: return(new FileInfoEncryptedHeaderBlock(dataBlock)); case HeaderBlockType.Compression: return(new V1CompressionEncryptedHeaderBlock(dataBlock)); case HeaderBlockType.UnicodeFileNameInfo: return(new V1UnicodeFileNameInfoEncryptedHeaderBlock(dataBlock)); } return(new UnrecognizedHeaderBlock(headerBlockType, dataBlock)); }
private ICrypto GetHeaderCrypto(HeaderBlockType headerBlockType) { switch (headerBlockType) { case HeaderBlockType.FileInfo: return(CreateKeyStreamCrypto(FILEINFO_KEYSTREAM_INDEX)); case HeaderBlockType.Compression: return(CreateKeyStreamCrypto(COMPRESSIONINFO_KEYSTREAM_INDEX)); case HeaderBlockType.UnicodeFileNameInfo: return(CreateKeyStreamCrypto(FILENAMEINFO_KEYSTREAM_INDEX)); case HeaderBlockType.AsymmetricRecipients: return(CreateKeyStreamCrypto(ASYMMETRICRECIPIENTS_KEYSTREAM_INDEX)); case HeaderBlockType.AlgorithmVerifier: return(CreateKeyStreamCrypto(ALGORITHMVERIFIER_KEYSTREAM_INDEX)); } throw new InternalErrorException("Unexpected header block type. Can't determine Header Crypto."); }
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 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; }
public TestingHeaderBlock(HeaderBlockType headerBlockType, byte[] dataBlock) : base(headerBlockType, dataBlock) { }
protected HeaderBlock(HeaderBlockType headerBlockType) { HeaderBlockType = headerBlockType; }
private bool VerifyInternalUnsafe() { if (!_inputStream.Locate(_axCrypt1GuidBytes)) { return(FailWithStatusReport("Not an AxCrypt file, No magic Guid was found.")); } _statusReport.Add($"{nameof(AxCryptItemType.MagicGuid)} Ok with length {0}".InvariantFormat(AxCrypt1Guid.Length)); AxCryptVersion version = AxCryptVersion.Unknown; ulong encryptedDataLength = 0; int dataBlocks = 0; while (true) { byte[] lengthBytes = new byte[sizeof(Int32)]; if (_inputStream.Read(lengthBytes, 0, lengthBytes.Length) != lengthBytes.Length) { return(FailWithStatusReport("End of stream reading header block length.")); } int headerBlockLength = BitConverter.ToInt32(lengthBytes, 0) - 5; int blockType = _inputStream.ReadByte(); if (blockType > 127 || blockType < 0) { return(FailWithStatusReport($"Unexpected header block type {blockType}")); } if (headerBlockLength < 0) { return(FailWithStatusReport($"Invalid block length {headerBlockLength}.")); } byte[] dataBlock = new byte[headerBlockLength]; if (_inputStream.Read(dataBlock, 0, headerBlockLength) != dataBlock.Length) { return(FailWithStatusReport($"End of stream reading block type {blockType}")); } HeaderBlockType headerBlockType = (HeaderBlockType)blockType; if (headerBlockType == HeaderBlockType.Data && version == AxCryptVersion.Version1) { return(ProcessVersion1DataBlock(dataBlock)); } if (headerBlockType != HeaderBlockType.EncryptedDataPart && dataBlocks > 0) { _statusReport.Add($"{HeaderBlockType.EncryptedDataPart} Ok with {dataBlocks} blocks and the total length {encryptedDataLength}."); dataBlocks = 0; encryptedDataLength = 0; } switch (headerBlockType) { case HeaderBlockType.Version: VersionHeaderBlock versionHeaderBlock = new VersionHeaderBlock(dataBlock); _statusReport.Add($"AxCrypt version {versionHeaderBlock.VersionMajor}.{versionHeaderBlock.VersionMinor}.{versionHeaderBlock.VersionMinuscule}. File format version {versionHeaderBlock.FileVersionMajor}.{versionHeaderBlock.FileVersionMinor}."); version = versionHeaderBlock.VersionMajor >= 2 ? AxCryptVersion.Version2 : AxCryptVersion.Version1; break; case HeaderBlockType.EncryptedDataPart: switch (version) { case AxCryptVersion.Version2: ++dataBlocks; encryptedDataLength += (uint)dataBlock.Length; break; case AxCryptVersion.Unknown: default: return(FailWithStatusReport($"{blockType} found but no {HeaderBlockType.Version} seen.")); } break; default: _statusReport.Add($"{headerBlockType} Ok with length {headerBlockLength}"); break; } if (headerBlockType == HeaderBlockType.V2Hmac) { return(ShowStatusReport()); } } }
protected StringEncryptedHeaderBlockBase(HeaderBlockType blockType, byte[] dataBlock) : base(blockType, dataBlock) { }
public UnrecognizedHeaderBlock(HeaderBlockType headerBlockType, byte[] dataBlock) : base(headerBlockType, dataBlock) { }
protected HeaderBlock(HeaderBlockType headerBlockType, byte[] dataBlock) { HeaderBlockType = headerBlockType; _dataBlock = dataBlock; }
protected StringEncryptedHeaderBlockBase(HeaderBlockType blockType, ICrypto headerCrypto) : this(blockType, new byte[0]) { HeaderCrypto = headerCrypto; StringValue = String.Empty; }
private static void ReadHeadersToLast(IList <HeaderBlock> headerBlocks, AxCryptReaderBase axCryptReader, HeaderBlockType last) { while (axCryptReader.Read()) { switch (axCryptReader.CurrentItemType) { case AxCryptItemType.Data: case AxCryptItemType.HeaderBlock: break; default: throw new InternalErrorException("The reader returned an item type it should not be possible for it to return."); } headerBlocks.Add(axCryptReader.CurrentHeaderBlock); if (axCryptReader.CurrentHeaderBlock.HeaderBlockType == last) { return; } } throw new FileFormatException("Premature end of stream.", ErrorStatus.EndOfStream); }
public void SetHeaderBlockType(HeaderBlockType headerBlockType) { HeaderBlockType = headerBlockType; }
protected EncryptedHeaderBlock(HeaderBlockType headerBlockType, byte[] dataBlock) : base(headerBlockType, dataBlock) { }
protected abstract HeaderBlock HeaderBlockFactory(HeaderBlockType headerBlockType, byte[] dataBlock);