public async Task<BlobFingerprint> GetFingerprintAsync(Stream stream, CancellationToken cancellationToken)
        {
            using (var sha3 = new Keccak())
            using (var sha256 = SHA256.Create())
            using (var md5 = MD5.Create())
            {
                var buffers = new[] { AllocateBuffer(), AllocateBuffer() };
                var index = 0;

                var totalLength = 0L;

                var readTask = stream.ReadAsync(buffers[index], 0, buffers[index].Length, cancellationToken);

                for (;;)
                {
                    var length = await readTask.ConfigureAwait(false);

                    if (length < 1)
                        break;

                    var buffer = buffers[index];

                    if (++index >= buffers.Length)
                        index = 0;

                    readTask = stream.ReadAsync(buffers[index], 0, buffers[index].Length, cancellationToken);

                    totalLength += length;

                    sha3.TransformBlock(buffer, 0, length, null, 0);

                    sha256.TransformBlock(buffer, 0, length, null, 0);

                    md5.TransformBlock(buffer, 0, length, null, 0);
                }

                sha3.TransformFinalBlock(buffers[0], 0, 0);

                sha256.TransformFinalBlock(buffers[0], 0, 0);

                md5.TransformFinalBlock(buffers[0], 0, 0);

                foreach (var buffer in buffers)
                    FreeBuffer(buffer);

                var fingerprint = new BlobFingerprint(totalLength, sha3.Hash, sha256.Hash, md5.Hash);

                return fingerprint;
            }
        }
示例#2
0
 public FileFingerprint(string fullFilePath, DateTime lastModifiedUtc, BlobFingerprint fingerprint, bool wasCached = false)
 {
     Fingerprint = fingerprint;
     WasCached = wasCached;
     FullFilePath = fullFilePath;
     LastModifiedUtc = lastModifiedUtc;
 }
        public async Task <BlobFingerprint> GetFingerprintAsync(Stream stream, CancellationToken cancellationToken)
        {
            using (var sha3 = new Keccak())
                using (var sha256 = SHA256.Create())
                    using (var md5 = MD5.Create())
                    {
                        var buffers = new[] { AllocateBuffer(), AllocateBuffer() };
                        var index   = 0;

                        var totalLength = 0L;

                        var readTask = stream.ReadAsync(buffers[index], 0, buffers[index].Length, cancellationToken);

                        for (; ;)
                        {
                            var length = await readTask.ConfigureAwait(false);

                            if (length < 1)
                            {
                                break;
                            }

                            var buffer = buffers[index];

                            if (++index >= buffers.Length)
                            {
                                index = 0;
                            }

                            readTask = stream.ReadAsync(buffers[index], 0, buffers[index].Length, cancellationToken);

                            totalLength += length;

                            sha3.TransformBlock(buffer, 0, length, buffer, 0);

                            sha256.TransformBlock(buffer, 0, length, buffer, 0);

                            md5.TransformBlock(buffer, 0, length, buffer, 0);
                        }

                        sha3.TransformFinalBlock(buffers[0], 0, 0);

                        sha256.TransformFinalBlock(buffers[0], 0, 0);

                        md5.TransformFinalBlock(buffers[0], 0, 0);

                        foreach (var buffer in buffers)
                        {
                            FreeBuffer(buffer);
                        }

                        var fingerprint = new BlobFingerprint(totalLength, sha3.Hash, sha256.Hash, md5.Hash);

                        return(fingerprint);
                    }
        }
示例#4
0
        static async Task <FileFingerprint> ReadFileFingerprintAsync(JsonReader reader, CancellationToken cancellationToken)
        {
            if (JsonToken.StartObject != reader.TokenType)
            {
                throw new JsonReaderException("State not object");
            }

            string   path     = null;
            DateTime?modified = null;
            long?    size     = null;

            byte[] md5      = null;
            byte[] sha256   = null;
            byte[] sha3_512 = null;

            while (await reader.ReadAsync(cancellationToken).ConfigureAwait(false))
            {
                if (reader.TokenType == JsonToken.EndObject)
                {
                    if (null == path || !modified.HasValue || !size.HasValue ||
                        null == md5 || null == sha256 || null == sha3_512)
                    {
                        throw new JsonReaderException("Missing required property");
                    }

                    var fingerprint = new BlobFingerprint(size.Value, sha3_512, sha256, md5);

                    return(new FileFingerprint(path, modified.Value, fingerprint, true));
                }

                if (reader.TokenType != JsonToken.PropertyName)
                {
                    throw new JsonReaderException("Missing property name");
                }

                var name = (string)reader.Value;

                if (!await reader.ReadAsync(cancellationToken).ConfigureAwait(false))
                {
                    throw new JsonReaderException("Missing property value for " + name);
                }

                switch (name)
                {
                case "path":
                    path = (string)reader.Value;
                    break;

                case "modified":
                    modified = DateTime.FromBinary((long)reader.Value);
                    break;

                case "size":
                    size = (long)reader.Value;
                    break;

                case "sha256":
                    sha256 = (byte[])reader.Value;
                    break;

                case "md5":
                    md5 = (byte[])reader.Value;
                    break;

                case "sha3_512":
                    sha3_512 = (byte[])reader.Value;
                    break;

                default:
                    Debug.WriteLine("Unknown name: " + name);
                    break;
                }
            }

            return(null);
        }
        IFileFingerprint ReadFileFingerprint(JsonReader reader)
        {
            if (JsonToken.StartObject != reader.TokenType)
                throw new JsonReaderException("State not object");

            string path = null;
            DateTime? modified = null;
            long? size = null;
            byte[] md5 = null;
            byte[] sha256 = null;
            byte[] sha3_512 = null;

            while (reader.Read())
            {
                if (reader.TokenType == JsonToken.EndObject)
                {
                    if (null == path || !modified.HasValue || !size.HasValue ||
                        null == md5 || null == sha256 || null == sha3_512)
                        throw new JsonReaderException("Missing required property");

                    var fingerprint = new BlobFingerprint(size.Value, sha3_512, sha256, md5);

                    return new FileFingerprint(path, modified.Value, fingerprint, true);
                }

                if (reader.TokenType != JsonToken.PropertyName)
                    throw new JsonReaderException("Missing property name");

                var name = (string)reader.Value;

                if (!reader.Read())
                    throw new JsonReaderException("Missing property value for " + name);

                switch (name)
                {
                    case "path":
                        path = (string)reader.Value;
                        break;
                    case "modified":
                        modified = DateTime.FromBinary((long)reader.Value);
                        break;
                    case "size":
                        size = (long)reader.Value;
                        break;
                    case "sha256":
                        sha256 = (byte[])reader.Value;
                        break;
                    case "md5":
                        md5 = (byte[])reader.Value;
                        break;
                    case "sha3_512":
                        sha3_512 = (byte[])reader.Value;
                        break;
                }
            }

            return null;
        }