From a00e225d74dfa03aba2293530416f69c55373bed Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sat, 12 Sep 2026 08:30:13 +0100 Subject: [PATCH] xftp: hash of the shared part of file description (#1865) Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> --- src/Simplex/FileTransfer/Description.hs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Simplex/FileTransfer/Description.hs b/src/Simplex/FileTransfer/Description.hs index cd2df9d33..4cbb08014 100644 --- a/src/Simplex/FileTransfer/Description.hs +++ b/src/Simplex/FileTransfer/Description.hs @@ -29,6 +29,7 @@ module Simplex.FileTransfer.Description YAMLFileDescription (..), -- for tests YAMLServerReplicas (..), -- for tests validateFileDescription, + sharedDescriptionHash, groupReplicasByServer, fdSeparator, kb, @@ -72,6 +73,7 @@ import Simplex.FileTransfer.Protocol import Simplex.Messaging.Agent.QueryString import Simplex.Messaging.Agent.Store.DB (Binary (..), FromField (..), ToField (..)) import qualified Simplex.Messaging.Crypto as C +import Simplex.Messaging.Encoding (Encoding (..)) import Simplex.Messaging.Encoding.String import Simplex.Messaging.Parsers (defaultJSON, parseAll) import Simplex.Messaging.Protocol (XFTPServer) @@ -227,6 +229,13 @@ validateFileDescription fd@FileDescription {size, chunks} chunkNos = map (\FileChunk {chunkNo} -> chunkNo) chunks chunksSize = foldl' (\(s :: Int64) FileChunk {chunkSize} -> s + fromIntegral (unFileSize chunkSize)) 0 +sharedDescriptionHash :: FileDescription p -> ByteString +sharedDescriptionHash FileDescription {size, digest, key, nonce, chunkSize, chunks} = + C.sha512Hash $ smpEncode (unFileSize size, unFileDigest digest, C.unSbKey key, nonce, unFileSize chunkSize) <> foldMap chunkFields chunks + where + chunkFields FileChunk {chunkNo, chunkSize = cSize, digest = cDigest} = + smpEncode (fromIntegral chunkNo :: Int64, unFileSize cSize, unFileDigest cDigest) + encodeFileDescription :: FileDescription p -> YAMLFileDescription encodeFileDescription FileDescription {party, size, digest, key, nonce, chunkSize, chunks, redirect} = YAMLFileDescription