broke out Verifiable to a utility library, and added a quickcheck test

This commit is contained in:
Joey Hess 2012-09-07 23:23:52 -04:00
parent c12caf0a4e
commit 92df8250fa
3 changed files with 58 additions and 36 deletions

37
Utility/Verifiable.hs Normal file
View file

@ -0,0 +1,37 @@
{- values verified using a shared secret
-
- Copyright 2012 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
module Utility.Verifiable where
import Data.Digest.Pure.SHA
import Data.ByteString.Lazy.UTF8 (fromString)
import qualified Data.ByteString.Lazy as L
type Secret = L.ByteString
type HMACDigest = String
{- A value, verifiable using a HMAC digest and a secret. -}
data Verifiable a = Verifiable
{ val :: a
, digest :: HMACDigest
}
deriving (Eq, Read, Show)
mkVerifiable :: Show a => a -> Secret -> Verifiable a
mkVerifiable a secret = Verifiable a (calcDigest (show a) secret)
verified :: (Eq a, Show a) => Verifiable a -> Secret -> Bool
verified v secret = v == mkVerifiable (val v) secret
calcDigest :: String -> Secret -> HMACDigest
calcDigest v secret = showDigest $ hmacSha1 secret $ fromString v
{- for quickcheck -}
prop_verifiable_sane :: String -> String -> Bool
prop_verifiable_sane a s = verified (mkVerifiable a secret) secret
where
secret = fromString s