From 91bb72cb57a5258b092507d5ae69945bd56a8968 Mon Sep 17 00:00:00 2001 From: Trolli Schmittlauch Date: Fri, 8 May 2020 17:15:40 +0200 Subject: [PATCH] fix ASN.1 container parsing --- Hash2Pub/src/Hash2Pub/ASN1Coding.hs | 45 ++++++++++++----------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/Hash2Pub/src/Hash2Pub/ASN1Coding.hs b/Hash2Pub/src/Hash2Pub/ASN1Coding.hs index cbe45c9..2cfc48f 100644 --- a/Hash2Pub/src/Hash2Pub/ASN1Coding.hs +++ b/Hash2Pub/src/Hash2Pub/ASN1Coding.hs @@ -201,7 +201,7 @@ encodePayload payload'@QueryIDResponsePayload{} = Start Sequence : encodeQueryResult resp : case resp of - FOUND _ -> [] + FOUND ns -> encodeNodeState $ ns FORWARD entrySet -> Start Sequence : (concatMap encodeCacheEntry . Set.elems $ entrySet) @@ -314,13 +314,12 @@ parseRequest action = do sender <- parseNodeState parts <- parseInteger part <- parseInteger - payload <- onNextContainer Sequence $ - case action of - QueryID -> parseQueryIDRequest - Join -> parseJoinRequest - Leave -> parseLeaveRequest - Stabilise -> parseStabiliseRequest - Ping -> parsePingRequest + payload <- case action of + QueryID -> parseQueryIDRequest + Join -> parseJoinRequest + Leave -> parseLeaveRequest + Stabilise -> parseStabiliseRequest + Ping -> parsePingRequest return $ Request requestID sender parts part action payload @@ -330,18 +329,12 @@ parseResponse responseTo = do parts <- parseInteger part <- parseInteger action <- parseEnum :: ParseASN1 Action - payload <- onNextContainer Sequence $ - case action of - QueryID -> parseQueryIDResponse - Join -> parseJoinResponse - Leave -> parseLeaveResponse - Stabilise -> parseStabiliseResponse - Ping -> parsePingResponse - -- consume sequence end - end <- getNext - case end of - End Sequence -> return () - x -> throwParseError $ "unexpected ASN.1 element " ++ show x + payload <- case action of + QueryID -> parseQueryIDResponse + Join -> parseJoinResponse + Leave -> parseLeaveResponse + Stabilise -> parseStabiliseResponse + Ping -> parsePingResponse return $ Response responseTo senderID parts part action payload @@ -414,7 +407,7 @@ parseJoinRequest = do return JoinRequestPayload parseJoinResponse :: ParseASN1 ActionPayload -parseJoinResponse = do +parseJoinResponse = onNextContainer Sequence $ do succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger) pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger) cache <- parseNodeCache @@ -425,7 +418,7 @@ parseJoinResponse = do } parseQueryIDRequest :: ParseASN1 ActionPayload -parseQueryIDRequest = do +parseQueryIDRequest = onNextContainer Sequence $ do targetID <- fromInteger <$> parseInteger lBestNodes <- parseInteger return $ QueryIDRequestPayload { @@ -434,7 +427,7 @@ parseQueryIDRequest = do } parseQueryIDResponse :: ParseASN1 ActionPayload -parseQueryIDResponse = do +parseQueryIDResponse = onNextContainer Sequence $ do Enumerated resultType <- getNext result <- case resultType of 0 -> FOUND <$> parseNodeState @@ -450,7 +443,7 @@ parseStabiliseRequest = do return StabiliseRequestPayload parseStabiliseResponse :: ParseASN1 ActionPayload -parseStabiliseResponse = do +parseStabiliseResponse = onNextContainer Sequence $ do succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger) pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger) return $ StabiliseResponsePayload { @@ -459,7 +452,7 @@ parseStabiliseResponse = do } parseLeaveRequest :: ParseASN1 ActionPayload -parseLeaveRequest = do +parseLeaveRequest = onNextContainer Sequence $ do succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger) pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger) return $ LeaveRequestPayload { @@ -478,7 +471,7 @@ parsePingRequest = do return PingRequestPayload parsePingResponse :: ParseASN1 ActionPayload -parsePingResponse = do +parsePingResponse = onNextContainer Sequence $ do handledNodes <- getMany parseNodeState return $ PingResponsePayload { pingNodeStates = handledNodes