public void TestDecryptOfTooNewFileVersion()
        {
            DateTime creationTimeUtc   = new DateTime(2012, 1, 1, 1, 2, 3, DateTimeKind.Utc);
            DateTime lastAccessTimeUtc = creationTimeUtc + new TimeSpan(1, 0, 0);
            DateTime lastWriteTimeUtc  = creationTimeUtc + new TimeSpan(2, 0, 0);;

            using (Stream inputStream = FakeDataStore.ExpandableMemoryStream(Encoding.UTF8.GetBytes("AxCrypt is Great!")))
            {
                using (Stream outputStream = new MemoryStream())
                {
                    Passphrase passphrase = new Passphrase("a");
                    using (V1AxCryptDocument document = new V1AxCryptDocument(passphrase, 101))
                    {
                        document.FileName          = "MyFile.txt";
                        document.CreationTimeUtc   = creationTimeUtc;
                        document.LastAccessTimeUtc = lastAccessTimeUtc;
                        document.LastWriteTimeUtc  = lastWriteTimeUtc;
                        VersionHeaderBlock versionHeaderBlock = document.DocumentHeaders.VersionHeaderBlock;
                        versionHeaderBlock.FileVersionMajor = (byte)(versionHeaderBlock.FileVersionMajor + 1);
                        document.EncryptTo(inputStream, outputStream, AxCryptOptions.EncryptWithoutCompression);
                    }
                    outputStream.Position = 0;
                    using (V1AxCryptDocument document = new V1AxCryptDocument())
                    {
                        Assert.Throws <FileFormatException>(() => { document.Load(passphrase, new V1Aes128CryptoFactory().CryptoId, outputStream); });
                    }
                }
            }
        }
        public static void TestSetCurrentVersion()
        {
            VersionHeaderBlock versionHeaderBlock = new VersionHeaderBlock(new byte[] { 3, 2, 2, 0, 0 });

            Assert.That(versionHeaderBlock.GetDataBlockBytes(), Is.EquivalentTo(new byte[] { 3, 2, 2, 0, 0 }));

            versionHeaderBlock.SetCurrentVersion(new byte[] { 5, 6, 7, 8, 9 });
            Assert.That(versionHeaderBlock.GetDataBlockBytes(), Is.EquivalentTo(new byte[] { 5, 6, 7, 8, 9 }));
        }
        public static void TestVersionValues()
        {
            VersionHeaderBlock versionHeaderBlock = new VersionHeaderBlock(new byte[] { 3, 2, 2, 0, 0 });

            Assert.That(versionHeaderBlock.FileVersionMajor, Is.EqualTo(3), "This is the current default version number");
            Assert.That(versionHeaderBlock.FileVersionMinor, Is.EqualTo(2), "This is the current default version number");
            Assert.That(versionHeaderBlock.VersionMajor, Is.EqualTo(2), "This is the current default version number");
            Assert.That(versionHeaderBlock.VersionMinor, Is.EqualTo(0), "This is the current default version number");
            Assert.That(versionHeaderBlock.VersionMinuscule, Is.EqualTo(0), "This is the current default version number");
        }
 public void TestFindPreambleHeaderBlockNotFirstShouldThrow()
 {
     using (MemoryStream testStream = new MemoryStream())
     {
         AxCrypt1Guid.Write(testStream);
         VersionHeaderBlock versionHeaderBlock = new VersionHeaderBlock(new byte[] { 3, 2, 2, 0, 0 });
         versionHeaderBlock.Write(testStream);
         PreambleHeaderBlock preambleHeaderBlock = new PreambleHeaderBlock();
         preambleHeaderBlock.Write(testStream);
         testStream.Position = 0;
         using (V1AxCryptReader axCryptReader = new V1AxCryptReader(new LookAheadStream(testStream)))
         {
             Assert.That(axCryptReader.Read(), Is.True, "We should be able to read the Guid");
             Assert.That(axCryptReader.CurrentItemType, Is.EqualTo(AxCryptItemType.MagicGuid), "We're expecting to have found a MagicGuid");
             Assert.Throws <FileFormatException>(() => axCryptReader.Read());
         }
     }
 }
Exemplo n.º 5
0
            public void SetNextFileVersionMajor()
            {
                VersionHeaderBlock versionHeaderBlock = VersionHeaderBlock;

                versionHeaderBlock.FileVersionMajor = (byte)(versionHeaderBlock.FileVersionMajor + 1);
            }
Exemplo n.º 6
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());
                }
            }
        }