server.rs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. use std::net::SocketAddr;
  2. use tonic::transport::{Error, Server};
  3. use tonic::{Request, Response, Status};
  4. use super::{boolean_response, key_rotation_response, keys_response, BooleanResponse};
  5. use crate::proto::{self, signatory_server};
  6. use crate::signatory::Signatory;
  7. pub struct CdkSignatoryServer<T>
  8. where
  9. T: Signatory + Send + Sync + 'static,
  10. {
  11. inner: T,
  12. }
  13. #[tonic::async_trait]
  14. impl<T> signatory_server::Signatory for CdkSignatoryServer<T>
  15. where
  16. T: Signatory + Send + Sync + 'static,
  17. {
  18. async fn blind_sign(
  19. &self,
  20. request: Request<proto::BlindedMessages>,
  21. ) -> Result<Response<proto::BlindSignResponse>, Status> {
  22. let result = match self
  23. .inner
  24. .blind_sign(
  25. request
  26. .into_inner()
  27. .blinded_messages
  28. .into_iter()
  29. .map(|blind_message| blind_message.try_into())
  30. .collect::<Result<Vec<_>, _>>()?,
  31. )
  32. .await
  33. {
  34. Ok(blind_signatures) => {
  35. proto::blind_sign_response::Result::Sigs(proto::BlindSignatures {
  36. blind_signatures: blind_signatures
  37. .into_iter()
  38. .map(|blind_sign| blind_sign.into())
  39. .collect(),
  40. })
  41. }
  42. Err(err) => proto::blind_sign_response::Result::Error(err.into()),
  43. };
  44. //.map_err(|e| Status::from_error(Box::new(e)))?;
  45. Ok(Response::new(proto::BlindSignResponse {
  46. result: Some(result),
  47. }))
  48. }
  49. async fn verify_proofs(
  50. &self,
  51. request: Request<proto::Proofs>,
  52. ) -> Result<Response<proto::BooleanResponse>, Status> {
  53. let result = match self
  54. .inner
  55. .verify_proofs(
  56. request
  57. .into_inner()
  58. .proof
  59. .into_iter()
  60. .map(|x| x.try_into())
  61. .collect::<Result<Vec<_>, _>>()?,
  62. )
  63. .await
  64. {
  65. Ok(()) => boolean_response::Result::Success(true),
  66. Err(cdk_common::Error::DHKE(_)) => boolean_response::Result::Success(false),
  67. Err(err) => boolean_response::Result::Error(err.into()),
  68. };
  69. Ok(Response::new(BooleanResponse {
  70. result: Some(result),
  71. }))
  72. }
  73. async fn keysets(
  74. &self,
  75. _request: Request<proto::EmptyRequest>,
  76. ) -> Result<Response<proto::KeysResponse>, Status> {
  77. let result = match self.inner.keysets().await {
  78. Ok(result) => keys_response::Result::Keysets(result.into()),
  79. Err(err) => keys_response::Result::Error(err.into()),
  80. };
  81. Ok(Response::new(proto::KeysResponse {
  82. result: Some(result),
  83. }))
  84. }
  85. async fn rotate_keyset(
  86. &self,
  87. request: Request<proto::RotationRequest>,
  88. ) -> Result<Response<proto::KeyRotationResponse>, Status> {
  89. let mint_keyset_info = match self
  90. .inner
  91. .rotate_keyset(request.into_inner().try_into()?)
  92. .await
  93. {
  94. Ok(result) => key_rotation_response::Result::Keyset(result.into()),
  95. Err(err) => key_rotation_response::Result::Error(err.into()),
  96. };
  97. Ok(Response::new(proto::KeyRotationResponse {
  98. result: Some(mint_keyset_info),
  99. }))
  100. }
  101. }
  102. /// Runs the signatory server
  103. pub async fn grpc_server<T>(signatory: T, addr: SocketAddr) -> Result<(), Error>
  104. where
  105. T: Signatory + Send + Sync + 'static,
  106. {
  107. tracing::info!("grpc_server listening on {}", addr);
  108. Server::builder()
  109. .add_service(signatory_server::SignatoryServer::new(CdkSignatoryServer {
  110. inner: signatory,
  111. }))
  112. .serve(addr)
  113. .await?;
  114. Ok(())
  115. }