diff --git a/src/api.ml b/src/api.ml index e1f36ddc..c3377f43 100644 --- a/src/api.ml +++ b/src/api.ml @@ -69,6 +69,7 @@ module HashCode : sig type t val hash : string -> t + val of_b32 : B32.t -> (t, string) result val to_denomination_hash : t -> Bin_type.DenominationHash.t val jsont : t Jsont.t end = struct @@ -80,6 +81,7 @@ end = struct let open Digestif.SHA512 in s |> digest_string |> to_raw_string + let of_b32 = B32.decode let jsont = B32.jsont end diff --git a/src/handler.ml b/src/handler.ml index 259592fe..d75949bc 100644 --- a/src/handler.ml +++ b/src/handler.ml @@ -26,7 +26,7 @@ end include Respond_util open Api -let keys_get req server _env = +let management_keys_get req server _env = let sm_signkey = Vif.Server.device Devices.secmod_signkey server in let sm_denom = Vif.Server.device Devices.secmod_denom server in let res = @@ -36,9 +36,9 @@ let keys_get req server _env = in respond_with_res res req -let keys_post_jsont = MasterSignatures.jsont +let management_keys_post_jsont = MasterSignatures.jsont -let keys_post req server _env = +let management_keys_post req server _env = let open Syntax in let open Management in let db_conn = Vif.Server.device Devices.db_connection server in @@ -55,3 +55,21 @@ let keys_post req server _env = Ok "" in respond_with_res res req + +let management_denom_revoke_jsont = DenomRevocationSignature.jsont + +let management_denom_revoke req h_denom_pub server _env = + let open Syntax in + let open Management in + let db_conn = Vif.Server.device Devices.db_connection server in + let sm_signkey = Vif.Server.device Devices.secmod_signkey server in + let sm_denom = Vif.Server.device Devices.secmod_denom server in + let res = + let* h_denom_pub = HashCode.of_b32 h_denom_pub in + let h_denom_pub = HashCode.to_denomination_hash h_denom_pub in + let* v = Vif.Request.of_json req |> unwrap_err_msg in + let* () = verify_denom_revocation_sig ~h_denom_pub v in + let* () = update_denom_revocation ~db_conn ~sm_signkey ~sm_denom v in + Ok "" + in + respond_with_res res req diff --git a/src/management.ml b/src/management.ml index 580b1758..87418c66 100644 --- a/src/management.ml +++ b/src/management.ml @@ -213,3 +213,12 @@ let update_master_signatures ~db_conn ~sm_signkey ~sm_denom in let* () = check_master_signatures_update ~db_conn ~sm_denom in Ok () + +[@@@ocaml.warning "-27"] + +let verify_denom_revocation_sig ~h_denom_pub + DenomRevocationSignature.{ master_sig } = + let open Bin_sig.MasterDenominationKeyRevocation in + verify ~key:Config.Exchange.master_public_key master_sig { h_denom_pub } + +let update_denom_revocation ~db_conn ~sm_signkey ~sm_denom v = Ok () diff --git a/src/mte.ml b/src/mte.ml index b164d851..3e82c256 100644 --- a/src/mte.ml +++ b/src/mte.ml @@ -32,8 +32,13 @@ let routes = get_ rel --> hello; get_ (v "terms") --> Static.terms; get_ (v "privacy") --> Static.privacy; - get_ (v "management" / "keys") --> keys_get; - post (v "management" / "keys") keys_post_jsont --> keys_post; + get_ (v "management" / "keys") --> management_keys_get; + post (v "management" / "keys") management_keys_post_jsont + --> management_keys_post; + post + (v "management" / "denominations" /% string `Path / "revoke") + management_denom_revoke_jsont + --> management_denom_revoke; ] let () =