sasl

SASL implementation using simple-pipe

https://github.com/YoshikuniJujo/sasl/wiki

Latest on Hackage:0.0.0.2

This package is not currently in any snapshots. If you're interested in using it, we recommend adding it to Stackage Nightly. Doing so will make builds more reliable, and allow stackage.org to host generated Haddocks.

BSD-3-Clause licensed and maintained by Yoshikuni Jujo

Example programs

SCRAM-SHA-1 Client sample

scramSha1sv.txt

r=00DEADBEEF007658cddf-0e44-4de2-87df-4132bce97f4,s=cGVwcGVy,i=4492
v=q0+IZgUtQTHYItaurlNyET1imLI=
success

examples/clientS.hs

extensions

  • OverloadedStrings

  • PackageImports

import "monads-tf" Control.Monad.State
import Data.Pipe
import Data.Pipe.ByteString
import System.IO
import Network.Sasl
import Network.Sasl.ScramSha1.Client

import qualified Data.ByteString as BS

data St = St [(BS.ByteString, BS.ByteString)] deriving Show

instance SaslState St where
	getSaslState (St s) = s
	putSaslState s _ = St s

serverFile :: String
serverFile = "examples/scramSha1sv.txt"

main :: IO ()
main = do
	let	(_, (_, p)) = sasl
	r <- runPipe (fromFileLn serverFile =$= input =$= p =$= toHandleLn stdout)
		`runStateT` St [
			("username", "yoshikuni"),
			("password", "password"),
			("cnonce", "00DEADBEEF00") ]
	print r

input :: Pipe BS.ByteString (Either Success BS.ByteString) (StateT St IO) ()
input = await >>= \mbs -> case mbs of
	Just "success" -> yield . Left $ Success Nothing
	Just ch -> yield (Right ch) >> input
	_ -> return ()

SCRAM-SHA-1 Server sample

scramSha1cl.txt

n,,n=yoshikuni,r=00DEADBEEF00
c=biws,r=00DEADBEEF007658cddf-0e44-4de2-87df-4132bce97f4,p=zup7ghwpAW43cP4Xu3YZTNnHo0g=

examples/serverS.hs

extensions

  • OverloadedStrings

  • PackageImports

import "monads-tf" Control.Monad.State
import Data.Pipe
import Data.Pipe.ByteString
import System.IO
import Network.Sasl
import Network.Sasl.ScramSha1.Server

import qualified Data.ByteString as BS

data St = St [(BS.ByteString, BS.ByteString)] deriving Show

instance SaslState St where
	getSaslState (St s) = s
	putSaslState s _ = St s

clientFile :: String
clientFile = "examples/scramSha1cl.txt"

main :: IO ()
main = do
	let	slt = "pepper"
		i = 4492
		(stk, svk) = salt "password" slt i
		(_, (_, p)) = sasl $ \"yoshikuni" -> return (slt, stk, svk, i)
	r <- runPipe (fromFileLn clientFile =$= p =$= output =$= toHandleLn stdout)
		`runStateT` St [("snonce", "7658cddf-0e44-4de2-87df-4132bce97f4")]
	print r

output :: Pipe (Either Success BS.ByteString) BS.ByteString (StateT St IO) ()
output = await >>= \mch -> case mch of
	Just (Left (Success Nothing)) -> yield "success"
	Just (Left (Success (Just bs))) -> yield bs
	Just (Right bs) -> yield bs >> output
	_ -> return ()

See examples directory for more examples.