From 7b6d73a61ba050fe33f4ff4981ce4b3966d5d38f Mon Sep 17 00:00:00 2001 From: swrup Date: Mon, 23 Feb 2026 10:59:36 +0100 Subject: [PATCH] --- src/denomination.ml | 42 ++++++++++++++++++++++++++++++++---------- src/http_info.ml | 10 +++++----- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/denomination.ml b/src/denomination.ml index ec5f7905..8c7fded4 100644 --- a/src/denomination.ml +++ b/src/denomination.ml @@ -16,7 +16,7 @@ type t = { master_sig: Signatures.DenominationKeyValidity.t; } -let make_denom_group denominations = +let make_denom_group_sorted denominations = let open Syntax in let ht = Hashtbl.create 0xff in List.iter @@ -72,19 +72,41 @@ let make_denom_group denominations = Hashtbl.replace ht k (v :: l)) denominations in - Hashtbl.to_seq ht - |> List.of_seq - |> List.map - (fun - ((value, fee_withdraw, fee_deposit, fee_refresh, fee_refund), denoms) - -> - Api.DenomGroup.Rsa - Api.RsaDenomGroup. + + (* ! important for /keys .exchange_sig + each group must be ordered in _reverse_ chronological order + order of groups to compute hash, must be the same as the order + in /keys .denominations *) + let open Api in + let open DenomGroup in + let open RsaDenomGroup in + let open RsaDenom in + let cmp_denom b a = Timestamp.compare a.stamp_start b.stamp_start in + let cmp_group = + let cmp_amount a b = + let open Amount in + match Int64.unsigned_compare a.value b.value with + | 0 -> Int32.unsigned_compare a.fraction b.fraction + | n -> n + in + fun (Rsa a) (Rsa b) -> cmp_amount a.value b.value + in + let l = + Hashtbl.to_seq ht + |> List.of_seq + |> List.map + (fun + ((value, fee_withdraw, fee_deposit, fee_refresh, fee_refund), denoms) + -> + Rsa { - denoms; + denoms= List.sort cmp_denom denoms; value; fee_withdraw; fee_deposit; fee_refresh; fee_refund; }) + |> List.sort cmp_group + in + l diff --git a/src/http_info.ml b/src/http_info.ml index f508a52f..4b425e1e 100644 --- a/src/http_info.ml +++ b/src/http_info.ml @@ -92,7 +92,7 @@ let mk_keys ~db_conn (module Keys : Keys.S) ~last_issue_date = (fun v -> Timestamp.compare v.Denomination.stamp_start timestamp >= 0) denom_l in - let* denominations = Denomination.make_denom_group denom_l in + let* denominations = Denomination.make_denom_group_sorted denom_l in let* signkeys = Keys.signkeys () in let signkeys = @@ -110,13 +110,13 @@ let mk_keys ~db_conn (module Keys : Keys.S) ~last_issue_date = | sk :: _ -> Ok sk.SignKey.key in - (* TODO *) - (* Compact eddsa signature over the contatentation of all of the master_sigs + (* eddsa signature over the contatentation of all of the master_sigs (in reverse chronological order by group) in the arrays under "denominations" *) let exchange_sig = let hc = - denom_l - |> List.map (fun dn -> dn.Denomination.master_sig) + denominations + |> List.map (fun (DenomGroup.Rsa g) -> g.RsaDenomGroup.denoms) + |> List.concat_map (List.map (fun dn -> dn.RsaDenom.master_sig)) |> List.map Signatures.DenominationKeyValidity.to_octets |> String.concat "" |> Hash.H64.hash