From 19b64a092d5f7da7e62700288577e98d8bc4e5a1 Mon Sep 17 00:00:00 2001 From: swrup Date: Sat, 21 Feb 2026 21:32:18 +0100 Subject: [PATCH] different verify for master sigs --- src/http_management.ml | 56 +++++++++--------------- src/keys.ml | 18 +++++--- src/mod_intf.mli | 4 +- src/signatures.ml | 69 +++++++++++++----------------- tools/offline_impl.ml | 96 ++++++++++++++++++------------------------ 5 files changed, 106 insertions(+), 137 deletions(-) diff --git a/src/http_management.ml b/src/http_management.ml index 2be6cd6c..a8dda624 100644 --- a/src/http_management.ml +++ b/src/http_management.ml @@ -3,29 +3,13 @@ open Api open Hash module Keys_get = struct - let mk_future_keys_response (module Keys : Keys.S) = - let* future_signkeys = Keys.future_signkeys () in - let* future_denoms = Keys.future_denominations () in - let master_pub = Keys.master_pub in - let denom_secmod_public_key = Keys.secmod_rsa_pub in - let signkey_secmod_public_key = Keys.secmod_eddsa_pub in - Ok - FutureKeysResponse. - { - future_denoms; - future_signkeys; - master_pub; - denom_secmod_public_key; - signkey_secmod_public_key; - } - let jsont = FutureKeysResponse.jsont let f req server _env = Logs.info (fun m -> m "GET /management/keys/"); - let keys = Vif.Server.device Devices.keys server in + let (module Keys : Keys.S) = Vif.Server.device Devices.keys server in let res = - let* v = mk_future_keys_response keys in + let* v = Keys.make_future_keys_response () in let s = Api.encode_exn jsont v in Ok s in @@ -36,9 +20,9 @@ module Keys_post = struct let verify_dn (module Keys : Keys.S) fdn denom_hash master_sig = let open FutureDenom in let open Signatures.DenominationKeyValidity in - let r : r = + let r = { - master= Config.master_public_key; + R.master= Config.master_public_key; start= fdn.stamp_start; expire_withdraw= fdn.stamp_expire_withdraw; expire_spend= fdn.stamp_expire_deposit; @@ -51,7 +35,7 @@ module Keys_post = struct denom_hash; } in - verify Keys.master_pub master_sig r + verify master_sig r let verify_denom_sigs (module Keys : Keys.S) denom_sigs = let* fdn_l = Keys.future_denominations () in @@ -78,15 +62,15 @@ module Keys_post = struct { key; stamp_start; stamp_expire; stamp_end; signkey_secmod_sig= _ } master_sig = let open Signatures.ExchangeSigningKeyValidity in - let r : r = + let r = { - start= stamp_start; + R.start= stamp_start; expire= stamp_expire; end_= stamp_end; signkey_pub= key; } in - verify Keys.master_pub master_sig r + verify master_sig r let verify_signkey_sigs (module Keys : Keys.S) signkey_sigs = let* fsk_l = Keys.future_signkeys () in @@ -137,7 +121,7 @@ module Denom_revoke = struct let verify (module Keys : Keys.S) h_denom_pub DenomRevocationSignature.{ master_sig } = let open Signatures.MasterDenominationKeyRevocation in - verify Keys.master_pub master_sig { h_denom_pub } + verify master_sig { h_denom_pub } let do_ (module Keys : Keys.S) h_denom_pub DenomRevocationSignature.{ master_sig } = @@ -163,7 +147,7 @@ module Signkey_revoke = struct let verify (module Keys : Keys.S) exchange_pub SignkeyRevocationSignature.{ master_sig } = let open Signatures.MasterSigningKeyRevocation in - verify Keys.master_pub master_sig { exchange_pub } + verify master_sig { exchange_pub } let do_ (module Keys : Keys.S) exchange_pub SignkeyRevocationSignature.{ master_sig } = @@ -196,7 +180,7 @@ module Auditors = struct validity_start; } = let open Signatures.MasterAddAuditor in - verify Keys.master_pub master_sig + verify master_sig { start_date= validity_start; auditor_pub; @@ -243,7 +227,7 @@ module Auditors_disable = struct let verify (module Keys : Keys.S) auditor_pub AuditorTeardownMessage.{ master_sig; validity_end } = let open Signatures.MasterDelAuditor in - verify Keys.master_pub master_sig { end_date= validity_end; auditor_pub } + verify master_sig { end_date= validity_end; auditor_pub } let do_ ~db_conn auditor_pub AuditorTeardownMessage.{ master_sig= _; validity_end } = @@ -291,7 +275,7 @@ module Wire_fee = struct wire_fee; } = let open Signatures.MasterWireFee in - verify Keys.master_pub master_sig_wire + verify master_sig_wire { h_wire_method= Hash.Cstring.H64.hash wire_method; start_date= fee_start; @@ -353,7 +337,7 @@ module Global_fees = struct master_sig; } = let open Signatures.GlobalFees in - verify Keys.master_pub master_sig + verify master_sig { start_date; end_date; @@ -426,7 +410,7 @@ module Wire = struct let debit_restrictions = "" in let* () = let open Signatures.MasterWireDetails in - verify Keys.master_pub master_sig_wire + verify master_sig_wire { h_wire_details= FullPaytoHash.hash payto_uri; h_conversion_url= Hash.Cstring.H64.hash conversion_url; @@ -436,7 +420,7 @@ module Wire = struct in let* () = let open Signatures.MasterAddWire in - verify Keys.master_pub master_sig_add + verify master_sig_add { start_date= validity_start; h_wire= FullPaytoHash.hash payto_uri; @@ -492,7 +476,7 @@ module Wire_disable = struct let verify (module Keys : Keys.S) WireTeardownMessage.{ payto_uri; master_sig_del; validity_end } = let open Signatures.MasterDelWire in - verify Keys.master_pub master_sig_del + verify master_sig_del { end_date= validity_end; h_wire= FullPaytoHash.hash payto_uri } let do_ ~db_conn @@ -535,7 +519,7 @@ module Drain = struct amount; } = let open Signatures.MasterDrainProfit in - verify Keys.master_pub master_sig + verify master_sig { wtid; date; @@ -576,7 +560,7 @@ module AmlOfficer = struct } = let open Signatures.MasterAmlOfficerStatus in let is_active = match is_active with true -> 1_l | false -> 0_l in - verify Keys.master_pub master_sig + verify master_sig { change_date; officer_pub; @@ -616,7 +600,7 @@ module Partners = struct wad_fee; } = let open Signatures.PartnerConfiguration in - verify Keys.master_pub master_sig + verify master_sig { partner_pub; start_date; diff --git a/src/keys.ml b/src/keys.ml index 1088f526..0c7113e6 100644 --- a/src/keys.ml +++ b/src/keys.ml @@ -12,11 +12,6 @@ module Make (Conn : Pg.CONN) = struct let conn = (module Conn : Pg.CONN) - (* - *) - let master_pub = Config.Exchange.master_public_key - let secmod_eddsa_pub = Sm_eddsa.sm_pub - let secmod_rsa_pub = Sm_rsa.sm_pub - (* TODO error "key not found", either: - we tried to sign with a key that is not ours @@ -173,6 +168,19 @@ module Make (Conn : Pg.CONN) = struct in List.filter_map Fun.id l + let make_future_keys_response () = + let* future_signkeys = future_signkeys () in + let* future_denoms = future_denominations () in + Ok + Api.FutureKeysResponse. + { + future_denoms; + future_signkeys; + master_pub= Config.Exchange.master_public_key; + denom_secmod_public_key= Sm_rsa.sm_pub; + signkey_secmod_public_key= Sm_eddsa.sm_pub; + } + let sk_of_future_sk future_sk master_sig = let Api.FutureSignKey. { key; stamp_start; stamp_expire; stamp_end; signkey_secmod_sig= _ } = diff --git a/src/mod_intf.mli b/src/mod_intf.mli index c0edfacd..1bea500c 100644 --- a/src/mod_intf.mli +++ b/src/mod_intf.mli @@ -3,9 +3,6 @@ open Crypto type 'a result = ('a, string) Result.t module type KEYS = sig - val master_pub : eddsa_pub - val secmod_rsa_pub : eddsa_pub - val secmod_eddsa_pub : eddsa_pub val sign : eddsa_pub -> string -> eddsa_sig val sign_denom : rsa_pub -> string -> rsa_sig val find_signkey : eddsa_pub -> Signkey.t option result @@ -14,6 +11,7 @@ module type KEYS = sig val denominations : unit -> Denomination.t list result val future_signkeys : unit -> Api.FutureSignKey.t list result val future_denominations : unit -> Api.FutureDenom.t list result + val make_future_keys_response : unit -> Api.FutureKeysResponse.t result val certify_future_signkey : eddsa_pub -> Signatures.ExchangeSigningKeyValidity.t -> unit result diff --git a/src/signatures.ml b/src/signatures.ml index 8c92a807..ff7de581 100644 --- a/src/signatures.ml +++ b/src/signatures.ml @@ -145,20 +145,21 @@ end (* --- Packed Signatures --- *) -module MK (R : sig +module type R = sig type r val bin : r Bin.t -end) : sig +end + +module type SIGNATURE = sig open Crypto - type r = R.r + type r type t val signf : (string -> EddsaSignature.t) -> r -> t (* todo - - could have another functor with `verify`'s key set to config's master_public_key - type for unknown/verified signatures? (nk/ok) *) val verify : EddsaPublicKey.t -> t -> r -> (unit, string) result val jsont : t Jsont.t @@ -166,10 +167,11 @@ end) : sig (* escape hatch, only needed for /keys `exchange_sig` (signature over contatentation of all of the master_sigs) *) val to_octets : t -> string -end = struct +end + +module MK (R : R) : SIGNATURE with type r := R.r = struct open Crypto - type r = R.r type t = EddsaSignature.t let to_string = Bin.to_string R.bin @@ -180,6 +182,14 @@ end = struct let to_octets t = EddsaSignature.to_octets t end +module MK_master_sig (R : R) = struct + include MK (R) + + let verify = verify Config.Exchange.master_public_key +end + +(* ---- *) + module DenominationKeyAnnouncement = struct module R = struct (* CS: use purpose TALER_SIGNATURE_SM_CS_DENOMINATION_KEY *) @@ -207,7 +217,6 @@ module DenominationKeyAnnouncement = struct |> sealr end - include R include MK (R) end @@ -232,7 +241,6 @@ module SigningKeyAnnouncement = struct |> sealr end - include R include MK (R) end @@ -301,8 +309,7 @@ module DenominationKeyValidity = struct |> sealr end - include R - include MK (R) + include MK_master_sig (R) end module ExchangeSigningKeyValidity = struct @@ -329,8 +336,7 @@ module ExchangeSigningKeyValidity = struct |> sealr end - include R - include MK (R) + include MK_master_sig (R) end module MasterDenominationKeyRevocation = struct @@ -348,8 +354,7 @@ module MasterDenominationKeyRevocation = struct |> sealr end - include R - include MK (R) + include MK_master_sig (R) end module MasterSigningKeyRevocation = struct @@ -367,8 +372,7 @@ module MasterSigningKeyRevocation = struct |> sealr end - include R - include MK (R) + include MK_master_sig (R) end module MasterAddAuditor = struct @@ -392,8 +396,7 @@ module MasterAddAuditor = struct |> sealr end - include R - include MK (R) + include MK_master_sig (R) end module MasterDelAuditor = struct @@ -414,8 +417,7 @@ module MasterDelAuditor = struct |> sealr end - include R - include MK (R) + include MK_master_sig (R) end module GlobalFees = struct @@ -470,8 +472,7 @@ module GlobalFees = struct |> sealr end - include R - include MK (R) + include MK_master_sig (R) end module MasterWireDetails = struct @@ -509,8 +510,7 @@ module MasterWireDetails = struct |> sealr end - include R - include MK (R) + include MK_master_sig (R) end module MasterAddWire = struct @@ -552,8 +552,7 @@ module MasterAddWire = struct |> sealr end - include R - include MK (R) + include MK_master_sig (R) end module MasterDelWire = struct @@ -574,8 +573,7 @@ module MasterDelWire = struct |> sealr end - include R - include MK (R) + include MK_master_sig (R) end module MasterDrainProfit = struct @@ -603,8 +601,7 @@ module MasterDrainProfit = struct |> sealr end - include R - include MK (R) + include MK_master_sig (R) end module MasterAmlOfficerStatus = struct @@ -630,8 +627,7 @@ module MasterAmlOfficerStatus = struct |> sealr end - include R - include MK (R) + include MK_master_sig (R) end module PartnerConfiguration = struct @@ -670,8 +666,7 @@ module PartnerConfiguration = struct |> sealr end - include R - include MK (R) + include MK_master_sig (R) end module WadPartnerSignature = struct @@ -718,7 +713,6 @@ module WadPartnerSignature = struct |> sealr end - include R include MK (R) end @@ -748,8 +742,7 @@ module MasterWireFee = struct |> sealr end - include R - include MK (R) + include MK_master_sig (R) end module ExchangeKeyValidity = struct @@ -815,7 +808,6 @@ module ExchangeKeyValidity = struct |> sealr end - include R include MK (R) end @@ -838,7 +830,6 @@ module ExchangeKeySet = struct |> sealr end - include R include MK (R) end diff --git a/tools/offline_impl.ml b/tools/offline_impl.ml index 47a0d22c..aa0d08e3 100644 --- a/tools/offline_impl.ml +++ b/tools/offline_impl.ml @@ -1,11 +1,19 @@ open Syntax +open Crypto open Hash module Future_keys = struct - open Crypto open Api - let verify = + let verify offline_master_public_key + FutureKeysResponse. + { + future_denoms; + future_signkeys; + master_pub; + denom_secmod_public_key; + signkey_secmod_public_key; + } = let verify_future_denom ~sm_denom_pub FutureDenom. { @@ -44,37 +52,35 @@ module Future_keys = struct verify sm_signkey_pub signkey_secmod_sig { exchange_pub; anchor_time; duration } in - fun our_master_public_key + let* () = + match master_pub = offline_master_public_key with + | false -> + Fmt.error + "master public key of the future key response does not match ours" + | true -> Ok () + in + let* () = + list_iter + (verify_future_denom ~sm_denom_pub:denom_secmod_public_key) + future_denoms + in + let* () = + list_iter + (verify_future_signkey ~sm_signkey_pub:signkey_secmod_public_key) + future_signkeys + in + Ok () + + let make ~master_key FutureKeysResponse. { future_denoms; future_signkeys; - master_pub; - denom_secmod_public_key; - signkey_secmod_public_key; - } - -> - let* () = - match master_pub = our_master_public_key with - | false -> - Fmt.error - "master public key of the future key response does not match ours" - | true -> Ok () - in - let* () = - list_iter - (verify_future_denom ~sm_denom_pub:denom_secmod_public_key) - future_denoms - in - let* () = - list_iter - (verify_future_signkey ~sm_signkey_pub:signkey_secmod_public_key) - future_signkeys - in - Ok () - - let make = - let denom_signature ~master_key + master_pub= _; + denom_secmod_public_key= _; + signkey_secmod_public_key= _; + } = + let denom_signature FutureDenom. { section_name= _; @@ -113,7 +119,7 @@ module Future_keys = struct in DenomSignature.{ h_denom_pub; master_sig } in - let signkey_signature ~master_key + let signkey_signature FutureSignKey. { key; stamp_start; stamp_expire; stamp_end; signkey_secmod_sig= _ } = let master_sig = @@ -129,21 +135,9 @@ module Future_keys = struct in SignKeySignature.{ key; master_sig } in - fun ~master_key - FutureKeysResponse. - { - future_denoms; - future_signkeys; - master_pub= _; - denom_secmod_public_key= _; - signkey_secmod_public_key= _; - } - -> - let denom_sigs = List.map (denom_signature ~master_key) future_denoms in - let signkey_sigs = - List.map (signkey_signature ~master_key) future_signkeys - in - MasterSignatures.{ denom_sigs; signkey_sigs } + let denom_sigs = List.map denom_signature future_denoms in + let signkey_sigs = List.map signkey_signature future_signkeys in + MasterSignatures.{ denom_sigs; signkey_sigs } end (* -- *) @@ -155,7 +149,7 @@ let write_file fname content = let read_master_key_file filename = let* master_key = read_file filename in - Crypto.EddsaPrivateKey.of_octets master_key + EddsaPrivateKey.of_octets master_key let download ~output ~url = let open Bos in @@ -197,7 +191,6 @@ let setup ~output ~output_pubkey = Ok () let sign ~master_key ~input ~output = - let open Crypto in let* master_key = read_master_key_file master_key in let* input = read_file input in let master_pub = EddsaPrivateKey.pub_of_priv master_key in @@ -214,7 +207,7 @@ let revoke_denom ~output ~master_key ~h_denom = let denom_revoke = let master_sig = let open Signatures.MasterDenominationKeyRevocation in - signf (Crypto.EddsaSignature.sign ~key) { h_denom_pub } + signf (EddsaSignature.sign ~key) { h_denom_pub } in Api.DenomRevocationSignature.{ master_sig } in @@ -227,7 +220,7 @@ let revoke_signkey ~output ~master_key ~signkey = let signkey_revoke = let master_sig = let open Signatures.MasterSigningKeyRevocation in - signf (Crypto.EddsaSignature.sign ~key) { exchange_pub= signkey } + signf (EddsaSignature.sign ~key) { exchange_pub= signkey } in Api.SignkeyRevocationSignature.{ master_sig } in @@ -238,7 +231,6 @@ let revoke_signkey ~output ~master_key ~signkey = let global_fees ~output ~master_key ~start_date ~end_date ~history_fee ~account_fee ~purse_fee ~history_expiration ~purse_account_limit ~purse_timeout = - let open Crypto in let* key = read_master_key_file master_key in let* purse_account_limit = match @@ -282,7 +274,6 @@ let global_fees ~output ~master_key ~start_date ~end_date ~history_fee let enable_auditor ~output ~master_key ~auditor_url ~auditor_name ~auditor_pub ~validity_start = - let open Crypto in let* key = read_master_key_file master_key in let master_sig = let open Signatures.MasterAddAuditor in @@ -302,7 +293,6 @@ let enable_auditor ~output ~master_key ~auditor_url ~auditor_name ~auditor_pub Ok () let disable_auditor ~output ~master_key ~auditor_pub ~validity_end = - let open Crypto in let* key = read_master_key_file master_key in let master_sig = let open Signatures.MasterDelAuditor in @@ -315,7 +305,6 @@ let disable_auditor ~output ~master_key ~auditor_pub ~validity_end = let wire_fee ~output ~master_key ~wire_method ~fee_start ~fee_end ~closing_fee ~wire_fee = - let open Crypto in let* key = read_master_key_file master_key in let master_sig_wire = let open Signatures.MasterWireFee in @@ -345,7 +334,6 @@ let wire_fee ~output ~master_key ~wire_method ~fee_start ~fee_end ~closing_fee let drain ~output ~master_key ~debit_account_section ~credit_payto_uri ~wtid ~date ~amount = - let open Crypto in let* key = read_master_key_file master_key in let master_sig = let open Signatures.MasterDrainProfit in