pub struct CoseEnvelope { /* private fields */ }Expand description
A COSE_Sign1 or COSE_Mac0 envelope (ADR 0006 §§1, 3-5).
Cheap to clone: the configuration sits behind one Arc. Build it with
CoseEnvelope::server or CoseEnvelope::client.
Errors, for every method (§10): a failed verification is the coarse
CratestackError::Unauthorized; a failing backend (key resolver, nonce
store, signer) is CratestackError::Internal, a 500; and local
misuse (a binding whose shape does not fit the call, an empty
audience, a request opened without a nonce store, a clock or cti
source returning nonsense, a signer returning a signature of the wrong
length, a codec whose encode_into does not append) is also
CratestackError::Internal. Misuse depends only on local state, never
on the received bytes, so a 500 for it reveals nothing about a
message. A codec error from a *_value method is returned as the codec
reported it.
Implementations§
Source§impl CoseEnvelope
impl CoseEnvelope
Sourcepub fn server(
mode: CoseMode,
signer: Arc<dyn CoseSigner>,
resolver: Arc<dyn CoseVerifierResolver>,
nonce_store: Arc<dyn NonceStore>,
) -> CoseEnvelopeBuilder
pub fn server( mode: CoseMode, signer: Arc<dyn CoseSigner>, resolver: Arc<dyn CoseVerifierResolver>, nonce_store: Arc<dyn NonceStore>, ) -> CoseEnvelopeBuilder
A server envelope: opens requests (verifying with keys from
resolver, recording (kid, cti) in nonce_store) and seals
responses with signer.
Sourcepub fn client(
mode: CoseMode,
signer: Arc<dyn CoseSigner>,
resolver: Arc<dyn CoseVerifierResolver>,
) -> CoseEnvelopeBuilder
pub fn client( mode: CoseMode, signer: Arc<dyn CoseSigner>, resolver: Arc<dyn CoseVerifierResolver>, ) -> CoseEnvelopeBuilder
A client envelope: seals requests with signer and opens responses
with keys from resolver (typically the server keys pinned at
enrolment, §8).
Source§impl CoseEnvelope
impl CoseEnvelope
Sourcepub async fn open_request(
&self,
body: Bytes,
bind: &Binding<'_>,
) -> Result<Opened, CratestackError>
pub async fn open_request( &self, body: Bytes, bind: &Binding<'_>, ) -> Result<Opened, CratestackError>
Verify a request and run the replay checks, without a
CratestackContext (the #1006 axum layer runs before one exists).
Needs a nonce store; without one it is local misuse (a 500).
Sourcepub async fn open_request_any(
&self,
body: Bytes,
binds: &[Binding<'_>],
) -> Result<(Opened, usize), CratestackError>
pub async fn open_request_any( &self, body: Bytes, binds: &[Binding<'_>], ) -> Result<(Opened, usize), CratestackError>
open_request against several candidate
bindings (differing, for the axum layer, only in the op-contract
digest): the message is parsed once and its key resolved once, and
only the signature verification is repeated per candidate, in
order. Returns the opened request and the index of the binding that
verified. A failed candidate records no nonce; an empty list is the
coarse 401.
Sourcepub async fn open_response(
&self,
body: Bytes,
bind: &Binding<'_>,
) -> Result<Opened, CratestackError>
pub async fn open_response( &self, body: Bytes, bind: &Binding<'_>, ) -> Result<Opened, CratestackError>
Verify a response against the request it answers.
Source§impl CoseEnvelope
impl CoseEnvelope
Sourcepub fn mode(&self) -> CoseMode
pub fn mode(&self) -> CoseMode
The message structure this envelope emits and accepts. An envelope accepts only its own mode’s tag: a Sign1 envelope refuses a Mac0 message outright, whatever keys its resolver holds.
Sourcepub fn request_nonce(&self) -> Result<RequestNonce, CratestackError>
pub fn request_nonce(&self) -> Result<RequestNonce, CratestackError>
A fresh Cratestack-Nonce for an outgoing request, from the
builder’s nonce source. Fails with CratestackError::Internal if
that source fails.
Sourcepub async fn seal_request(
&self,
payload: &[u8],
bind: &Binding<'_>,
) -> Result<Bytes, CratestackError>
pub async fn seal_request( &self, payload: &[u8], bind: &Binding<'_>, ) -> Result<Bytes, CratestackError>
Seal an encoded request payload for bind (a request binding:
response is None), with iat from the clock and a
fresh cti. The payload is copied into the message once; see
seal_request_value to avoid that.
Sourcepub async fn seal_response(
&self,
payload: &[u8],
bind: &Binding<'_>,
) -> Result<Bytes, CratestackError>
pub async fn seal_response( &self, payload: &[u8], bind: &Binding<'_>, ) -> Result<Bytes, CratestackError>
Seal an encoded response payload for bind (a response binding:
response names the request answered, its kind and the status).
Responses carry alg and kid only.
Sourcepub async fn seal_request_value<C, T>(
&self,
codec: &C,
value: &T,
bind: &Binding<'_>,
) -> Result<Bytes, CratestackError>
pub async fn seal_request_value<C, T>( &self, codec: &C, value: &T, bind: &Binding<'_>, ) -> Result<Bytes, CratestackError>
seal_request for a value codec has not
encoded yet: it is encoded straight into the message buffer. The
bytes are identical to encoding first and sealing after. A codec
error is returned as the codec reported it.
Sourcepub async fn seal_response_value<C, T>(
&self,
codec: &C,
value: &T,
bind: &Binding<'_>,
) -> Result<Bytes, CratestackError>
pub async fn seal_response_value<C, T>( &self, codec: &C, value: &T, bind: &Binding<'_>, ) -> Result<Bytes, CratestackError>
seal_response for a value, encoded in
place as seal_request_value does.
Trait Implementations§
Source§impl Clone for CoseEnvelope
impl Clone for CoseEnvelope
Source§fn clone(&self) -> CoseEnvelope
fn clone(&self) -> CoseEnvelope
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl CratestackEnvelope for CoseEnvelope
impl CratestackEnvelope for CoseEnvelope
Source§fn media_type(&self, shape: BodyShape) -> Option<&'static str>
fn media_type(&self, shape: BodyShape) -> Option<&'static str>
Unary bodies are application/cose; cose-type="cose-sign1" or
"cose-mac0". Streams are None: chain mode is P1
(cratestack#1008), and until then a stream keeps plain cbor-seq, as
the trait’s contract requires when the stream methods return None.
Source§fn seal<'a>(
&'a self,
payload: Bytes,
bind: &'a Binding<'a>,
) -> impl Future<Output = Result<Bytes, CratestackError>> + Send + 'a
fn seal<'a>( &'a self, payload: Bytes, bind: &'a Binding<'a>, ) -> impl Future<Output = Result<Bytes, CratestackError>> + Send + 'a
A server seals a response, a client seals a request (see
CoseRole). The payload arrives encoded, so it is copied into the
message once; seal_value avoids that copy.
Source§fn seal_value<'a, C, T>(
&'a self,
codec: &'a C,
value: &'a T,
bind: &'a Binding<'a>,
) -> impl Future<Output = Result<Bytes, CratestackError>> + Send + 'a
fn seal_value<'a, C, T>( &'a self, codec: &'a C, value: &'a T, bind: &'a Binding<'a>, ) -> impl Future<Output = Result<Bytes, CratestackError>> + Send + 'a
Overridden to encode in place (ADR 0006 §1): codec.encode_into
writes the payload straight into the message buffer, after the room
reserved for its bstr head, and the head is patched in once the
length is known. The bytes equal codec.encode followed by
seal.
Source§fn open<'a>(
&'a self,
body: Bytes,
bind: &'a Binding<'a>,
ctx: &'a mut CratestackContext,
) -> impl Future<Output = Result<Bytes, CratestackError>> + Send + 'a
fn open<'a>( &'a self, body: Bytes, bind: &'a Binding<'a>, ctx: &'a mut CratestackContext, ) -> impl Future<Output = Result<Bytes, CratestackError>> + Send + 'a
A server opens a request (replay checks included), a client opens a
response. On success the context records a VerifiedSigner that
names the key that verified: its thumbprint, its kid (the header’s,
which the opener checked is the key’s own, copied so the context does
not keep the body alive) and the algorithm. The payload returned is a
slice of body.
Source§fn stream_sealer(
&self,
_bind: Binding<'static>,
) -> Option<Box<dyn StreamSealer>>
fn stream_sealer( &self, _bind: Binding<'static>, ) -> Option<Box<dyn StreamSealer>>
None when this envelope does
not sign streams (plain cbor-seq passes through). It takes
Binding<'static> because the sealer outlives the request borrow:
chain mode’s h₀ = SHA-256(external_aad) needs the binding (§6).Source§fn stream_opener(
&self,
_bind: Binding<'static>,
) -> Option<Box<dyn StreamOpener>>
fn stream_opener( &self, _bind: Binding<'static>, ) -> Option<Box<dyn StreamOpener>>
None when this envelope does
not verify streams. See stream_sealer.Source§impl Debug for CoseEnvelope
impl Debug for CoseEnvelope
Source§impl ServerEnvelope for CoseEnvelope
impl ServerEnvelope for CoseEnvelope
Source§fn media_type(&self) -> &'static str
fn media_type(&self) -> &'static str
application/cose; cose-type="cose-sign1" or "cose-mac0", by mode.
Source§fn open_request<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
body: Bytes,
bind: &'life1 Binding<'life2>,
) -> Pin<Box<dyn Future<Output = Result<OpenedRequest, CratestackError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
CoseEnvelope: 'async_trait,
fn open_request<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
body: Bytes,
bind: &'life1 Binding<'life2>,
) -> Pin<Box<dyn Future<Output = Result<OpenedRequest, CratestackError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
CoseEnvelope: 'async_trait,
The signer is the key that verified: its full RFC 9679 thumbprint
(not the 8-byte kid, which can collide), a copy of its kid (so
the signer does not keep the body alive) and its algorithm. The same
fields the CratestackEnvelope::open path records. One framing, so
no seal context.
Source§fn open_request_any<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
body: Bytes,
binds: &'life1 [Binding<'life2>],
) -> Pin<Box<dyn Future<Output = Result<(OpenedRequest, usize), CratestackError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
CoseEnvelope: 'async_trait,
fn open_request_any<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
body: Bytes,
binds: &'life1 [Binding<'life2>],
) -> Pin<Box<dyn Future<Output = Result<(OpenedRequest, usize), CratestackError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
CoseEnvelope: 'async_trait,
Parse and key resolution happen once; only the signature check runs per candidate binding.
Source§fn seal_response<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
payload: &'life1 [u8],
bind: &'life2 Binding<'life3>,
_context: &'life4 SealContext,
) -> Pin<Box<dyn Future<Output = Result<Sealed, CratestackError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
CoseEnvelope: 'async_trait,
fn seal_response<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
payload: &'life1 [u8],
bind: &'life2 Binding<'life3>,
_context: &'life4 SealContext,
) -> Pin<Box<dyn Future<Output = Result<Sealed, CratestackError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
CoseEnvelope: 'async_trait,
One copy of the payload into the message (D1), sent as this envelope’s mode’s media type.
Source§fn is_envelope_content_type(&self, content_type: &str) -> bool
fn is_envelope_content_type(&self, content_type: &str) -> bool
content_type (a request’s Content-Type, or one Accept
entry, parameters included) names this envelope’s framing. Only
needed for a framing other than application/cose, which the layer
always recognises itself; the default recognises nothing more.Auto Trait Implementations§
impl !RefUnwindSafe for CoseEnvelope
impl !UnwindSafe for CoseEnvelope
impl Freeze for CoseEnvelope
impl Send for CoseEnvelope
impl Sync for CoseEnvelope
impl Unpin for CoseEnvelope
impl UnsafeUnpin for CoseEnvelope
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<'src, T> IntoMaybe<'src, T> for Twhere
T: 'src,
impl<'src, T> IntoMaybe<'src, T> for Twhere
T: 'src,
impl<T> MaybeSend for T
impl<T> MaybeSendSync for T
impl<T> OrderedSeq<'_, T> for Twhere
T: Clone,
§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling [Attribute] value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi [Quirk] value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the [Condition] value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
§impl<'p, T> Seq<'p, T> for Twhere
T: Clone,
impl<'p, T> Seq<'p, T> for Twhere
T: Clone,
§type Iter<'a> = Once<&'a T>
where
T: 'a
type Iter<'a> = Once<&'a T> where T: 'a
§fn contains(&self, val: &T) -> boolwhere
T: PartialEq,
fn contains(&self, val: &T) -> boolwhere
T: PartialEq,
§fn to_maybe_ref<'b>(item: <T as Seq<'p, T>>::Item<'b>) -> Maybe<T, &'p T>where
'p: 'b,
fn to_maybe_ref<'b>(item: <T as Seq<'p, T>>::Item<'b>) -> Maybe<T, &'p T>where
'p: 'b,
MaybeRef].