2022-05-17 00:23:30 +02:00
#!/ usr / bin / env runhaskell
{- # LANGUAGE DeriveDataTypeable # -}
module Main where
import System.Console.CmdArgs
import Control.Arrow
2022-05-19 23:55:26 +02:00
import Numeric ( showHex , showIntAtBase )
2022-05-22 01:15:09 +02:00
import Data.Text ( pack , unpack )
import Data.Char ( intToDigit , ord , chr )
import Data.Maybe ( fromJust )
2022-05-19 23:55:26 +02:00
import TextShow ( toText )
import Text.XML.HXT.DOM.Util ( stringToHexString , hexStringToInt , intToHexString , charToHexString , decimalStringToInt )
import TextShow.Data.Integral ( showbBin , showbHex )
2022-05-22 01:15:09 +02:00
import Codec.CBOR.Magic ( intToWord64 )
2022-05-17 00:23:30 +02:00
import qualified Data.Either.Unwrap as U
import qualified Codec.Binary.Base91 as B91
import qualified Codec.Binary.Base85 as B85
import qualified Codec.Binary.Base64 as B64
import qualified Data.Word.Base62 as B62
2022-05-22 01:15:09 +02:00
import qualified Haskoin.Address.Base58 as B58
2022-05-17 00:23:30 +02:00
import qualified Codec.Binary.Base32 as B32
import qualified Codec.Binary.Base16 as B16
2022-05-19 23:55:26 +02:00
import qualified Codec.Binary.QuotedPrintable as QP
import qualified Codec.Binary.Uu as UU
import qualified Codec.Binary.Xx as XX
import qualified Codec.Binary.Yenc as Y
2022-05-17 00:23:30 +02:00
import qualified Data.Bytes as Bytes
import qualified Data.Bytes.Text.Ascii as ASCII
2022-05-22 01:15:09 +02:00
import Data.Bytes.Get ( getWord64host )
2022-05-17 00:23:30 +02:00
import Data.ByteString.UTF8 as BSU -- from utf8-string
import qualified Data.ByteString.Char8 as C
data Based = Decode {
b91 :: Bool ,
b85 :: Bool ,
b64 :: Bool ,
b62 :: Bool ,
2022-05-19 23:55:26 +02:00
b58 :: Bool ,
2022-05-17 00:23:30 +02:00
b32 :: Bool ,
2022-05-19 23:55:26 +02:00
b16 :: Bool ,
b10 :: Bool ,
qp :: Bool ,
uu :: Bool ,
xx :: Bool ,
yenc :: Bool
2022-05-17 00:23:30 +02:00
}
| Encode {
b91 :: Bool ,
b85 :: Bool ,
b64 :: Bool ,
b62 :: Bool ,
2022-05-19 23:55:26 +02:00
b58 :: Bool ,
2022-05-17 00:23:30 +02:00
b32 :: Bool ,
2022-05-19 23:55:26 +02:00
b16 :: Bool ,
b10 :: Bool ,
qp :: Bool ,
uu :: Bool ,
xx :: Bool ,
yenc :: Bool
2022-05-17 00:23:30 +02:00
}
deriving ( Show , Data , Typeable )
-- without the show func, sequences like \n will not be shown as characters but will be executed as newline
dec91 = C . unpack . B91 . decode
enc91 = B91 . encode . BSU . fromString
dec85 = C . unpack . U . fromRight . B85 . decode . BSU . fromString
enc85 = C . unpack . B85 . encode . BSU . fromString
dec64 = C . unpack . U . fromRight . B64 . decode . BSU . fromString
enc64 = C . unpack . B64 . encode . BSU . fromString
2022-05-22 01:15:09 +02:00
dec62 = show . fromJust . B62 . decode128 . ( Bytes . fromByteString . BSU . fromString )
enc62 = C . unpack . BSU . fromString . Bytes . toLatinString . ( Bytes . fromByteArray . ( B62 . encode64 . ( intToWord64 . decimalStringToInt ) ) )
dec58 = C . unpack . fromJust . B58 . decodeBase58 . pack
enc58 = unpack . B58 . encodeBase58 . BSU . fromString
2022-05-17 00:23:30 +02:00
dec32 = C . unpack . U . fromRight . B32 . decode . BSU . fromString
enc32 = C . unpack . B32 . encode . BSU . fromString
dec16 = C . unpack . U . fromRight . B16 . decode . BSU . fromString
enc16 = C . unpack . B16 . encode . BSU . fromString
2022-05-19 23:55:26 +02:00
dec10 = show . hexStringToInt
enc10 = C . unpack . BSU . fromString . intToHexString . decimalStringToInt -- Depending on what you want, do enc10 = show . map ord
decqp = C . unpack . U . fromRight . QP . decode . BSU . fromString
encqp = C . unpack . QP . encode . BSU . fromString
decuu = C . unpack . U . fromRight . UU . decode . BSU . fromString
encuu = C . unpack . UU . encode . BSU . fromString
decxx = C . unpack . U . fromRight . XX . decode . BSU . fromString
encxx = C . unpack . XX . encode . BSU . fromString
decy = C . unpack . U . fromRight . Y . decode . BSU . fromString
ency = C . unpack . Y . encode . BSU . fromString
2022-05-17 00:23:30 +02:00
optionHandler Decode { b91 = True } = dec91
optionHandler Encode { b91 = True } = enc91
optionHandler Decode { b85 = True } = dec85
optionHandler Encode { b85 = True } = enc85
optionHandler Decode { b64 = True } = dec64
optionHandler Encode { b64 = True } = enc64
optionHandler Decode { b62 = True } = dec62
optionHandler Encode { b62 = True } = enc62
2022-05-19 23:55:26 +02:00
optionHandler Decode { b58 = True } = dec58
optionHandler Encode { b58 = True } = enc58
2022-05-17 00:23:30 +02:00
optionHandler Decode { b32 = True } = dec32
optionHandler Encode { b32 = True } = enc32
optionHandler Decode { b16 = True } = dec16
optionHandler Encode { b16 = True } = enc16
2022-05-19 23:55:26 +02:00
optionHandler Decode { b10 = True } = dec10
optionHandler Encode { b10 = True } = enc10
optionHandler Decode { qp = True } = decqp
optionHandler Encode { qp = True } = encqp
optionHandler Encode { uu = True } = decuu
optionHandler Decode { uu = True } = encuu
optionHandler Decode { xx = True } = decxx
optionHandler Encode { xx = True } = encxx
optionHandler Decode { yenc = True } = decy
optionHandler Encode { yenc = True } = ency
2022-05-17 00:23:30 +02:00
decode_ = Decode {
b91 = def &= help " decode base91 " ,
b85 = def &= help " decode base85 " ,
b64 = def &= help " decode base64 " ,
b62 = def &= help " decode base62 " ,
2022-05-19 23:55:26 +02:00
b58 = def &= help " decode base58 " ,
2022-05-17 00:23:30 +02:00
b32 = def &= help " decode base32 " ,
2022-05-19 23:55:26 +02:00
b16 = def &= help " decode base16 " ,
b10 = def &= help " decode base10 to hex " ,
qp = def &= help " decode quoted-printable " ,
uu = def &= help " decode uu " ,
xx = def &= help " decode xx " ,
yenc = def &= help " decode yEncode "
2022-05-17 00:23:30 +02:00
} &= help " Decode chosen base " &= auto
encode_ = Encode {
b91 = def &= help " encode base91 " ,
b85 = def &= help " encode base85 " ,
b64 = def &= help " encode base64 " ,
b62 = def &= help " encode base62 " ,
2022-05-19 23:55:26 +02:00
b58 = def &= help " encode base58 " ,
2022-05-17 00:23:30 +02:00
b32 = def &= help " encode base32 " ,
2022-05-19 23:55:26 +02:00
b16 = def &= help " encode base16 " ,
b10 = def &= help " encode base10 to hex " ,
qp = def &= help " encode quoted-printable " ,
uu = def &= help " encode uu " ,
xx = def &= help " encode xx " ,
yenc = def &= help " encode yEncode "
2022-05-17 00:23:30 +02:00
} &= help " Encode chosen base "
2022-05-19 23:55:26 +02:00
main = cmdArgs ( modes [ decode_ , encode_ ] &= help " Anybased, when Cyberchef simply doesn't cut it. " &= program " based " &= summary " based v0.1 " ) >>= interact . optionHandler