(*open Types*) open Api_types let mk_future_denom denom_key_signf ({ section_name; value; stamp_start; stamp_expire_withdraw; stamp_expire_deposit; stamp_expire_legal; fee_withdraw; fee_deposit; fee_refresh; fee_refund; pub; sign= _; } : Denomination.t) = let denom_pub = DenominationKey.Rsa RsaDenominationKey.{ age_mask= 0; rsa_pub= pub } in let denom_secmod_sig = let open Binary_formats in let h_denom_pub = DenominationHash.hash pub in let h_section_name = Cstring_hash_64.hash section_name in let anchor_time = TimeAbsoluteNBO.{ v= Util.ptime_to_int64_us stamp_start } in let duration_withdraw = let v = Ptime.diff stamp_start stamp_expire_withdraw |> Util.ptime_of_span_exn |> Util.ptime_to_int64_us in TimeRelativeNBO.{ v } in let ps = DenominationKeyAnnouncementPS. { h_denom_pub; h_section_name; anchor_time; duration_withdraw } in ps |> Bin.to_string DenominationKeyAnnouncementPS.bin |> denom_key_signf in FutureDenom. { section_name; value; stamp_start= Timestamp.of_ptime stamp_start; stamp_expire_withdraw= Timestamp.of_ptime stamp_expire_withdraw; stamp_expire_deposit= Timestamp.of_ptime stamp_expire_deposit; stamp_expire_legal= Timestamp.of_ptime stamp_expire_legal; denom_pub; fee_withdraw; fee_deposit; fee_refresh; fee_refund; denom_secmod_sig; } let mk_future_signkey signkey_signf ({ pub; sign= _; stamp_start; stamp_expire; stamp_end } : Signkey.t) = let signkey_secmod_sig = let open Binary_formats in let exchange_pub = pub in let anchor_time = TimeAbsoluteNBO.{ v= Util.ptime_to_int64_us stamp_start } in let duration = let v = Ptime.diff stamp_start stamp_expire |> Util.ptime_of_span_exn |> Util.ptime_to_int64_us in TimeRelativeNBO.{ v } in let ps = SigningKeyAnnouncementPS.{ exchange_pub; anchor_time; duration } in ps |> Bin.to_string SigningKeyAnnouncementPS.bin |> signkey_signf in FutureSignKey. { key= pub; stamp_start= Timestamp.of_ptime stamp_start; stamp_expire= Timestamp.of_ptime stamp_expire; stamp_end= Timestamp.of_ptime stamp_end; signkey_secmod_sig; } let mk_future_keys_response ~signkey ~online_key ~denom_key ~denominations = let future_denoms = (* todo: "only those lacking a master signature" *) List.map (mk_future_denom denom_key.Signkey.sign) denominations in let future_signkeys = (* todo: "only those lacking a master signature" *) List.map (mk_future_signkey signkey.Signkey.sign) [ online_key ] in let master_pub = Config.Exchange.master_public_key in let denom_secmod_public_key = denom_key.pub in let signkey_secmod_public_key = signkey.pub in FutureKeysResponse. { future_denoms; future_signkeys; master_pub; denom_secmod_public_key; signkey_secmod_public_key; } let keys req server _env = let open Vif.Response in let open Syntax in let signkey = Vif.Server.device Devices.signkey server in let online_key = Vif.Server.device Devices.online_key server in let denom_key = Vif.Server.device Devices.denom_key server in let denominations = Vif.Server.device Devices.denominations server in let v = mk_future_keys_response ~signkey ~online_key ~denom_key ~denominations in let s = Json.encode_exn Json.FutureKeysResponse.jsont v in let* () = with_string req s in let* () = add ~field:"content-type" "application/json" in respond `OK