store secmod data on POST /management/keys

This commit is contained in:
swrup 2026-01-24 08:23:37 +01:00
parent eaf9d7cb56
commit 46a82fc998
3 changed files with 34 additions and 33 deletions

View file

@ -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