{-# LANGUAGE CPP #-} -- | SPDX-License-Identifier: MIT -- -- @since 0.1.0.0 module HashImpl where #if defined(MIN_VERSION_SHA) import qualified Data.ByteString.Lazy as BS.L import qualified Data.Digest.Pure.SHA as SHA #else import qualified Crypto.Hash.SHA1 as SHA1 import qualified Crypto.Hash.SHA256 as SHA256 import qualified Crypto.Hash.SHA512 as SHA512 #endif import qualified Data.ByteString as BS -- | Shared secret encoded as raw octets type Secret = BS.ByteString -- | Hash algorithm used for HOTP\/TOTP computations data HashAlgorithm = SHA1 | SHA256 | SHA512 deriving (Eq,Show) hmac :: HashAlgorithm -> Secret -> BS.ByteString -> BS.ByteString hmac alg key msg = case alg of #if defined(MIN_VERSION_SHA) SHA1 -> BS.L.toStrict (SHA.bytestringDigest (SHA.hmacSha1 (BS.L.fromStrict key) (BS.L.fromStrict msg))) SHA256 -> BS.L.toStrict (SHA.bytestringDigest (SHA.hmacSha256 (BS.L.fromStrict key) (BS.L.fromStrict msg))) SHA512 -> BS.L.toStrict (SHA.bytestringDigest (SHA.hmacSha512 (BS.L.fromStrict key) (BS.L.fromStrict msg))) #else SHA1 -> SHA1.hmac key msg SHA256 -> SHA256.hmac key msg SHA512 -> SHA512.hmac key msg #endif