]> git.immae.eu Git - github/fretlink/hmacaroons.git/blame - src/Crypto/Macaroon/Verifier.hs
Add basic exact caveat verifiers
[github/fretlink/hmacaroons.git] / src / Crypto / Macaroon / Verifier.hs
CommitLineData
b92e3c15 1{-# LANGUAGE OverloadedStrings #-}
6f3c0dca 2{-# LANGUAGE RankNTypes #-}
b92e3c15
JT
3{-|
4Module : Crypto.Macaroon.Verifier
5Copyright : (c) 2015 Julien Tanguy
6License : BSD3
7
8Maintainer : julien.tanguy@jhome.fr
9Stability : experimental
10Portability : portable
11
12
13
14-}
6f3c0dca
JT
15module Crypto.Macaroon.Verifier (
16 Verified(..)
17 , verifySig
18 , verifyExact
19 , verifyCavs
20 -- , module Data.Attoparsec.ByteString
21 , module Data.Attoparsec.ByteString.Char8
22) where
b92e3c15
JT
23
24
25import Crypto.Hash
26import Data.Bool
27import qualified Data.ByteString as BS
28import Data.Byteable
29import Data.Foldable
6f3c0dca
JT
30import Data.Maybe
31import Data.Attoparsec.ByteString
32import Data.Attoparsec.ByteString.Char8
b92e3c15
JT
33
34import Crypto.Macaroon.Internal
35
36
37-- | Opaque datatype for now. Might need more explicit errors
6f3c0dca 38data Verified = Ok | Failed deriving (Show,Eq)
b92e3c15 39
6f3c0dca
JT
40instance Monoid Verified where
41 mempty = Ok
42 mappend Ok Ok = Ok
43 mappend _ _ = Failed
44
45
46type CaveatVerifier = Caveat -> Maybe Verified
47
48verifySig :: Key -> Macaroon -> Verified
49verifySig k m = bool Failed Ok $
b92e3c15
JT
50 signature m == foldl' hash (toBytes (hmac derivedKey (identifier m) :: HMAC SHA256)) (caveats m)
51 where
52 hash s c = toBytes (hmac s (vid c `BS.append` cid c) :: HMAC SHA256)
53 derivedKey = toBytes (hmac "macaroons-key-generator" k :: HMAC SHA256)
6f3c0dca
JT
54
55verifyCavs :: [Caveat -> Maybe Verified] -> Macaroon -> Verified
56verifyCavs verifiers m = mconcat $ map (\c -> mconcat . catMaybes $ map ($ c) verifiers) (caveats m)
57
58verifyExact :: (Show a, Eq a) => Key -> a -> Parser a -> Caveat -> Maybe Verified
59verifyExact key expected parser cav = if key `BS.isPrefixOf` cid cav then
60 case parseOnly kvparser (cid cav) of
61 Right v -> verify <$> Just v
62 Left _ -> Just Failed
63 else Nothing
64 where
65 kvparser = do
66 key <- string key
67 skipSpace
68 string "="
69 skipSpace
70 parser
71
72 -- *> skipSpace *> string "=" *> skipSpace *> parser <* endOfInput
73 verify a = bool Failed Ok (a == expected)