Skip to main content

http_msgsign_draft/sign/
response.rs

1use crate::errors::{SignError, VerificationError};
2use crate::sign::{SignatureInput, SignatureParams};
3use crate::sign::{SignerKey, VerifierKey};
4
5//noinspection DuplicatedCode
6pub 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<(), VerificationError>> + Send
19    where
20        Self: Sized + Sync;
21}
22
23impl<B> ResponseSign for http::Response<B>
24where
25    B: http_body::Body + Send,
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<(), VerificationError> {
42        let input = SignatureInput::try_from(self)?;
43        let seeked = input.seek_response(self)?;
44        seeked.verify(key, &input.signature)?;
45        Ok(())
46    }
47}