diff options
-rw-r--r-- | src/Crypto/Tox.hs | 49 | ||||
-rw-r--r-- | src/Network/Tox.hs | 45 | ||||
-rw-r--r-- | src/Network/Tox/DHT/Handlers.hs | 3 | ||||
-rw-r--r-- | src/Network/Tox/Onion/Transport.hs | 1 | ||||
-rw-r--r-- | src/Network/Tox/Relay.hs | 1 |
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 | |||
105 | import Crypto.ECC | 106 | import Crypto.ECC |
106 | import Crypto.Error | 107 | import Crypto.Error |
107 | #endif | 108 | #endif |
109 | import Crypto.Random | ||
108 | import Network.Socket (SockAddr) | 110 | import Network.Socket (SockAddr) |
109 | import GHC.Exts (Word(..),inline) | 111 | import GHC.Exts (Word(..),inline) |
110 | import GHC.Generics (Generic) | 112 | import GHC.Generics (Generic) |
@@ -118,6 +120,8 @@ import System.IO.Unsafe (unsafeDupablePerformIO) | |||
118 | import Data.Functor.Compose | 120 | import Data.Functor.Compose |
119 | import qualified Rank2 | 121 | import qualified Rank2 |
120 | import Data.Functor.Identity | 122 | import Data.Functor.Identity |
123 | import DPut | ||
124 | import 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. |
123 | newtype Encrypted a = Encrypted ByteString | 127 | newtype 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 | |||
666 | showHex :: BA.ByteArrayAccess ba => ba -> String | ||
667 | showHex bs = C8.unpack $ Base16.encode $ BA.convert bs | ||
668 | |||
669 | newCrypto :: IO TransportCrypto | ||
670 | newCrypto = 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 | |||
66 | import DebugTag | 66 | import DebugTag |
67 | import Network.Tox.Avahi | 67 | import Network.Tox.Avahi |
68 | import Network.Tox.Session | 68 | import Network.Tox.Session |
69 | import Network.Tox.Relay | ||
69 | import Network.SessionTransports | 70 | import Network.SessionTransports |
70 | import Network.Kademlia.Search | 71 | import Network.Kademlia.Search |
71 | import HandshakeCache | 72 | import HandshakeCache |
72 | 73 | ||
73 | newCrypto :: IO TransportCrypto | ||
74 | newCrypto = 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 | |||
114 | updateIP :: TVar (R.BucketList NodeInfo) -> SockAddr -> STM () | 74 | updateIP :: TVar (R.BucketList NodeInfo) -> SockAddr -> STM () |
115 | updateIP tblvar a = do | 75 | updateIP 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)) | |||
340 | unpong (DHTPong asymm) = Just asymm | 340 | unpong (DHTPong asymm) = Just asymm |
341 | unpong _ = Nothing | 341 | unpong _ = Nothing |
342 | 342 | ||
343 | showHex :: BA.ByteArrayAccess ba => ba -> String | ||
344 | showHex bs = C8.unpack $ Base16.encode $ BA.convert bs | ||
345 | |||
346 | ping :: Client -> NodeInfo -> IO Bool | 343 | ping :: Client -> NodeInfo -> IO Bool |
347 | ping client addr = do | 344 | ping 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 | ||
56 | import Network.Address (fromSockAddr,toSockAddr,setPort,either4or6,sockAddrPort) | 57 | import 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 | |||
28 | import Network.Address (getBindAddress) | 28 | import Network.Address (getBindAddress) |
29 | import Network.SocketLike | 29 | import Network.SocketLike |
30 | import Network.StreamServer | 30 | import Network.StreamServer |
31 | import Network.Tox (newCrypto) | ||
32 | import Network.Tox.Onion.Transport hiding (encrypt,decrypt) | 31 | import Network.Tox.Onion.Transport hiding (encrypt,decrypt) |
33 | 32 | ||
34 | 33 | ||