Example #1
0
        //Створення папки вручну
        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();
                }
            }
        }
Example #2
0
 protected Element(Header header, SafeStreamAccess dataFileStream, Object addElementLocker, Object changeElementsLocker)
 {
     this.header           = header;
     this.dataFileStream   = dataFileStream;
     _addElementLocker     = addElementLocker;
     _changeElementsLocker = changeElementsLocker;
 }
Example #3
0
        //Створення при зчитувані з файлу
        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);
            }
        }
Example #4
0
        //Створення файлу при читані з файлу
        public FileElement(Header header, SafeStreamAccess dataFileStream, Object addElementLocker, Object changeElementsLocker) : base(header, dataFileStream, addElementLocker, changeElementsLocker)
        {
            byte[] buf = header.GetInfoBuf();

            ReadElementParamsFromBuffer(buf);

            buf = null;
        }
Example #5
0
        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;
        }
Example #6
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);
            }
        }
Example #7
0
        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("Помилка читання даних. Можливо невірний пароль.");
            }
        }