summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Network/Tox.hs60
-rw-r--r--src/Network/Tox/Crypto/Handlers.hs4
-rw-r--r--src/Network/Tox/DHT/Handlers.hs17
3 files changed, 66 insertions, 15 deletions
diff --git a/src/Network/Tox.hs b/src/Network/Tox.hs
index 69975c0a..149905d2 100644
--- a/src/Network/Tox.hs
+++ b/src/Network/Tox.hs
@@ -97,7 +97,7 @@ import Crypto.Tox
97import Data.Word64Map (fitsInInt) 97import Data.Word64Map (fitsInInt)
98import qualified Data.Word64Map (empty) 98import qualified Data.Word64Map (empty)
99import Network.Kademlia.Bootstrap (forkPollForRefresh, bootstrap) 99import Network.Kademlia.Bootstrap (forkPollForRefresh, bootstrap)
100import Network.Tox.Crypto.Transport (NetCrypto, CryptoMessage) 100import Network.Tox.Crypto.Transport (NetCrypto(..), CryptoMessage, HandshakeData(..), Handshake(..))
101import Network.Tox.Crypto.Handlers 101import Network.Tox.Crypto.Handlers
102import qualified Network.Tox.DHT.Handlers as DHT 102import qualified Network.Tox.DHT.Handlers as DHT
103import qualified Network.Tox.DHT.Transport as DHT 103import qualified Network.Tox.DHT.Transport as DHT
@@ -111,6 +111,7 @@ import Text.XXD
111import qualified Data.HashMap.Strict as HashMap 111import qualified Data.HashMap.Strict as HashMap
112import Data.HashMap.Strict (HashMap) 112import Data.HashMap.Strict (HashMap)
113import qualified Data.Map.Strict as Map 113import qualified Data.Map.Strict as Map
114import Control.Concurrent (threadDelay)
114 115
115 116
116newCrypto :: IO TransportCrypto 117newCrypto :: IO TransportCrypto
@@ -266,10 +267,22 @@ netCrypto tox myseckey theirpubkey = do
266 hPutStrLn stderr ("netCrypto: (" ++ show mykeyAsId ++") friend not found (" ++ show theirkeyAsId ++ ").") 267 hPutStrLn stderr ("netCrypto: (" ++ show mykeyAsId ++") friend not found (" ++ show theirkeyAsId ++ ").")
267 return [] 268 return []
268 Just contact@(Contact { contactKeyPacket = mbKeyPkt 269 Just contact@(Contact { contactKeyPacket = mbKeyPkt
269 , contactLastSeenAddr = mbSAddr 270 , contactLastSeenAddr = Nothing
270 , contactFriendRequest = mbFR 271 , contactFriendRequest = mbFR
271 , contactPolicy = mbPolicy 272 , contactPolicy = mbPolicy
272 }) -> do 273 }) -> do
274 hPutStrLn stderr ("netCrypto: (" ++ show mykeyAsId ++") no SockAddr for friend (" ++ show theirkeyAsId ++ "). TODO: search their node?")
275 return []
276 Just contact@(Contact { contactKeyPacket = Nothing
277 }) -> do
278 hPutStrLn stderr ("netCrypto: (" ++ show mykeyAsId ++") no DHT-key for friend (" ++ show theirkeyAsId ++ "). TODO: what?")
279 return []
280 Just contact@(Contact { contactKeyPacket = Just keyPkt
281 , contactLastSeenAddr = Just saddr
282 , contactFriendRequest = mbFR
283 , contactPolicy = mbPolicy
284 }) | theirDhtKey <- DHT.dhtpk keyPkt -> do
285 -- Do we already have an active session with this user?
273 sessionsMap <- atomically $ readTVar (netCryptoSessionsByKey (toxCryptoSessions tox) ) 286 sessionsMap <- atomically $ readTVar (netCryptoSessionsByKey (toxCryptoSessions tox) )
274 let sessionUsesIdentity key session = key == ncMyPublicKey session 287 let sessionUsesIdentity key session = key == ncMyPublicKey session
275 case Map.lookup theirpubkey sessionsMap of 288 case Map.lookup theirpubkey sessionsMap of
@@ -280,12 +293,45 @@ netCrypto tox myseckey theirpubkey = do
280 hPutStrLn stderr ("netCrypto: Already have a session for " ++ show mykeyAsId ++ "<-->" ++ show theirkeyAsId) 293 hPutStrLn stderr ("netCrypto: Already have a session for " ++ show mykeyAsId ++ "<-->" ++ show theirkeyAsId)
281 return matchedSessions 294 return matchedSessions
282 -- if not, send handshake, this is separate session 295 -- if not, send handshake, this is separate session
283 Nothing -> error "netCrypto: todo" 296 Nothing -> do
284 -- if no session: 297 -- if no session:
285 -- 1) send dht key, actually maybe send dht-key regardless 298 -- Convert to NodeInfo, so we can send cookieRequest
286 -- 2) if no IP, search for their node(dht-key) 299 let crypto = toxCryptoKeys tox
287 -- 3) if no dht-key, output error message return empty 300 client = toxDHT tox
288 -- 4) send handshakes to last seen ip's, if any 301 case nodeInfo (key2id theirDhtKey) saddr of
302 Left e -> hPutStrLn stderr ("netCrypto: nodeInfo fail... " ++ e) >> return []
303 Right ni -> do
304 mbCookie <- DHT.cookieRequest crypto client (toPublic myseckey) ni
305 case mbCookie of
306 Nothing -> do
307 hPutStrLn stderr ("netCrypto: (" ++ show mykeyAsId ++") <--> (" ++ show theirkeyAsId ++ ").")
308 hPutStrLn stderr ("netCrypto: CookieRequest failed. TODO: dhtpkNodes thingy")
309 return []
310 Just cookie -> do
311 let hp = HParam { hpOtherCookie = cookie
312 , hpMySecretKey = myseckey
313 , hpCookieRemotePubkey = theirpubkey
314 , hpCookieRemoteDhtkey = theirDhtKey
315 , hpTheirBaseNonce = error "netCrypto: Unreachable! hpTheirBaseNonce"
316 , hpTheirSessionKeyPublic = error "netCrypto: Unreachable! hpTheirSessionKeyPublic"
317 }
318 n24' <- atomically $ transportNewNonce crypto
319 state <- lookupSharedSecret crypto myseckey theirDhtKey n24'
320 newBaseNonce <- atomically $ transportNewNonce crypto
321 mbMyhandshakeData <- newHandShakeData crypto newBaseNonce hp saddr
322 let encodeHandshake myhandshakeData = let plain = encodePlain myhandshakeData
323 encrypted = encrypt state plain
324 in Handshake { handshakeCookie = cookie
325 , handshakeNonce = n24'
326 , handshakeData = encrypted
327 }
328 let myhandshake = encodeHandshake <$> mbMyhandshakeData
329 case myhandshake of
330 Nothing -> hPutStrLn stderr "netCrypto: failed to create HandshakeData." >> return []
331 Just handshake -> do
332 sendMessage (toxCrypto tox) saddr (NetHandshake handshake)
333 threadDelay 1000000 -- delay 1 second
334 netCrypto tox myseckey theirpubkey -- hopefully it will find an active session this time.
289 335
290getContactInfo :: Tox -> IO DHT.DHTPublicKey 336getContactInfo :: Tox -> IO DHT.DHTPublicKey
291getContactInfo Tox{toxCryptoKeys,toxRouting} = join $ atomically $ do 337getContactInfo Tox{toxCryptoKeys,toxRouting} = join $ atomically $ do
diff --git a/src/Network/Tox/Crypto/Handlers.hs b/src/Network/Tox/Crypto/Handlers.hs
index bffb4280..0e349196 100644
--- a/src/Network/Tox/Crypto/Handlers.hs
+++ b/src/Network/Tox/Crypto/Handlers.hs
@@ -7,7 +7,7 @@ import Network.QueryResponse
7import Network.Tox.NodeId 7import Network.Tox.NodeId
8import Network.Tox.Crypto.Transport 8import Network.Tox.Crypto.Transport
9import Network.Tox.DHT.Transport (Cookie(..),CookieData(..), CookieRequest(..), NoSpam(..)) 9import Network.Tox.DHT.Transport (Cookie(..),CookieData(..), CookieRequest(..), NoSpam(..))
10import Network.Tox.DHT.Handlers (Client, cookieRequest, cookieRequestH ) 10import Network.Tox.DHT.Handlers (Client, cookieRequest, createCookie )
11import Crypto.Tox 11import Crypto.Tox
12import Control.Concurrent.STM 12import Control.Concurrent.STM
13import Network.Address 13import Network.Address
@@ -212,7 +212,7 @@ newHandShakeData crypto basenonce (HParam {hpOtherCookie,hpMySecretKey,hpCookieR
212 = do 212 = do
213 freshCookie 213 freshCookie
214 <- case nodeInfo (key2id hpCookieRemoteDhtkey) addr of 214 <- case nodeInfo (key2id hpCookieRemoteDhtkey) addr of
215 Right nodeinfo -> Just <$> cookieRequestH crypto nodeinfo (CookieRequest hpCookieRemotePubkey) 215 Right nodeinfo -> Just <$> createCookie crypto nodeinfo hpCookieRemotePubkey
216 Left er -> return Nothing 216 Left er -> return Nothing
217 let hinit = hashInit 217 let hinit = hashInit
218 Cookie n24 encrypted = hpOtherCookie 218 Cookie n24 encrypted = hpOtherCookie
diff --git a/src/Network/Tox/DHT/Handlers.hs b/src/Network/Tox/DHT/Handlers.hs
index 9faee69a..327659a9 100644
--- a/src/Network/Tox/DHT/Handlers.hs
+++ b/src/Network/Tox/DHT/Handlers.hs
@@ -217,11 +217,8 @@ getNodesH routing addr (GetNodes nid) = do
217 217
218 k = 4 218 k = 4
219 219
220cookieRequestH :: TransportCrypto -> NodeInfo -> CookieRequest -> IO Cookie 220createCookie :: TransportCrypto -> NodeInfo -> PublicKey -> IO Cookie
221cookieRequestH crypto ni (CookieRequest remoteUserKey) = do 221createCookie crypto ni remoteUserKey = do
222 hPutStrLn stderr $ unlines
223 [ "CookieRequest! remoteUserKey=" ++ show (key2id remoteUserKey)
224 , " sender=" ++ show ni ]
225 (n24,sym,us) <- atomically $ do 222 (n24,sym,us) <- atomically $ do
226 n24 <- transportNewNonce crypto 223 n24 <- transportNewNonce crypto
227 sym <- transportSymmetric crypto 224 sym <- transportSymmetric crypto
@@ -234,9 +231,17 @@ cookieRequestH crypto ni (CookieRequest remoteUserKey) = do
234 , dhtKey = transportPublic crypto 231 , dhtKey = transportPublic crypto
235 } 232 }
236 edta = encryptSymmetric sym n24 dta 233 edta = encryptSymmetric sym n24 dta
237 hPutStrLn stderr $ "CookieRequest! responding to " ++ show (key2id remoteUserKey)
238 return $ Cookie n24 edta 234 return $ Cookie n24 edta
239 235
236cookieRequestH :: TransportCrypto -> NodeInfo -> CookieRequest -> IO Cookie
237cookieRequestH crypto ni (CookieRequest remoteUserKey) = do
238 hPutStrLn stderr $ unlines
239 [ "CookieRequest! remoteUserKey=" ++ show (key2id remoteUserKey)
240 , " sender=" ++ show ni ]
241 x <- createCookie crypto ni remoteUserKey
242 hPutStrLn stderr $ "CookieRequest! responding to " ++ show (key2id remoteUserKey)
243 return x
244
240lanDiscoveryH :: Client -> NodeInfo -> NodeInfo -> IO (Maybe (Message -> Message)) 245lanDiscoveryH :: Client -> NodeInfo -> NodeInfo -> IO (Maybe (Message -> Message))
241lanDiscoveryH client _ ni = do 246lanDiscoveryH client _ ni = do
242 forkIO $ do 247 forkIO $ do