From 4aeaf247a25fbe80598ce54e4142a707ec5b9951 Mon Sep 17 00:00:00 2001 From: Joe Crayne Date: Tue, 4 Sep 2018 23:27:07 -0400 Subject: Tox Alternative sessions: Outgoing seqno/ack reversed. --- src/Network/Tox/Session.hs | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) (limited to 'src/Network/Tox') diff --git a/src/Network/Tox/Session.hs b/src/Network/Tox/Session.hs index a52e9478..88221b11 100644 --- a/src/Network/Tox/Session.hs +++ b/src/Network/Tox/Session.hs @@ -10,6 +10,7 @@ import Network.Socket import Crypto.Tox import Data.PacketBuffer (PacketInboundEvent (..)) import Data.Tox.Message +import DPut import Network.Lossless import Network.QueryResponse import Network.SessionTransports @@ -43,6 +44,7 @@ data Session = Session -- convenience, a lower bound for the numbers in the list is also -- returned. Suggested polling interval: a few seconds. , sTransport :: Transport String () CryptoMessage + , sSessionID :: Int } handshakeH :: SessionParams @@ -63,7 +65,11 @@ plainHandshakeH :: SessionParams -> IO () plainHandshakeH sp saddr skey handshake = do let hd = runIdentity $ handshakeData handshake + prelude = show saddr ++ " --> " + dput XNetCrypto $ prelude ++ "handshake: " ++ show (otherCookie hd, baseNonce hd) sent <- spGetSentHandshake sp skey saddr (handshakeCookie handshake) (otherCookie hd) + -- TODO: this is always returning sent = Nothing + dput XNetCrypto $ prelude ++ "plainHandshakeH: cached outgoing: " ++ show (fmap (baseNonce . snd) sent) forM_ sent $ \(hd_skey,hd_sent) -> do sk <- SessionKeys (spCrypto sp) hd_skey @@ -71,7 +77,8 @@ plainHandshakeH sp saddr skey handshake = do <$> atomically (newTVar $ baseNonce hd) <*> atomically (newTVar $ baseNonce hd_sent) m <- newSession (spSessions sp) (\() p -> return p) (decryptPacket sk) saddr - forM_ m $ \t -> do + dput XNetCrypto $ prelude ++ "plainHandshakeH: session " ++ maybe "Nothing" (const "Just") m + forM_ m $ \(sid, t) -> do (t2,resend,getMissing) <- lossless (\cp a -> return $ fmap (,a) $ checkLossless $ runIdentity $ pktData cp) (\seqno p _ -> encryptPacket sk $ bookKeeping seqno p) @@ -79,6 +86,7 @@ plainHandshakeH sp saddr skey handshake = do t let _ = t :: TransportA String () (CryptoPacket Identity) (CryptoPacket Encrypted) _ = t2 :: Transport String () CryptoMessage + sendMessage t2 () $ OneByte ONLINE spOnNewSession sp Session { sOurKey = skey , sTheirAddr = saddr @@ -87,6 +95,7 @@ plainHandshakeH sp saddr skey handshake = do , sResendPackets = resend , sMissingInbound = getMissing , sTransport = t2 + , sSessionID = sid } return () @@ -122,17 +131,28 @@ data SessionKeys = SessionKeys , skNonceOutgoing :: TVar Nonce24 -- +1 on every packet } + +-- From spec.md: +-- +-- Data in the encrypted packets: +-- +-- [our recvbuffers buffer_start, (highest packet number handled + 1), (big endian)] +-- [uint32_t packet number if lossless, sendbuffer buffer_end if lossy, (big endian)] +-- [data] + + bookKeeping :: SequenceInfo -> CryptoMessage -> CryptoData bookKeeping (SequenceInfo seqno ack) m = CryptoData - { bufferStart = seqno :: Word32 - , bufferEnd = ack :: Word32 + { bufferStart = ack :: Word32 + , bufferEnd = seqno :: Word32 , bufferData = m } checkLossless :: CryptoData -> PacketInboundEvent CryptoMessage -checkLossless CryptoData{ bufferStart = ack - , bufferEnd = no - , bufferData = x } = tag no x ack +checkLossless cd@CryptoData{ bufferStart = ack + , bufferEnd = no + , bufferData = x } = tag no x' ack where - tag = case lossyness (msgID x) of Lossy -> PacketReceivedLossy - _ -> PacketReceived + x' = decodeRawCryptoMsg cd + tag = case lossyness (msgID x') of Lossy -> PacketReceivedLossy + _ -> PacketReceived -- cgit v1.2.3