module Network.CryptoConditions
( module CCI
, Condition(..)
, ed25519Condition
, preimageCondition
, fulfillEd25519
, readStandardFulfillment
) where
import qualified Crypto.PubKey.Ed25519 as Ed2
import Data.ByteString as BS
import Data.Word
import qualified Data.Set as Set
import Network.CryptoConditions.Impl as CCI
data Condition =
Preimage Preimage
| Prefix Prefix Int Condition
| Threshold Word16 [Condition]
| Ed25519 Ed2.PublicKey (Maybe Ed2.Signature)
| Anon Int Fingerprint Int (Set.Set ConditionType)
deriving (Show, Eq)
instance IsCondition Condition where
getType (Anon 0 _ _ _) = preimageType
getType (Anon 2 _ _ _) = thresholdType
getType (Anon 4 _ _ _) = ed25519Type
getType (Threshold _ _) = thresholdType
getType (Ed25519 _ _) = ed25519Type
getType (Preimage _) = preimageType
getType (Prefix _ _ _) = prefixType
getCost (Threshold t subs) = thresholdCost t subs
getCost (Ed25519 _ _) = ed25519Cost
getCost (Preimage pre) = preimageCost pre
getCost (Prefix pre mml c) = prefixCost pre mml c
getCost (Anon _ _ c _) = c
getFingerprint (Threshold t subs) = thresholdFingerprint t subs
getFingerprint (Ed25519 pk _) = ed25519Fingerprint pk
getFingerprint (Preimage pre) = preimageFingerprint pre
getFingerprint (Prefix pre mml c) = prefixFingerprint pre mml c
getFingerprint (Anon _ fp _ _) = fp
getFulfillment (Threshold t subs) = thresholdFulfillment t subs
getFulfillment (Ed25519 pk msig) = ed25519Fulfillment pk <$> msig
getFulfillment (Preimage pre) = Just $ preimageFulfillment pre
getFulfillment (Prefix pre mml c) = prefixFulfillment pre mml c
getFulfillment (Anon _ _ _ _) = Nothing
getSubtypes (Threshold _ sts) = thresholdSubtypes sts
getSubtypes (Anon _ _ _ sts) = sts
getSubtypes (Prefix _ _ c) = prefixSubtypes c
getSubtypes _ = mempty
parseFulfillment 0 = parsePreimage Preimage
parseFulfillment 1 = parsePrefix Prefix
parseFulfillment 2 = parseThreshold Threshold
parseFulfillment 4 = parseEd25519 (\a b -> Ed25519 a (Just b))
verifyMessage (Preimage image) = verifyPreimage image
verifyMessage (Prefix pre mml cond) = verifyPrefix pre mml cond
verifyMessage (Threshold m subs) = verifyThreshold m subs
verifyMessage (Ed25519 pk (Just sig)) = verifyEd25519 pk sig
verifyMessage _ = const False
anon t f c = Anon t f c . toConditionTypes
toConditionTypes :: Set.Set Int -> Set.Set ConditionType
toConditionTypes = Set.map $
let u = undefined in (\tid -> getType $ Anon tid u u u)
preimageCondition :: BS.ByteString -> Condition
preimageCondition = Preimage
ed25519Condition :: Ed2.PublicKey -> Condition
ed25519Condition pk = Ed25519 pk Nothing
fulfillEd25519 :: Ed2.PublicKey -> Ed2.Signature
-> Condition -> Condition
fulfillEd25519 pk sig (Threshold t subs) =
Threshold t $ fulfillEd25519 pk sig <$> subs
fulfillEd25519 pk sig e@(Ed25519 pk' Nothing) =
if pk == pk' then Ed25519 pk (Just sig) else e
fulfillEd25519 _ _ c = c
readStandardFulfillment :: Fulfillment -> Either String Condition
readStandardFulfillment = readFulfillment