Haskell base64 encoder and validated decoder
Haskell
import Data.Char (chr, ord)
import Data.List (elemIndex, unfoldr)
b64 = ['A' .. 'Z'] ++ ['a' .. 'z'] ++ ['0' .. '9'] ++ "+/"
parts n = unfoldr (\ys -> if null ys then Nothing else Just (splitAt n ys))
encode :: String -> String
encode xs = take (4 * k - p) (concatMap quad padded) ++ replicate p '='
where
p = (3 - length xs `mod` 3) `mod` 3
k = (length xs + p) `div` 3
padded = parts 3 (xs ++ replicate p '\0')
quad [a, b, c] = [ix (ord a `div` 4), ix (ord a `mod` 4 * 16 + ord b `div` 16), ix (ord b `mod` 16 * 4 + ord c `div` 64), ix (ord c `mod` 64)]
ix i = b64 !! i
decode :: String -> Either String String
decode s
| length s `mod` 4 /= 0 = Left "base64 length must be a multiple of 4"
| otherwise = do
vals <- traverse val s
pure (take (3 * (length s `div` 4) - length (takeWhile (== '=') (reverse s))) (concatMap unquad (parts 4 vals)))
where
val '=' = Right 0
val c = maybe (Left ("invalid base64 character: " ++ [c])) Right (elemIndex c b64)
unquad [a, b, c, d] = [chr (a * 4 + b `div` 16), chr ((b `mod` 16) * 16 + c `div` 4), chr ((c `mod` 4) * 64 + d)]