]> git.immae.eu Git - github/fretlink/hmacaroons.git/blame - src/Crypto/Macaroon.hs
Disable third party caveats
[github/fretlink/hmacaroons.git] / src / Crypto / Macaroon.hs
CommitLineData
f6781456
JT
1{-# LANGUAGE OverloadedStrings #-}
2{-|
3Module : Crypto.Macaroon
4Copyright : (c) 2015 Julien Tanguy
5License : BSD3
6
7Maintainer : julien.tanguy@jhome.fr
8Stability : experimental
9Portability : portable
10
f6781456
JT
11Pure haskell implementations of macaroons.
12
13Warning: this implementation has not been audited by security experts.
2aede11a 14Do not use in production
f6781456
JT
15
16
17References:
18
19- Macaroons: Cookies with Contextual Caveats for Decentralized Authorization in the Cloud <http://research.google.com/pubs/pub41892.html>
20- Time for better security in NoSQL <http://hackingdistributed.com/2014/11/23/macaroons-in-hyperdex>
f6781456
JT
21-}
22module Crypto.Macaroon (
23 -- * Types
24 Macaroon
25 , Caveat
26 , Key
27 , Location
1971e224 28 , Sig
f6781456
JT
29 -- * Accessing functions
30 -- ** Macaroons
31 , location
32 , identifier
33 , caveats
34 , signature
35 -- ** Caveats
36 , caveatLoc
37 , caveatId
38 , caveatVId
39
40 -- * Create Macaroons
41 , create
42 , inspect
43 , addFirstPartyCaveat
26d38f73 44 -- , addThirdPartyCaveat
f6781456
JT
45 ) where
46
47import Crypto.Cipher.AES
48import Crypto.Hash
49import Data.Byteable
50import qualified Data.ByteString as BS
51import qualified Data.ByteString.Base64.URL as B64
52import qualified Data.ByteString.Char8 as B8
f6781456
JT
53
54import Crypto.Macaroon.Internal
55
56-- | Create a Macaroon from its key, identifier and location
57create :: Key -> Key -> Location -> Macaroon
58create secret ident loc = MkMacaroon loc ident [] (toBytes (hmac derivedKey ident :: HMAC SHA256))
59 where
2aede11a 60 derivedKey = toBytes (hmac "macaroons-key-generator" secret :: HMAC SHA256)
f6781456 61
1971e224 62-- | Caveat target location
f6781456
JT
63caveatLoc :: Caveat -> Location
64caveatLoc = cl
65
1971e224 66-- | Caveat identifier
f6781456
JT
67caveatId :: Caveat -> Key
68caveatId = cid
69
1971e224 70-- | Caveat verification identifier
f6781456
JT
71caveatVId :: Caveat -> Key
72caveatVId = vid
73
1971e224 74-- | Inspect a macaroon's contents. For debugging purposes.
f6781456 75inspect :: Macaroon -> String
2aede11a 76inspect = show
f6781456 77
f6781456
JT
78-- | Add a first party Caveat to a Macaroon, with its identifier
79addFirstPartyCaveat :: Key -> Macaroon -> Macaroon
80addFirstPartyCaveat ident m = addCaveat (location m) ident BS.empty m
81
82-- |Add a third party Caveat to a Macaroon, using its location, identifier and
83-- verification key
84addThirdPartyCaveat :: Key
85 -> Key
86 -> Location
87 -> Macaroon
88 -> Macaroon
89addThirdPartyCaveat key cid loc m = addCaveat loc cid vid m
90 where
91 vid = encryptECB (initAES (signature m)) key
92
93