Skip to content
Snippets Groups Projects
Unverified Commit 08fc0a40 authored by Jean-Paul Calderone's avatar Jean-Paul Calderone Committed by GitHub
Browse files

Merge pull request #53 from PrivateStorageio/51.counter-in-redemption

Accept a counter value in redemption request

This is a step towards being able to scale up the number of tokens issued.
parents d6ad0042 f2661507
No related branches found
No related tags found
No related merge requests found
...@@ -29,6 +29,8 @@ import Data.Aeson ...@@ -29,6 +29,8 @@ import Data.Aeson
, FromJSON(parseJSON) , FromJSON(parseJSON)
, withObject , withObject
, (.:) , (.:)
, (.:?)
, (.!=)
, genericToEncoding , genericToEncoding
, defaultOptions , defaultOptions
, encode , encode
...@@ -71,6 +73,8 @@ data Result ...@@ -71,6 +73,8 @@ data Result
= Unpaid -- ^ A voucher has not been paid for. = Unpaid -- ^ A voucher has not been paid for.
| DoubleSpend -- ^ A voucher has already been redeemed. | DoubleSpend -- ^ A voucher has already been redeemed.
| OtherFailure Text -- ^ Some other unrecognized failure mode. | OtherFailure Text -- ^ Some other unrecognized failure mode.
-- | Given counter was not in the expected range
| CounterOutOfBounds Integer Integer Integer
| Succeeded PublicKey [Signature] Proof | Succeeded PublicKey [Signature] Proof
deriving (Show, Eq) deriving (Show, Eq)
...@@ -80,9 +84,15 @@ data Redeem ...@@ -80,9 +84,15 @@ data Redeem
= Redeem = Redeem
{ redeemVoucher :: Voucher -- ^ The voucher being redeemed. { redeemVoucher :: Voucher -- ^ The voucher being redeemed.
, redeemTokens :: [BlindedToken] -- ^ Tokens to be signed as part of this redemption. , redeemTokens :: [BlindedToken] -- ^ Tokens to be signed as part of this redemption.
, redeemCounter :: Integer -- ^ Counter tag on this redemption.
} deriving (Show, Eq, Generic) } deriving (Show, Eq, Generic)
instance FromJSON Redeem instance FromJSON Redeem where
parseJSON = withObject "redeem" $ \o -> do
voucher <- o .: "redeemVoucher"
tokens <- o .: "redeemTokens"
counter <- o .:? "redeemCounter" .!= 0
return $ Redeem voucher tokens counter
instance ToJSON Redeem where instance ToJSON Redeem where
toEncoding = genericToEncoding defaultOptions toEncoding = genericToEncoding defaultOptions
...@@ -96,6 +106,13 @@ instance ToJSON Result where ...@@ -96,6 +106,13 @@ instance ToJSON Result where
[ "success" .= False [ "success" .= False
, "reason" .= ("double-spend" :: Text) , "reason" .= ("double-spend" :: Text)
] ]
toJSON (CounterOutOfBounds min max received) = object
[ "success" .= False
, "reason" .= ("counter-out-of-bounds" :: Text)
, "min" .= min
, "max" .= max
, "received" .= received
]
toJSON (OtherFailure description) = object toJSON (OtherFailure description) = object
[ "success" .= False [ "success" .= False
, "reason" .= description , "reason" .= description
...@@ -123,6 +140,11 @@ instance FromJSON Result where ...@@ -123,6 +140,11 @@ instance FromJSON Result where
then return DoubleSpend then return DoubleSpend
else return $ OtherFailure reason else return $ OtherFailure reason
-- | Limit the value for the counter value supplied during a voucher
-- redemption attempt. A counter in the range [0..maxCounter) is allowed.
maxCounter :: Integer
maxCounter = 16
type RedemptionAPI = ReqBody '[JSON] Redeem :> Post '[JSON] Result type RedemptionAPI = ReqBody '[JSON] Redeem :> Post '[JSON] Result
jsonErr400 reason = err400 jsonErr400 reason = err400
...@@ -137,7 +159,10 @@ redemptionServer = redeem ...@@ -137,7 +159,10 @@ redemptionServer = redeem
-- voucher and return signatures. Return a failure if this is not possible -- voucher and return signatures. Return a failure if this is not possible
-- (eg because the voucher was already redeemed). -- (eg because the voucher was already redeemed).
redeem :: VoucherDatabase d => Issuer -> d -> Redeem -> Handler Result redeem :: VoucherDatabase d => Issuer -> d -> Redeem -> Handler Result
redeem issue database (Redeem voucher tokens) = do redeem issue database (Redeem voucher tokens counter) =
if counter < 0 || counter >= maxCounter then
throwError $ jsonErr400 (CounterOutOfBounds 0 maxCounter counter)
else do
let fingerprint = fingerprintFromTokens tokens let fingerprint = fingerprintFromTokens tokens
result <- liftIO $ PaymentServer.Persistence.redeemVoucher database voucher fingerprint result <- liftIO $ PaymentServer.Persistence.redeemVoucher database voucher fingerprint
case result of case result of
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment