{-# LANGUAGE OverloadedStrings #-} module Parser where import Control.Lens ((<&>), view, lazy) import Data.Attoparsec.ByteString (Parser) import qualified Data.Attoparsec.ByteString as P import Data.Binary.Get import Data.ByteString.Char8 (ByteString) import Data.Word (Word32) import GHC.Word (Word8) obfsParser :: Parser (Word32, ByteString, Word32, ByteString) obfsParser = do randomLen <- P.take 4 <&> runGet getWord32be . view lazy random <- P.take (fromIntegral randomLen) payloadLen <- P.take 4 <&> runGet getWord32be . view lazy payload <- P.take (fromIntegral payloadLen) pure (randomLen, random, payloadLen, payload)