pub enum ReleaseTrust {
Keyless {
identity_regexp: String,
oidc_issuer: String,
},
Key {
key_ref: String,
},
}Expand description
How a consumer proves a release artifact is ours (R605-F1).
The two arms are the verify-side mirror of yah_qed::SigningIdentity, and
they exist for the same reason: a release cut on QED instead of GitHub
cannot use Fulcio keyless, because the public-good Fulcio only issues certs
for OIDC issuers on its own configured allowlist. W235 §“Off-GHA forfeits
GitHub OIDC keyless cosign” makes the call — key-based cosign, key vaulted
in kamaji — so every consumer that verifies a yubaba/CLI artifact has to be
able to express both.
This is carried through the config plumbing as a plain string (the existing
--yubaba-cosign-identity value, the RenderInput field, the manifest’s
identity regexp) and parsed at the two points that actually shell cosign.
Keeping the wire type a string is deliberate: it means flipping a fleet to
key-based trust is a value change, not a schema migration.
Variants§
Keyless
Fulcio keyless: pin the certificate identity + the OIDC issuer.
Key
Key-based: pin the cosign public key. key_ref is whatever
cosign verify-blob --key accepts — a .pub path, an https:// URL,
or a KMS URI (awskms://…, hashivault://…).
Implementations§
Source§impl ReleaseTrust
impl ReleaseTrust
Sourcepub fn parse(spec: &str) -> Self
pub fn parse(spec: &str) -> Self
Parse an operator-supplied cosign-identity spec.
key:<ref> selects key-based verification; anything else is a keyless
certificate-identity regexp against COSIGN_OIDC_ISSUER. The prefix
is explicit rather than sniffed, because a KMS URI and a regexp are
both arbitrary strings and guessing between them would silently pick
the wrong trust model.
Sourcepub fn verify_flags(&self) -> Vec<String>
pub fn verify_flags(&self) -> Vec<String>
The cosign verify-blob flags this trust model contributes, in order.
The caller appends --bundle <path>/the blob itself. cosign 3.x’s
bundle format carries the signature (and, for keyless, the Fulcio
certificate + transparency proof) as ONE file, so there is no
separate .cert sidecar to conditionally fetch any more — the old
needs_certificate() distinction that gated a .cert download is
gone with it.
Trait Implementations§
Source§impl Clone for ReleaseTrust
impl Clone for ReleaseTrust
Source§impl Debug for ReleaseTrust
impl Debug for ReleaseTrust
impl Eq for ReleaseTrust
Source§impl PartialEq for ReleaseTrust
impl PartialEq for ReleaseTrust
impl StructuralPartialEq for ReleaseTrust
Auto Trait Implementations§
impl Freeze for ReleaseTrust
impl RefUnwindSafe for ReleaseTrust
impl Send for ReleaseTrust
impl Sync for ReleaseTrust
impl Unpin for ReleaseTrust
impl UnsafeUnpin for ReleaseTrust
impl UnwindSafe for ReleaseTrust
Blanket Implementations§
impl<T> Allocation for T
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,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<K, Q> Equivalent<Q> for K
impl<K, Q> Equivalent<Q> for K
Source§fn equivalent(&self, key: &Q) -> bool
fn equivalent(&self, key: &Q) -> bool
key and return true if they are equal.impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> Fruit for T
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§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