diff options
-rw-r--r-- | src/Network/Tox.hs | 60 | ||||
-rw-r--r-- | src/Network/Tox/Crypto/Handlers.hs | 4 | ||||
-rw-r--r-- | src/Network/Tox/DHT/Handlers.hs | 17 |
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 | |||
97 | import Data.Word64Map (fitsInInt) | 97 | import Data.Word64Map (fitsInInt) |
98 | import qualified Data.Word64Map (empty) | 98 | import qualified Data.Word64Map (empty) |
99 | import Network.Kademlia.Bootstrap (forkPollForRefresh, bootstrap) | 99 | import Network.Kademlia.Bootstrap (forkPollForRefresh, bootstrap) |
100 | import Network.Tox.Crypto.Transport (NetCrypto, CryptoMessage) | 100 | import Network.Tox.Crypto.Transport (NetCrypto(..), CryptoMessage, HandshakeData(..), Handshake(..)) |
101 | import Network.Tox.Crypto.Handlers | 101 | import Network.Tox.Crypto.Handlers |
102 | import qualified Network.Tox.DHT.Handlers as DHT | 102 | import qualified Network.Tox.DHT.Handlers as DHT |
103 | import qualified Network.Tox.DHT.Transport as DHT | 103 | import qualified Network.Tox.DHT.Transport as DHT |
@@ -111,6 +111,7 @@ import Text.XXD | |||
111 | import qualified Data.HashMap.Strict as HashMap | 111 | import qualified Data.HashMap.Strict as HashMap |
112 | import Data.HashMap.Strict (HashMap) | 112 | import Data.HashMap.Strict (HashMap) |
113 | import qualified Data.Map.Strict as Map | 113 | import qualified Data.Map.Strict as Map |
114 | import Control.Concurrent (threadDelay) | ||
114 | 115 | ||
115 | 116 | ||
116 | newCrypto :: IO TransportCrypto | 117 | newCrypto :: 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 | ||
290 | getContactInfo :: Tox -> IO DHT.DHTPublicKey | 336 | getContactInfo :: Tox -> IO DHT.DHTPublicKey |
291 | getContactInfo Tox{toxCryptoKeys,toxRouting} = join $ atomically $ do | 337 | getContactInfo 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 | |||
7 | import Network.Tox.NodeId | 7 | import Network.Tox.NodeId |
8 | import Network.Tox.Crypto.Transport | 8 | import Network.Tox.Crypto.Transport |
9 | import Network.Tox.DHT.Transport (Cookie(..),CookieData(..), CookieRequest(..), NoSpam(..)) | 9 | import Network.Tox.DHT.Transport (Cookie(..),CookieData(..), CookieRequest(..), NoSpam(..)) |
10 | import Network.Tox.DHT.Handlers (Client, cookieRequest, cookieRequestH ) | 10 | import Network.Tox.DHT.Handlers (Client, cookieRequest, createCookie ) |
11 | import Crypto.Tox | 11 | import Crypto.Tox |
12 | import Control.Concurrent.STM | 12 | import Control.Concurrent.STM |
13 | import Network.Address | 13 | import 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 | ||
220 | cookieRequestH :: TransportCrypto -> NodeInfo -> CookieRequest -> IO Cookie | 220 | createCookie :: TransportCrypto -> NodeInfo -> PublicKey -> IO Cookie |
221 | cookieRequestH crypto ni (CookieRequest remoteUserKey) = do | 221 | createCookie 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 | ||
236 | cookieRequestH :: TransportCrypto -> NodeInfo -> CookieRequest -> IO Cookie | ||
237 | cookieRequestH 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 | |||
240 | lanDiscoveryH :: Client -> NodeInfo -> NodeInfo -> IO (Maybe (Message -> Message)) | 245 | lanDiscoveryH :: Client -> NodeInfo -> NodeInfo -> IO (Maybe (Message -> Message)) |
241 | lanDiscoveryH client _ ni = do | 246 | lanDiscoveryH client _ ni = do |
242 | forkIO $ do | 247 | forkIO $ do |