http_msgsign_draft/sign/
response.rs1use crate::errors::{SignError, VerificationError};
2use crate::sign::{SignatureInput, SignatureParams};
3use crate::sign::{SignerKey, VerifierKey};
4
5pub trait ResponseSign {
7 fn sign<S: SignerKey>(
8 self,
9 key: &S,
10 params: &SignatureParams,
11 ) -> impl Future<Output = Result<Self, SignError>> + Send
12 where
13 Self: Sized;
14
15 fn verify_sign<V: VerifierKey>(
16 self,
17 key: &V,
18 ) -> impl Future<Output = Result<Self, VerificationError>> + Send
19 where
20 Self: Sized;
21}
22
23impl<B> ResponseSign for http::Response<B>
24where
25 B: http_body::Body + Send + Sync,
26 B::Data: Send,
27{
28 async fn sign<S: SignerKey>(
29 self,
30 key: &S,
31 params: &SignatureParams,
32 ) -> Result<Self, SignError> {
33 let base = params.seek_response(&self)?;
34 let (mut parts, body) = self.into_parts();
35 let (name, value) = base.to_signature_header(key);
36 parts.headers.insert(name, value);
37
38 Ok(Self::from_parts(parts, body))
39 }
40
41 async fn verify_sign<V: VerifierKey>(self, key: &V) -> Result<Self, VerificationError> {
42 let (parts, body) = self.into_parts();
43 let input = SignatureInput::from_header(&parts.headers)?;
44
45 let res = Self::from_parts(parts, body);
46 let seeked = input.seek_response(&res)?;
47
48 seeked.verify(key, &input.signature)?;
49
50 Ok(res)
51 }
52}