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); } }
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; }
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; } }
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 } }
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); } }