blakesum 0.4 → 0.5
raw patch · 2 files changed
+2/−237 lines, 2 filesdep −blakesumdep −haskell98
Dependencies removed: blakesum, haskell98
Files
- blakesum.cabal +2/−14
- demo/Main.hs +0/−223
blakesum.cabal view
@@ -1,5 +1,5 @@ name: blakesum-version: 0.4+version: 0.5 synopsis: The BLAKE SHA-3 candidate hashes, in Haskell description: .@@ -12,8 +12,6 @@ . Contributions and optimizations are welcome! .- This package installs both a library and an executable.- . category: Cryptography stability: experimental license: BSD3@@ -36,16 +34,6 @@ text >= 0 && < 1, vector >= 0 && < 1 exposed-modules: Data.Digest.BLAKE- ghc-options: -Wall -O2--executable blakesum- main-is: Main.hs- hs-source-dirs: demo- build-depends: base >= 4 && < 5,- blakesum == 0.4,- bytestring >= 0 && < 1,- haskell98 >= 1 && < 2,- text >= 0 && < 1,- vector >= 0 && < 1+ ghc-options: -Wall -O2 -fspec-constr-count=15
− demo/Main.hs
@@ -1,223 +0,0 @@--- |--- Copyright : (c) 2011 Kevin Cantu------ License : BSD-style--- Maintainer : Kevin Cantu <me@kevincantu.org>--- Stability : experimental------ A demo program providing a command line `blakesum` utility which behaves --- much like the sha512sum or shasum software available for various platforms---module Main (main) where--import Data.Digest.BLAKE-import qualified Data.ByteString.Lazy as B-import System---import System.IO-import IO-import System.Console.GetOpt-import qualified Data.Text.Lazy as T-import qualified Data.Text.Lazy.Encoding as E-import Data.Word----- command line options-data Options = Options { help :: Bool- , check :: Bool- , algorithm :: Integer- , salt_ :: B.ByteString- }----- command line defaults-defaultOpts :: Options-defaultOpts = Options { help = False- , check = False- , algorithm = 512- , salt_ = B.take 32 $ B.repeat 0- }----- command line description--- this format is kinda bone headed:--- [Option short [long] (property setter-function hint) description]-options :: [ OptDescr (Options -> IO Options) ]-options = [ Option "a" ["algorithm"] - (ReqArg- (\arg opt -> let alg = read arg :: Integer- in- if elem alg [256,512,224,384]- then return opt { algorithm = alg }- else error "please choose a working algorithm size")- "BITS")- "256, 512, 224, 384 (default: 512)"-- , Option "c" ["check"] - (NoArg $ \opt -> return opt { check = True })- "check saved hashes"-- , Option "s" ["salt"] - (ReqArg- (\arg opt -> let s = (read ("[" ++ arg ++ "]")) :: [Word8]- in - if (length $ filter (<0) s) > 0- then error "please specify a salt of positive numbers"- else return opt { salt_ = B.pack s })- "SALT")- "one positive uint per byte, salt: \"0,0,...0,0\""-- , Option "h" ["help"] - (NoArg $ \_ -> do- prg <- getProgName- hPutStrLn stderr $ usageInfo prg options- exitWith ExitSuccess)- "display this help and exit"-- , Option "v" ["version"] - (NoArg $ \_ -> do- me <- getProgName- hPutStrLn stderr $ me ++ " version 0.4"- exitWith ExitSuccess)- "display version and exit"- ]----- apply a function (which uses the path) to a list of files and/or stdin-fileMapWithPath :: ( FilePath -> B.ByteString -> IO () ) -> [FilePath] -> IO ()-fileMapWithPath f paths = - let - -- apply f to stdin- stdinF :: IO ()- stdinF = B.getContents >>= f "-"-- -- apply f to a file (or stdin, when "-")- fileF :: FilePath -> IO ()- fileF "-" = stdinF- fileF path = (B.readFile path >>= f path) `catch` (\e -> hPutStrLn stderr (show e))- in- case paths of- [] -> stdinF- _ -> mapM_ fileF paths----- apply a function to a list of files and/or stdin-fileMap :: ( B.ByteString -> IO () ) -> [FilePath] -> IO ()-fileMap f paths = fileMapWithPath (\_ -> f) paths------ compute a hash, return text-getHash256 :: B.ByteString -> B.ByteString -> T.Text-getHash256 salt message = textDigest $ blake256 salt message-getHash224 :: B.ByteString -> B.ByteString -> T.Text-getHash224 salt message = textDigest $ blake224 salt message-getHash512 :: B.ByteString -> B.ByteString -> T.Text-getHash512 salt message = textDigest $ blake512 salt message-getHash384 :: B.ByteString -> B.ByteString -> T.Text-getHash384 salt message = textDigest $ blake384 salt message----- print out the BLAKE hash followed by the file name-printHash :: (B.ByteString -> B.ByteString -> T.Text)- -> B.ByteString- -> String- -> B.ByteString- -> IO ()--printHash getHash salt path message = - do- hash <- return $ getHash salt message- B.putStrLn $ E.encodeUtf8 $ T.concat [hash, T.pack " *", T.pack path]----- check one hash line (i.e., aas98d4a654...5756 *README.txt)-checkHash :: (B.ByteString -> B.ByteString -> T.Text)- -> B.ByteString- -> T.Text- -> IO ()--checkHash getHash salt line = - let- [savedHash, path] = T.splitOn (T.pack " *") line- printStatus status = B.putStrLn $ E.encodeUtf8 $ T.append path $ T.pack $ ": " ++ status- in- (do- message <- B.readFile (T.unpack path)-- printStatus $ if savedHash == getHash salt message- then "OK"- else "FAILED"-- ) `catch` (\e -> hPutStrLn stderr (show e) - >> printStatus "FAILED open or read")----- print hashes of given files-printHashes :: Num a => a -> B.ByteString -> [FilePath] -> IO ()-printHashes alg salt paths =- let- printHash' =- case alg of - 256 -> printHash getHash256- 224 -> printHash getHash224- 512 -> printHash getHash512- 384 -> printHash getHash384- _ -> error "unavailable algorithm size"- in- fileMapWithPath (printHash' salt) paths----- check hashes within given files-checkHashes :: Num a => a -> B.ByteString -> [FilePath] -> IO ()-checkHashes alg salt paths =- let- -- check message (file) of hashes- checkHashesInMessage f salt' = mapM_ (checkHash f salt') --- checkHashes' =- case alg of- 256 -> checkHashesInMessage getHash256- 224 -> checkHashesInMessage getHash224- 512 -> checkHashesInMessage getHash512- 384 -> checkHashesInMessage getHash384- _ -> error "unavailable algorithm size"- in- fileMap ((checkHashes' salt) . T.lines . E.decodeUtf8) paths---main :: IO ()-main = - do - args <- getArgs-- -- call getOpt with the option description- -- ignoring errors- let (actions, nonOptions, _) = getOpt Permute options args-- -- process the defaults with those actions- -- returns command line properties- opts <- foldl (>>=) (return defaultOpts) actions- - -- assign the results- -- via destructuring assignment- let Options { check = check'- , algorithm = algorithm'- , salt_ = salt'- } = opts-- let salt'' = case algorithm' of- 256 | B.length salt' == 16 -> salt'- 512 | B.length salt' == 32 -> salt'- _ -> error "salt should be 32 (default) or 16 bytes"-- -- are we in check mode?- let run = if check'- then checkHashes -- ^ verify hashes listed in given files- else printHashes -- ^ output hashes of given files-- -- either check or print hashes- run algorithm' salt'' nonOptions--