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()); } } }
public void SetNextFileVersionMajor() { VersionHeaderBlock versionHeaderBlock = VersionHeaderBlock; versionHeaderBlock.FileVersionMajor = (byte)(versionHeaderBlock.FileVersionMajor + 1); }
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()); } } }