diff --git a/app/Main.hs b/app/Main.hs index 26347fe..4bf0d29 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -5,8 +5,6 @@ module Main where import System.Console.CmdArgs import qualified Data.ByteString as B -import qualified Data.ByteString.Char8 as BC -import Text.Regex.TDFA import Encoding.Base2 (enc2, dec2) import Encoding.Base8 (enc8, dec8) import Encoding.Base10 (enc10, dec10) @@ -24,6 +22,7 @@ import Encoding.QuotedPrintable (encqp, decqp) import Encoding.UnixToUnix (encuu, decuu) import Encoding.Yenc (ency, decy) import Encoding.Rotate (rotate) +import Encoding.Solve (solveEnc) data Based = Decode { @@ -69,41 +68,6 @@ data Based = Decode { } deriving(Show, Data, Typeable) -base91Regex = "^[!-~]*$" -base85Regex = "^[0-9A-Za-z!#$%&()*+,-;<=>?@^_`{|}~]+$" -base64Regex = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$" -base58Regex = "^[1-9A-HJ-NP-Za-km-z]+$" -- incorrect -base32Regex = "^(?:[A-Z2-7]{8})*(?:[A-Z2-7]{2}={6}|[A-Z2-7]{4}={4}|[A-Z2-7]{5}={3}|[A-Z2-7]{7}=)?$" -base16Regex = "^[0-9A-FXx]*$" -base10Regex = "^[0-9]*$" -base8Regex = "^[0-7]*$" -base2Regex = "^[01]*$" -urlRegex = "^[a-zA-Z0-9%]*$" - -solveEnc :: BC.ByteString -> BC.ByteString -solveEnc input = - let isBase91 = input =~ base91Regex :: Bool - isBase85 = input =~ base85Regex :: Bool - isBase64 = input =~ base64Regex :: Bool - isBase58 = input =~ base58Regex :: Bool - isBase32 = input =~ base32Regex :: Bool - isBase16 = input =~ base16Regex :: Bool - isBase10 = input =~ base10Regex :: Bool - isBase8 = input =~ base8Regex :: Bool - isBase2 = input =~ base2Regex :: Bool - isURL = input =~ urlRegex :: Bool - base91Result = if isBase91 then BC.pack "\nTrying base91:\n" `BC.append` dec91 input else BC.empty - base85Result = if isBase85 then BC.pack "\nTrying base85:\n" `BC.append` dec85 input else BC.empty - base64Result = if isBase64 then BC.pack "\nTrying base64:\n" `BC.append` dec64 input else BC.empty - base58Result = if isBase58 then BC.pack "\nTrying base58:\n" `BC.append` dec58 input else BC.empty - base32Result = if isBase64 then BC.pack "\nTrying base32:\n" `BC.append` dec32 input else BC.empty - base16Result = if isBase16 then BC.pack "\nTrying base16:\n" `BC.append` dec16 input else BC.empty - base10Result = if isBase10 then BC.pack "\nTrying base10:\n" `BC.append` dec10 input else BC.empty - base2Result = if isBase2 then BC.pack "\nTrying base2:\n" `BC.append` dec2 input else BC.empty - base8Result = if isBase8 then BC.pack "\nTrying base8:\n" `BC.append` dec8 input else BC.empty - urlResult = if isURL then BC.pack "\nTrying URL decode:\n" `BC.append` decurl input else BC.empty - in BC.concat [base91Result, base85Result, base64Result, base58Result, base32Result, base16Result, base10Result, base8Result, base2Result, urlResult] - optionHandler :: Based -> B.ByteString -> B.ByteString optionHandler Decode{b91=True} = dec91 diff --git a/based.cabal b/based.cabal index 7e3917b..248dce0 100644 --- a/based.cabal +++ b/based.cabal @@ -25,6 +25,7 @@ library Encoding.Xx Encoding.Yenc Encoding.Rotate + Encoding.Solve other-modules: -- Data.Bytes.Text.Ascii build-depends: @@ -42,6 +43,7 @@ library haskoin-core, text, primitive, + regex-tdfa, base64-bytestring default-language: Haskell2010 diff --git a/src/Encoding/Solve.hs b/src/Encoding/Solve.hs new file mode 100644 index 0000000..bbdc4bd --- /dev/null +++ b/src/Encoding/Solve.hs @@ -0,0 +1,58 @@ +module Encoding.Solve + (solveEnc) where + +import qualified Data.ByteString.Char8 as BC +import Text.Regex.TDFA +import Encoding.Base2 (enc2, dec2) +import Encoding.Base8 (enc8, dec8) +import Encoding.Base10 (enc10, dec10) +import Encoding.Base16 (enc16, dec16) +import Encoding.Base32 (enc32, dec32) +import Encoding.Base45 (enc45, dec45) +import Encoding.Base58 (enc58, dec58) +import Encoding.Base62 (enc62, dec62) +import Encoding.Base64 (enc64, dec64, enc64url, dec64url) +import Encoding.Base85 (enc85, dec85) +import Encoding.Base91 (enc91, dec91) +import Encoding.Url (encurl, decurl) +import Encoding.Xx (encxx, decxx) +import Encoding.QuotedPrintable (encqp, decqp) +import Encoding.UnixToUnix (encuu, decuu) +import Encoding.Yenc (ency, decy) +import Encoding.Rotate (rotate) + + +base91Regex = "^[!-~]*$" +base85Regex = "^[0-9A-Za-z!#$%&()*+,-;<=>?@^_`{|}~]+$" +base64Regex = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$" +base58Regex = "^[1-9A-HJ-NP-Za-km-z]+$" -- incorrect +base32Regex = "^(?:[A-Z2-7]{8})*(?:[A-Z2-7]{2}={6}|[A-Z2-7]{4}={4}|[A-Z2-7]{5}={3}|[A-Z2-7]{7}=)?$" +base16Regex = "^[0-9A-FXx]*$" +base10Regex = "^[0-9]*$" +base8Regex = "^[0-7]*$" +base2Regex = "^[01]*$" +urlRegex = "^[a-zA-Z0-9%]*$" + +solveEnc :: BC.ByteString -> BC.ByteString +solveEnc input = + let isBase91 = input =~ base91Regex :: Bool + isBase85 = input =~ base85Regex :: Bool + isBase64 = input =~ base64Regex :: Bool + isBase58 = input =~ base58Regex :: Bool + isBase32 = input =~ base32Regex :: Bool + isBase16 = input =~ base16Regex :: Bool + isBase10 = input =~ base10Regex :: Bool + isBase8 = input =~ base8Regex :: Bool + isBase2 = input =~ base2Regex :: Bool + isURL = input =~ urlRegex :: Bool + base91Result = if isBase91 then BC.pack "\nTrying base91:\n" `BC.append` dec91 input else BC.empty + base85Result = if isBase85 then BC.pack "\nTrying base85:\n" `BC.append` dec85 input else BC.empty + base64Result = if isBase64 then BC.pack "\nTrying base64:\n" `BC.append` dec64 input else BC.empty + base58Result = if isBase58 then BC.pack "\nTrying base58:\n" `BC.append` dec58 input else BC.empty + base32Result = if isBase64 then BC.pack "\nTrying base32:\n" `BC.append` dec32 input else BC.empty + base16Result = if isBase16 then BC.pack "\nTrying base16:\n" `BC.append` dec16 input else BC.empty + base10Result = if isBase10 then BC.pack "\nTrying base10:\n" `BC.append` dec10 input else BC.empty + base2Result = if isBase2 then BC.pack "\nTrying base2:\n" `BC.append` dec2 input else BC.empty + base8Result = if isBase8 then BC.pack "\nTrying base8:\n" `BC.append` dec8 input else BC.empty + urlResult = if isURL then BC.pack "\nTrying URL decode:\n" `BC.append` decurl input else BC.empty + in BC.concat [base91Result, base85Result, base64Result, base58Result, base32Result, base16Result, base10Result, base8Result, base2Result, urlResult]