open Bos.OS open Syntax open Crypto let read fname = let* b = File.exists fname in match b with | false -> Ok None | true -> let+ content = File.read fname in Some content let read_eddsa fname = let+ content_opt = read fname in Option.map EddsaPrivateKey.of_octets content_opt let read_rsa fname = let+ content_opt = read fname in Option.map RsaPrivateKey.of_octets content_opt let write_eddsa fname priv = EddsaPrivateKey.to_octets priv |> File.write fname let write_rsa fname priv = RsaPrivateKey.to_octets priv |> File.write fname let load_signkey conn fname = let* opt = read_eddsa fname in match opt with | None -> Ok None | Some priv -> ( let pub = EddsaPrivateKey.pub_of_priv priv in let* opt = Pg.lookup_signing_key conn pub in match opt with | None -> Fmt.error_msg "load_signkey error no associated metadata found in database for \ signkey `%s`." (Fpath.to_string fname) | Some (stamp_start, stamp_expire, stamp_end) -> (* TODO master_sig *) let master_sig = None in let v = Signkey. { pub; priv; stamp_start; stamp_expire; stamp_end; master_sig } in Ok (Some v)) let load_denom conn ~section_name fname = let* opt = read_rsa fname in match opt with | None -> Ok None | Some priv -> ( let pub = RsaPrivateKey.pub_of_priv priv in let h_pub = Bin_type.DenominationHash.hash (RsaPublicKey.to_octets pub) in let* opt = Pg.lookup_denomination_key conn h_pub in match opt with | None -> Fmt.error_msg "load_denom error no associated metadata found in database for \ denom `%s`." (Fpath.to_string fname) | Some ( stamp_start, stamp_expire_withdraw, stamp_expire_deposit, stamp_expire_legal, value, fee_withdraw, fee_deposit, fee_refresh, fee_refund, age_mask ) -> (* TODO master_sig *) let master_sig = None in let v = Denomination. { pub; priv; section_name; value; stamp_start; stamp_expire_withdraw; stamp_expire_deposit; stamp_expire_legal; fee_withdraw; fee_deposit; fee_refresh; fee_refund; age_mask; h_pub; master_sig; } in Ok (Some v))