private void WriteFooterInCurrentPosition(EncryptedFile.Footer footer) { var footerBytes = StructConverter.ConvertStructToBits(footer); if (!isReadonly) { stream.Write(footerBytes, 0, EncryptedFile.Footer.FooterSize); } }
private void WriteHeaderInCurrentPositionIfNotReadonly(EncryptedFile.Header fileHeader) { if (isReadonly) { return; } var headerBytes = StructConverter.ConvertStructToBits(fileHeader); stream.Write(headerBytes, 0, EncryptedFile.Header.HeaderSize); }
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); }
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); } } }