summaryrefslogtreecommitdiff
path: root/OnionTransport.hs
diff options
context:
space:
mode:
Diffstat (limited to 'OnionTransport.hs')
-rw-r--r--OnionTransport.hs59
1 files changed, 58 insertions, 1 deletions
diff --git a/OnionTransport.hs b/OnionTransport.hs
index 804c444e..aa4bae1e 100644
--- a/OnionTransport.hs
+++ b/OnionTransport.hs
@@ -3,6 +3,7 @@
3{-# LANGUAGE GeneralizedNewtypeDeriving #-} 3{-# LANGUAGE GeneralizedNewtypeDeriving #-}
4{-# LANGUAGE KindSignatures #-} 4{-# LANGUAGE KindSignatures #-}
5{-# LANGUAGE LambdaCase #-} 5{-# LANGUAGE LambdaCase #-}
6{-# LANGUAGE RankNTypes #-}
6{-# LANGUAGE ScopedTypeVariables #-} 7{-# LANGUAGE ScopedTypeVariables #-}
7{-# LANGUAGE TupleSections #-} 8{-# LANGUAGE TupleSections #-}
8{-# LANGUAGE TypeOperators #-} 9{-# LANGUAGE TypeOperators #-}
@@ -21,15 +22,20 @@ module OnionTransport
21 , OnionResponse(..) 22 , OnionResponse(..)
22 , Addressed(..) 23 , Addressed(..)
23 , UDPTransport 24 , UDPTransport
25 , KeyRecord(..)
26 , encrypt
27 , decrypt
24 ) where 28 ) where
25 29
26import Network.QueryResponse 30import Network.QueryResponse
27import ToxCrypto 31import ToxCrypto hiding (encrypt,decrypt)
32import qualified ToxCrypto
28import DHTTransport (NodeInfo(..),NodeId(..),SendNodes,nodeInfo) 33import DHTTransport (NodeInfo(..),NodeId(..),SendNodes,nodeInfo)
29 34
30import Control.Arrow 35import Control.Arrow
31import qualified Data.ByteString as B 36import qualified Data.ByteString as B
32 ;import Data.ByteString (ByteString) 37 ;import Data.ByteString (ByteString)
38import Data.Functor.Identity
33import Data.Serialize as S (Get, Put, Serialize, get, put, runGet) 39import Data.Serialize as S (Get, Put, Serialize, get, put, runGet)
34import Data.Typeable 40import Data.Typeable
35import Data.Word 41import Data.Word
@@ -52,6 +58,7 @@ data OnionMessage (f :: * -> *)
52 58
53data OnionToOwner = OnionToOwner NodeInfo (ReturnPath 3) 59data OnionToOwner = OnionToOwner NodeInfo (ReturnPath 3)
54 | OnionToMe SockAddr -- SockAddr is immediate peer in route 60 | OnionToMe SockAddr -- SockAddr is immediate peer in route
61 deriving Show
55 62
56 63
57onionToOwner assym ret3 saddr = do 64onionToOwner assym ret3 saddr = do
@@ -127,6 +134,10 @@ data ReturnPath (n :: Nat) where
127 NoReturnPath :: ReturnPath 0 134 NoReturnPath :: ReturnPath 0
128 ReturnPath :: Nonce24 -> Encrypted (Addressed (ReturnPath n)) -> ReturnPath (n + 1) 135 ReturnPath :: Nonce24 -> Encrypted (Addressed (ReturnPath n)) -> ReturnPath (n + 1)
129 136
137instance KnownNat n => Show (ReturnPath n) where
138 show rpath = "ReturnPath" ++ show (natVal rpath)
139
140
130-- instance KnownNat n => Serialize (ReturnPath n) where 141-- instance KnownNat n => Serialize (ReturnPath n) where
131-- -- Size: 59 = 1(family) + 16(ip) + 2(port) +16(mac) + 24(nonce) 142-- -- Size: 59 = 1(family) + 16(ip) + 2(port) +16(mac) + 24(nonce)
132-- get = ReturnPath <$> getBytes ( 59 * (fromIntegral $ natVal $ Proxy @n) ) 143-- get = ReturnPath <$> getBytes ( 59 * (fromIntegral $ natVal $ Proxy @n) )
@@ -194,3 +205,49 @@ data DataToRoute = DataToRoute
194 , dataToRoute :: Encrypted (Word8,ByteString) 205 , dataToRoute :: Encrypted (Word8,ByteString)
195 } 206 }
196 207
208instance Serialize DataToRoute where
209 get = return $ DataToRoute _todo _todo
210 put _ = return () -- todo
211
212encrypt :: TransportCrypto -> OnionMessage Identity -> OnionToOwner -> (OnionMessage Encrypted, OnionToOwner)
213encrypt crypto msg rpath = (transcode (encryptMessage crypto) msg, rpath)
214
215encryptMessage :: Serialize a =>
216 TransportCrypto -> Nonce24 -> Either (Identity a) (Assym (Identity a)) -> Encrypted a
217encryptMessage crypto n (Right a) = ToxCrypto.encrypt secret plain
218 where
219 secret = computeSharedSecret (transportSecret crypto) (senderKey a) n
220 plain = encodePlain $ runIdentity $ assymData a
221encryptMessage crypto n (Left x) = ToxCrypto.encrypt secret plain
222 where
223 secret = computeSharedSecret (transportSecret crypto) _todo n
224 plain = encodePlain $ runIdentity $ x
225
226decrypt :: TransportCrypto -> OnionMessage Encrypted -> OnionToOwner -> Either String (OnionMessage Identity, OnionToOwner)
227decrypt crypto msg addr = (, addr) <$> (sequenceMessage $ transcode (decryptMessage crypto) msg)
228
229decryptMessage :: Serialize x =>
230 TransportCrypto
231 -> Nonce24
232 -> Either (Encrypted x) (Assym (Encrypted x))
233 -> (Either String ∘ Identity) x
234decryptMessage crypto n (Right assymE) = plain $ ToxCrypto.decrypt secret e
235 where
236 secret = computeSharedSecret (transportSecret crypto) (senderKey assymE) n
237 e = assymData assymE
238 plain = Composed . fmap Identity . (>>= decodePlain)
239decryptMessage crypto n (Left e) = _todo
240
241
242sequenceMessage :: Applicative m => OnionMessage (m ∘ f) -> m (OnionMessage f)
243sequenceMessage (OnionAnnounce a) = fmap OnionAnnounce $ sequenceA $ fmap uncomposed a
244sequenceMessage (OnionToRoute pub a) = fmap (OnionToRoute pub) $ sequenceA $ fmap uncomposed a
245sequenceMessage (OnionToRouteResponse a) = fmap OnionToRouteResponse $ sequenceA $ fmap uncomposed a
246sequenceMessage (OnionAnnounceResponse n8 n24 dta) = OnionAnnounceResponse n8 n24 <$> uncomposed dta
247
248transcode :: forall f g. (forall a. Serialize a => Nonce24 -> Either (f a) (Assym (f a)) -> g a) -> OnionMessage f -> OnionMessage g
249transcode f (OnionAnnounce a) = OnionAnnounce $ a { assymData = f (assymNonce a) (Right a) }
250transcode f (OnionToRoute pub a) = OnionToRoute pub $ a { assymData = f (assymNonce a) (Right a) }
251transcode f (OnionToRouteResponse a) = OnionToRouteResponse $ a { assymData = f (assymNonce a) (Right a) }
252transcode f (OnionAnnounceResponse n8 n24 dta) = OnionAnnounceResponse n8 n24 $ f n24 $ Left dta
253