diff --git a/src/PaymentServer/Redemption.hs b/src/PaymentServer/Redemption.hs index 35963cbb8d7e3183e3206acfa9fbd04ca52a6fba..87e3ed0ad12dc252e4b1ae27c1800897151f64c7 100644 --- a/src/PaymentServer/Redemption.hs +++ b/src/PaymentServer/Redemption.hs @@ -61,9 +61,20 @@ import PaymentServer.Persistence , Voucher ) +-- | A cryptographic signature of a blinded token created using our private +-- key. +type Signature = Text + +-- | A public key corresponding to our private key. +type PublicKey = Text + +-- | A zero-knowledge proof that signatures were created of the corresponding +-- blinded tokens using the corresponding public key's private key. +type Proof = Text + data Result = Failed - | Succeeded + | Succeeded PublicKey [Signature] Proof deriving (Show, Eq) -- | A blinded token is presented along with a voucher to be signed and the @@ -81,12 +92,23 @@ instance ToJSON Redeem where instance ToJSON Result where toJSON Failed = object [ "success" .= False ] - toJSON Succeeded = object [ "success" .= True ] + toJSON (Succeeded key signatures proof) = object + [ "success" .= True + , "public-key" .= key + , "signatures" .= signatures + , "proof" .= proof + ] instance FromJSON Result where parseJSON = withObject "Result" $ \v -> v .: "success" >>= \success -> - return $ if success then Succeeded else Failed + if success then + Succeeded + <$> v .: "public-key" + <*> v .: "signatures" + <*> v .: "proof" + else + return Failed type RedemptionAPI = ReqBody '[JSON] Redeem :> Post '[JSON] Result @@ -104,7 +126,7 @@ redeem database (Redeem voucher tokens) = do result <- liftIO $ PaymentServer.Persistence.redeemVoucher database voucher fingerprint case result of Left err -> throwError jsonErr400 - Right () -> return Succeeded + Right () -> return $ Succeeded "" [] "" fingerprintFromTokens :: [BlindedToken] -> Fingerprint fingerprintFromTokens = diff --git a/test/SpecRedemption.hs b/test/SpecRedemption.hs index 00b9f333888f277d1595b3b0abdeb0413f8af434..ba4bf06dac3f96871112e51bff58e689c3a97870 100644 --- a/test/SpecRedemption.hs +++ b/test/SpecRedemption.hs @@ -156,7 +156,9 @@ spec_redemption = parallel $ do it "receive a success response when redemption succeeds" $ property $ \(voucher :: Voucher) (tokens :: [BlindedToken]) -> propertyRedeem path voucher tokens 200 - { matchBody = matchJSONBody Succeeded + -- TODO: Get some real crypto involved to be able to replace these + -- dummy values. + { matchBody = matchJSONBody $ Succeeded "" [] "" , matchHeaders = ["Content-Type" <:> "application/json;charset=utf-8"] }