summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Crypto/Tox.hs49
-rw-r--r--src/Network/Tox.hs45
-rw-r--r--src/Network/Tox/DHT/Handlers.hs3
-rw-r--r--src/Network/Tox/Onion/Transport.hs1
-rw-r--r--src/Network/Tox/Relay.hs1
5 files changed, 53 insertions, 46 deletions
diff --git a/src/Crypto/Tox.hs b/src/Crypto/Tox.hs
index d418f504..a7f1ae83 100644
--- a/src/Crypto/Tox.hs
+++ b/src/Crypto/Tox.hs
@@ -24,6 +24,7 @@ module Crypto.Tox
24 , toPublic 24 , toPublic
25 , SymmetricKey(..) 25 , SymmetricKey(..)
26 , TransportCrypto(..) 26 , TransportCrypto(..)
27 , newCrypto
27 , SecretsCache 28 , SecretsCache
28 , newSecretsCache 29 , newSecretsCache
29 , Encrypted 30 , Encrypted
@@ -105,6 +106,7 @@ import Crypto.Error.Types (CryptoFailable (..), throwCryptoE
105import Crypto.ECC 106import Crypto.ECC
106import Crypto.Error 107import Crypto.Error
107#endif 108#endif
109import Crypto.Random
108import Network.Socket (SockAddr) 110import Network.Socket (SockAddr)
109import GHC.Exts (Word(..),inline) 111import GHC.Exts (Word(..),inline)
110import GHC.Generics (Generic) 112import GHC.Generics (Generic)
@@ -118,6 +120,8 @@ import System.IO.Unsafe (unsafeDupablePerformIO)
118import Data.Functor.Compose 120import Data.Functor.Compose
119import qualified Rank2 121import qualified Rank2
120import Data.Functor.Identity 122import Data.Functor.Identity
123import DPut
124import DebugTag
121 125
122-- | A 16-byte mac and an arbitrary-length encrypted stream. 126-- | A 16-byte mac and an arbitrary-length encrypted stream.
123newtype Encrypted a = Encrypted ByteString 127newtype Encrypted a = Encrypted ByteString
@@ -658,3 +662,48 @@ xorsum bs = unsafeDupablePerformIO $ BA.withByteArray bs $ \ptr16 -> do
658 loop (wcnt - 1) $ case r of 662 loop (wcnt - 1) $ case r of
659 0 -> 0 663 0 -> 0
660 _ -> 256 * fromIntegral (BA.index bs (BA.length bs - 1)) 664 _ -> 256 * fromIntegral (BA.index bs (BA.length bs - 1))
665
666showHex :: BA.ByteArrayAccess ba => ba -> String
667showHex bs = C8.unpack $ Base16.encode $ BA.convert bs
668
669newCrypto :: IO TransportCrypto
670newCrypto = do
671 secret <- generateSecretKey
672 alias <- generateSecretKey
673 ralias <- generateSecretKey
674 let pubkey = toPublic secret
675 aliaspub = toPublic alias
676 raliaspub = toPublic ralias
677 ukeys <- atomically $ newTVar []
678 (symkey, drg) <- do
679 drg0 <- getSystemDRG
680 return $ randomBytesGenerate 32 drg0 :: IO (ByteString, SystemDRG)
681 noncevar <- atomically $ newTVar $ fst $ withDRG drg drgNew
682 cookieKeys <- atomically $ newTVar []
683 cache <- newSecretsCache
684 dput XNetCrypto $ "secret(tox) = " ++ showHex secret
685 dput XNetCrypto $ "public(tox) = " ++ showHex pubkey
686 dput XNetCrypto $ "symmetric(tox) = " ++ showHex symkey
687 return TransportCrypto
688 { transportSecret = secret
689 , transportPublic = pubkey
690 , onionAliasSecret = alias
691 , onionAliasPublic = aliaspub
692 , rendezvousSecret = ralias
693 , rendezvousPublic = raliaspub
694 , transportSymmetric = return $ SymmetricKey symkey
695 , transportNewNonce = do
696 drg1 <- readTVar noncevar
697 let (nonce, drg2) = withDRG drg1 (Nonce24 <$> getRandomBytes 24)
698 writeTVar noncevar drg2
699 return nonce
700 , transportNewKey = do
701 drg1 <- readTVar noncevar
702 let (k, drg2) = withDRG drg1 generateSecretKey
703 writeTVar noncevar drg2
704 return k
705 , userKeys = return []
706 , pendingCookies = cookieKeys
707 , secretsCache = cache
708 }
709
diff --git a/src/Network/Tox.hs b/src/Network/Tox.hs
index 30efefa8..37762eb8 100644
--- a/src/Network/Tox.hs
+++ b/src/Network/Tox.hs
@@ -66,51 +66,11 @@ import DPut
66import DebugTag 66import DebugTag
67import Network.Tox.Avahi 67import Network.Tox.Avahi
68import Network.Tox.Session 68import Network.Tox.Session
69import Network.Tox.Relay
69import Network.SessionTransports 70import Network.SessionTransports
70import Network.Kademlia.Search 71import Network.Kademlia.Search
71import HandshakeCache 72import HandshakeCache
72 73
73newCrypto :: IO TransportCrypto
74newCrypto = do
75 secret <- generateSecretKey
76 alias <- generateSecretKey
77 ralias <- generateSecretKey
78 let pubkey = toPublic secret
79 aliaspub = toPublic alias
80 raliaspub = toPublic ralias
81 ukeys <- atomically $ newTVar []
82 (symkey, drg) <- do
83 drg0 <- getSystemDRG
84 return $ randomBytesGenerate 32 drg0 :: IO (ByteString, SystemDRG)
85 noncevar <- atomically $ newTVar $ fst $ withDRG drg drgNew
86 cookieKeys <- atomically $ newTVar []
87 cache <- newSecretsCache
88 dput XNetCrypto $ "secret(tox) = " ++ DHT.showHex secret
89 dput XNetCrypto $ "public(tox) = " ++ DHT.showHex pubkey
90 dput XNetCrypto $ "symmetric(tox) = " ++ DHT.showHex symkey
91 return TransportCrypto
92 { transportSecret = secret
93 , transportPublic = pubkey
94 , onionAliasSecret = alias
95 , onionAliasPublic = aliaspub
96 , rendezvousSecret = ralias
97 , rendezvousPublic = raliaspub
98 , transportSymmetric = return $ SymmetricKey symkey
99 , transportNewNonce = do
100 drg1 <- readTVar noncevar
101 let (nonce, drg2) = withDRG drg1 (Nonce24 <$> getRandomBytes 24)
102 writeTVar noncevar drg2
103 return nonce
104 , transportNewKey = do
105 drg1 <- readTVar noncevar
106 let (k, drg2) = withDRG drg1 generateSecretKey
107 writeTVar noncevar drg2
108 return k
109 , userKeys = return []
110 , pendingCookies = cookieKeys
111 , secretsCache = cache
112 }
113
114updateIP :: TVar (R.BucketList NodeInfo) -> SockAddr -> STM () 74updateIP :: TVar (R.BucketList NodeInfo) -> SockAddr -> STM ()
115updateIP tblvar a = do 75updateIP tblvar a = do
116 bkts <- readTVar tblvar 76 bkts <- readTVar tblvar
@@ -286,7 +246,8 @@ newTox keydb bindspecs onsess suppliedDHTKey tcp = do
286 throwIO $ userError "Tox UDP listen port?" 246 throwIO $ userError "Tox UDP listen port?"
287 (udp,sock) <- foldr tryBind failedBind addrs Nothing 247 (udp,sock) <- foldr tryBind failedBind addrs Nothing
288 addr <- getSocketName sock 248 addr <- getSocketName sock
289 tox <- newToxOverTransport keydb addr onsess suppliedDHTKey udp tcp 249 (relay,sendTCP) <- tcpRelay addr (\a x -> sendMessage udp a $ S.runPut $ Onion.putRequest x)
250 tox <- newToxOverTransport keydb addr onsess suppliedDHTKey udp sendTCP
290 return tox { toxAnnounceToLan = announceToLan sock (key2id $ transportPublic $ toxCryptoKeys tox) } 251 return tox { toxAnnounceToLan = announceToLan sock (key2id $ transportPublic $ toxCryptoKeys tox) }
291 252
292-- | This version of 'newTox' is useful for automated tests using 'testPairTransport'. 253-- | This version of 'newTox' is useful for automated tests using 'testPairTransport'.
diff --git a/src/Network/Tox/DHT/Handlers.hs b/src/Network/Tox/DHT/Handlers.hs
index d7f05dbc..2062b51d 100644
--- a/src/Network/Tox/DHT/Handlers.hs
+++ b/src/Network/Tox/DHT/Handlers.hs
@@ -340,9 +340,6 @@ unpong :: Message -> Maybe (Asymm (Nonce8,Pong))
340unpong (DHTPong asymm) = Just asymm 340unpong (DHTPong asymm) = Just asymm
341unpong _ = Nothing 341unpong _ = Nothing
342 342
343showHex :: BA.ByteArrayAccess ba => ba -> String
344showHex bs = C8.unpack $ Base16.encode $ BA.convert bs
345
346ping :: Client -> NodeInfo -> IO Bool 343ping :: Client -> NodeInfo -> IO Bool
347ping client addr = do 344ping client addr = do
348 dput XPing $ show addr ++ " <-- ping" 345 dput XPing $ show addr ++ " <-- ping"
diff --git a/src/Network/Tox/Onion/Transport.hs b/src/Network/Tox/Onion/Transport.hs
index f6d9ca31..3d8a9e93 100644
--- a/src/Network/Tox/Onion/Transport.hs
+++ b/src/Network/Tox/Onion/Transport.hs
@@ -51,6 +51,7 @@ module Network.Tox.Onion.Transport
51 , RouteId(..) 51 , RouteId(..)
52 , routeId 52 , routeId
53 , rewrap 53 , rewrap
54 , putRequest
54 ) where 55 ) where
55 56
56import Network.Address (fromSockAddr,toSockAddr,setPort,either4or6,sockAddrPort) 57import Network.Address (fromSockAddr,toSockAddr,setPort,either4or6,sockAddrPort)
diff --git a/src/Network/Tox/Relay.hs b/src/Network/Tox/Relay.hs
index 17bbc379..7af14ed6 100644
--- a/src/Network/Tox/Relay.hs
+++ b/src/Network/Tox/Relay.hs
@@ -28,7 +28,6 @@ import Data.Tox.Relay
28import Network.Address (getBindAddress) 28import Network.Address (getBindAddress)
29import Network.SocketLike 29import Network.SocketLike
30import Network.StreamServer 30import Network.StreamServer
31import Network.Tox (newCrypto)
32import Network.Tox.Onion.Transport hiding (encrypt,decrypt) 31import Network.Tox.Onion.Transport hiding (encrypt,decrypt)
33 32
34 33