示例#1
0
        byte[] CalculateHash(Stream stream, bool create)
        {
            long pos = stream.Position;

            if (create)
            {
                _bodyLength = StreamLength(stream);
            }

            using (HashAlgorithm hasher = (_snk != null) ? _snk.CreateHasher() : QQnCryptoHelpers.CreateHashAlgorithm(_hashType))
            {
                long newPos = _hashPosition;

                if (stream.Position != newPos)
                {
                    stream.Position = newPos;
                }

                byte[] buffer;

                using (MemoryStream ms = new MemoryStream())                 // Use memorystream and writer to resolve endian-issues
                    using (QQnBinaryWriter bw = new QQnBinaryWriter(ms))
                    {
                        bw.Write(_guid.ToByteArray());
                        bw.Write(_bodyLength);

                        buffer = ms.ToArray();
                    }

                hasher.TransformBlock(buffer, 0, buffer.Length, null, 0);

                buffer = new byte[8192];

                int nRead;

                while (0 != (nRead = stream.Read(buffer, 0, buffer.Length)))
                {
                    hasher.TransformBlock(buffer, 0, nRead, null, 0);
                }

                hasher.TransformFinalBlock(buffer, 0, 0);

                if (stream.CanSeek)
                {
                    stream.Position = pos;
                }

                return(hasher.Hash);
            }
        }
示例#2
0
        void WriteHeader()
        {
            if (BaseStream.Position != _headerPosition)
            {
                BaseStream.Position = _headerPosition;
            }

            QQnBinaryWriter bw = new QQnBinaryWriter(BaseStream);

            bw.Write(_streamHash);
            bw.Write(_hashSignature);
            bw.Write(_hashLength);
            _hashPosition = BaseStream.Position;
        }
示例#3
0
        public void WriteHeader(Stream stream)
        {
            QQnBinaryWriter bw = new QQnBinaryWriter(stream);

            _headerPosition = SafePosition(stream);
            bw.Write(FileSignature);
            bw.Write(FileType);
            bw.Write((byte)_hashType);
            bw.WriteByteArray(_fileHash);
            bw.WriteByteArray(_hashSignature);
            bw.WriteByteArray(_snk != null ? _snk.GetPublicKeyData() : new byte[0]);
            bw.Write(_guid.ToByteArray());
            bw.Write(_bodyLength);
            _hashPosition = SafePosition(stream);
        }
        void WriteHeader()
        {
            BaseStream.Position = 0;
            _writer.Write((int)_maxCount);
            _writer.Write((int)_items.Count);

            _writer.Write((long)0);             // Next header position; not used for now

            for (int i = 0; (i < _items.Count) && (i < _maxCount); i++)
            {
                _items[i].WriteTo(_writer);
            }

            if (BaseStream.Length < _startPosition)
            {
                BaseStream.SetLength(_startPosition);
                BaseStream.Position = _startPosition;
            }
        }
示例#5
0
        internal void WriteTo(QQnBinaryWriter writer)
        {
            if (_length < uint.MaxValue)
            {
                writer.Write((byte)1);
                writer.Write(_offset);
                writer.Write((uint)_length);                 // As UInt32
                writer.Write(_itemType);
            }
            else
            {
                writer.Write((byte)2);
                writer.Write(_offset);
                writer.Write(_length);                 // As long
                writer.Write(_itemType);

                //throw new NotSupportedException("Big chance on buffer overflows on substreams greater than 4GB; Please review before enabling");
                // If only 1 in 4 streams is version 2 we are ok
            }
        }
示例#6
0
        byte[] CalculateHash(bool create)
        {
            if (create)
            {
                _hashLength = Length;
            }

            long oldPos = Position;

            Position = 0;
            using (HashAlgorithm hasher = QQnCryptoHelpers.CreateHashAlgorithm(_hashType))
            {
                byte[] buffer;
                using (MemoryStream ms = new MemoryStream(16))                 // Use memorystream and writer to resolve endian-issues
                    using (QQnBinaryWriter bw = new QQnBinaryWriter(ms))
                    {
                        bw.Write(_hashLength);
                        buffer = ms.ToArray();
                    }

                hasher.TransformBlock(buffer, 0, buffer.Length, null, 0);

                buffer = new byte[8192];

                int nRead;

                while (0 != (nRead = Read(buffer, 0, buffer.Length)))
                {
                    hasher.TransformBlock(buffer, 0, nRead, null, 0);
                }

                hasher.TransformFinalBlock(buffer, 0, 0);

                if (CanSeek)
                {
                    Position = oldPos;
                }

                return(hasher.Hash);
            }
        }