//Створення папки вручну protected DirElement(DirElement parent, SafeStreamAccess dataFileStream, string Name, Object addElementLocker, Object changeElementsLocker, Bitmap Icon = null, SafeStreamAccess.ProgressCallback Progress = null) : this(addElementLocker, changeElementsLocker) { lock (_addElementLocker) { lock (dataFileStream.writeLock) { header = new Header(parent.header.headersFileStream, parent.header.AES, ElementType.Dir); this.dataFileStream = dataFileStream; byte[] icon = GetIconBytes(Icon); UInt32 iconSize = icon == null ? 0 : (UInt32)icon.Length; UInt64 iconStartPos = dataFileStream.GetFreeSpaceStartPos(Crypto.GetMod16(iconSize)); //Вибираємо місце куди писати іконку AesCryptoServiceProvider AES = GetFileAES(_IconIV); if ((icon != null) && (iconSize > 0)) { dataFileStream.WriteEncrypt((long)iconStartPos, icon, AES); } _Name = Name; _ID = GenID(); _ParentID = parent.ID; _IconStartPos = iconStartPos; _IconSize = iconSize; _PHash = GetPHash(Icon); Parent = parent; SaveInf(); } } }
protected Element(Header header, SafeStreamAccess dataFileStream, Object addElementLocker, Object changeElementsLocker) { this.header = header; this.dataFileStream = dataFileStream; _addElementLocker = addElementLocker; _changeElementsLocker = changeElementsLocker; }
//Створення при зчитувані з файлу public Header(Stream memoryStream, UInt64 startPos, SafeStreamAccess headersStream, AesCryptoServiceProvider AES) { memoryData = memoryStream; //Зчитуємо незакодовані дані, IV (16 байт) і Exists (1 байт) byte[] buf = new byte[17]; _StartPos = startPos; memoryStream.Position = (int)startPos; memoryStream.Read(buf, 0, buf.Length); //Записуємо зчитані дані в відповідні параметри _IV = new byte[16]; Buffer.BlockCopy(buf, 0, _IV, 0, 16); _Exists = buf[16] < 128; _AES = AES; SetAESValue(); Crypto.AES_Decrypt(memoryStream, buf, 16, this.AES); _InfSize = BitConverter.ToUInt16(buf, 13); _ElType = (ElementType)(buf[15] / 128); writedInFile = true; _headersFileStream = headersStream; if (_Exists) { infDdata = new byte[_InfSize]; SetAESValue(); //memoryData.Position = (int)_StartPos + Length; Crypto.AES_Decrypt(memoryData, infDdata, infDdata.Length, AES); } }
//Створення файлу при читані з файлу public FileElement(Header header, SafeStreamAccess dataFileStream, Object addElementLocker, Object changeElementsLocker) : base(header, dataFileStream, addElementLocker, changeElementsLocker) { byte[] buf = header.GetInfoBuf(); ReadElementParamsFromBuffer(buf); buf = null; }
public Header(SafeStreamAccess headersStream, AesCryptoServiceProvider AES, ElementType blockType) { _IV = new byte[16]; CryptoRandom.GetBytes(_IV); _AES = AES; _StartPos = (UInt64)headersStream.Length; _Exists = true; _ElType = blockType; _headersFileStream = headersStream; _InfSize = 0; }
//Створення файлу вручну public FileElement(DirElement parent, Header parentHeader, SafeStreamAccess dataFileStream, string Name, Stream fileStream, bool isCompressed, Object addElementLocker, Object changeElementsLocker, Bitmap Icon = null, SafeStreamAccess.ProgressCallback Progress = null) : base(addElementLocker, changeElementsLocker) { lock (_addElementLocker) { UInt64 fileSize = (UInt64)fileStream.Length; byte[] icon = GetIconBytes(Icon); UInt32 iconSize = icon == null ? 0 : (UInt32)icon.Length; UInt64 fileStartPos = dataFileStream.GetFreeSpaceStartPos(Crypto.GetMod16(fileSize)); //Вибираємо місце куди писати файл UInt64 iconStartPos = dataFileStream.GetFreeSpaceStartPos(Crypto.GetMod16(iconSize)); //Вибираємо місце куди писати іконку iconStartPos = (iconStartPos == fileStartPos) ? iconStartPos += Crypto.GetMod16(fileSize) : iconStartPos; lock (dataFileStream.writeLock) { header = new Header(parentHeader.headersFileStream, parentHeader.AES, ElementType.File); this.dataFileStream = dataFileStream; _Name = Name; _ParentID = parent.ID; _FileStartPos = fileStartPos; _FileSize = fileSize; _IconStartPos = iconStartPos; _IconSize = iconSize; _IsCompressed = isCompressed; _Hash = new byte[16]; CryptoRandom.GetBytes(_Hash); _PHash = GetPHash(Icon); SaveInf(); _Exists = false; } AesCryptoServiceProvider AES = GetFileAES(_FileIV); if (fileSize > 0) { dataFileStream.WriteEncrypt((long)fileStartPos, fileStream, AES, out _Hash, Progress); } if ((icon != null) && (iconSize > 0)) { AES.IV = _IconIV; dataFileStream.WriteEncrypt((long)iconStartPos, icon, AES); } //Закидаємо файл в потрібну папку і записуємо зміни _Exists = true; ChangeParent(parent, true); } }
public XDB(string FileName, string Password, ProgressCallback Progress = null) { Progress?.Invoke(0, "Creating AES key"); InitKey(Password); _addElementLocker = new Object(); _changeElementsLocker = new Object(); string DataFilename = Path.GetDirectoryName(FileName) + "\\" + Path.GetFileNameWithoutExtension(FileName) + ".Data"; try { bool writeVersion = !File.Exists(FileName); _headersFileStream = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read); _dataFileStream = new FileStream(DataFilename, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read); if (writeVersion) { _headersFileStream.WriteByte(Version); } IsReadOnly = false; } catch { if (_headersFileStream != null) { _headersFileStream.Close(); } _headersFileStream = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite); _dataFileStream = new FileStream(DataFilename, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite); IsReadOnly = true; } header = new Header(new SafeStreamAccess(_headersFileStream), AES, ElementType.Dir); dataFileStream = new SafeStreamAccess(_dataFileStream); try { ReadFileStruct(Progress); } catch (Exception) { throw new ReadingDataException("Помилка читання даних. Можливо невірний пароль."); } }