public void ReadHeader_CheckHashCode()
        {
            var fileName = Path.Combine(testFolder, "file.bin");
            var bytes    = new byte[] {
                0,                                 // version
                4, 0,                              // length of blocks
                1, 0, 0, 0,                        // length of source file
                0, 0, 0, 0,                        // length of source file
                1, 2, 3, 4,                        // hash code
                5, 6, 7, 8,                        // hash code
                9, 10, 11, 12,                     // hash code
                13, 14, 15, 16,                    // hash code
                0, 0, 0, 0                         // first block
            };

            File.WriteAllBytes(fileName, bytes);
            using (reader = new RsaFileReader(fileName)) {
                reader.ReadHeader();
                var expected = new byte[] {
                    1, 2, 3, 4,
                    5, 6, 7, 8,
                    9, 10, 11, 12,
                    13, 14, 15, 16
                };
                TestHelper.CheckArray(expected, reader.HashCode);
            }
        }
        public void IsDone_FileIsNotEmpty()
        {
            var fileName = Path.Combine(testFolder, "file.exe");

            File.WriteAllText(fileName, "hello");
            using (reader = new RsaFileReader(fileName)) {
                Assert.IsFalse(reader.IsDone);
            }
        }
        public void IsDone_FileIsEmpty()
        {
            var fileName = Path.Combine(testFolder, "file.bin");

            File.Create(fileName).Dispose();
            using (reader = new RsaFileReader(fileName)) {
                Assert.IsTrue(reader.IsDone);
            }
        }
        public void Length_LengthIs5()
        {
            var fileName = Path.Combine(testFolder, "file.txt");

            File.WriteAllBytes(fileName, new byte[] { 23, 67, 34, 89, 140 });
            using (reader = new RsaFileReader(fileName)) {
                Assert.AreEqual(5, reader.Length);
            }
        }
        public void ReadNextBlockBeforeReadHeader()
        {
            var fileName = Path.Combine(testFolder, "file.bin");

            File.WriteAllBytes(fileName, new byte[20]);
            using (reader = new RsaFileReader(fileName)) {
                Assert.Throws(typeof(InvalidOperationException), () => reader.ReadNextBlock());
            }
        }
        public void ReadHeader_FileTooSmall()
        {
            var fileName = Path.Combine(testFolder, "file.h");
            var bytes    = new byte[26];

            File.WriteAllBytes(fileName, bytes);
            using (reader = new RsaFileReader(fileName)) {
                Assert.Throws(typeof(SourceFileException), () => reader.ReadHeader());
            }
        }
        public void ReadHeader_CheckVersion()
        {
            var fileName = Path.Combine(testFolder, "file.bin");
            var bytes    = new byte[27];

            bytes[0] = 12;
            File.WriteAllBytes(fileName, bytes);
            using (reader = new RsaFileReader(fileName)) {
                reader.ReadHeader();
                Assert.AreEqual(12, reader.Version);
            }
        }
        public void ConstructorTest()
        {
            var fileName = Path.Combine(testFolder, "file.zip");

            File.WriteAllBytes(fileName, new byte[20]);

            using (reader = new RsaFileReader(fileName)) {
                Assert.AreEqual(0, reader.Version);
                Assert.AreEqual(0, reader.BlockLength);
                Assert.AreEqual(0, reader.SourceFileLength);
            }
        }
        public void ReadHeader_CheckBlockLength()
        {
            var fileName = Path.Combine(testFolder, "file.bin");
            var bytes    = new byte[27];

            bytes[1] = 23;
            bytes[2] = 1;
            File.WriteAllBytes(fileName, bytes);
            using (reader = new RsaFileReader(fileName)) {
                reader.ReadHeader();
                Assert.AreEqual(279, reader.BlockLength);
            }
        }
        public void ReadNextBlock_ZeroBeforeNumber()
        {
            var fileName = Path.Combine(testFolder, "file.bin");
            var bytes    = new byte[29];

            bytes[1]  = 2;
            bytes[27] = 45;
            bytes[28] = 0;
            File.WriteAllBytes(fileName, bytes);
            using (reader = new RsaFileReader(fileName)) {
                reader.ReadHeader();
                var number         = reader.ReadNextBlock();
                var expectedNumber = BigNumber.FromBytes(new[] { 45 });
                Assert.AreEqual(CompareResult.Equal, expectedNumber.Compare(number));
            }
        }
        public void ReadNextBlock_BlockLengthIs5()
        {
            var fileName = Path.Combine(testFolder, "file.bin");
            var bytes    = new byte[32];

            bytes[1]  = 5;
            bytes[27] = 23;
            bytes[28] = 67;
            bytes[29] = 12;
            bytes[30] = 149;
            bytes[31] = 253;
            File.WriteAllBytes(fileName, bytes);
            using (reader = new RsaFileReader(fileName)) {
                reader.ReadHeader();
                var number         = reader.ReadNextBlock();
                var expectedNumber = BigNumber.FromBytes(new[] { 23, 67, 12, 149, 253 });
                Assert.AreEqual(CompareResult.Equal, expectedNumber.Compare(number));
            }
        }
        public void ReadHeader_CheckSourceFileLength()
        {
            var fileName = Path.Combine(testFolder, "file.bin");
            var bytes    = new byte[27];

            // 10 FF FF FF FF FF FF FF
            bytes[3] = 255;
            bytes[4] = 255;
            bytes[5] = 255;
            bytes[6] = 255;

            bytes[7]  = 255;
            bytes[8]  = 255;
            bytes[9]  = 255;
            bytes[10] = 16;
            File.WriteAllBytes(fileName, bytes);
            using (reader = new RsaFileReader(fileName)) {
                reader.ReadHeader();
                Assert.AreEqual(1224979098644774911, reader.SourceFileLength);
            }
        }
        public void ReadNextBlock_BlockContainsOnlyZeros()
        {
            var fileName = Path.Combine(testFolder, "file.bin");
            var bytes    = new byte[] {
                0,                                 // version
                4, 0,                              // length of blocks
                1, 0, 0, 0,                        // length of source file
                0, 0, 0, 0,                        // length of source file
                0, 0, 0, 0,                        // hash code
                0, 0, 0, 0,                        // hash code
                0, 0, 0, 0,                        // hash code
                0, 0, 0, 0,                        // hash code
                0, 0, 0, 0                         // first block
            };

            File.WriteAllBytes(fileName, bytes);
            using (reader = new RsaFileReader(fileName)) {
                reader.ReadHeader();
                var number = reader.ReadNextBlock();
                Assert.IsTrue(number.IsZero);
            }
        }