diff --git a/src/api.ml b/src/api.ml index b38e9f5d..81e2ba7f 100644 --- a/src/api.ml +++ b/src/api.ml @@ -925,8 +925,10 @@ module RecoupDenoms = struct |> finish end -module DenomCommon = struct +module RsaDenom = struct + (* correspond to: ({ rsa_pub: RsaPublicKey;} & DenomCommon) *) type t = { + rsa_pub: RsaPublicKey.t; master_sig: DenominationKeyValidityPS.t; stamp_start: Timestamp.t; stamp_expire_withdraw: Timestamp.t; @@ -936,9 +938,10 @@ module DenomCommon = struct } let jsont = - let make master_sig stamp_start stamp_expire_withdraw stamp_expire_deposit - stamp_expire_legal lost = + let make rsa_pub master_sig stamp_start stamp_expire_withdraw + stamp_expire_deposit stamp_expire_legal lost = { + rsa_pub; master_sig; stamp_start; stamp_expire_withdraw; @@ -947,6 +950,7 @@ module DenomCommon = struct lost; } in + let rsa_pub v = v.rsa_pub in let master_sig v = v.master_sig in let stamp_start v = v.stamp_start in let stamp_expire_withdraw v = v.stamp_expire_withdraw in @@ -954,7 +958,8 @@ module DenomCommon = struct let stamp_expire_legal v = v.stamp_expire_legal in let lost v = v.lost in let open Jsont.Object in - map ~kind:"DenomCommon" make + map ~kind:"RsaDenom" make + |> mem "rsa_pub" RsaPublicKey.jsont ~enc:rsa_pub |> mem "master_sig" DenominationKeyValidityPS.jsont ~enc:master_sig |> mem "stamp_start" Timestamp.jsont ~enc:stamp_start |> mem "stamp_expire_withdraw" Timestamp.jsont ~enc:stamp_expire_withdraw @@ -964,9 +969,9 @@ module DenomCommon = struct |> finish end -module DenomGroupRsa = struct +module RsaDenomGroup = struct type t = { - rsa_pub: RsaPublicKey.t; + denoms: RsaDenom.t list; value: Amount.t; fee_withdraw: Amount.t; fee_deposit: Amount.t; @@ -975,18 +980,18 @@ module DenomGroupRsa = struct } let jsont = - let make rsa_pub value fee_withdraw fee_deposit fee_refresh fee_refund = - { rsa_pub; value; fee_withdraw; fee_deposit; fee_refresh; fee_refund } + let make denoms value fee_withdraw fee_deposit fee_refresh fee_refund = + { denoms; value; fee_withdraw; fee_deposit; fee_refresh; fee_refund } in - let rsa_pub v = v.rsa_pub in + let denoms v = v.denoms in let value v = v.value in let fee_withdraw v = v.fee_withdraw in let fee_deposit v = v.fee_deposit in let fee_refresh v = v.fee_refresh in let fee_refund v = v.fee_refund in let open Jsont.Object in - map ~kind:"DenomGroupRsa" make - |> mem "rsa_pub" RsaPublicKey.jsont ~enc:rsa_pub + map ~kind:"RsaDenomGroup" make + |> mem "denoms" (Jsont.list RsaDenom.jsont) ~enc:denoms |> mem "value" Amount.jsont ~enc:value |> mem "fee_withdraw" Amount.jsont ~enc:fee_withdraw |> mem "fee_deposit" Amount.jsont ~enc:fee_deposit @@ -995,29 +1000,21 @@ module DenomGroupRsa = struct |> finish end +(* TODO better jsont cases + factorize common fields (DenomCommon/DenomGroupCommon) + "+age_restricted"/CS variants + raise error not implemented if not RSA *) module DenomGroup = struct - (* TODO -type DenomGroup = - | DenomGroupRsa - | DenomGroupCs - | DenomGroupRsaAgeRestricted - | DenomGroupCsAgeRestricted; - *) - type t = Rsa of DenomGroupRsa.t - - let to_octets = function Rsa denom -> RsaPublicKey.to_octets denom.rsa_pub - - let of_cs _v = - Jsont.Error.msg Jsont.Meta.none "CSDenominationKey are not supported" + type t = Rsa of RsaDenomGroup.t let of_rsa v = Rsa v let jsont = let open Jsont.Object in - let rsa = Case.map "RSA" DenomGroupRsa.jsont ~dec:of_rsa in + let rsa = Case.map "RSA" RsaDenomGroup.jsont ~dec:of_rsa in let enc_case = function Rsa v -> Case.value rsa v in let cases = Case.[ make rsa ] in - map ~kind:"DenomGroup" Fun.id + map ~kind:"DenominationKey" Fun.id |> case_mem "cipher" Jsont.string ~enc:Fun.id ~enc_case cases |> finish end