Example #1
0
        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;
        }
Example #2
0
        protected HeaderBlock(HeaderBlockType headerBlockType, byte[] dataBlock)
        {
            if (dataBlock == null)
            {
                throw new ArgumentNullException("dataBlock");
            }

            HeaderBlockType = headerBlockType;
            _dataBlock      = (byte[])dataBlock.Clone();
        }
Example #3
0
        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));
        }
Example #4
0
        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.");
        }
Example #7
0
        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;
            }
        }
Example #8
0
        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;
        }
Example #9
0
        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;
        }
Example #10
0
 public TestingHeaderBlock(HeaderBlockType headerBlockType, byte[] dataBlock)
     : base(headerBlockType, dataBlock)
 {
 }
Example #11
0
 protected HeaderBlock(HeaderBlockType headerBlockType)
 {
     HeaderBlockType = headerBlockType;
 }
Example #12
0
        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)
 {
 }
Example #15
0
 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;
 }
Example #17
0
        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;
 }
 public void SetHeaderBlockType(HeaderBlockType headerBlockType)
 {
     HeaderBlockType = headerBlockType;
 }
 protected EncryptedHeaderBlock(HeaderBlockType headerBlockType, byte[] dataBlock)
     : base(headerBlockType, dataBlock)
 {
 }
Example #21
0
 protected HeaderBlock(HeaderBlockType headerBlockType, byte[] dataBlock)
 {
     HeaderBlockType = headerBlockType;
     _dataBlock = dataBlock;
 }
Example #22
0
 protected EncryptedHeaderBlock(HeaderBlockType headerBlockType, byte[] dataBlock)
     : base(headerBlockType, dataBlock)
 {
 }
Example #23
0
 protected HeaderBlock(HeaderBlockType headerBlockType)
 {
     HeaderBlockType = headerBlockType;
 }
Example #24
0
 protected abstract HeaderBlock HeaderBlockFactory(HeaderBlockType headerBlockType, byte[] dataBlock);
 public UnrecognizedHeaderBlock(HeaderBlockType headerBlockType, byte[] dataBlock)
     : base(headerBlockType, dataBlock)
 {
 }