Copyright | (c) 2014 by Peter Simons |
---|---|
License | BSD3 |
Maintainer | simons@cryp.to |
Stability | provisional |
Portability | portable |
Safe Haskell | None |
Language | Haskell98 |
This module proivdes a high-level API to the message
digest algorithms found in OpenSSL's crypto
library.
Link with -lcrypto
when using this module.
Here is a short example program which runs all available digests on a string:
example :: (Enum a) => [a] -> IO [String] example input = mapM hash [minBound .. maxBound] where hash f = fmap (fmt f) (digest f (toWord input)) fmt f = shows f . (": \t"++) . (>>=toHex) toWord = map (toEnum . fromEnum)
And when called, the function prints:
*Digest> example "open sesame" >>= putStr . unlines Null: MD5: 54ef36ec71201fdf9d1423fd26f97f6b SHA: 2ccefef64c76ac0d42ca1657457977675890c42f SHA1: 5bcaff7f22ff533ca099b3408ead876c0ebba9a7 DSS: 5bcaff7f22ff533ca099b3408ead876c0ebba9a7 DSS1: 5bcaff7f22ff533ca099b3408ead876c0ebba9a7 RIPEMD160: bdb2bba6ec93bd566dc1181cadbc92176aa78382 MDC2: 112db2200ce1e9db3c2d132aea4ef7d0 SHA224: 1ee0f9d93a873a67fe781852d716cb3e5904e015aafaa4d1ff1a81bc SHA256: 41ef4bb0b23661e66301aac36066912dac037827b4ae63a7b1165a5aa93ed4eb SHA384: ae2a5d6649035c00efe2bc1b5c97f4d5ff97fa2df06f273afa0231c425e8aff30e4cc1db5e5756e8d2245a1514ad1a2d SHA512: 8470cdd3bf1ef85d5f092bce5ae5af97ce50820481bf43b2413807fec37e2785b533a65d4c7d71695b141d81ebcd4b6c4def4284e6067f0b400000001b230205
- data MessageDigest
- digest :: MessageDigest -> [Word8] -> IO [Word8]
- type Digest a = StateT DigestState IO a
- newtype DigestState = DST (Ptr OpaqueContext)
- mkDigest :: MessageDigest -> (DigestState -> IO a) -> IO a
- update :: [Word8] -> Digest ()
- update' :: (Ptr Word8, Int) -> Digest ()
- final :: Digest [Word8]
- data OpaqueContext = OpaqueContext
- type Context = Ptr OpaqueContext
- data OpaqueMDEngine = OpaqueMDEngine
- type MDEngine = Ptr OpaqueMDEngine
- maxMDSize :: Int
- ctxCreate :: IO Context
- ctxInit :: Context -> IO ()
- ctxDestroy :: Context -> IO ()
- digestInit :: Context -> MDEngine -> IO CInt
- digestUpdate :: Context -> Ptr Word8 -> CUInt -> IO CInt
- digestFinal :: Context -> Ptr Word8 -> Ptr CUInt -> IO CInt
- mdDSS :: IO MDEngine
- mdDSS1 :: IO MDEngine
- mdMD5 :: IO MDEngine
- mdNull :: IO MDEngine
- mdMDC2 :: IO MDEngine
- mdRIPEMD160 :: IO MDEngine
- mdSHA :: IO MDEngine
- mdSHA1 :: IO MDEngine
- mdSHA224 :: IO MDEngine
- mdSHA256 :: IO MDEngine
- mdSHA384 :: IO MDEngine
- mdSHA512 :: IO MDEngine
- toMDEngine :: MessageDigest -> IO MDEngine
- toHex :: Word8 -> String
High-level API
data MessageDigest Source
The message digest algorithms we support.
digest :: MessageDigest -> [Word8] -> IO [Word8] Source
A convenience wrapper which computes the given digest
over a list of Word8
. Unlike the monadic interface,
this function does not allow the computation to be
restarted.
type Digest a = StateT DigestState IO a Source
A monadic interface to the digest computation.
mkDigest :: MessageDigest -> (DigestState -> IO a) -> IO a Source
Run an IO
computation with an initialized
DigestState
. All resources will be freed when the
computation returns.
update' :: (Ptr Word8, Int) -> Digest () Source
Update the internal state with a block of data from
memory. This is the faster version of update
.
final :: Digest [Word8] Source
Wrap up the computation, add padding, do whatever has to
be done, and return the final hash. The length of the
result depends on the chosen MessageDigest
. Do not call
more than once!
Low-level API
data OpaqueContext Source
The EVP context used by OpenSSL is opaque for us; we
only access it through a Ptr
.
type Context = Ptr OpaqueContext Source
type MDEngine = Ptr OpaqueMDEngine Source
Maximum size of all message digests supported by
OpenSSL. Allocate a buffer of this size for digestFinal
if you want to stay generic.
ctxDestroy :: Context -> IO () Source
Destroy an EVP context and free the allocated resources.
digestInit :: Context -> MDEngine -> IO CInt Source
Set the message digest engine for digestUpdate
calls.
Returns /=0
in case of an error.
digestUpdate :: Context -> Ptr Word8 -> CUInt -> IO CInt Source
Update the internal context with a block of input.
Returns /=0
in case of an error.
digestFinal :: Context -> Ptr Word8 -> Ptr CUInt -> IO CInt Source
Wrap up the digest computation and return the final
digest. Do not call repeatedly on the same context!
Returns /=0
in case of an error. The pointer to the
unsigned integer may be nullPtr
. If it is not,
digestFinal
will store the length of the computed
digest there.
Message Digest Engines
toMDEngine :: MessageDigest -> IO MDEngine Source
Map a MessageDigest
type into the the corresponding
MDEngine
.