From e14949b97be58a39f0b0e06ee08f041d5ce79684 Mon Sep 17 00:00:00 2001 From: Bernd Brachmaier | AUNOVIS Date: Tue, 5 Dec 2023 15:57:00 +0100 Subject: [PATCH] Avoid additional decode to calculate fingerprint --- .../SAF.Toolbox/Filetransfer/TransportFile.cs | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/Toolbox/SAF.Toolbox/Filetransfer/TransportFile.cs b/src/Toolbox/SAF.Toolbox/Filetransfer/TransportFile.cs index 0c5bd0f..ed63517 100644 --- a/src/Toolbox/SAF.Toolbox/Filetransfer/TransportFile.cs +++ b/src/Toolbox/SAF.Toolbox/Filetransfer/TransportFile.cs @@ -15,6 +15,7 @@ public class TransportFile internal string Content { get; set; } = string.Empty; internal long OriginalLength { get; set; } + internal string? Fingerprint { get; set; } public string Name { get; } public string? MimeType { get; } @@ -27,7 +28,7 @@ public TransportFile(string name, string? mimeType = null, IDictionary (Content, OriginalLength) = Encode(stream); + public void ReadFrom(Stream stream) => (Content, OriginalLength, Fingerprint) = Encode(stream); public void WriteTo(Stream stream) => Decode(stream, Content); @@ -45,9 +46,14 @@ public IDictionary ToSerializableProperties() properties["Content"] = Content; properties["OriginalLength"] = $"{OriginalLength}"; - using var ms = new MemoryStream(); - Decode(ms, Content); - properties["Fingerprint"] = GenerateFingerprint(ms); + if (string.IsNullOrEmpty(Fingerprint)) + { + using var ms = new MemoryStream(); + Decode(ms, Content); + Fingerprint = GenerateFingerprint(ms); + } + + properties["Fingerprint"] = Fingerprint; return properties; } @@ -68,18 +74,26 @@ public bool Verify() return StringComparer.OrdinalIgnoreCase.Compare(hash, fingerprint) == 0; } - private static (string encodedContent, long originalLength) Encode(Stream stream) + private (string encodedContent, long originalLength, string fingerprint) Encode(Stream stream) + { + var fingerprint = GenerateFingerprint(stream); + var originalLength = stream.Position; + stream.Seek(0, SeekOrigin.Begin); + + var encodedContent = EncodeStream(stream); + return (encodedContent, originalLength, fingerprint); + } + + private static string EncodeStream(Stream stream) { using var ms = new MemoryStream(); using var cs = new CryptoStream(ms, new ToBase64Transform(), CryptoStreamMode.Write); stream.CopyTo(cs); - var originalLength = stream.Position; - cs.FlushFinalBlock(); ms.Flush(); ms.Seek(0, SeekOrigin.Begin); var reader = new StreamReader(ms); - return (reader.ReadToEnd(), originalLength); + return reader.ReadToEnd(); } private static void Decode(Stream stream, string content)