This commit is contained in:
swrup 2025-11-29 14:03:37 +01:00
parent 760e6de1fb
commit 97cb41e904

View file

@ -1,3 +1,6 @@
open Syntax
open Crypto
type env = {
caqti_switch: Caqti_miou.Switch.t;
db_uri: Uri.t;
@ -27,51 +30,40 @@ module Secmod_signkey = struct
let dir = Fpath.(v "data" / "secmod_signkey")
let read_eddsa_key_files fname =
let open Syntax in
let open Bos.OS in
let open Crypto in
let pub = Fpath.(dir / fname) |> Fpath.set_ext "pub" in
let priv = Fpath.(dir / fname) in
let* b0 = File.exists pub in
let* b1 = File.exists priv in
match (b0, b1) with
| true, true ->
let* pub = File.read pub in
let* priv = File.read priv in
let pub = EddsaPublicKey.of_octets pub in
let priv = EddsaPrivateKey.of_octets priv in
Ok (Some (pub, priv))
| false, false -> Ok None
| _, _ -> Error (`Msg "secmod_signkey: invalid local file state.")
let fname = Fpath.(dir / fname) in
let* b = File.exists fname in
match b with
| false -> Ok None
| true ->
let+ content = File.read fname in
let priv = EddsaPrivateKey.of_octets content in
Some priv
let write_eddsa_key_files fname signkey =
let open Syntax in
let open Bos.OS in
let open Crypto in
let pub_file = Fpath.(dir / fname) |> Fpath.set_ext "pub" in
let priv_file = Fpath.(dir / fname) in
let pub = EddsaPublicKey.to_octets signkey.Signkey.pub in
let priv = EddsaPrivateKey.to_octets signkey.priv in
let* () = File.write pub_file pub in
let* () = File.write priv_file priv in
Ok ()
let fname = Fpath.(dir / fname) in
let content = EddsaPrivateKey.to_octets signkey.Signkey.priv in
let+ () = File.write fname content in
()
let write_local_keys t =
let open Syntax in
let* () = write_eddsa_key_files "eddsa_sm_key" t.sm_key in
let keys =
List.mapi (fun i key -> ("eddsa_" ^ string_of_int i, key)) t.keys
in
let* () = list_iter (fun (s, key) -> write_eddsa_key_files s key) keys in
Ok ()
let+ () =
list_iter (fun (fname, key) -> write_eddsa_key_files fname key) keys
in
()
let load_local_keys conn =
let open Syntax in
let load s =
let* opt = read_eddsa_key_files s in
match opt with
| None -> Ok None
| Some (pub, priv) -> (
| Some priv -> (
let pub = EddsaPrivateKey.pub_of_priv priv in
let* opt = Pg.lookup_signing_key conn pub in
match opt with
| None ->
@ -80,6 +72,7 @@ module Secmod_signkey = struct
database for key `%s`."
s
| Some (stamp_start, stamp_expire, stamp_end) ->
(* TODO master_sig *)
let master_sig = None in
Ok
(Some
@ -114,15 +107,11 @@ module Secmod_signkey = struct
@@ fun conn (_env : env) ->
match load_local_keys conn with
| Ok None ->
Fmt.pr "secmod_signkey: generate_fresh_keys@.";
let t = generate_fresh_keys () in
(*write_local_keys t |> Result.get_ok;*)
t
| Ok (Some v) ->
Fmt.pr "secmod_signkey: loaded local keys@.";
v
| Ok (Some v) -> v
| Error _ ->
(* TODO pp error *)
(* TODO error: pretty print *)
Fmt.failwith "secmod_signkey init failure."
end