This commit is contained in:
swrup 2026-01-24 06:12:52 +01:00
parent 04bc0b6566
commit 996a2c9eb9
5 changed files with 35 additions and 26 deletions

BIN
data/secmod/kudo_1 Normal file

Binary file not shown.

BIN
data/secmod/kudo_2 Normal file

Binary file not shown.

1
data/secmod/sk_0 Normal file
View file

@ -0,0 +1 @@
坝嚯p幪xR 廃B饦<42>r领壕鶏下>

1
data/secmod/sm_key Normal file
View file

@ -0,0 +1 @@
<EFBFBD>òõ±ÝâO<C3A2>qûöпöo—èAû}ÍÀ]€Y§.?

View file

@ -70,7 +70,7 @@ module Make (Conn : Pg.CONN) = struct
dn_section_name_ht: (denomination_hash, string) Hashtbl.t; dn_section_name_ht: (denomination_hash, string) Hashtbl.t;
} }
let dir = Fpath.(v "data" / "secmod ") let dir = Fpath.(v "data" / "secmod")
let db_lookup_signkey_data conn fname priv = let db_lookup_signkey_data conn fname priv =
let pub = EddsaPrivateKey.pub_of_priv priv in let pub = EddsaPrivateKey.pub_of_priv priv in
@ -110,7 +110,7 @@ module Make (Conn : Pg.CONN) = struct
in in
let* sm_key_priv = Data_file.read_eddsa Fpath.(dir / "sm_key") in let* sm_key_priv = Data_file.read_eddsa Fpath.(dir / "sm_key") in
let* signkeys = let* signkeys =
let l = List.init 1 (fun i -> Fpath.(dir / string_of_int i)) in let l = List.init 1 (fun i -> Fpath.(dir / Fmt.str "sk_%d" i)) in
let* l = list_map (fun fname -> load_signkey conn fname) l in let* l = list_map (fun fname -> load_signkey conn fname) l in
match opt_list l with Error () -> error_invalid_state | Ok opt -> Ok opt match opt_list l with Error () -> error_invalid_state | Ok opt -> Ok opt
in in
@ -249,18 +249,44 @@ module Make (Conn : Pg.CONN) = struct
in in
{ lock; sm_key_priv; sm_key_pub; sk_ht; dn_ht; dn_section_name_ht } { lock; sm_key_priv; sm_key_pub; sk_ht; dn_ht; dn_section_name_ht }
let store t =
let* () = Data_file.write_eddsa Fpath.(dir / "sm_key") 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* () =
Hashtbl.to_seq_values t.dn_ht
|> List.of_seq
|> List.map (fun (key : denom) ->
let section_name =
Hashtbl.find t.dn_section_name_ht key.dn_data.h_pub
in
let fname = Fpath.(dir / section_name) in
(fname, key.priv))
|> list_iter (fun (fname, key) -> Data_file.write_rsa fname key)
in
Ok ()
let t = let t =
match load (module Conn) with match load (module Conn) with
| Ok None -> | Ok None ->
let t = make_new () in let t = make_new () in
let () =
match store t with
| Error (`Msg e) -> Fmt.failwith "secmod storage failure: %s." e
| Ok () -> ()
in
Logs.info (fun m -> m "secmod initialized with fresh keys"); Logs.info (fun m -> m "secmod initialized with fresh keys");
t t
| Ok (Some v) -> | Ok (Some t) ->
Logs.info (fun m -> m "secmod initialized from storage"); Logs.info (fun m -> m "secmod initialized from storage");
v t
| Error _ -> | Error _ -> Fmt.failwith "secmod init failure."
(* TODO error: pretty print *)
Fmt.failwith "secmod init failure."
(* note: don't expose a signing function if we want a real "security module" one day *) (* note: don't expose a signing function if we want a real "security module" one day *)
let sign_with_sm_key s = EddsaSignature.sign ~key:t.sm_key_priv s let sign_with_sm_key s = EddsaSignature.sign ~key:t.sm_key_priv s
@ -369,23 +395,4 @@ module Make (Conn : Pg.CONN) = struct
let denom = { denom with dn_data } in let denom = { denom with dn_data } in
Hashtbl.replace t.dn_ht h_denom_pub denom; Hashtbl.replace t.dn_ht h_denom_pub denom;
Ok () Ok ()
(* TODO *)
let _store t =
let* () = Data_file.write_eddsa Fpath.(dir / "sm_key") t.sm_key_priv in
let* () =
get_signkeys ()
|> List.mapi (fun i (key : signkey) ->
let fname = Fpath.(dir / string_of_int i) in
(fname, key.priv))
|> list_iter (fun (fname, key) -> Data_file.write_eddsa fname key)
in
let* () =
get_denoms ()
|> List.mapi (fun i (key : denom) ->
let fname = Fpath.(dir / string_of_int i) in
(fname, key.priv))
|> list_iter (fun (fname, key) -> Data_file.write_rsa fname key)
in
Ok ()
end end