module Network.Fernet.Base64 (
b64
, b64dec
, b64url
, b64urldec
) where
import Data.Monoid ((<>))
import qualified Data.ByteString.Char8 as S8
import Data.ByteArray (ByteArrayAccess)
import qualified Data.ByteArray.Encoding as B (Base (..), convertToBase, convertFromBase)
import Data.ByteString (ByteString)
b64 :: ByteArrayAccess a => a -> ByteString
b64 = B.convertToBase B.Base64
b64url :: ByteArrayAccess a => a -> ByteString
b64url = urlSafeBase64 . b64
b64dec :: ByteArrayAccess a => a -> Either String ByteString
b64dec = B.convertFromBase B.Base64
b64urldec :: ByteString -> Either String ByteString
b64urldec = b64dec . unUrlSafeBase64
urlSafeBase64 :: ByteString -> ByteString
urlSafeBase64 = S8.map (tr '+' '-' . tr '/' '_')
unUrlSafeBase64 :: ByteString -> ByteString
unUrlSafeBase64 = S8.map (tr '-' '+' . tr '_' '/')
tr :: Char -> Char -> Char -> Char
tr a b c = if c == a then b else c