From e97217398f4fb159756df8e89830c2aace51dda6 Mon Sep 17 00:00:00 2001 From: swrup Date: Sat, 24 Jan 2026 08:23:37 +0100 Subject: [PATCH] --- src/http_management.ml | 1 + src/secmod.ml | 64 ++++++++++++++++++++---------------------- src/secmod.mli | 2 ++ 3 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/http_management.ml b/src/http_management.ml index cb4e414c..486b141b 100644 --- a/src/http_management.ml +++ b/src/http_management.ml @@ -197,6 +197,7 @@ module Keys_post = struct (h_denom_pub, master_sig)) |> Sm.add_denom_master_signatures in + let* () = Sm.store () in let* () = check_master_signatures_update ~db_conn (module Sm) in Ok () diff --git a/src/secmod.ml b/src/secmod.ml index 6c0090dc..047aefab 100644 --- a/src/secmod.ml +++ b/src/secmod.ml @@ -37,6 +37,8 @@ module type S = sig denomination_hash -> Bin_sig.MasterDenominationKeyRevocation.t -> (unit, string) result + + val store : unit -> (unit, string) result end module Make (Conn : Pg.CONN) = struct @@ -249,43 +251,10 @@ module Make (Conn : Pg.CONN) = struct in { lock; sm_key_priv; sm_key_pub; sk_ht; dn_ht; dn_section_name_ht } - let store t = - Miou.Mutex.protect t.lock @@ fun () -> - let* () = Data_file.write_eddsa Fpath.(dir / "sk_sm") t.sm_key_priv in - let* () = - Hashtbl.to_seq_values t.sk_ht - |> List.of_seq - |> List.mapi (fun i (key : signkey) -> - let fname = Fpath.(dir / Fmt.str "sk_%d" i) in - (fname, key.priv)) - |> list_iter (fun (fname, key) -> Data_file.write_eddsa fname key) - in - let* () = - let* l = - Hashtbl.to_seq_values t.dn_ht - |> List.of_seq - |> Syntax.list_map (fun (key : denom) -> - let+ section_name = - match Hashtbl.find_opt t.dn_section_name_ht key.dn_data.h_pub with - | None -> Error "invalid state, section_name not found" - | Some s -> Ok s - in - let fname = Fpath.(dir / section_name) in - (fname, key.priv)) - in - list_iter (fun (fname, key) -> Data_file.write_rsa fname key) l - in - Ok () - let t = match load (module Conn) with | Ok None -> let t = make_new () in - let () = - match store t with - | Error e -> Fmt.failwith "secmod storage failure: %s." e - | Ok () -> () - in Logs.info (fun m -> m "secmod initialized with fresh keys"); t | Ok (Some t) -> @@ -400,4 +369,33 @@ module Make (Conn : Pg.CONN) = struct let denom = { denom with dn_data } in Hashtbl.replace t.dn_ht h_denom_pub denom; Ok () + + let store () = + Miou.Mutex.protect t.lock @@ fun () -> + let* () = Data_file.write_eddsa Fpath.(dir / "sk_sm") t.sm_key_priv in + let* () = + Hashtbl.to_seq_values t.sk_ht + |> List.of_seq + |> List.mapi (fun i (key : signkey) -> + let fname = Fpath.(dir / Fmt.str "sk_%d" i) in + (fname, key.priv)) + |> list_iter (fun (fname, key) -> Data_file.write_eddsa fname key) + in + let* () = + let* l = + Hashtbl.to_seq_values t.dn_ht + |> List.of_seq + |> Syntax.list_map (fun (key : denom) -> + let+ section_name = + match Hashtbl.find_opt t.dn_section_name_ht key.dn_data.h_pub with + | None -> Error "invalid state, section_name not found" + | Some s -> Ok s + in + let fname = Fpath.(dir / section_name) in + (fname, key.priv)) + in + list_iter (fun (fname, key) -> Data_file.write_rsa fname key) l + in + Logs.info (fun m -> m "stored secmod data to file"); + Ok () end diff --git a/src/secmod.mli b/src/secmod.mli index 2a24ca9f..6faafd11 100644 --- a/src/secmod.mli +++ b/src/secmod.mli @@ -37,6 +37,8 @@ module type S = sig denomination_hash -> Bin_sig.MasterDenominationKeyRevocation.t -> (unit, string) result + + val store : unit -> (unit, string) result end module Make (_ : Pg.CONN) : S