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); }
/// <summary> /// Initializes a new instance of the <see cref="MultipleStreamWriter"/> class. /// </summary> /// <param name="output">The output.</param> /// <param name="args">The args.</param> public MultipleStreamWriter(Stream output, MultipleStreamCreateArgs args) { if (output == null) { throw new ArgumentNullException("output"); } _output = output; _writer = new QQnBinaryWriter(BaseStream); _maxCount = args.MaximumNumberOfStreams; // sizeof(_maxCount) + sizeof(_items) + sizeof(_nextHeaderPosition) + sizeof(item)*maxItems _startPosition = 4 + 4 + 8 + MultiStreamItemHeader.ItemSize * _maxCount; WriteHeader(); }
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); } }