public override void BuildBuffer(IO.EndianStream blockStream, System.IO.Stream sourceFile, Security.Cryptography.TigerHashBase hasher) { base.BuildBuffer(blockStream, sourceFile, hasher); ComputeHash(blockStream, hasher); Array.Copy(hasher.Hash, 0, CompressedDataTiger128, 0, CompressedDataTiger128.Length); }
public void ComputeHash(IO.EndianStream blockStream, Security.Cryptography.TigerHashBase hasher) { Contract.Requires(blockStream != null); Contract.Requires(hasher != null); hasher.Initialize(); hasher.ComputeHash(blockStream.BaseStream, (long)DataOffset, DataSize); }
protected void UpdateDecompressedDataTigerHash(System.IO.Stream source, Security.Cryptography.TigerHashBase hasher) { hasher.ComputeHash(source, 0, (int)source.Length, restorePosition: true); ulong tiger64; hasher.TryGetAsTiger64(out tiger64); DecompressedDataTiger64 = tiger64; }
public virtual void BuildBuffer(IO.EndianStream blockStream, Stream sourceFile , Security.Cryptography.TigerHashBase hasher = null) { blockStream.AlignToBoundry(DataAlignmentBit); sourceFile.Seek(0, SeekOrigin.Begin); if (hasher != null) { UpdateDecompressedDataTigerHash(sourceFile, hasher); } Contract.Assert(blockStream.BaseStream.Position == blockStream.BaseStream.Length); DataOffset = blockStream.PositionPtr; // #TODO determine if compressing the sourceFile data has any savings (eg, 7% smaller) var assumed_compression_type = CompressionType; // #NOTE CompressionType can be Stored but IsDeflateStream can be true (seen it in XMB). // So just handle the flag as we do EcfCompressionType.DeflateStream if (IsDeflateStream) { assumed_compression_type = EcfCompressionType.DeflateStream; } switch (assumed_compression_type) { case EcfCompressionType.Stored: { // Update this ECF's size DataSize = (int)sourceFile.Length; // Also update this ECF's checksum Adler32 = Security.Cryptography.Adler32.Compute(sourceFile, DataSize, restorePosition: true); // Copy the source file's bytes to the block stream sourceFile.CopyTo(blockStream.BaseStream); break; } case EcfCompressionType.DeflateRaw: CompressSourceToStream(blockStream.Writer, sourceFile); break; case EcfCompressionType.DeflateStream: CompressSourceToCompressionStream(blockStream.Writer, sourceFile); break; default: throw new KSoft.Debug.UnreachableException(assumed_compression_type.ToString()); } Contract.Assert(blockStream.BaseStream.Position == ((long)DataOffset + DataSize)); }