Skip to content

Commit 39eb3c4

Browse files
authored
smp: fix handshake for rcv services between new client & old server (#1790)
1 parent 0496086 commit 39eb3c4

1 file changed

Lines changed: 7 additions & 8 deletions

File tree

src/Simplex/Messaging/Transport.hs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -824,23 +824,22 @@ smpClientHandshake c ks_ keyHash@(C.KeyHash kh) vRange proxyServer serviceKeys_
824824
serverKey <- getServerVerifyKey c
825825
(,certKey) <$> (C.x509ToPublic' =<< C.verifyX509 serverKey exact)
826826
let v = maxVersion vr
827+
serviceVersion ServiceCredentials {serviceRole} = if serviceRole == SRMessaging then rcvServiceSMPVersion else serviceCertsSMPVersion
827828
serviceKeys = case serviceKeys_ of
828-
Just sks | v >= serviceCertsSMPVersion && certificateSent c -> Just sks
829+
Just sks | v >= serviceVersion (fst sks) && certificateSent c -> Just sks
829830
_ -> Nothing
830-
clientService = mkClientService v =<< serviceKeys
831+
clientService = mkClientService <$> serviceKeys
831832
hs = SMPClientHandshake {smpVersion = v, keyHash, authPubKey = fst <$> ks_, proxyServer, clientService}
832833
sendHandshake th hs
833834
service <- mapM getClientService serviceKeys
834835
liftIO $ smpTHandleClient th v vr (snd <$> ks_) ck_ proxyServer service
835836
Nothing -> throwE TEVersion
836837
where
837838
th@THandle {params = THandleParams {sessionId}} = smpTHandle c
838-
mkClientService :: VersionSMP -> (ServiceCredentials, C.KeyPairEd25519) -> Maybe SMPClientHandshakeService
839-
mkClientService v (ServiceCredentials {serviceRole, serviceCreds, serviceSignKey}, (k, _))
840-
| serviceRole == SRMessaging && v < rcvServiceSMPVersion = Nothing
841-
| otherwise =
842-
let sk = C.signX509 serviceSignKey $ C.publicToX509 k
843-
in Just SMPClientHandshakeService {serviceRole, serviceCertKey = CertChainPubKey (fst serviceCreds) sk}
839+
mkClientService :: (ServiceCredentials, C.KeyPairEd25519) -> SMPClientHandshakeService
840+
mkClientService (ServiceCredentials {serviceRole, serviceCreds, serviceSignKey}, (k, _)) =
841+
let sk = C.signX509 serviceSignKey $ C.publicToX509 k
842+
in SMPClientHandshakeService {serviceRole, serviceCertKey = CertChainPubKey (fst serviceCreds) sk}
844843
getClientService :: (ServiceCredentials, C.KeyPairEd25519) -> ExceptT TransportError IO THClientService
845844
getClientService (ServiceCredentials {serviceRole, serviceCertHash}, (_, pk)) =
846845
getHandshake th >>= \case

0 commit comments

Comments
 (0)