JJ: Description from the destination commit:

fix secmod add/write; + wip test revoke

JJ: Description from source commit:
+ test disable-auditor + wire + drain
This commit is contained in:
swrup 2026-02-25 00:12:05 +01:00
parent 836b9ff64a
commit c45cd51c27
14 changed files with 545 additions and 232 deletions

View file

@ -2,7 +2,7 @@
(public_name offline)
(name offline)
(modules offline offline_impl)
(libraries cmdliner bos fmt mirage-crypto ptime mte vif))
(libraries cmdliner bos fmt mirage-crypto mtime ptime mte vif))
(executable
(public_name gen_registry_files)

View file

@ -1,13 +1,6 @@
(* TODO
all management operations:
/management/wire
/management/wire/disable
/management/aml-officers
-> /aml
/management/partners
-> /wads *)
(* not done:
/management/aml-officers (for /aml)
/management/partners (for /wads) *)
open Cmdliner
open Cmdliner.Term.Syntax
open Offline_impl
@ -128,14 +121,54 @@ let sign_cmd =
let revoke_denom_cmd =
let doc = "Revoke denomination." in
let h_denom =
let doc = "hash of denomination public key" in
let is_rsa_pub =
let doc =
"interpret input string as a RSA public key (in Crockford-base32) \
instead of a denomination hash"
in
Arg.(value & flag & info [ "rsa" ] ~doc)
in
let v =
let doc = "hash of denomination (or RSA public key if --rsa is set)" in
Arg.(required & pos 0 (some string) None & info [] ~doc)
in
Cmd.make (Cmd.info "revoke-denom" ~doc)
@@
let+ output = output and+ master_key = master_key and+ h_denom = h_denom in
revoke_denom ~output ~master_key ~h_denom
let+ output = output
and+ master_key = master_key
and+ is_rsa_pub = is_rsa_pub
and+ v = v in
let res =
match is_rsa_pub with
| false -> Ok v
| true -> (
match B32.decode v with
| Error e -> Error e
| Ok s ->
let h = Hash.DenominationHash.hash s in
let s = B32.encode (Hash.DenominationHash.to_octets h) in
Ok s)
in
match res with
| Error e -> Error e
| Ok h_denom -> revoke_denom ~output ~master_key ~h_denom
(* just for tests... *)
let test_hash64_cmd =
let doc =
"Compute SHA-512, print output to stdout, input and output are \
Crockford-base32 encoded"
in
let s = Arg.(required & pos 0 (some string) None & info []) in
Cmd.make (Cmd.info "hash64" ~doc)
@@
let+ s = s in
match B32.decode s with
| Error e -> Error e
| Ok s ->
let h = Hash.DenominationHash.hash s in
let s = B32.encode (Hash.DenominationHash.to_octets h) in
Fmt.pr "%s@." s; Ok ()
let revoke_signkey_cmd =
let doc = "Revoke signkey." in
@ -159,35 +192,26 @@ let enable_auditor_cmd =
let auditor_pub =
Arg.(required & opt (some eddsa_pub) None & info [ "auditor_pub" ])
in
let validity_start =
Arg.(required & opt (some timestamp) None & info [ "validity_start" ])
in
Cmd.make (Cmd.info "enable-auditor" ~doc)
@@
let+ output = output
and+ master_key = master_key
and+ auditor_url = auditor_url
and+ auditor_name = auditor_name
and+ auditor_pub = auditor_pub
and+ validity_start = validity_start in
and+ auditor_pub = auditor_pub in
enable_auditor ~output ~master_key ~auditor_url ~auditor_name ~auditor_pub
~validity_start
let disable_auditor_cmd =
let doc = "Disable auditor." in
let auditor_pub =
Arg.(required & opt (some eddsa_pub) None & info [ "auditor_pub" ])
in
let validity_end =
Arg.(required & opt (some timestamp) None & info [ "validity_end" ])
in
Cmd.make (Cmd.info "disable-auditor" ~doc)
@@
let+ output = output
and+ master_key = master_key
and+ auditor_pub = auditor_pub
and+ validity_end = validity_end in
disable_auditor ~output ~master_key ~auditor_pub ~validity_end
and+ auditor_pub = auditor_pub in
disable_auditor ~output ~master_key ~auditor_pub
let wire_fee_cmd =
let doc = "Provides wire fee configuration." in
@ -261,6 +285,36 @@ let global_fees_cmd =
~account_fee ~purse_fee ~history_expiration ~purse_account_limit
~purse_timeout
let enable_wire_cmd =
let doc = "Enable wire method." in
let payto_uri =
Arg.(required & opt (some string) None & info [ "payto_uri" ])
in
let bank_label =
Arg.(value & opt (some string) None & info [ "bank_label" ])
in
let priority = Arg.(value & opt (some int) None & info [ "priority" ]) in
Cmd.make (Cmd.info "enable-wire" ~doc)
@@
let+ output = output
and+ master_key = master_key
and+ payto_uri = payto_uri
and+ bank_label = bank_label
and+ priority = priority in
enable_wire ~output ~master_key ~payto_uri ~bank_label ~priority
let disable_wire_cmd =
let doc = "Disable wire method." in
let payto_uri =
Arg.(required & opt (some string) None & info [ "payto_uri" ])
in
Cmd.make (Cmd.info "disable-wire" ~doc)
@@
let+ output = output
and+ master_key = master_key
and+ payto_uri = payto_uri in
disable_wire ~output ~master_key ~payto_uri
let drain_cmd =
let doc =
"Drain profits from the exchange. The actual drain requires running the \
@ -304,7 +358,11 @@ let cli =
disable_auditor_cmd;
wire_fee_cmd;
global_fees_cmd;
enable_wire_cmd;
disable_wire_cmd;
drain_cmd;
(* - *)
test_hash64_cmd;
]
let main () = Cmd.eval_result cli

View file

@ -275,9 +275,10 @@ let global_fees ~output ~master_key ~start_date ~end_date ~history_fee
let* () = write_file output s in
Ok ()
let enable_auditor ~output ~master_key ~auditor_url ~auditor_name ~auditor_pub
~validity_start =
let enable_auditor ~output ~master_key ~auditor_url ~auditor_name ~auditor_pub =
let* key = read_master_key_file master_key in
let ns = Mtime_clock.now_ns () in
let validity_start = Timestamp.of_s @@ Int64.unsigned_div ns 1_000_000_000L in
let master_sig =
let open Signatures.MasterAddAuditor in
signf (EddsaSignature.sign ~key)
@ -295,8 +296,10 @@ let enable_auditor ~output ~master_key ~auditor_url ~auditor_name ~auditor_pub
let* () = write_file output s in
Ok ()
let disable_auditor ~output ~master_key ~auditor_pub ~validity_end =
let disable_auditor ~output ~master_key ~auditor_pub =
let* key = read_master_key_file master_key in
let ns = Mtime_clock.now_ns () in
let validity_end = Timestamp.of_s @@ Int64.unsigned_div ns 1_000_000_000L in
let master_sig =
let open Signatures.MasterDelAuditor in
signf (EddsaSignature.sign ~key) { end_date= validity_end; auditor_pub }
@ -335,9 +338,84 @@ let wire_fee ~output ~master_key ~wire_method ~fee_start ~fee_end ~closing_fee
let* () = write_file output s in
Ok ()
(* TODO wire
hash over json, hash over string option?
~conversion_url ~credit_restrictions ~debit_restrictions *)
let enable_wire ~output ~master_key ~payto_uri ~bank_label ~priority =
let* key = read_master_key_file master_key in
let ns = Mtime_clock.now_ns () in
let validity_start = Timestamp.of_s @@ Int64.unsigned_div ns 1_000_000_000L in
let h_wire_details = Hash.FullPaytoHash.hash payto_uri in
let conversion_url = None in
let credit_restrictions = [] in
let debit_restrictions = [] in
let h_conversion_url =
Hash.Cstring.H64.hash ((* ?? *) Option.value ~default:"" conversion_url)
in
let h_credit_restrictions = Hash.Cstring.H64.hash "" in
let h_debit_restrictions = Hash.Cstring.H64.hash "" in
let master_sig_wire =
let open Signatures.MasterWireDetails in
signf (EddsaSignature.sign ~key)
{
h_wire_details;
h_conversion_url;
h_credit_restrictions;
h_debit_restrictions;
}
in
let master_sig_add =
let open Signatures.MasterAddWire in
signf (EddsaSignature.sign ~key)
{
start_date= validity_start;
h_wire= h_wire_details;
h_conversion_url;
h_credit_restrictions;
h_debit_restrictions;
}
in
let v =
Api.WireSetupMessage.
{
master_sig_wire;
master_sig_add;
payto_uri;
conversion_url;
credit_restrictions;
debit_restrictions;
validity_start;
bank_label;
priority;
}
in
let* s = Api.encode Api.WireSetupMessage.jsont v in
let* () = write_file output s in
Ok ()
let disable_wire ~output ~master_key ~payto_uri =
let* key = read_master_key_file master_key in
let ns = Mtime_clock.now_ns () in
let validity_end = Timestamp.of_s @@ Int64.unsigned_div ns 1_000_000_000L in
let h_wire = Hash.FullPaytoHash.hash payto_uri in
let master_sig_del =
let open Signatures.MasterDelWire in
signf (EddsaSignature.sign ~key) { end_date= validity_end; h_wire }
in
let v = Api.WireTeardownMessage.{ payto_uri; master_sig_del; validity_end } in
let* s = Api.encode Api.WireTeardownMessage.jsont v in
let* () = write_file output s in
Ok ()
let drain ~output ~master_key ~debit_account_section ~credit_payto_uri ~wtid
~date ~amount =
let* key = read_master_key_file master_key in
let* () =
match String.length wtid = 32 with
| false -> Error "invalid wtid: must be 32 bytes"
| true -> Ok ()
in
let master_sig =
let open Signatures.MasterDrainProfit in
signf (EddsaSignature.sign ~key)