diff --git a/src/socks5.hs b/src/socks5.hs index 55a7ef4..a0873f3 100644 --- a/src/socks5.hs +++ b/src/socks5.hs @@ -9,7 +9,8 @@ module Socks5 where import ClassyPrelude -import qualified Data.Binary.Get as Bin +import Data.Binary +import Data.Binary.Get import Network.Socket (HostName, PortNumber) data AuthMethod = NoAuth @@ -24,6 +25,40 @@ data RequestAuth = RequestAuth , methods :: Vector AuthMethod } deriving (Show, Read) +instance Binary AuthMethod where + put val = case val of + NoAuth -> putWord8 0x00 + GSSAPI -> putWord8 0x01 + Login -> putWord8 0x02 + NotAllowed -> putWord8 0xFF + _ {- Reserverd -} -> putWord8 0x03 + + get = do + method <- getWord8 + return $ case method of + 0x00 -> NoAuth + 0x01 -> GSSAPI + 0x02 -> Login + 0xFF -> NotAllowed + _ -> Reserved + + +instance Binary RequestAuth where + put RequestAuth{..} = do + putWord8 (fromIntegral version) + putWord8 (fromIntegral $ length methods) + sequence_ ( put <$> methods) + + get = do + version <- fromIntegral <$> getWord8 + guard (version == 0x05) + nbMethods <- fromIntegral <$> getWord8 + guard (version <= 0xFF) + methods <- replicateM nbMethods get + return $ RequestAuth version methods + + + data Request = Request { version :: Int