diff options
Diffstat (limited to 'OnionTransport.hs')
-rw-r--r-- | OnionTransport.hs | 59 |
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 | ||
26 | import Network.QueryResponse | 30 | import Network.QueryResponse |
27 | import ToxCrypto | 31 | import ToxCrypto hiding (encrypt,decrypt) |
32 | import qualified ToxCrypto | ||
28 | import DHTTransport (NodeInfo(..),NodeId(..),SendNodes,nodeInfo) | 33 | import DHTTransport (NodeInfo(..),NodeId(..),SendNodes,nodeInfo) |
29 | 34 | ||
30 | import Control.Arrow | 35 | import Control.Arrow |
31 | import qualified Data.ByteString as B | 36 | import qualified Data.ByteString as B |
32 | ;import Data.ByteString (ByteString) | 37 | ;import Data.ByteString (ByteString) |
38 | import Data.Functor.Identity | ||
33 | import Data.Serialize as S (Get, Put, Serialize, get, put, runGet) | 39 | import Data.Serialize as S (Get, Put, Serialize, get, put, runGet) |
34 | import Data.Typeable | 40 | import Data.Typeable |
35 | import Data.Word | 41 | import Data.Word |
@@ -52,6 +58,7 @@ data OnionMessage (f :: * -> *) | |||
52 | 58 | ||
53 | data OnionToOwner = OnionToOwner NodeInfo (ReturnPath 3) | 59 | data 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 | ||
57 | onionToOwner assym ret3 saddr = do | 64 | onionToOwner 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 | ||
137 | instance 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 | ||
208 | instance Serialize DataToRoute where | ||
209 | get = return $ DataToRoute _todo _todo | ||
210 | put _ = return () -- todo | ||
211 | |||
212 | encrypt :: TransportCrypto -> OnionMessage Identity -> OnionToOwner -> (OnionMessage Encrypted, OnionToOwner) | ||
213 | encrypt crypto msg rpath = (transcode (encryptMessage crypto) msg, rpath) | ||
214 | |||
215 | encryptMessage :: Serialize a => | ||
216 | TransportCrypto -> Nonce24 -> Either (Identity a) (Assym (Identity a)) -> Encrypted a | ||
217 | encryptMessage crypto n (Right a) = ToxCrypto.encrypt secret plain | ||
218 | where | ||
219 | secret = computeSharedSecret (transportSecret crypto) (senderKey a) n | ||
220 | plain = encodePlain $ runIdentity $ assymData a | ||
221 | encryptMessage crypto n (Left x) = ToxCrypto.encrypt secret plain | ||
222 | where | ||
223 | secret = computeSharedSecret (transportSecret crypto) _todo n | ||
224 | plain = encodePlain $ runIdentity $ x | ||
225 | |||
226 | decrypt :: TransportCrypto -> OnionMessage Encrypted -> OnionToOwner -> Either String (OnionMessage Identity, OnionToOwner) | ||
227 | decrypt crypto msg addr = (, addr) <$> (sequenceMessage $ transcode (decryptMessage crypto) msg) | ||
228 | |||
229 | decryptMessage :: Serialize x => | ||
230 | TransportCrypto | ||
231 | -> Nonce24 | ||
232 | -> Either (Encrypted x) (Assym (Encrypted x)) | ||
233 | -> (Either String ∘ Identity) x | ||
234 | decryptMessage 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) | ||
239 | decryptMessage crypto n (Left e) = _todo | ||
240 | |||
241 | |||
242 | sequenceMessage :: Applicative m => OnionMessage (m ∘ f) -> m (OnionMessage f) | ||
243 | sequenceMessage (OnionAnnounce a) = fmap OnionAnnounce $ sequenceA $ fmap uncomposed a | ||
244 | sequenceMessage (OnionToRoute pub a) = fmap (OnionToRoute pub) $ sequenceA $ fmap uncomposed a | ||
245 | sequenceMessage (OnionToRouteResponse a) = fmap OnionToRouteResponse $ sequenceA $ fmap uncomposed a | ||
246 | sequenceMessage (OnionAnnounceResponse n8 n24 dta) = OnionAnnounceResponse n8 n24 <$> uncomposed dta | ||
247 | |||
248 | transcode :: forall f g. (forall a. Serialize a => Nonce24 -> Either (f a) (Assym (f a)) -> g a) -> OnionMessage f -> OnionMessage g | ||
249 | transcode f (OnionAnnounce a) = OnionAnnounce $ a { assymData = f (assymNonce a) (Right a) } | ||
250 | transcode f (OnionToRoute pub a) = OnionToRoute pub $ a { assymData = f (assymNonce a) (Right a) } | ||
251 | transcode f (OnionToRouteResponse a) = OnionToRouteResponse $ a { assymData = f (assymNonce a) (Right a) } | ||
252 | transcode f (OnionAnnounceResponse n8 n24 dta) = OnionAnnounceResponse n8 n24 $ f n24 $ Left dta | ||
253 | |||