From c5b7d3c7afb8c0df8d329885db09b08c2e88109c Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 16 Jun 2025 11:11:59 +0100 Subject: [PATCH] agent: use flexible (small/large) string encoding for contact link data, for backward/forward compatibility (#1569) * agent: use large string encoding for contact link data * size-dependent user link data encoding * tag large user data encoding with \255 --- src/Simplex/Messaging/Agent.hs | 12 +++++----- src/Simplex/Messaging/Agent/Protocol.hs | 21 ++++++++++++++--- src/Simplex/Messaging/Crypto/ShortLink.hs | 6 ++--- src/Simplex/Messaging/Util.hs | 4 +++- tests/AgentTests/EqInstances.hs | 6 ++++- tests/AgentTests/FunctionalAPITests.hs | 28 +++++++++++------------ tests/AgentTests/ShortLinkTests.hs | 18 +++++++-------- 7 files changed, 58 insertions(+), 37 deletions(-) diff --git a/src/Simplex/Messaging/Agent.hs b/src/Simplex/Messaging/Agent.hs index d178134c1..c72d39729 100644 --- a/src/Simplex/Messaging/Agent.hs +++ b/src/Simplex/Messaging/Agent.hs @@ -368,12 +368,12 @@ deleteConnectionsAsync c waitDelivery = withAgentEnv c . deleteConnectionsAsync' {-# INLINE deleteConnectionsAsync #-} -- | Create SMP agent connection (NEW command) -createConnection :: ConnectionModeI c => AgentClient -> UserId -> Bool -> SConnectionMode c -> Maybe ConnInfo -> Maybe CRClientData -> CR.InitialKeys -> SubscriptionMode -> AE (ConnId, (CreatedConnLink c, Maybe ClientServiceId)) +createConnection :: ConnectionModeI c => AgentClient -> UserId -> Bool -> SConnectionMode c -> Maybe UserLinkData -> Maybe CRClientData -> CR.InitialKeys -> SubscriptionMode -> AE (ConnId, (CreatedConnLink c, Maybe ClientServiceId)) createConnection c userId enableNtfs = withAgentEnv c .::. newConn c userId enableNtfs {-# INLINE createConnection #-} -- | Create or update user's contact connection short link -setConnShortLink :: AgentClient -> ConnId -> SConnectionMode c -> ConnInfo -> Maybe CRClientData -> AE (ConnShortLink c) +setConnShortLink :: AgentClient -> ConnId -> SConnectionMode c -> UserLinkData -> Maybe CRClientData -> AE (ConnShortLink c) setConnShortLink c = withAgentEnv c .:: setConnShortLink' c {-# INLINE setConnShortLink #-} @@ -832,14 +832,14 @@ switchConnectionAsync' c corrId connId = pure . connectionStats $ DuplexConnection cData rqs' sqs _ -> throwE $ CMD PROHIBITED "switchConnectionAsync: not duplex" -newConn :: ConnectionModeI c => AgentClient -> UserId -> Bool -> SConnectionMode c -> Maybe ConnInfo -> Maybe CRClientData -> CR.InitialKeys -> SubscriptionMode -> AM (ConnId, (CreatedConnLink c, Maybe ClientServiceId)) +newConn :: ConnectionModeI c => AgentClient -> UserId -> Bool -> SConnectionMode c -> Maybe UserLinkData -> Maybe CRClientData -> CR.InitialKeys -> SubscriptionMode -> AM (ConnId, (CreatedConnLink c, Maybe ClientServiceId)) newConn c userId enableNtfs cMode userData_ clientData pqInitKeys subMode = do srv <- getSMPServer c userId connId <- newConnNoQueues c userId enableNtfs cMode (CR.connPQEncryption pqInitKeys) (connId,) <$> newRcvConnSrv c userId connId enableNtfs cMode userData_ clientData pqInitKeys subMode srv `catchE` \e -> withStore' c (`deleteConnRecord` connId) >> throwE e -setConnShortLink' :: AgentClient -> ConnId -> SConnectionMode c -> ConnInfo -> Maybe CRClientData -> AM (ConnShortLink c) +setConnShortLink' :: AgentClient -> ConnId -> SConnectionMode c -> UserLinkData -> Maybe CRClientData -> AM (ConnShortLink c) setConnShortLink' c connId cMode userData clientData = withConnLock c connId "setConnShortLink" $ do SomeConn _ conn <- withStore c (`getConn` connId) @@ -935,7 +935,7 @@ changeConnectionUser' c oldUserId connId newUserId = do where updateConn = withStore' c $ \db -> setConnUserId db oldUserId connId newUserId -newRcvConnSrv :: forall c. ConnectionModeI c => AgentClient -> UserId -> ConnId -> Bool -> SConnectionMode c -> Maybe ConnInfo -> Maybe CRClientData -> CR.InitialKeys -> SubscriptionMode -> SMPServerWithAuth -> AM (CreatedConnLink c, Maybe ClientServiceId) +newRcvConnSrv :: forall c. ConnectionModeI c => AgentClient -> UserId -> ConnId -> Bool -> SConnectionMode c -> Maybe UserLinkData -> Maybe CRClientData -> CR.InitialKeys -> SubscriptionMode -> SMPServerWithAuth -> AM (CreatedConnLink c, Maybe ClientServiceId) newRcvConnSrv c userId connId enableNtfs cMode userData_ clientData pqInitKeys subMode srvWithAuth@(ProtoServerWithAuth srv _) = do case (cMode, pqInitKeys) of (SCMContact, CR.IKUsePQ) -> throwE $ CMD PROHIBITED "newRcvConnSrv" @@ -978,7 +978,7 @@ newRcvConnSrv c userId connId enableNtfs cMode userData_ clientData pqInitKeys s (pk1, pk2, pKem, e2eRcvParams) <- liftIO $ CR.generateRcvE2EParams g (maxVersion e2eEncryptVRange) pqEnc withStore' c $ \db -> createRatchetX3dhKeys db connId pk1 pk2 pKem pure $ CRInvitationUri crData $ toVersionRangeT e2eRcvParams e2eEncryptVRange - prepareLinkData :: ConnInfo -> C.PublicKeyX25519 -> AM (C.CbNonce, SMPQueueUri, ConnectionRequestUri c, ClntQueueReqData) + prepareLinkData :: UserLinkData -> C.PublicKeyX25519 -> AM (C.CbNonce, SMPQueueUri, ConnectionRequestUri c, ClntQueueReqData) prepareLinkData userData e2eDhKey = do g <- asks random nonce@(C.CbNonce corrId) <- atomically $ C.randomCbNonce g diff --git a/src/Simplex/Messaging/Agent/Protocol.hs b/src/Simplex/Messaging/Agent/Protocol.hs index bd242c8bf..44a749898 100644 --- a/src/Simplex/Messaging/Agent/Protocol.hs +++ b/src/Simplex/Messaging/Agent/Protocol.hs @@ -111,6 +111,7 @@ module Simplex.Messaging.Agent.Protocol ServiceScheme, FixedLinkData (..), ConnLinkData (..), + UserLinkData (..), OwnerAuth (..), OwnerId, ConnectionLink (..), @@ -167,6 +168,7 @@ module Simplex.Messaging.Agent.Protocol shortenShortLink, restoreShortLink, linkUserData, + linkUserData', ) where @@ -1633,7 +1635,7 @@ data FixedLinkData c = FixedLinkData } data ConnLinkData c where - InvitationLinkData :: VersionRangeSMPA -> ConnInfo -> ConnLinkData 'CMInvitation + InvitationLinkData :: VersionRangeSMPA -> UserLinkData -> ConnLinkData 'CMInvitation ContactLinkData :: { agentVRange :: VersionRangeSMPA, -- direct connection via connReq in fixed data is allowed. @@ -1642,15 +1644,22 @@ data ConnLinkData c where owners :: [OwnerAuth], -- alternative addresses of chat relays that receive requests for this contact address. relays :: [ConnShortLink 'CMContact], - userData :: ConnInfo + userData :: UserLinkData } -> ConnLinkData 'CMContact +newtype UserLinkData = UserLinkData ByteString + data AConnLinkData = forall m. ConnectionModeI m => ACLD (SConnectionMode m) (ConnLinkData m) -linkUserData :: ConnLinkData c -> ConnInfo +linkUserData :: ConnLinkData c -> UserLinkData linkUserData = \case InvitationLinkData _ d -> d ContactLinkData {userData} -> userData +{-# INLINE linkUserData #-} + +linkUserData' :: ConnLinkData c -> ByteString +linkUserData' d = let UserLinkData s = linkUserData d in s +{-# INLINE linkUserData' #-} type OwnerId = ByteString @@ -1706,6 +1715,12 @@ instance Encoding AConnLinkData where userData <- smpP <* A.takeByteString -- ignoring tail for forward compatibility with the future link data encoding pure $ ACLD SCMContact ContactLinkData {agentVRange, direct, owners, relays, userData} +instance Encoding UserLinkData where + smpEncode (UserLinkData s) = if B.length s <= 254 then smpEncode s else smpEncode ('\255', Large s) + {-# INLINE smpEncode #-} + smpP = UserLinkData <$> ((A.char '\255' *> (unLarge <$> smpP)) <|> smpP) + {-# INLINE smpP #-} + data StoredClientService (s :: DBStored) = ClientService { dbServiceId :: DBEntityId' s, serviceId :: SMP.ServiceId diff --git a/src/Simplex/Messaging/Crypto/ShortLink.hs b/src/Simplex/Messaging/Crypto/ShortLink.hs index c32c05bcf..34f292c8c 100644 --- a/src/Simplex/Messaging/Crypto/ShortLink.hs +++ b/src/Simplex/Messaging/Crypto/ShortLink.hs @@ -48,17 +48,17 @@ contactShortLinkKdf (LinkKey k) = invShortLinkKdf :: LinkKey -> C.SbKey invShortLinkKdf (LinkKey k) = C.unsafeSbKey $ C.hkdf "" k "SimpleXInvLink" 32 -encodeSignLinkData :: forall c. ConnectionModeI c => C.KeyPairEd25519 -> VersionRangeSMPA -> ConnectionRequestUri c -> ConnInfo -> (LinkKey, (ByteString, ByteString)) +encodeSignLinkData :: forall c. ConnectionModeI c => C.KeyPairEd25519 -> VersionRangeSMPA -> ConnectionRequestUri c -> UserLinkData -> (LinkKey, (ByteString, ByteString)) encodeSignLinkData (rootKey, pk) agentVRange connReq userData = let fd = smpEncode FixedLinkData {agentVRange, rootKey, connReq} md = smpEncode $ connLinkData @c agentVRange userData in (LinkKey (C.sha3_256 fd), (encodeSign pk fd, encodeSign pk md)) -encodeSignUserData :: forall c. ConnectionModeI c => SConnectionMode c -> C.PrivateKeyEd25519 -> VersionRangeSMPA -> ConnInfo -> ByteString +encodeSignUserData :: forall c. ConnectionModeI c => SConnectionMode c -> C.PrivateKeyEd25519 -> VersionRangeSMPA -> UserLinkData -> ByteString encodeSignUserData _ pk agentVRange userData = encodeSign pk $ smpEncode $ connLinkData @c agentVRange userData -connLinkData :: forall c. ConnectionModeI c => VersionRangeSMPA -> ConnInfo -> ConnLinkData c +connLinkData :: forall c. ConnectionModeI c => VersionRangeSMPA -> UserLinkData -> ConnLinkData c connLinkData agentVRange userData = case sConnectionMode @c of SCMInvitation -> InvitationLinkData agentVRange userData SCMContact -> ContactLinkData {agentVRange, direct = True, owners = [], relays = [], userData} diff --git a/src/Simplex/Messaging/Util.hs b/src/Simplex/Messaging/Util.hs index 416a61f8d..1a7dedef5 100644 --- a/src/Simplex/Messaging/Util.hs +++ b/src/Simplex/Messaging/Util.hs @@ -265,9 +265,11 @@ atomicModifyIORef'_ r f = atomicModifyIORef' r (\v -> (f v, ())) encodeJSON :: ToJSON a => a -> Text encodeJSON = safeDecodeUtf8 . LB.toStrict . J.encode +{-# INLINE encodeJSON #-} decodeJSON :: FromJSON a => Text -> Maybe a -decodeJSON = J.decode . LB.fromStrict . encodeUtf8 +decodeJSON = J.decodeStrict . encodeUtf8 +{-# INLINE decodeJSON #-} traverseWithKey_ :: Monad m => (k -> v -> m ()) -> Map k v -> m () traverseWithKey_ f = M.foldrWithKey (\k v -> (f k v >>)) (pure ()) diff --git a/tests/AgentTests/EqInstances.hs b/tests/AgentTests/EqInstances.hs index d59874921..52e88fdcc 100644 --- a/tests/AgentTests/EqInstances.hs +++ b/tests/AgentTests/EqInstances.hs @@ -5,7 +5,7 @@ module AgentTests.EqInstances where import Data.Type.Equality -import Simplex.Messaging.Agent.Protocol (ConnLinkData (..), OwnerAuth (..)) +import Simplex.Messaging.Agent.Protocol (ConnLinkData (..), OwnerAuth (..), UserLinkData (..)) import Simplex.Messaging.Agent.Store import Simplex.Messaging.Client (ProxiedRelay (..)) @@ -30,6 +30,10 @@ deriving instance Show (ConnLinkData c) deriving instance Eq (ConnLinkData c) +deriving instance Show UserLinkData + +deriving instance Eq UserLinkData + deriving instance Show OwnerAuth deriving instance Eq OwnerAuth diff --git a/tests/AgentTests/FunctionalAPITests.hs b/tests/AgentTests/FunctionalAPITests.hs index 000cee386..e527323f9 100644 --- a/tests/AgentTests/FunctionalAPITests.hs +++ b/tests/AgentTests/FunctionalAPITests.hs @@ -1137,7 +1137,7 @@ testAllowConnectionClientRestart ps@(t, ASType qsType _) = do testInviationShortLink :: HasCallStack => Bool -> AgentClient -> AgentClient -> IO () testInviationShortLink viaProxy a b = withAgent 3 agentCfg initAgentServers testDB3 $ \c -> do - let userData = "some user data" + let userData = UserLinkData "some user data" (bId, (CCLink connReq (Just shortLink), Nothing)) <- runRight $ A.createConnection a 1 True SCMInvitation (Just userData) Nothing CR.IKUsePQ SMSubscribe (connReq', connData') <- runRight $ getConnShortLink b 1 shortLink strDecode (strEncode shortLink) `shouldBe` Right shortLink @@ -1171,14 +1171,14 @@ testJoinConn_ viaProxy sndSecure a bId b connReq = do testInviationShortLinkPrev :: HasCallStack => Bool -> Bool -> AgentClient -> AgentClient -> IO () testInviationShortLinkPrev viaProxy sndSecure a b = runRight_ $ do - let userData = "some user data" + let userData = UserLinkData "some user data" -- can't create short link with previous version (bId, (CCLink connReq Nothing, Nothing)) <- A.createConnection a 1 True SCMInvitation (Just userData) Nothing CR.IKPQOn SMSubscribe testJoinConn_ viaProxy sndSecure a bId b connReq testInviationShortLinkAsync :: HasCallStack => Bool -> AgentClient -> AgentClient -> IO () testInviationShortLinkAsync viaProxy a b = do - let userData = "some user data" + let userData = UserLinkData "some user data" (bId, (CCLink connReq (Just shortLink), Nothing)) <- runRight $ A.createConnection a 1 True SCMInvitation (Just userData) Nothing CR.IKUsePQ SMSubscribe (connReq', connData') <- runRight $ getConnShortLink b 1 shortLink strDecode (strEncode shortLink) `shouldBe` Right shortLink @@ -1197,7 +1197,7 @@ testInviationShortLinkAsync viaProxy a b = do testContactShortLink :: HasCallStack => Bool -> AgentClient -> AgentClient -> IO () testContactShortLink viaProxy a b = withAgent 3 agentCfg initAgentServers testDB3 $ \c -> do - let userData = "some user data" + let userData = UserLinkData "some user data" (contactId, (CCLink connReq0 (Just shortLink), Nothing)) <- runRight $ A.createConnection a 1 True SCMContact (Just userData) Nothing CR.IKPQOn SMSubscribe Right connReq <- pure $ smpDecode (smpEncode connReq0) (connReq', connData') <- runRight $ getConnShortLink b 1 shortLink @@ -1226,7 +1226,7 @@ testContactShortLink viaProxy a b = get b ##> ("", aId, CON) exchangeGreetingsViaProxy viaProxy a bId b aId -- update user data - let updatedData = "updated user data" + let updatedData = UserLinkData "updated user data" shortLink' <- runRight $ setConnShortLink a contactId SCMContact updatedData Nothing shortLink' `shouldBe` shortLink (connReq4, updatedConnData') <- runRight $ getConnShortLink c 1 shortLink @@ -1245,7 +1245,7 @@ testAddContactShortLink viaProxy a b = withAgent 3 agentCfg initAgentServers testDB3 $ \c -> do (contactId, (CCLink connReq0 Nothing, Nothing)) <- runRight $ A.createConnection a 1 True SCMContact Nothing Nothing CR.IKPQOn SMSubscribe Right connReq <- pure $ smpDecode (smpEncode connReq0) -- - let userData = "some user data" + let userData = UserLinkData "some user data" shortLink <- runRight $ setConnShortLink a contactId SCMContact userData Nothing (connReq', connData') <- runRight $ getConnShortLink b 1 shortLink strDecode (strEncode shortLink) `shouldBe` Right shortLink @@ -1273,7 +1273,7 @@ testAddContactShortLink viaProxy a b = get b ##> ("", aId, CON) exchangeGreetingsViaProxy viaProxy a bId b aId -- update user data - let updatedData = "updated user data" + let updatedData = UserLinkData "updated user data" shortLink' <- runRight $ setConnShortLink a contactId SCMContact updatedData Nothing shortLink' `shouldBe` shortLink (connReq4, updatedConnData') <- runRight $ getConnShortLink c 1 shortLink @@ -1282,7 +1282,7 @@ testAddContactShortLink viaProxy a b = testInviationShortLinkRestart :: HasCallStack => (ASrvTransport, AStoreType) -> IO () testInviationShortLinkRestart ps = withAgentClients2 $ \a b -> do - let userData = "some user data" + let userData = UserLinkData "some user data" (bId, (CCLink connReq (Just shortLink), Nothing)) <- withSmpServer ps $ runRight $ A.createConnection a 1 True SCMInvitation (Just userData) Nothing CR.IKUsePQ SMOnlyCreate withSmpServer ps $ do @@ -1294,11 +1294,11 @@ testInviationShortLinkRestart ps = withAgentClients2 $ \a b -> do testContactShortLinkRestart :: HasCallStack => (ASrvTransport, AStoreType) -> IO () testContactShortLinkRestart ps = withAgentClients2 $ \a b -> do - let userData = "some user data" + let userData = UserLinkData "some user data" (contactId, (CCLink connReq0 (Just shortLink), Nothing)) <- withSmpServer ps $ runRight $ A.createConnection a 1 True SCMContact (Just userData) Nothing CR.IKPQOn SMOnlyCreate Right connReq <- pure $ smpDecode (smpEncode connReq0) - let updatedData = "updated user data" + let updatedData = UserLinkData "updated user data" withSmpServer ps $ do (connReq', connData') <- runRight $ getConnShortLink b 1 shortLink strDecode (strEncode shortLink) `shouldBe` Right shortLink @@ -1314,12 +1314,12 @@ testContactShortLinkRestart ps = withAgentClients2 $ \a b -> do testAddContactShortLinkRestart :: HasCallStack => (ASrvTransport, AStoreType) -> IO () testAddContactShortLinkRestart ps = withAgentClients2 $ \a b -> do - let userData = "some user data" + let userData = UserLinkData "some user data" ((contactId, (CCLink connReq0 Nothing, Nothing)), shortLink) <- withSmpServer ps $ runRight $ do r@(contactId, _) <- A.createConnection a 1 True SCMContact Nothing Nothing CR.IKPQOn SMOnlyCreate (r,) <$> setConnShortLink a contactId SCMContact userData Nothing Right connReq <- pure $ smpDecode (smpEncode connReq0) - let updatedData = "updated user data" + let updatedData = UserLinkData "updated user data" withSmpServer ps $ do (connReq', connData') <- runRight $ getConnShortLink b 1 shortLink strDecode (strEncode shortLink) `shouldBe` Right shortLink @@ -1355,14 +1355,14 @@ testOldContactQueueShortLink ps@(_, msType) = withAgentClients2 $ \a b -> do _ -> pure () withSmpServer ps $ do - let userData = "some user data" + let userData = UserLinkData "some user data" shortLink <- runRight $ setConnShortLink a contactId SCMContact userData Nothing (connReq', connData') <- runRight $ getConnShortLink b 1 shortLink strDecode (strEncode shortLink) `shouldBe` Right shortLink connReq' `shouldBe` connReq linkUserData connData' `shouldBe` userData -- update user data - let updatedData = "updated user data" + let updatedData = UserLinkData "updated user data" shortLink' <- runRight $ setConnShortLink a contactId SCMContact updatedData Nothing shortLink' `shouldBe` shortLink -- check updated diff --git a/tests/AgentTests/ShortLinkTests.hs b/tests/AgentTests/ShortLinkTests.hs index 216b7c658..b38daa7d8 100644 --- a/tests/AgentTests/ShortLinkTests.hs +++ b/tests/AgentTests/ShortLinkTests.hs @@ -8,7 +8,7 @@ import AgentTests.ConnectionRequestTests (contactConnRequest, invConnRequest) import AgentTests.EqInstances () import Control.Concurrent.STM import Control.Monad.Except -import Simplex.Messaging.Agent.Protocol (AgentErrorType (..), ConnectionMode (..), LinkKey (..), SConnectionMode (..), SMPAgentError (..), linkUserData, supportedSMPAgentVRange) +import Simplex.Messaging.Agent.Protocol (AgentErrorType (..), ConnectionMode (..), LinkKey (..), SConnectionMode (..), SMPAgentError (..), UserLinkData (..), linkUserData, supportedSMPAgentVRange) import qualified Simplex.Messaging.Crypto as C import qualified Simplex.Messaging.Crypto.ShortLink as SL import Test.Hspec hiding (fit, it) @@ -30,7 +30,7 @@ testInvShortLink = do -- encrypt g <- C.newRandom sigKeys <- atomically $ C.generateKeyPair @'C.Ed25519 g - let userData = "some user data" + let userData = UserLinkData "some user data" (linkKey, linkData) = SL.encodeSignLinkData sigKeys supportedSMPAgentVRange invConnRequest userData k = SL.invShortLinkKdf linkKey Right srvData <- runExceptT $ SL.encryptLinkData g k linkData @@ -44,7 +44,7 @@ testInvShortLinkBadDataHash = do -- encrypt g <- C.newRandom sigKeys <- atomically $ C.generateKeyPair @'C.Ed25519 g - let userData = "some user data" + let userData = UserLinkData "some user data" (_linkKey, linkData) = SL.encodeSignLinkData sigKeys supportedSMPAgentVRange invConnRequest userData -- different key linkKey <- LinkKey <$> atomically (C.randomBytes 32 g) @@ -59,7 +59,7 @@ testContactShortLink = do -- encrypt g <- C.newRandom sigKeys <- atomically $ C.generateKeyPair @'C.Ed25519 g - let userData = "some user data" + let userData = UserLinkData "some user data" (linkKey, linkData) = SL.encodeSignLinkData sigKeys supportedSMPAgentVRange contactConnRequest userData (_linkId, k) = SL.contactShortLinkKdf linkKey Right srvData <- runExceptT $ SL.encryptLinkData g k linkData @@ -73,12 +73,12 @@ testUpdateContactShortLink = do -- encrypt g <- C.newRandom sigKeys <- atomically $ C.generateKeyPair @'C.Ed25519 g - let userData = "some user data" + let userData = UserLinkData "some user data" (linkKey, linkData) = SL.encodeSignLinkData sigKeys supportedSMPAgentVRange contactConnRequest userData (_linkId, k) = SL.contactShortLinkKdf linkKey Right (fd, _ud) <- runExceptT $ SL.encryptLinkData g k linkData -- encrypt updated user data - let updatedUserData = "updated user data" + let updatedUserData = UserLinkData "updated user data" signed = SL.encodeSignUserData SCMContact (snd sigKeys) supportedSMPAgentVRange updatedUserData Right ud' <- runExceptT $ SL.encryptUserData g k signed -- decrypt @@ -91,7 +91,7 @@ testContactShortLinkBadDataHash = do -- encrypt g <- C.newRandom sigKeys <- atomically $ C.generateKeyPair @'C.Ed25519 g - let userData = "some user data" + let userData = UserLinkData "some user data" (_linkKey, linkData) = SL.encodeSignLinkData sigKeys supportedSMPAgentVRange contactConnRequest userData -- different key linkKey <- LinkKey <$> atomically (C.randomBytes 32 g) @@ -106,12 +106,12 @@ testContactShortLinkBadSignature = do -- encrypt g <- C.newRandom sigKeys <- atomically $ C.generateKeyPair @'C.Ed25519 g - let userData = "some user data" + let userData = UserLinkData "some user data" (linkKey, linkData) = SL.encodeSignLinkData sigKeys supportedSMPAgentVRange contactConnRequest userData (_linkId, k) = SL.contactShortLinkKdf linkKey Right (fd, _ud) <- runExceptT $ SL.encryptLinkData g k linkData -- encrypt updated user data - let updatedUserData = "updated user data" + let updatedUserData = UserLinkData "updated user data" -- another signature key (_, pk) <- atomically $ C.generateKeyPair @'C.Ed25519 g let signed = SL.encodeSignUserData SCMContact pk supportedSMPAgentVRange updatedUserData