module OpenSSL.Digest.ByteString where
import OpenSSL.Digest hiding ( update )
import Control.Monad.State ( evalStateT, lift, get )
import Foreign.Ptr ( castPtr )
import Data.Word ( Word8 )
import Data.ByteString ( ByteString )
import Data.ByteString.Unsafe ( unsafeUseAsCStringLen )
digest :: MessageDigest -> ByteString -> IO [Word8]
digest mdType xs =
mkDigest mdType $ evalStateT (update xs >> final)
update :: ByteString -> Digest Int
update bs = do
DST ctx <- get
l <- lift $
unsafeUseAsCStringLen bs $ \(ptr, len) ->
digestUpdate ctx (castPtr ptr) (fromIntegral len)
return (fromEnum l)