This commit is contained in:
parent
906be6760a
commit
26df105afd
2 changed files with 24 additions and 16 deletions
|
|
@ -13,7 +13,7 @@ type key = {
|
||||||
type t = {
|
type t = {
|
||||||
sm_key_priv: EddsaPrivateKey.t;
|
sm_key_priv: EddsaPrivateKey.t;
|
||||||
sm_key_pub: EddsaPublicKey.t;
|
sm_key_pub: EddsaPublicKey.t;
|
||||||
mutable keys: key list;
|
ht: (EddsaPublicKey.t, key) Hashtbl.t;
|
||||||
}
|
}
|
||||||
|
|
||||||
(* -- util -- *)
|
(* -- util -- *)
|
||||||
|
|
@ -138,7 +138,9 @@ let load () =
|
||||||
| _l ->
|
| _l ->
|
||||||
let* sm_key_priv = read_key sm_key_fpath in
|
let* sm_key_priv = read_key sm_key_fpath in
|
||||||
let sm_key_pub = EddsaPrivateKey.pub_of_priv sm_key_priv in
|
let sm_key_pub = EddsaPrivateKey.pub_of_priv sm_key_priv in
|
||||||
Ok (Some { sm_key_priv; sm_key_pub; keys })
|
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 })
|
||||||
|
|
||||||
let init () =
|
let init () =
|
||||||
let* opt = load () in
|
let* opt = load () in
|
||||||
|
|
@ -148,13 +150,15 @@ let init () =
|
||||||
| None ->
|
| None ->
|
||||||
let sm_key_priv, sm_key_pub = EddsaPrivateKey.generate () in
|
let sm_key_priv, sm_key_pub = EddsaPrivateKey.generate () in
|
||||||
let* () = write_eddsa sm_key_fpath sm_key_priv in
|
let* () = write_eddsa sm_key_fpath sm_key_priv in
|
||||||
Ok { sm_key_priv; sm_key_pub; keys= [] }
|
let ht = Hashtbl.create 0xff in
|
||||||
|
Ok { sm_key_priv; sm_key_pub; ht }
|
||||||
in
|
in
|
||||||
let now = Absolute.of_ptime (Ptime_clock.now ()) in
|
let now = Absolute.of_ptime (Ptime_clock.now ()) in
|
||||||
let new_keys = gen_additional_keys_until_lookahead ~now t.keys in
|
let keys = List.of_seq @@ Hashtbl.to_seq_values t.ht in
|
||||||
|
let new_keys = gen_additional_keys_until_lookahead ~now keys in
|
||||||
|
let () = List.iter (fun k -> Hashtbl.replace t.ht k.pub k) keys in
|
||||||
let+ () = list_iter write_key new_keys in
|
let+ () = list_iter write_key new_keys in
|
||||||
let keys = sort_keys (t.keys @ new_keys) in
|
t
|
||||||
{ t with keys }
|
|
||||||
|
|
||||||
(* --- *)
|
(* --- *)
|
||||||
|
|
||||||
|
|
@ -164,12 +168,16 @@ let t =
|
||||||
| Ok t -> t
|
| Ok t -> t
|
||||||
|
|
||||||
let sm_key_pub = t.sm_key_pub
|
let sm_key_pub = t.sm_key_pub
|
||||||
let keys () = List.map (fun { priv= _; pub; t1; t2 } -> (pub, t1, t2)) t.keys
|
|
||||||
|
let keys () =
|
||||||
|
Hashtbl.to_seq_values t.ht
|
||||||
|
|> List.of_seq
|
||||||
|
|> List.map (fun { priv= _; pub; t1; t2 } -> (pub, t1, t2))
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
let find_key pub =
|
let find_key pub =
|
||||||
List.find_opt (fun k -> k.pub = pub) t.keys
|
Hashtbl.find_opt t.ht pub |> Option.to_result ~none:"key not found"
|
||||||
|> Option.to_result ~none:"key not found"
|
|
||||||
|
|
||||||
let sign ~pub s =
|
let sign ~pub s =
|
||||||
let+ k = find_key pub in
|
let+ k = find_key pub in
|
||||||
|
|
@ -178,12 +186,11 @@ let sign ~pub s =
|
||||||
|
|
||||||
let delete_key pub =
|
let delete_key pub =
|
||||||
let* k = find_key pub in
|
let* k = find_key pub in
|
||||||
let l = List.filter (fun k -> k.pub <> pub) t.keys in
|
Hashtbl.remove t.ht k.pub; delete_key_file k
|
||||||
t.keys <- l;
|
|
||||||
delete_key_file k
|
|
||||||
|
|
||||||
let delete_outdated ~now =
|
let delete_outdated ~now =
|
||||||
t.keys
|
Hashtbl.to_seq_values t.ht
|
||||||
|
|> List.of_seq
|
||||||
|> List.filter (fun k -> Absolute.compare now k.t2 >= 0)
|
|> List.filter (fun k -> Absolute.compare now k.t2 >= 0)
|
||||||
|> List.map (fun k -> k.pub)
|
|> List.map (fun k -> k.pub)
|
||||||
|> list_iter delete_key
|
|> list_iter delete_key
|
||||||
|
|
|
||||||
|
|
@ -198,10 +198,10 @@ let t =
|
||||||
| Ok t -> t
|
| Ok t -> t
|
||||||
|
|
||||||
let sm_key_pub = t.sm_key_pub
|
let sm_key_pub = t.sm_key_pub
|
||||||
let all_keys () = List.of_seq @@ Hashtbl.to_seq_values t.ht
|
|
||||||
|
|
||||||
let keys () =
|
let keys () =
|
||||||
all_keys ()
|
Hashtbl.to_seq_values t.ht
|
||||||
|
|> List.of_seq
|
||||||
|> List.map (fun { section_name; priv= _; pub; t1; t2 } ->
|
|> List.map (fun { section_name; priv= _; pub; t1; t2 } ->
|
||||||
(section_name, pub, t1, t2))
|
(section_name, pub, t1, t2))
|
||||||
|
|
||||||
|
|
@ -220,7 +220,8 @@ let delete_key pub =
|
||||||
Hashtbl.remove t.ht k.pub; delete_key_file k
|
Hashtbl.remove t.ht k.pub; delete_key_file k
|
||||||
|
|
||||||
let delete_outdated ~now =
|
let delete_outdated ~now =
|
||||||
all_keys ()
|
Hashtbl.to_seq_values t.ht
|
||||||
|
|> List.of_seq
|
||||||
|> List.filter (fun k -> Absolute.compare now k.t2 >= 0)
|
|> List.filter (fun k -> Absolute.compare now k.t2 >= 0)
|
||||||
|> List.map (fun k -> k.pub)
|
|> List.map (fun k -> k.pub)
|
||||||
|> list_iter delete_key
|
|> list_iter delete_key
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue