(* Packed Signature *) open Bin_type open Bin_type.Aliases (* EccSignaturePurpose *) module Purpose = struct type t = { size: int32; purpose: int32; } let bin = let open Bin in record (fun size purpose -> { size; purpose }) |+ field beint32 (fun t -> t.size) |+ field beint32 (fun t -> t.purpose) |> sealr let make ~size purpose = { size= Int32.of_int size; purpose } let dummy = make ~size:0 0_l (* helper function to make ['signature Bin.t] to compute [t.size], we first build a bin with a dummy purpose *) let make_bin = let get_size f = let open Bin in match Size.of_value (Size.size_of (f dummy)) with | Dynamic _ | Unknown -> Fmt.failwith "size_of failure: size is not Static" | Static n -> n in fun code f -> make ~size:(get_size f) code |> f let field purpose = Bin.field bin (fun _t -> purpose) end module MK (R : sig type r val bin : r Bin.t end) : sig type r = R.r type t val sign : key:Crypto.EddsaPrivateKey.t -> r -> t val verify : key:Crypto.EddsaPublicKey.t -> t -> r -> bool val jsont : t Jsont.t end = struct open Crypto type r = R.r type t = EddsaSignature.t let bin = R.bin let sign ~key r = EddsaSignature.sign ~key (Bin.to_string bin r) let verify ~key t r = EddsaSignature.verify ~key t ~msg:(Bin.to_string bin r) let jsont = EddsaSignature.jsont end module DenominationKeyAnnouncementPS = struct module R = struct (* TODO taler_signatures purpose we use TALER_SIGNATURE_SM_RSA_DENOMINATION_KEY instead here *) (* purpose.purpose = TALER_SIGNATURE_SM_DENOMINATION_KEY *) type r = { h_denom_pub: DenominationHash.t; h_section_name: Hash_64_cstr.t; anchor_time: TimeAbsoluteNBO.t; duration_withdraw: TimeRelativeNBO.t; } let bin = let open Bin in Purpose.make_bin Taler_signatures.sm_rsa_denomination_key @@ fun purpose -> record (fun _purpose h_denom_pub h_section_name anchor_time duration_withdraw -> { h_denom_pub; h_section_name; anchor_time; duration_withdraw }) |+ Purpose.field purpose |+ field DenominationHash.bin (fun t -> t.h_denom_pub) |+ field Hash_64_cstr.bin (fun t -> t.h_section_name) |+ field TimeAbsoluteNBO.bin (fun t -> t.anchor_time) |+ field TimeRelativeNBO.bin (fun t -> t.duration_withdraw) |> sealr end include R include MK (R) end module SigningKeyAnnouncementPS = struct module R = struct (* purpose.purpose = TALER_SIGNATURE_SM_SIGNING_KEY *) type r = { exchange_pub: ExchangePublicKeyP.t; anchor_time: TimeAbsoluteNBO.t; duration: TimeRelativeNBO.t; } let bin = let open Bin in Purpose.make_bin Taler_signatures.sm_signing_key @@ fun purpose -> record (fun _purpose exchange_pub anchor_time duration -> { exchange_pub; anchor_time; duration }) |+ Purpose.field purpose |+ field ExchangePublicKeyP.bin (fun t -> t.exchange_pub) |+ field TimeAbsoluteNBO.bin (fun t -> t.anchor_time) |+ field TimeRelativeNBO.bin (fun t -> t.duration) |> sealr end include R include MK (R) end module DenominationKeyValidityPS = struct module R = struct (* purpose.purpose = TALER_SIGNATURE_MASTER_DENOMINATION_KEY_VALIDITY *) type r = { master: MasterPublicKeyP.t; start: TimeAbsoluteNBO.t; expire_withdraw: TimeAbsoluteNBO.t; expire_spend: TimeAbsoluteNBO.t; expire_legal: TimeAbsoluteNBO.t; value: AmountNBO.t; fee_withdraw: AmountNBO.t; fee_deposit: AmountNBO.t; fee_refresh: AmountNBO.t; denom_hash: DenominationHash.t; } let bin = let open Bin in Purpose.make_bin Taler_signatures.master_denomination_key_validity @@ fun purpose -> record (fun _purpose master start expire_withdraw expire_spend expire_legal value fee_withdraw fee_deposit fee_refresh denom_hash -> { master; start; expire_withdraw; expire_spend; expire_legal; value; fee_withdraw; fee_deposit; fee_refresh; denom_hash; }) |+ Purpose.field purpose |+ field MasterPublicKeyP.bin (fun t -> t.master) |+ field TimeAbsoluteNBO.bin (fun t -> t.start) |+ field TimeAbsoluteNBO.bin (fun t -> t.expire_withdraw) |+ field TimeAbsoluteNBO.bin (fun t -> t.expire_spend) |+ field TimeAbsoluteNBO.bin (fun t -> t.expire_legal) |+ field AmountNBO.bin (fun t -> t.value) |+ field AmountNBO.bin (fun t -> t.fee_withdraw) |+ field AmountNBO.bin (fun t -> t.fee_deposit) |+ field AmountNBO.bin (fun t -> t.fee_refresh) |+ field DenominationHash.bin (fun t -> t.denom_hash) |> sealr end include R include MK (R) end module ExchangeSigningKeyValidityPS = struct module R = struct (* purpose.purpose = TALER_SIGNATURE_MASTER_SIGNING_KEY_VALIDITY *) type r = { start: TimeAbsoluteNBO.t; expire: TimeAbsoluteNBO.t; end_: TimeAbsoluteNBO.t; (* "end" renamed to end_ *) signkey_pub: ExchangePublicKeyP.t; } let bin = let open Bin in Purpose.make_bin Taler_signatures.master_signing_key_validity @@ fun purpose -> record (fun _purpose start expire end_ signkey_pub -> { start; expire; end_; signkey_pub }) |+ Purpose.field purpose |+ field TimeAbsoluteNBO.bin (fun t -> t.start) |+ field TimeAbsoluteNBO.bin (fun t -> t.expire) |+ field TimeAbsoluteNBO.bin (fun t -> t.end_) |+ field ExchangePublicKeyP.bin (fun t -> t.signkey_pub) |> sealr end include R include MK (R) end module MasterDenominationKeyRevocationPS = struct module R = struct (* purpose.purpose = TALER_SIGNATURE_MASTER_DENOMINATION_KEY_REVOKED. *) type r = { h_denom_pub: DenominationHash.t } let bin = let open Bin in Purpose.make_bin Taler_signatures.master_denomination_key_revoked @@ fun purpose -> record (fun _purpose h_denom_pub -> { h_denom_pub }) |+ Purpose.field purpose |+ field DenominationHash.bin (fun t -> t.h_denom_pub) |> sealr end include R include MK (R) end module MasterSigningKeyRevocationPS = struct module R = struct (* purpose.purpose = TALER_SIGNATURE_MASTER_SIGNING_KEY_REVOKED *) type r = { exchange_pub: ExchangePublicKeyP.t } let bin = let open Bin in Purpose.make_bin Taler_signatures.master_signing_key_revoked @@ fun purpose -> record (fun _purpose exchange_pub -> { exchange_pub }) |+ Purpose.field purpose |+ field ExchangePublicKeyP.bin (fun t -> t.exchange_pub) |> sealr end include R include MK (R) end module MasterAddAuditorPS = struct module R = struct (* purpose.purpose = TALER_SIGNATURE_MASTER_ADD_AUDITOR *) type r = { start_date: TimeAbsoluteNBO.t; auditor_pub: AuditorPublicKeyP.t; h_auditor_url: Hash_64_cstr.t; } let bin = let open Bin in Purpose.make_bin Taler_signatures.master_add_auditor @@ fun purpose -> record (fun _purpose start_date auditor_pub h_auditor_url -> { start_date; auditor_pub; h_auditor_url }) |+ Purpose.field purpose |+ field TimeAbsoluteNBO.bin (fun t -> t.start_date) |+ field AuditorPublicKeyP.bin (fun t -> t.auditor_pub) |+ field Hash_64_cstr.bin (fun t -> t.h_auditor_url) |> sealr end include R include MK (R) end module MasterDelAuditorPS = struct module R = struct (* purpose.purpose = TALER_SIGNATURE_MASTER_DEL_AUDITOR *) type r = { end_date: TimeAbsoluteNBO.t; auditor_pub: AuditorPublicKeyP.t; } let bin = let open Bin in Purpose.make_bin Taler_signatures.master_del_auditor @@ fun purpose -> record (fun _purpose end_date auditor_pub -> { end_date; auditor_pub }) |+ Purpose.field purpose |+ field TimeAbsoluteNBO.bin (fun t -> t.end_date) |+ field AuditorPublicKeyP.bin (fun t -> t.auditor_pub) |> sealr end include R include MK (R) end module GlobalFeesPS = struct module R = struct (* purpose.purpose = TALER_SIGNATURE_MASTER_GLOBAL_FEES *) type r = { start_date: TimeAbsoluteNBO.t; end_date: TimeAbsoluteNBO.t; purse_timeout: TimeRelativeNBO.t; kyc_timeout: TimeRelativeNBO.t; history_expiration: TimeRelativeNBO.t; history_fee: AmountNBO.t; kyc_fee: AmountNBO.t; account_fee: AmountNBO.t; purse_fee: AmountNBO.t; purse_account_limit: int32; } let bin = let open Bin in Purpose.make_bin Taler_signatures.master_global_fees @@ fun purpose -> record (fun _purpose start_date end_date purse_timeout kyc_timeout history_expiration history_fee kyc_fee account_fee purse_fee purse_account_limit -> { start_date; end_date; purse_timeout; kyc_timeout; history_expiration; history_fee; kyc_fee; account_fee; purse_fee; purse_account_limit; }) |+ Purpose.field purpose |+ field TimeAbsoluteNBO.bin (fun t -> t.start_date) |+ field TimeRelativeNBO.bin (fun t -> t.end_date) |+ field TimeRelativeNBO.bin (fun t -> t.purse_timeout) |+ field TimeRelativeNBO.bin (fun t -> t.kyc_timeout) |+ field TimeRelativeNBO.bin (fun t -> t.history_expiration) |+ field AmountNBO.bin (fun t -> t.history_fee) |+ field AmountNBO.bin (fun t -> t.kyc_fee) |+ field AmountNBO.bin (fun t -> t.account_fee) |+ field AmountNBO.bin (fun t -> t.purse_fee) |+ field beint32 (fun t -> t.purse_account_limit) |> sealr end include R include MK (R) end module MasterWireDetailsPS = struct module R = struct (* purpose.purpose = TALER_SIGNATURE_MASTER_WIRE_DETAILS *) type r = { h_wire_details: FullPaytoHash.t; h_conversion_url: Hash_64_cstr.t; h_credit_restrictions: Hash_64_cstr.t; h_debit_restrictions: Hash_64_cstr.t; } let bin = let open Bin in Purpose.make_bin Taler_signatures.master_wire_details @@ fun purpose -> record (fun _purpose h_wire_details h_conversion_url h_credit_restrictions h_debit_restrictions -> { h_wire_details; h_conversion_url; h_credit_restrictions; h_debit_restrictions; }) |+ Purpose.field purpose |+ field FullPaytoHash.bin (fun t -> t.h_wire_details) |+ field Hash_64_cstr.bin (fun t -> t.h_conversion_url) |+ field Hash_64_cstr.bin (fun t -> t.h_credit_restrictions) |+ field Hash_64_cstr.bin (fun t -> t.h_debit_restrictions) |> sealr end include R include MK (R) end module MasterAddWirePS = struct module R = struct (* purpose.purpose = TALER_SIGNATURE_MASTER_ADD_WIRE *) type r = { start_date: TimeAbsoluteNBO.t; h_wire: FullPaytoHash.t; h_conversion_url: Hash_64_cstr.t; h_credit_restrictions: Hash_64_cstr.t; h_debit_restrictions: Hash_64_cstr.t; } let bin = let open Bin in Purpose.make_bin Taler_signatures.master_add_wire @@ fun _purpose -> record (fun _purpose start_date h_wire h_conversion_url h_credit_restrictions h_debit_restrictions -> { start_date; h_wire; h_conversion_url; h_credit_restrictions; h_debit_restrictions; }) |+ Purpose.field _purpose |+ field TimeAbsoluteNBO.bin (fun t -> t.start_date) |+ field FullPaytoHash.bin (fun t -> t.h_wire) |+ field Hash_64_cstr.bin (fun t -> t.h_conversion_url) |+ field Hash_64_cstr.bin (fun t -> t.h_credit_restrictions) |+ field Hash_64_cstr.bin (fun t -> t.h_debit_restrictions) |> sealr end include R include MK (R) end module MasterDelWirePS = struct module R = struct (* purpose.purpose = TALER_SIGNATURE_MASTER_DEL_WIRE *) type r = { end_date: TimeAbsoluteNBO.t; h_wire: FullPaytoHash.t; } let bin = let open Bin in Purpose.make_bin Taler_signatures.master_del_wire @@ fun _purpose -> record (fun _purpose end_date h_wire -> { end_date; h_wire }) |+ Purpose.field _purpose |+ field TimeAbsoluteNBO.bin (fun t -> t.end_date) |+ field FullPaytoHash.bin (fun t -> t.h_wire) |> sealr end include R include MK (R) end module MasterDrainProfitPS = struct module R = struct (* purpose.purpose = TALER_SIGNATURE_MASTER_DRAIN_PROFITS *) type r = { wtid: WireTransferIdentifierRawP.t; date: TimeAbsoluteNBO.t; amount: AmountNBO.t; h_section: Hash_64_cstr.t; h_payto: FullPaytoHash.t; } let bin = let open Bin in Purpose.make_bin Taler_signatures.master_drain_profit @@ fun _purpose -> record (fun _purpose wtid date amount h_section h_payto -> { wtid; date; amount; h_section; h_payto }) |+ Purpose.field _purpose |+ field WireTransferIdentifierRawP.bin (fun t -> t.wtid) |+ field TimeAbsoluteNBO.bin (fun t -> t.date) |+ field AmountNBO.bin (fun t -> t.amount) |+ field Hash_64_cstr.bin (fun t -> t.h_section) |+ field FullPaytoHash.bin (fun t -> t.h_payto) |> sealr end include R include MK (R) end module MasterAmlOfficerStatusPS = struct module R = struct (* purpose.purpose = TALER_SIGNATURE_MASTER_AML_KEY *) type r = { change_date: TimestampNBO.t; officer_pub: AmlOfficerPublicKeyP.t; h_officer_name: Hash_64_cstr.t; is_active: int32; } let bin = let open Bin in Purpose.make_bin Taler_signatures.master_aml_key @@ fun _purpose -> record (fun _purpose change_date officer_pub h_officer_name is_active -> { change_date; officer_pub; h_officer_name; is_active }) |+ Purpose.field _purpose |+ field TimestampNBO.bin (fun t -> t.change_date) |+ field AmlOfficerPublicKeyP.bin (fun t -> t.officer_pub) |+ field Hash_64_cstr.bin (fun t -> t.h_officer_name) |+ field beint32 (fun t -> t.is_active) |> sealr end include R include MK (R) end module PartnerConfigurationPS = struct module R = struct (* purpose.purpose = TALER_SIGNATURE_MASTER_PARNTER_DETAILS *) type r = { partner_pub: MasterPublicKeyP.t; start_date: TimestampNBO.t; end_date: TimestampNBO.t; wad_frequency: TimeRelativeNBO.t; wad_fee: AmountNBO.t; h_url: Hash_64_cstr.t; } let bin = let open Bin in Purpose.make_bin Taler_signatures.master_partner_details @@ fun _purpose -> record (fun _purpose partner_pub start_date end_date wad_frequency wad_fee h_url -> { partner_pub; start_date; end_date; wad_frequency; wad_fee; h_url }) |+ Purpose.field _purpose |+ field MasterPublicKeyP.bin (fun t -> t.partner_pub) |+ field TimestampNBO.bin (fun t -> t.start_date) |+ field TimestampNBO.bin (fun t -> t.end_date) |+ field TimeRelativeNBO.bin (fun t -> t.wad_frequency) |+ field AmountNBO.bin (fun t -> t.wad_fee) |+ field Hash_64_cstr.bin (fun t -> t.h_url) |> sealr end include R include MK (R) end (* ### BIN IMPL END ### *) module WithdrawRequestPS = struct (* Purpose is #TALER_SIGNATURE_WALLET_RESERVE_WITHDRAW *) type t = { amount: Amount.t; fee: Amount.t; h_planchets: HashPlanchetsP.t; blinding_seed: BlindingMasterSecret.t; max_age_group: int32; mask: AgeMask.t; } let bin = let open Bin in Purpose.make_bin Taler_signatures.wallet_reserve_withdraw @@ fun purpose -> record (fun _purpose amount fee h_planchets blinding_seed max_age_group mask -> { amount; fee; h_planchets; blinding_seed; max_age_group; mask }) |+ Purpose.field purpose |+ field Amount.bin (fun t -> t.amount) |+ field Amount.bin (fun t -> t.fee) |+ field HashPlanchetsP.bin (fun t -> t.h_planchets) |+ field BlindingMasterSecret.bin (fun t -> t.blinding_seed) |+ field beint32 (fun t -> t.max_age_group) |+ field AgeMask.bin (fun t -> t.mask) |> sealr end module WithdrawConfirmationPS = struct (* Purpose is #TALER_SIGNATURE_EXCHANGE_CONFIRM_WITHDRAW. Signed by a `struct TALER_ExchangePrivateKeyP` using EdDSA. *) type t = { (* TODO TALER doc missing TALER_HashBlindedPlanchetsP*) h_planchets: HashPlanchetsP.t; noreveal_index: int32; } let bin = let open Bin in Purpose.make_bin Taler_signatures.exchange_confirm_withdraw @@ fun purpose -> record (fun _purpose h_planchets noreveal_index -> { h_planchets; noreveal_index }) |+ Purpose.field purpose |+ field HashPlanchetsP.bin (fun t -> t.h_planchets) |+ field beint32 (fun t -> t.noreveal_index) |> sealr end module SingleWithdrawRequestPS = struct (* purpose.purpose = TALER_SIGNATURE_WALLET_RESERVE_WITHDRAW *) type t = { amount_with_fee: AmountNBO.t; h_denomination_pub: DenominationHash.t; h_coin_envelope: BlindedCoinHash.t; } end module DepositRequestPS = struct (* purpose.purpose = TALER_SIGNATURE_WALLET_COIN_DEPOSIT *) type t = { h_contract_terms: PrivateContractHash.t; h_age_commitment: AgeCommitmentHash.t; h_policy: ExtensionsPolicyHash.t; h_wire: MerchantWireHash.t; h_denom_pub: DenominationHash.t; timestamp: TimeAbsoluteNBO.t; refund_deadline: TimeAbsoluteNBO.t; amount_with_fee: AmountNBO.t; deposit_fee: AmountNBO.t; merchant: MerchantPublicKeyP.t; wallet_data_hash: Hash_64_cstr.t; } end module DepositConfirmationPS = struct (* purpose.purpose = TALER_SIGNATURE_EXCHANGE_CONFIRM_DEPOSIT *) type t = { h_contract_terms: PrivateContractHash.t; h_wire: MerchantWireHash.t; h_policy: ExtensionsPolicyHash.t; timestamp: TimeAbsoluteNBO.t; refund_deadline: TimeAbsoluteNBO.t; amount_without_fee: AmountNBO.t; coin_pub: CoinSpendPublicKeyP.t; merchant: MerchantPublicKeyP.t; } end module RefreshMeltCoinAffirmationPS = struct (* purpose.purpose = TALER_SIGNATURE_WALLET_COIN_MELT *) type t = { session_hash: RefreshCommitmentP.t; h_denom_pub: DenominationHash.t; h_age_commitment: AgeCommitmentHash.t; amount_with_fee: AmountNBO.t; melt_fee: AmountNBO.t; } end module RefreshMeltConfirmationPS = struct (* purpose.purpose = TALER_SIGNATURE_EXCHANGE_CONFIRM_MELT *) type t = { session_hash: RefreshCommitmentP.t; noreveal_index: int; (* uint16_t mapped to OCaml int *) } end module ExchangeKeySetPS = struct (* purpose.purpose = TALER_SIGNATURE_EXCHANGE_KEY_SET *) type t = { list_issue_date: TimeAbsoluteNBO.t; hc: Hash_64_cstr.t; } end module MasterWireFeePS = struct (* purpose.purpose = TALER_SIGNATURE_MASTER_WIRE_FEES *) type t = { h_wire_method: Hash_64_cstr.t; start_date: TimeAbsoluteNBO.t; end_date: TimeAbsoluteNBO.t; wire_fee: AmountNBO.t; closing_fee: AmountNBO.t; } end module DepositTrackPS = struct (* purpose.purpose = TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION *) type t = { h_contract_terms: PrivateContractHash.t; h_wire: MerchantWireHash.t; coin_pub: CoinSpendPublicKeyP.t; } end module WireDepositDetailP = struct type t = { h_contract_terms: PrivateContractHash.t; execution_time: TimeAbsoluteNBO.t; coin_pub: CoinSpendPublicKeyP.t; deposit_value: AmountNBO.t; deposit_fee: AmountNBO.t; } end module WireDepositDataPS = struct (* purpose.purpose = TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE_DEPOSIT *) type t = { total: AmountNBO.t; wire_fee: AmountNBO.t; merchant_pub: MerchantPublicKeyP.t; h_wire: MerchantWireHash.t; h_details: Hash_64_cstr.t; } end module ExchangeKeyValidityPS = struct (* purpose.purpose = TALER_SIGNATURE_AUDITOR_EXCHANGE_KEYS *) type t = { auditor_url_hash: Hash_64_cstr.t; master: MasterPublicKeyP.t; start: TimeAbsoluteNBO.t; expire_withdraw: TimeAbsoluteNBO.t; expire_spend: TimeAbsoluteNBO.t; expire_legal: TimeAbsoluteNBO.t; value: AmountNBO.t; fee_withdraw: AmountNBO.t; fee_deposit: AmountNBO.t; fee_refresh: AmountNBO.t; denom_hash: DenominationHash.t; } end module PaymentResponsePS = struct (* purpose.purpose = TALER_SIGNATURE_MERCHANT_PAYMENT_OK *) type t = { h_contract_terms: PrivateContractHash.t } end module ContractPS = struct (* purpose.purpose = TALER_SIGNATURE_MERCHANT_CONTRACT *) type t = { h_contract_terms: PrivateContractHash.t } end module ConfirmWirePS = struct (* purpose.purpose = TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE *) type t = { h_wire: MerchantWireHash.t; h_contract_terms: PrivateContractHash.t; wtid: WireTransferIdentifierRawP.t; coin_pub: CoinSpendPublicKeyP.t; execution_time: TimeAbsoluteNBO.t; coin_contribution: AmountNBO.t; } end module RefundConfirmationPS = struct (* purpose.purpose = TALER_SIGNATURE_EXCHANGE_CONFIRM_REFUND *) type t = { h_contract_terms: PrivateContractHash.t; coin_pub: CoinSpendPublicKeyP.t; merchant: MerchantPublicKeyP.t; rtransaction_id: int64; refund_amount: AmountNBO.t; } end module DepositTrackPS2 = struct (* purpose.purpose = TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION *) type t = { h_contract_terms: PrivateContractHash.t; h_wire: MerchantWireHash.t; merchant: MerchantPublicKeyP.t; coin_pub: CoinSpendPublicKeyP.t; } end module RefundRequestPS = struct (* purpose.purpose = TALER_SIGNATURE_MERCHANT_REFUND *) type t = { h_contract_terms: PrivateContractHash.t; coin_pub: CoinSpendPublicKeyP.t; rtransaction_id: int64; refund_amount: AmountNBO.t; refund_fee: AmountNBO.t; } end module MerchantRefundConfirmationPS = struct (* purpose.purpose = TALER_SIGNATURE_MERCHANT_REFUND_OK *) (* Hash of the order ID (a string), hashed without the 0-termination. *) type t = { h_order_id: Hash_64_cstr.t } end module RecoupRequestPS = struct (* purpose.purpose = TALER_SIGNATURE_WALLET_COIN_RECOUP or TALER_SIGNATURE_WALLET_COIN_RECOUP_REFRESH *) type t = { h_denom_pub: DenominationHash.t; coin_blind: DenominationBlindingKeyP.t; } end module RecoupRefreshConfirmationPS = struct (* purpose.purpose = TALER_SIGNATURE_EXCHANGE_CONFIRM_RECOUP_REFRESH *) type t = { timestamp: TimeAbsoluteNBO.t; recoup_amount: AmountNBO.t; coin_pub: CoinSpendPublicKeyP.t; old_coin_pub: CoinSpendPublicKeyP.t; } end module RecoupConfirmationPS = struct (* purpose.purpose = TALER_SIGNATURE_EXCHANGE_CONFIRM_RECOUP *) type t = { timestamp: TimeAbsoluteNBO.t; recoup_amount: AmountNBO.t; coin_pub: CoinSpendPublicKeyP.t; reserve_pub: ReservePublicKeyP.t; } end module DenominationUnknownAffirmationPS = struct (* purpose.purpose = TALER_SIGNATURE_EXCHANGE_AFFIRM_DENOM_UNKNOWN *) type t = { timestamp: TimeAbsoluteNBO.t; h_denom_pub: DenominationHash.t; } end module DenominationExpiredAffirmationPS = struct (* purpose.purpose = TALER_SIGNATURE_EXCHANGE_GENERIC_DENOMINATIN_EXPIRED *) type t = { timestamp: TimeAbsoluteNBO.t; operation: string; (* char[8] → string *) h_denom_pub: DenominationHash.t; } end module ReserveCloseConfirmationPS = struct (* purpose.purpose = TALER_SIGNATURE_EXCHANGE_RESERVE_CLOSED *) type t = { timestamp: TimeAbsoluteNBO.t; closing_amount: AmountNBO.t; reserve_pub: ReservePublicKeyP.t; h_wire: FullPaytoHash.t; } end module CoinLinkSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_WALLET_COIN_LINK *) type t = { h_denom_pub: DenominationHash.t; old_coin_pub: CoinSpendPublicKeyP.t; transfer_pub: TransferPublicKeyP.t; coin_envelope_hash: BlindedCoinHash.t; } end module RefreshNonceSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_WALLET_COIN_LINK *) type t = { nonce: PublicRefreshCoinNonceP.t } end module ReserveStatusRequestSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_RESERVE_STATUS_REQUEST *) type t = { request_timestamp: TimeAbsoluteNBO.t } end module ReserveHistoryRequestSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_RESERVE_HISTORY_REQUEST *) type t = { history_fee: AmountNBO.t; request_timestamp: TimeAbsoluteNBO.t; } end module PurseStatusRequestSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_PURSE_STATUS_REQUEST *) type t = unit end module PurseStatusResponseSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_PURSE_STATUS_RESPONSE *) type t = { total_purse_amount: AmountNBO.t; total_deposit_amount: AmountNBO.t; max_deposit_fees: AmountNBO.t; purse_expiration: TimeAbsoluteNBO.t; status_timestamp: TimeAbsoluteNBO.t; h_contract_terms: PrivateContractHash.t; } end module ReserveCloseRequestSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_WALLET_RESERVE_CLOSE *) type t = unit end module PurseRequestSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_WALLET_PURSE_CREATE *) type t = { purse_expiration: TimeAbsoluteNBO.t; merge_value_after_fees: AmountNBO.t; h_contract_terms: PrivateContractHash.t; min_age: int; } end module PurseDepositSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_PURSE_DEPOSIT *) type t = { coin_contribution: AmountNBO.t; h_denom_pub: DenominationHash.t; h_age_commitment: AgeCommitmentHash.t; purse_pub: PursePublicKey.t; h_exchange_base_url: Hash_64_cstr.t; } end module PurseDepositSignaturePS2 = struct (* purpose.purpose = TALER_SIGNATURE_WALLET_RESERVE_OPEN_DEPOSIT *) type t = { reserve_sig: ReserveSignatureP.t; coin_contribution: AmountNBO.t; } end module PurseDepositConfirmedSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_PURSE_DEPOSIT_CONFIRMED *) type t = { total_purse_amount: AmountNBO.t; total_deposit_fees: AmountNBO.t; purse_pub: PursePublicKey.t; purse_expiration: TimeAbsoluteNBO.t; h_contract_terms: PrivateContractHash.t; } end module PurseMergeSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_WALLET_PURSE_MERGE *) type t = { merge_timestamp: TimeAbsoluteNBO.t; h_wire: NormalizedPaytoHash.t; } end module AccountMergeSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_WALLET_ACCOUNT_MERGE *) type t = { reserve_pub: ReservePublicKeyP.t; purse_pub: PursePublicKey.t; merge_amount_after_fees: AmountNBO.t; merge_timestamp: TimeAbsoluteNBO.t; purse_expiration: TimeAbsoluteNBO.t; h_contract_terms: PrivateContractHash.t; min_age: int; } end module AccountSetupRequestSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_WALLET_ACCOUNT_SETUP *) type t = { threshold: AmountNBO.t } end module PurseMergeSuccessSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_PURSE_MERGE_SUCCESS *) type t = { reserve_pub: ReservePublicKeyP.t; purse_pub: PursePublicKey.t; merge_amount_after_fees: AmountNBO.t; contract_time: TimeAbsoluteNBO.t; h_contract_terms: PrivateContractHash.t; h_wire: NormalizedPaytoHash.t; min_age: int; } end module WadDataSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_WAD_DATA *) type t = { wad_execution_time: TimeAbsoluteNBO.t; total_amount: AmountNBO.t; h_items: Hash_64_cstr.t; wad_id: WadId.t; } end module WadPartnerSignaturePS = struct (* purpose.purpose = TALER_SIGNATURE_MASTER_PARTNER_DETAILS *) type t = { h_partner_base_url: Hash_64_cstr.t; master_public_key: MasterPublicKeyP.t; start_date: TimeAbsoluteNBO.t; end_date: TimeAbsoluteNBO.t; wad_fee: AmountNBO.t; wad_frequency: TimeRelativeNBO.t; } end module P2PFeesPS = struct (* purpose.purpose = TALER_SIGNATURE_P2P_FEES *) type t = { start_date: TimeAbsoluteNBO.t; end_date: TimeAbsoluteNBO.t; kyc_fee: AmountNBO.t; purse_fee: AmountNBO.t; account_history_fee: AmountNBO.t; account_annual_fee: AmountNBO.t; account_kyc_timeout: TimeRelativeNBO.t; purse_timeout: TimeRelativeNBO.t; purse_account_limit: int; } end module CoinPurseRefundConfirmationPS = struct (* purpose.purpose = TALER_SIGNATURE_EXCHANGE_CONFIRM_PURSE_REFUND *) type t = { purse_pub: PursePublicKey.t; coin_pub: CoinSpendPublicKeyP.t; refunded_amount: AmountNBO.t; refund_fee: AmountNBO.t; } end module AmlDecisionPS = struct (* purpose.purpose = TALER_SIGNATURE_AML_DECISION *) type t = { h_justification: Hash_64_cstr.t; decision_time: TimestampNBO.t; new_threshold: AmountNBO.t; h_payto: NormalizedPaytoHash.t; h_kyc_requirements: Hash_64_cstr.t; new_state: int; } end module ReserveOpenPS = struct (* purpose.purpose = TALER_SIGNATURE_WALLET_RESERVE_OPEN *) type t = { reserve_payment: AmountNBO.t; request_timestamp: TimestampNBO.t; reserve_expiration: TimestampNBO.t; purse_limit: int; } end module ReserveClosePS = struct (* purpose.purpose = TALER_SIGNATURE_WALLET_RESERVE_CLOSE *) type t = { request_timestamp: TimestampNBO.t; target_account_h_payto: FullPaytoHash.t; } end module ReserveAttestRequestPS = struct (* purpose.purpose = TALER_SIGNATURE_WALLET_ATTEST_REQUEST *) type t = { request_timestamp: TimestampNBO.t; h_details: Hash_64_cstr.t; } end module ExchangeAttestPS = struct (* purpose.purpose = TALER_SIGNATURE_EXCHANGE_RESERVE_ATTEST_DETAILS *) type t = { attest_timestamp: TimestampNBO.t; expiration_time: TimestampNBO.t; reserve_pub: ReservePublicKeyP.t; h_attributes: Hash_64_cstr.t; } end