This commit is contained in:
swrup 2026-02-21 16:45:59 +01:00
parent 84c3b8bec5
commit 7f440077ed
6 changed files with 101 additions and 96 deletions

View file

@ -14,7 +14,7 @@ type key = {
type t = {
sm_key_priv: EddsaPrivateKey.t;
sm_key_pub: EddsaPublicKey.t;
sm_pub: EddsaPublicKey.t;
ht: (RsaPublicKey.t, key) Hashtbl.t;
}
@ -153,10 +153,10 @@ let load () =
| [] -> Ok None
| _l ->
let* sm_key_priv = read_eddsa sm_key_fpath in
let sm_key_pub = EddsaPrivateKey.pub_of_priv sm_key_priv in
let sm_pub = EddsaPrivateKey.pub_of_priv sm_key_priv in
let ht = Hashtbl.create 0xff in
let () = List.iter (fun k -> Hashtbl.replace ht k.pub k) keys in
Ok (Some { sm_key_priv; sm_key_pub; ht })
Ok (Some { sm_key_priv; sm_pub; ht })
let init () =
let* opt = load () in
@ -164,10 +164,10 @@ let init () =
match opt with
| Some t -> Ok t
| None ->
let sm_key_priv, sm_key_pub = EddsaPrivateKey.generate () in
let sm_key_priv, sm_pub = EddsaPrivateKey.generate () in
let* () = write_eddsa sm_key_fpath sm_key_priv in
let ht = Hashtbl.create 0xff in
Ok { sm_key_priv; sm_key_pub; ht }
Ok { sm_key_priv; sm_pub; ht }
in
let now = Absolute.of_ptime (Ptime_clock.now ()) in
let all_keys = List.of_seq @@ Hashtbl.to_seq_values t.ht in
@ -193,26 +193,11 @@ let t =
| Error e -> Fmt.failwith "secmod_rsa initialization failure: %s." e
| Ok t -> t
let sm_key_pub = t.sm_key_pub
let keys () =
Hashtbl.to_seq_values t.ht
|> List.of_seq
|> List.map (fun { section_name; priv= _; pub; t1; t2 } ->
(section_name, pub, t1, t2))
let sign_with_sm_key s = EddsaSignature.sign ~key:t.sm_key_priv s
let find_key pub =
let find pub =
Hashtbl.find_opt t.ht pub |> Option.to_result ~none:"key not found"
let sign ~pub s =
let+ k = find_key pub in
let data = RsaSignature.sign ~key:k.priv s in
data
let delete_key pub =
let* k = find_key pub in
let delete pub =
let* k = find pub in
Hashtbl.remove t.ht k.pub; delete_key_file k
let delete_outdated ~now =
@ -220,17 +205,33 @@ let delete_outdated ~now =
|> List.of_seq
|> List.filter (fun k -> Absolute.compare now k.t2 >= 0)
|> List.map (fun k -> k.pub)
|> list_iter delete_key
|> list_iter delete
let add_key section_name t1 t2 =
let add section_name t1 t2 =
let priv, pub = RsaPrivateKey.generate ~bits:Cfg.rsa_keysize () in
let k = { section_name; priv; pub; t1; t2 } in
Hashtbl.replace t.ht k.pub k;
()
(* delete and replace *)
let revoke_key pub =
let* k = find_key pub in
let* () = delete_key pub in
add_key k.section_name k.t1 k.t2;
(* ---- *)
let sm_pub = t.sm_pub
let keys () =
Hashtbl.to_seq_values t.ht
|> List.of_seq
|> List.map (fun { section_name; priv= _; pub; t1; t2 } ->
(section_name, pub, t1, t2))
let sign_secmod s = EddsaSignature.sign ~key:t.sm_key_priv s
let sign ~pub s =
let+ k = find pub in
let data = RsaSignature.sign ~key:k.priv s in
data
let revoke pub =
let* k = find pub in
let* () = delete pub in
add k.section_name k.t1 k.t2;
Ok ()