websockets-0.3.1.0: src/Network/WebSockets/Mask.hs
-- | Masking of fragmes using a simple XOR algorithm
{-# LANGUAGE BangPatterns #-}
module Network.WebSockets.Mask
( Mask
, maskPayload
) where
import Data.Bits (xor)
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
-- | ByteString should be exactly 4 bytes long
type Mask = Maybe B.ByteString
-- | Apply mask
maskPayload :: Mask -> BL.ByteString -> BL.ByteString
maskPayload Nothing = id
maskPayload (Just mask) = snd . BL.mapAccumL f 0
where
len = B.length mask
f !i !c = let i' = (i + 1) `mod` len
m = mask `B.index` i
in (i', m `xor` c)