U      !"#$%&'()*+,-./0123456789:;<=>?@A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k lmnopqrstuvwxyz{|}~unknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthy2compute a MAC using the supplied hashing function unknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthy2perform io for hashes that do allocation and ffi. 5 unsafeDupablePerformIO is used when possible as the 7 computation is pure and the output is directly linked ; to the input. we also do not modify anything after it has  been returned to the user. unknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthyinit a context #update a context with a bytestring ,updates a context with multiples bytestring .finalize the context into a digest bytestring 2hash a strict bytestring into a digest bytestring 0hash a lazy bytestring into a digest bytestring     unknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthy init a context #update a context with a bytestring ,updates a context with multiples bytestring .finalize the context into a digest bytestring 2hash a strict bytestring into a digest bytestring 0hash a lazy bytestring into a digest bytestring       unknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthyinit a context #update a context with a bytestring ,updates a context with multiples bytestring .finalize the context into a digest bytestring 2hash a strict bytestring into a digest bytestring 0hash a lazy bytestring into a digest bytestring   unknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthyinit a context #update a context with a bytestring !,updates a context with multiples bytestring ".finalize the context into a digest bytestring #2hash a strict bytestring into a digest bytestring $0hash a lazy bytestring into a digest bytestring  !"#$  !"#$  !"#$ !"#$unknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthy(init a context )#update a context with a bytestring *,updates a context with multiples bytestring +.finalize the context into a digest bytestring ,2hash a strict bytestring into a digest bytestring -0hash a lazy bytestring into a digest bytestring %&'()*+,- %&'()*+,- &'%()*+,-%&'()*+,-unknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthy1init a context 2#update a context with a bytestring 3,updates a context with multiples bytestring 4.finalize the context into a digest bytestring 52hash a strict bytestring into a digest bytestring 60hash a lazy bytestring into a digest bytestring ./0123456  ./0123456 /0.123456./0123456  unknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthy:5init a context using FIPS 180-4 for truncated SHA512 ;init a context <#update a context with a bytestring =,updates a context with multiples bytestring >.finalize the context into a digest bytestring ?2hash a strict bytestring into a digest bytestring @0hash a lazy bytestring into a digest bytestring 7 89  :;<=>?@ 789:;<=>?@ 897;:<=>?@7 89  :;<=>?@ unknown experimental#Vincent Hanquez <vincent@snarc.org> TrustworthyCinit a context D#update a context with a bytestring E.finalize the context into a digest bytestring F2hash a strict bytestring into a digest bytestring G0hash a lazy bytestring into a digest bytestring ABCDEFGABCDEFGABCDEFGABCDEFG unknown experimental#Vincent Hanquez <vincent@snarc.org> TrustworthyKinit a context L#update a context with a bytestring M,updates a context with multiples bytestring N.finalize the context into a digest bytestring O2hash a strict bytestring into a digest bytestring P0hash a lazy bytestring into a digest bytestring HIJ !"#$%&'()KLMNOP*+ HIJKLMNOP IJHKLMNOPHIJ !"#$%&'()KLMNOP*+ unknown experimental#Vincent Hanquez <vincent@snarc.org> TrustworthyTinit a context U#update a context with a bytestring V,updates a context with multiples bytestring W.finalize the context into a digest bytestring X2hash a strict bytestring into a digest bytestring Y0hash a lazy bytestring into a digest bytestring Q,RS-./0123456789TUVWXY:; QRSTUVWXY RSQTUVWXYQ,RS-./0123456789TUVWXY:; unknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthy]init a context ^#update a context with a bytestring _,updates a context with multiples bytestring `.finalize the context into a digest bytestring a2hash a strict bytestring into a digest bytestring b0hash a lazy bytestring into a digest bytestring Z<[\=>?@ABCDEFGHI]^_`abJK Z[\]^_`ab [\Z]^_`abZ<[\=>?@ABCDEFGHI]^_`abJK unknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthyfinit a context g#update a context with a bytestring h,updates a context with multiples bytestring i.finalize the context into a digest bytestring j2hash a strict bytestring into a digest bytestring k0hash a lazy bytestring into a digest bytestring cLdeMNOPQRSTUVWXYfghijkZ[ cdefghijk decfghijkcLdeMNOPQRSTUVWXYfghijkZ[unknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthyoinit a context p#update a context with a bytestring q,updates a context with multiples bytestring r.finalize the context into a digest bytestring s2hash a strict bytestring into a digest bytestring t0hash a lazy bytestring into a digest bytestring l\mn]^_`abcdefghiopqrstjk lmnopqrst mnlopqrstl\mn]^_`abcdefghiopqrstjkunknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthyxinit a context y#update a context with a bytestring z,updates a context with multiples bytestring {.finalize the context into a digest bytestring |2hash a strict bytestring into a digest bytestring }0hash a lazy bytestring into a digest bytestring ulvwmnopqrstuvwxyxyz{|}z{ uvwxyz{|} vwuxyz{|}ulvwmnopqrstuvwxyxyz{|}z{unknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthyinit a context #update a context with a bytestring ,updates a context with multiples bytestring .finalize the context into a digest bytestring 2hash a strict bytestring into a digest bytestring 0hash a lazy bytestring into a digest bytestring ~|}~ ~ ~~|}~unknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthyunknown experimental#Vincent Hanquez <vincent@snarc.org> Trustworthy/Represent a digest for a given hash algorithm. Return the binary digest 0Represent a context for a given hash algorithm. 'Class representing hashing algorithms. /The hash algorithm is built over 3 primitives:  init : create a new context > updates : update the context with some strict bytestrings 1 finalize : finalize the context into a digest 1Initialize a new context for this hash algorithm 5Update the context with a list of strict bytestring, , and return a new context with the updates. (Finalize a context and return a digest.  unknown experimental#Vincent Hanquez <vincent@snarc.org> TrustworthyIrun hashUpdates on one single bytestring and return the updated context. (Hash a strict bytestring into a digest. &Hash a lazy bytestring into a digest. 9Return the hexadecimal (base16) bytestring of the digest . !. !"#$        %         &         '         (        )*+,,-../0123456789:;<= !#%&'()*+>?@,ABCDEFGHIJKLMNO,PQRESFGHIJKLMTU,VWXESFGHIJKLMYZ,[\]DEFGHIJKLM^_,`abDEFGHIJKLMcd,efgESFGHIJKLMhi,jklmDEFGHIJKLMno , p q r D E F G H I J K L M s t , u v w D E F G H I J K L M x y , z { | D E F G H I J K L M } ~ ,  D E F G H I J K L M ,DEFGHIJKLM,DEFGHIJKLM,DEFGHIJKLMcryptohash-0.8.1Crypto.MAC.HMACCrypto.Hash.WhirlpoolCrypto.Hash.Skein512Crypto.Hash.Skein256Crypto.Hash.TigerCrypto.Hash.RIPEMD160Crypto.Hash.SHA3Crypto.Hash.SHA512Crypto.Hash.SHA512tCrypto.Hash.SHA384Crypto.Hash.SHA256Crypto.Hash.SHA224Crypto.Hash.SHA1Crypto.Hash.MD5Crypto.Hash.MD4Crypto.Hash.MD2Crypto.Hash.Types Crypto.HashCrypto.Hash.InternalCrypto.Hash.Utilshmac WhirlpoolCtxinitupdateupdatesfinalizehashhashlazySkein512Skein256Tiger RIPEMD160SHA3SHA512init_tSHA384SHA256SHA224SHA1MD5MD4MD2DigestdigestToByteStringContextcontextToByteString HashAlgorithmhashInit hashUpdates hashFinalize Skein512_512 Skein512_384 Skein512_256 Skein512_224 Skein256_256 Skein256_224SHA3_512SHA3_384SHA3_256SHA3_224 hashUpdatedigestToHexByteString unsafeDoIOc_whirlpool_finalizec_whirlpool_updatec_whirlpool_init digestSizesizeCtxwithByteStringPtr memcopy64 withCtxCopy withCtxThrow withCtxNewwithCtxNewThrowupdateInternalIOfinalizeInternalIO$fSerializeWhirlpool$fHashCtxWhirlpoolc_skein512_finalizec_skein512_updatec_skein512_init peekHashlen$fSerializeSkein512$fHashCtxSkein512c_skein256_finalizec_skein256_updatec_skein256_init$fSerializeSkein256$fHashCtxSkein256c_tiger_finalizec_tiger_update c_tiger_init$fSerializeTiger$fHashCtxTigerc_ripemd160_finalizec_ripemd160_updatec_ripemd160_init$fSerializeRIPEMD160$fHashCtxRIPEMD160c_sha3_finalize c_sha3_update c_sha3_init$fSerializeSHA3 $fHashCtxSHA3c_sha512_init_tc_sha512_finalizec_sha512_update c_sha512_init$fSerializeSHA512$fHashCtxSHA512c_sha384_finalizec_sha384_update c_sha384_init$fSerializeSHA384$fHashCtxSHA384c_sha256_finalizec_sha256_update c_sha256_init$fSerializeSHA256$fHashCtxSHA256c_sha224_finalizec_sha224_update c_sha224_init$fSerializeSHA224$fHashCtxSHA224c_sha1_finalize c_sha1_update c_sha1_init$fSerializeSHA1 $fHashCtxSHA1c_md5_finalize c_md5_update c_md5_init$fSerializeMD5 $fHashCtxMD5c_md4_finalize c_md4_update c_md4_init$fSerializeMD4 $fHashCtxMD4c_md2_finalize c_md2_update c_md2_init$fSerializeMD2 $fHashCtxMD2toHex $fShowDigest$fHashAlgorithmSkein512_512$fHashAlgorithmSkein512_384$fHashAlgorithmSkein512_256$fHashAlgorithmSkein512_224$fHashAlgorithmSkein256_256$fHashAlgorithmSkein256_224$fHashAlgorithmSHA3_512$fHashAlgorithmSHA3_384$fHashAlgorithmSHA3_256$fHashAlgorithmSHA3_224$fHashAlgorithmTiger$fHashAlgorithmWhirlpool$fHashAlgorithmRIPEMD160$fHashAlgorithmSHA512$fHashAlgorithmSHA384$fHashAlgorithmSHA256$fHashAlgorithmSHA224$fHashAlgorithmSHA1$fHashAlgorithmMD5$fHashAlgorithmMD4$fHashAlgorithmMD2