cryptohash-cryptoapi (empty) → 0.1.0
raw patch · 5 files changed
+181/−0 lines, 5 filesdep +basedep +bytestringdep +cerealsetup-changed
Dependencies added: base, bytestring, cereal, crypto-api, cryptohash, tagged
Files
- Crypto/Hash/CryptoAPI.hs +124/−0
- LICENSE +27/−0
- README.md +1/−0
- Setup.hs +2/−0
- cryptohash-cryptoapi.cabal +27/−0
+ Crypto/Hash/CryptoAPI.hs view
@@ -0,0 +1,124 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE MultiParamTypeClasses #-}+-- |+-- Module : Crypto.Hash.CryptoAPI+-- License : BSD-style+-- Maintainer : Vincent Hanquez <vincent@snarc.org>+-- Stability : experimental+-- Portability : unknown+--+-- Cryptohash API exported through crypto-api.+--+-- Note: Current version (0.10) of crypto-api suffers a small performance problem.+-- see <http://tab.snarc.org/others/benchmark-cryptohash-0.8.html>.+-- Hopefully, future versions will fix this.+--+module Crypto.Hash.CryptoAPI+ ( MD2+ , MD4+ , MD5+ , SHA1+ , SHA224+ , SHA256+ , SHA384+ , SHA512+ , Skein256_256+ , Skein512_512+ , RIPEMD160+ , Tiger+ , Whirlpool+ , Hash(..)+ , hash+ , hash'+ ) where++import qualified Crypto.Hash.MD2 as MD2 (Ctx, init, update, finalize)+import qualified Crypto.Hash.MD4 as MD4 (Ctx, init, update, finalize)+import qualified Crypto.Hash.MD5 as MD5 (Ctx, init, update, finalize)+import qualified Crypto.Hash.SHA1 as SHA1 (Ctx, init, update, finalize)+import qualified Crypto.Hash.SHA224 as SHA224 (Ctx, init, update, finalize)+import qualified Crypto.Hash.SHA256 as SHA256 (Ctx, init, update, finalize)+import qualified Crypto.Hash.SHA384 as SHA384 (Ctx, init, update, finalize)+import qualified Crypto.Hash.SHA512 as SHA512 (Ctx, init, update, finalize)+import qualified Crypto.Hash.SHA512t as SHA512t (Ctx, init, update, finalize)+import qualified Crypto.Hash.SHA3 as SHA3 (Ctx, init, update, finalize)+import qualified Crypto.Hash.RIPEMD160 as RIPEMD160 (Ctx, init, update, finalize)+import qualified Crypto.Hash.Tiger as Tiger (Ctx, init, update, finalize)+import qualified Crypto.Hash.Skein256 as Skein256 (Ctx, init, update, finalize)+import qualified Crypto.Hash.Skein512 as Skein512 (Ctx, init, update, finalize)+import qualified Crypto.Hash.Whirlpool as Whirlpool (Ctx, init, update, finalize)++import Control.Monad (liftM)+import Data.ByteString (ByteString)+import Data.Serialize (Serialize(..))+import Data.Serialize.Get (getByteString)+import Data.Serialize.Put (putByteString)+import Data.Tagged (Tagged(..))+import Crypto.Classes (Hash(..), hash, hash')++-- +-- need to redefine a context wrapper to not clash with the already existing+-- and avoid the "function dependencies conflict between instance declaration" error.+--+-- unfortunately haskell uses cpp in traditional mode to avoid problem, but traditional mode+-- doesn't do proper token concatenation, so need to define the ctxname in the macro+--++#define DEFINE_TYPE_AND_INSTANCES_SIMPLE(CTXNAME, MODULENAME, OUTPUTLEN, BLOCKLEN) \+ DEFINE_TYPE_AND_INSTANCES(CTXNAME, MODULENAME, MODULENAME, OUTPUTLEN, BLOCKLEN)++#define DEFINE_TYPE_AND_INSTANCES(CTXNAME, NAME, MODULENAME, OUTPUTLEN, BLOCKLEN) \+\+newtype CTXNAME = CTXNAME MODULENAME.Ctx; \+\+data NAME = NAME !ByteString deriving (Eq,Ord,Show); \+\+instance Hash CTXNAME NAME where \+ { outputLength = Tagged (OUTPUTLEN * 8) \+ ; blockLength = Tagged (BLOCKLEN * 8) \+ ; initialCtx = CTXNAME MODULENAME.init \+ ; updateCtx (CTXNAME ctx) = CTXNAME . MODULENAME.update ctx \+ ; finalize (CTXNAME ctx) bs = NAME $ MODULENAME.finalize (MODULENAME.update ctx bs) \+ }; \+\+instance Serialize NAME where \+ { get = liftM NAME (getByteString OUTPUTLEN) \+ ; put (NAME d) = putByteString d \+ }++#define DEFINE_TYPE_AND_INSTANCES_WITHLEN(CTXNAME, NAME, ILEN, MODULENAME, OUTPUTLEN, BLOCKLEN) \+\+newtype CTXNAME = CTXNAME MODULENAME.Ctx; \+\+data NAME = NAME !ByteString deriving (Eq,Ord,Show); \+\+instance Hash CTXNAME NAME where \+ { outputLength = Tagged (OUTPUTLEN * 8) \+ ; blockLength = Tagged (BLOCKLEN * 8) \+ ; initialCtx = CTXNAME (MODULENAME.init ILEN) \+ ; updateCtx (CTXNAME ctx) = CTXNAME . MODULENAME.update ctx \+ ; finalize (CTXNAME ctx) bs = NAME $ MODULENAME.finalize (MODULENAME.update ctx bs) \+ }; \+\+instance Serialize NAME where \+ { get = liftM NAME (getByteString OUTPUTLEN) \+ ; put (NAME d) = putByteString d \+ }++DEFINE_TYPE_AND_INSTANCES_SIMPLE(CTXMD2, MD2, 16, 16)+DEFINE_TYPE_AND_INSTANCES_SIMPLE(CTXMD4, MD4, 16, 64)+DEFINE_TYPE_AND_INSTANCES_SIMPLE(CTXMD5, MD5, 16, 64)++DEFINE_TYPE_AND_INSTANCES_SIMPLE(CTXSHA1, SHA1, 20, 64)++DEFINE_TYPE_AND_INSTANCES_SIMPLE(CTXSHA224, SHA224, 28, 64)+DEFINE_TYPE_AND_INSTANCES_SIMPLE(CTXSHA256, SHA256, 32, 64)+DEFINE_TYPE_AND_INSTANCES_SIMPLE(CTXSHA384, SHA384, 48, 128)+DEFINE_TYPE_AND_INSTANCES_SIMPLE(CTXSHA512, SHA512, 64, 128)++DEFINE_TYPE_AND_INSTANCES_SIMPLE(CTXRIPEMD160, RIPEMD160, 20, 64)+DEFINE_TYPE_AND_INSTANCES_SIMPLE(CTXTiger, Tiger, 24, 64)+DEFINE_TYPE_AND_INSTANCES_SIMPLE(CTXWhirlpool, Whirlpool, 64, 64)++DEFINE_TYPE_AND_INSTANCES_WITHLEN(CTXSkein256_256, Skein256_256, 256, Skein256, 32, 32)+DEFINE_TYPE_AND_INSTANCES_WITHLEN(CTXSkein512_512, Skein512_512, 512, Skein512, 64, 64)
+ LICENSE view
@@ -0,0 +1,27 @@+Copyright (c) 2010-2013 Vincent Hanquez <vincent@snarc.org>++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:+1. Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.+2. Redistributions in binary form must reproduce the above copyright+ notice, this list of conditions and the following disclaimer in the+ documentation and/or other materials provided with the distribution.+3. Neither the name of the author nor the names of his contributors+ may be used to endorse or promote products derived from this software+ without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF+SUCH DAMAGE.
+ README.md view
@@ -0,0 +1,1 @@+crypto-api instances for cryptohash.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ cryptohash-cryptoapi.cabal view
@@ -0,0 +1,27 @@+Name: cryptohash-cryptoapi+Version: 0.1.0+Description: Crypto-api interfaces for cryptohash+License: BSD3+License-file: LICENSE+Copyright: Vincent Hanquez <vincent@snarc.org>+Author: Vincent Hanquez <vincent@snarc.org>+Maintainer: Vincent Hanquez <vincent@snarc.org>+Synopsis: Crypto-api interfaces for cryptohash+Category: Cryptography+Build-Type: Simple+Cabal-Version: >=1.6+Homepage: http://github.com/vincenthz/hs-cryptohash-cryptoapi+data-files: README.md++Library+ Build-Depends: base >= 4 && < 6+ , bytestring+ , cryptohash >= 0.8.0+ , crypto-api >= 0.5+ , tagged >= 0.1+ , cereal >= 0.2+ Exposed-modules: Crypto.Hash.CryptoAPI++source-repository head+ type: git+ location: git://github.com/vincenthz/hs-cryptohash-cryptoapi