示例#1
0
        private void WriteFooterInCurrentPosition(EncryptedFile.Footer footer)
        {
            var footerBytes = StructConverter.ConvertStructToBits(footer);

            if (!isReadonly)
            {
                stream.Write(footerBytes, 0, EncryptedFile.Footer.FooterSize);
            }
        }
示例#2
0
        private void WriteHeaderInCurrentPositionIfNotReadonly(EncryptedFile.Header fileHeader)
        {
            if (isReadonly)
            {
                return;
            }

            var headerBytes = StructConverter.ConvertStructToBits(fileHeader);

            stream.Write(headerBytes, 0, EncryptedFile.Header.HeaderSize);
        }
示例#3
0
        private void WriteHeaderInCurrentPositionIfNotReadonly(EncryptedFile.Header fileHeader, ulong magicNumber)
        {
            if (isReadonly)
            {
                return;
            }

            var headerSize  = GetHeaderSizeByMagicNumber(magicNumber);
            var headerBytes = StructConverter.ConvertStructToBits(fileHeader, headerSize);

            stream.Write(headerBytes, 0, headerSize);
        }
示例#4
0
        private EncryptedFile.Header ReadOrWriteHeader(int defaultBlockSize)
        {
            lock (locker)
            {
                stream.Position = 0;

                if (stream.Length >= EncryptedFile.Header.HeaderSize)
                {
                    // Read header

                    var headerBytes = stream.ReadEntireBlock(EncryptedFile.Header.HeaderSize);
                    var header      = StructConverter.ConvertBitsToStruct <EncryptedFile.Header>(headerBytes);

                    if (header.MagicNumber != EncryptedFile.DefaultMagicNumber)
                    {
                        throw new InvalidDataException("The magic number in the file doesn't match the expected magic number for encypted files. Perhaps this file isn't encrypted?");
                    }

                    return(header);
                }
                else
                {
                    // Write header

                    var sizeTest = settings.Codec.EncodeBlock("Dummy key", new byte[defaultBlockSize]);

                    var header = new EncryptedFile.Header
                    {
                        MagicNumber        = EncryptedFile.DefaultMagicNumber,
                        DecryptedBlockSize = defaultBlockSize,
                        IVSize             = sizeTest.IV.Length,
                        EncryptedBlockSize = sizeTest.Data.Length
                    };
                    var headerBytes = StructConverter.ConvertStructToBits(header);

                    if (!isReadonly)
                    {
                        stream.Write(headerBytes, 0, EncryptedFile.Header.HeaderSize);
                    }

                    return(header);
                }
            }
        }