diff options
Diffstat (limited to 'ToxMessage.hs')
-rw-r--r-- | ToxMessage.hs | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/ToxMessage.hs b/ToxMessage.hs index 56758e48..c77f1ad7 100644 --- a/ToxMessage.hs +++ b/ToxMessage.hs | |||
@@ -220,14 +220,6 @@ data Packet where | |||
220 | 220 | ||
221 | OnionRequest3 :: ByteString -> Symmetric -> Packet -- 0x82 | 221 | OnionRequest3 :: ByteString -> Symmetric -> Packet -- 0x82 |
222 | 222 | ||
223 | -- TODO: | ||
224 | -- Announce has a return path appended to it. | ||
225 | -- We'll need a type-level natural to indicate how may bytes to | ||
226 | -- get in the ImplicitAssymetric data. (Or we could force the size | ||
227 | -- of the return path). | ||
228 | -- | ||
229 | -- If the return path is non empty, we should respond with OnionResponse3 | ||
230 | -- rather than AnnounceResponse directly. | ||
231 | Announce :: Aliased Assymetric -> ReturnPath 3 -> Packet --0x83 | 223 | Announce :: Aliased Assymetric -> ReturnPath 3 -> Packet --0x83 |
232 | AnnounceResponse :: Nonce8 -> UnclaimedAssymetric -> Packet -- 0x84 | 224 | AnnounceResponse :: Nonce8 -> UnclaimedAssymetric -> Packet -- 0x84 |
233 | 225 | ||
@@ -256,8 +248,9 @@ pattern OnionRequest1Type = PacketKind 129 -- 0x81 Onion Request 1 | |||
256 | pattern OnionRequest2Type = PacketKind 130 -- 0x82 Onion Request 2 | 248 | pattern OnionRequest2Type = PacketKind 130 -- 0x82 Onion Request 2 |
257 | pattern AnnounceType = PacketKind 131 -- 0x83 Announce Request | 249 | pattern AnnounceType = PacketKind 131 -- 0x83 Announce Request |
258 | pattern AnnounceResponseType = PacketKind 132 -- 0x84 Announce Response | 250 | pattern AnnounceResponseType = PacketKind 132 -- 0x84 Announce Response |
259 | -- 0x85 Onion Data Request (data to route request packet) | 251 | |
260 | -- 0x86 Onion Data Response (data to route response packet) | 252 | pattern DataRequestType = PacketKind 133 -- 0x85 Onion Data Request (data to route request packet) |
253 | pattern DataResponseType = PacketKind 134 -- 0x86 Onion Data Response (data to route response packet) | ||
261 | -- 0x8c Onion Response 3 | 254 | -- 0x8c Onion Response 3 |
262 | -- 0x8d Onion Response 2 | 255 | -- 0x8d Onion Response 2 |
263 | pattern OnionResponse3Type = PacketKind 140 -- 0x8c Onion Response 3 | 256 | pattern OnionResponse3Type = PacketKind 140 -- 0x8c Onion Response 3 |
@@ -291,7 +284,10 @@ instance Show PacketKind where | |||
291 | showsPrec d OnionRequest0Type = mappend "OnionRequest0" | 284 | showsPrec d OnionRequest0Type = mappend "OnionRequest0" |
292 | showsPrec d OnionResponse1Type = mappend "OnionResponse1" | 285 | showsPrec d OnionResponse1Type = mappend "OnionResponse1" |
293 | showsPrec d OnionResponse3Type = mappend "OnionResponse3" | 286 | showsPrec d OnionResponse3Type = mappend "OnionResponse3" |
294 | showsPrec d AnnounceType = mappend "AnnounceType" | 287 | showsPrec d AnnounceType = mappend "Announce" |
288 | showsPrec d AnnounceResponseType = mappend "AnnounceResponse" | ||
289 | showsPrec d DataRequestType = mappend "DataRequestType" | ||
290 | showsPrec d DataResponseType = mappend "DataResponseType" | ||
295 | showsPrec d (PacketKind x) = mappend "PacketKind " . showsPrec (d+1) x | 291 | showsPrec d (PacketKind x) = mappend "PacketKind " . showsPrec (d+1) x |
296 | 292 | ||
297 | pktKind :: Packet -> PacketKind | 293 | pktKind :: Packet -> PacketKind |
@@ -356,6 +352,7 @@ pktKind OnionResponse3 {} = PacketKind 0x8c | |||
356 | data PacketClass = | 352 | data PacketClass = |
357 | AssymetricClass (Assymetric -> Packet) (Packet -> Assymetric) | 353 | AssymetricClass (Assymetric -> Packet) (Packet -> Assymetric) |
358 | | forall n. OnionPacket n => AliasedClass ((Aliased Assymetric,ReturnPath n) -> Packet) (Packet -> (Aliased Assymetric,ReturnPath n)) | 354 | | forall n. OnionPacket n => AliasedClass ((Aliased Assymetric,ReturnPath n) -> Packet) (Packet -> (Aliased Assymetric,ReturnPath n)) |
355 | | forall n. OnionPacket n => ToRouteClass ((PubKey,(Aliased Assymetric,ReturnPath n)) -> Packet) (Packet -> (PubKey,(Aliased Assymetric,ReturnPath n))) | ||
359 | | forall n. OnionPacket n => OnionClass ((Packet,ReturnPath n) -> Packet) (Packet -> (Packet,ReturnPath n)) | 356 | | forall n. OnionPacket n => OnionClass ((Packet,ReturnPath n) -> Packet) (Packet -> (Packet,ReturnPath n)) |
360 | | NoncedUnclaimedClass (Nonce8 -> UnclaimedAssymetric -> Packet) | 357 | | NoncedUnclaimedClass (Nonce8 -> UnclaimedAssymetric -> Packet) |
361 | (Packet -> (Nonce8, UnclaimedAssymetric)) | 358 | (Packet -> (Nonce8, UnclaimedAssymetric)) |
@@ -383,13 +380,16 @@ pktClass (PacketKind 4) = AssymetricClass SendNodes (\(SendNodes a) -> a) | |||
383 | 380 | ||
384 | pktClass (PacketKind 0x18) = AssymetricClass CookieRequest (\(CookieRequest a) -> a) | 381 | pktClass (PacketKind 0x18) = AssymetricClass CookieRequest (\(CookieRequest a) -> a) |
385 | pktClass (PacketKind 0x80) = AssymetricClass OnionRequest0 (\(OnionRequest0 a) -> a) | 382 | pktClass (PacketKind 0x80) = AssymetricClass OnionRequest0 (\(OnionRequest0 a) -> a) |
386 | -- pktClass (PacketKind 0x86) = AssymetricClass (DataToRouteResponse . Aliased) (\(DataToRouteResponse (Aliased a)) -> a) | 383 | pktClass (PacketKind 0x86) = AssymetricClass (DataToRouteResponse . Aliased) (\(DataToRouteResponse (Aliased a)) -> a) |
387 | 384 | ||
388 | pktClass (PacketKind 0x83) = AliasedClass (uncurry Announce) (\(Announce a r)-> (a,r)) | 385 | pktClass (PacketKind 0x83) = AliasedClass (uncurry Announce) (\(Announce a r)-> (a,r)) |
389 | pktClass (PacketKind 0x84) = NoncedUnclaimedClass AnnounceResponse (\(AnnounceResponse n8 uncl)-> (n8,uncl)) | 386 | pktClass (PacketKind 0x84) = NoncedUnclaimedClass AnnounceResponse (\(AnnounceResponse n8 uncl)-> (n8,uncl)) |
390 | 387 | ||
391 | pktClass (PacketKind 0x8c) = OnionClass (uncurry OnionResponse3 . swap) (\(OnionResponse3 r a)-> (a,r)) | 388 | pktClass (PacketKind 0x8c) = OnionClass (uncurry OnionResponse3 . swap) (\(OnionResponse3 r a)-> (a,r)) |
392 | 389 | ||
390 | pktClass DataRequestType = ToRouteClass (\(k,(a,r))-> DataToRoute k a r) | ||
391 | (\(DataToRoute k a r) -> (k,(a,r))) | ||
392 | |||
393 | pktClass _ = Unclassified | 393 | pktClass _ = Unclassified |
394 | 394 | ||
395 | 395 | ||
@@ -408,6 +408,13 @@ getPacket = do | |||
408 | r <- get | 408 | r <- get |
409 | trace ("PARSED "++show typ) $ return () | 409 | trace ("PARSED "++show typ) $ return () |
410 | return $ toPacket (a,r) | 410 | return $ toPacket (a,r) |
411 | ToRouteClass toPacket _ -> do | ||
412 | trace ("R-PARSE "++show typ) $ return () | ||
413 | cnt <- remaining | ||
414 | (pub,a) <- isolate (cnt - 59*3) get | ||
415 | r <- get | ||
416 | trace ("R-PARSED "++show typ) $ return () | ||
417 | return $ toPacket (pub,(a,r)) | ||
411 | OnionClass toPacket _ -> do | 418 | OnionClass toPacket _ -> do |
412 | trace ("ONION-PARSE "++show typ) $ return () | 419 | trace ("ONION-PARSE "++show typ) $ return () |
413 | p <- get | 420 | p <- get |
@@ -421,6 +428,7 @@ putPacket p = do | |||
421 | case pktClass (pktKind p) of | 428 | case pktClass (pktKind p) of |
422 | AssymetricClass _ fromPacket -> put $ fromPacket p | 429 | AssymetricClass _ fromPacket -> put $ fromPacket p |
423 | AliasedClass _ fromPacket -> put $ fromPacket p | 430 | AliasedClass _ fromPacket -> put $ fromPacket p |
431 | ToRouteClass _ fromPacket -> put $ fromPacket p | ||
424 | OnionClass _ fromPacket -> put $ swap $ fromPacket p | 432 | OnionClass _ fromPacket -> put $ swap $ fromPacket p |
425 | NoncedUnclaimedClass _ fromPacket -> put $ fromPacket p -- putting a pair. | 433 | NoncedUnclaimedClass _ fromPacket -> put $ fromPacket p -- putting a pair. |
426 | Unclassified -> fail $ "todo: serialize packet "++show (pktKind p) | 434 | Unclassified -> fail $ "todo: serialize packet "++show (pktKind p) |