Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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;
        }
Beispiel #4
0
        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));
        }