diff --git a/Cargo.lock b/Cargo.lock index bb975963e46..4b7f4f6d7a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1504,7 +1504,7 @@ dependencies = [ "bitflags 2.13.2", "cexpr", "clang-sys", - "itertools 0.10.5", + "itertools 0.13.0", "log", "prettyplease", "proc-macro2", @@ -2177,7 +2177,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -3013,7 +3013,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -3323,7 +3323,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5276,7 +5276,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.61.2", + "windows-core 0.62.2", ] [[package]] @@ -6024,7 +6024,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cde48f36530cbd91b65f050101e6c056d6eb743cea2a8f0f19beef69c6742ff8" dependencies = [ "scopeguard", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -6066,7 +6066,7 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a1886916523694cd6ea3d175f03a1e5010699a2a4cc13696d83d7bea1d80638" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -6761,7 +6761,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.11.0", - "sigstore-verify", + "sigstore-verify 0.14.0", "snap", "thiserror 2.0.21", "tokio", @@ -7125,7 +7125,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -7402,7 +7402,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -7470,11 +7470,11 @@ dependencies = [ "serde", "serde_json", "sha2 0.11.0", - "sigstore-bundle", - "sigstore-rekor", - "sigstore-trust-root", - "sigstore-types", - "sigstore-verify", + "sigstore-bundle 0.11.0", + "sigstore-rekor 0.11.0", + "sigstore-trust-root 0.11.0", + "sigstore-types 0.11.0", + "sigstore-verify 0.11.0", "thiserror 2.0.21", "tokio", "x509-cert 0.3.0", @@ -8279,7 +8279,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -9308,7 +9308,7 @@ dependencies = [ "errno 0.3.14", "libc", "linux-raw-sys 0.12.1", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -9366,7 +9366,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -10054,10 +10054,22 @@ dependencies = [ "hex", "serde", "serde_json", - "sigstore-crypto", - "sigstore-rekor", - "sigstore-tsa", - "sigstore-types", + "sigstore-crypto 0.11.0", + "sigstore-rekor 0.11.0", + "sigstore-tsa 0.11.0", + "sigstore-types 0.11.0", + "thiserror 2.0.21", +] + +[[package]] +name = "sigstore-bundle" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a74b758235084c8baee7869e6073702b04d42d1efbd55b7042a43dca3a27f15e" +dependencies = [ + "jiff", + "serde_json", + "sigstore-types 0.14.0", "thiserror 2.0.21", ] @@ -10076,13 +10088,30 @@ dependencies = [ "rand_core 0.9.5", "sha2 0.10.9", "signature 2.2.0", - "sigstore-types", + "sigstore-types 0.11.0", "spki 0.7.3", "thiserror 2.0.21", "tracing", "x509-cert 0.2.5", ] +[[package]] +name = "sigstore-crypto" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ee2920d66400eef83fe543bff02c3ac5ea9a59ff864d365dd746ada4c8fc4c" +dependencies = [ + "aws-lc-rs", + "const-oid 0.9.6", + "der 0.7.10", + "futures-io", + "jiff", + "sigstore-types 0.14.0", + "spki 0.7.3", + "thiserror 2.0.21", + "x509-cert 0.2.5", +] + [[package]] name = "sigstore-merkle" version = "0.11.0" @@ -10091,8 +10120,19 @@ checksum = "0ee85fd9fb550efd7c8a59447cb0ef4eb02f1258f3ffa80c88d38427c3930af3" dependencies = [ "base64 0.22.1", "hex", - "sigstore-crypto", - "sigstore-types", + "sigstore-crypto 0.11.0", + "sigstore-types 0.11.0", + "thiserror 2.0.21", +] + +[[package]] +name = "sigstore-merkle" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64415f7d91620a3fce3f89f5955997e7104d863c12f36bf0dcbad1b258cf584" +dependencies = [ + "sigstore-crypto 0.14.0", + "sigstore-types 0.14.0", "thiserror 2.0.21", ] @@ -10107,13 +10147,29 @@ dependencies = [ "reqwest", "serde", "serde_json", - "sigstore-crypto", - "sigstore-merkle", - "sigstore-types", + "sigstore-crypto 0.11.0", + "sigstore-merkle 0.11.0", + "sigstore-types 0.11.0", "thiserror 2.0.21", "url", ] +[[package]] +name = "sigstore-rekor" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b17fdd6fd9070f6779b117594582b9d2b4d9a9339d1b2f57711ad10f6a0cc0c8" +dependencies = [ + "base64 0.22.1", + "hex", + "jiff", + "serde", + "serde_json", + "sigstore-merkle 0.14.0", + "sigstore-types 0.14.0", + "thiserror 2.0.21", +] + [[package]] name = "sigstore-trust-root" version = "0.11.0" @@ -10121,21 +10177,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "389b54d1b8ace20ba86fdf90e5e655495f65f1abbc7d5d0eb7494defa9ad32f0" dependencies = [ "base64 0.22.1", - "directories", "hex", "jiff", "rustls-pki-types", "serde", "serde_json", - "sigstore-crypto", - "sigstore-tuf", - "sigstore-types", + "sigstore-crypto 0.11.0", + "sigstore-tuf 0.11.0", + "sigstore-types 0.11.0", "thiserror 2.0.21", - "tokio", - "tracing", "x509-cert 0.2.5", ] +[[package]] +name = "sigstore-trust-root" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16644cdbe963a469df667174ce6447649281aef02300149b195bd6f66d910ae4" +dependencies = [ + "directories", + "hex", + "jiff", + "serde", + "serde_json", + "sigstore-crypto 0.14.0", + "sigstore-tuf 0.14.0", + "sigstore-types 0.14.0", + "thiserror 2.0.21", + "tokio", +] + [[package]] name = "sigstore-tsa" version = "0.11.0" @@ -10154,14 +10225,37 @@ dependencies = [ "reqwest", "rustls-pki-types", "rustls-webpki", - "sigstore-crypto", - "sigstore-types", + "sigstore-crypto 0.11.0", + "sigstore-types 0.11.0", "thiserror 2.0.21", "tracing", "x509-cert 0.2.5", "x509-tsp", ] +[[package]] +name = "sigstore-tsa" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403b8a741c152f65752314805dd20bf9022a2e23191f7aa39b4fe8bf30699265" +dependencies = [ + "aws-lc-rs", + "base64 0.22.1", + "cms", + "const-oid 0.9.6", + "der 0.7.10", + "hex", + "jiff", + "rand 0.9.5", + "rustls-pki-types", + "rustls-webpki", + "sigstore-crypto 0.14.0", + "sigstore-types 0.14.0", + "thiserror 2.0.21", + "tracing", + "x509-cert 0.2.5", +] + [[package]] name = "sigstore-tuf" version = "0.11.0" @@ -10175,8 +10269,8 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.9", - "sigstore-crypto", - "sigstore-types", + "sigstore-crypto 0.11.0", + "sigstore-types 0.11.0", "tempfile", "thiserror 2.0.21", "tokio", @@ -10184,6 +10278,27 @@ dependencies = [ "url", ] +[[package]] +name = "sigstore-tuf" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9da0d2e44d8c02a84fb15473329015fd2983a62c26cdc226b4138a9ec9fc1c6" +dependencies = [ + "glob", + "hex", + "jiff", + "reqwest", + "serde", + "serde_json", + "sha2 0.10.9", + "sigstore-crypto 0.14.0", + "sigstore-types 0.14.0", + "tempfile", + "thiserror 2.0.21", + "tracing", + "url", +] + [[package]] name = "sigstore-types" version = "0.11.0" @@ -10198,6 +10313,21 @@ dependencies = [ "thiserror 2.0.21", ] +[[package]] +name = "sigstore-types" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d644275d2d22b52bc872214dc1618bcbb830f71064124f8e8b3cfc07c1020205" +dependencies = [ + "base64 0.22.1", + "hex", + "jiff", + "pem", + "serde", + "serde_json", + "thiserror 2.0.21", +] + [[package]] name = "sigstore-verify" version = "0.11.0" @@ -10215,13 +10345,42 @@ dependencies = [ "serde", "serde_json", "serde_json_canonicalizer", - "sigstore-bundle", - "sigstore-crypto", - "sigstore-merkle", - "sigstore-rekor", - "sigstore-trust-root", - "sigstore-tsa", - "sigstore-types", + "sigstore-bundle 0.11.0", + "sigstore-crypto 0.11.0", + "sigstore-merkle 0.11.0", + "sigstore-rekor 0.11.0", + "sigstore-trust-root 0.11.0", + "sigstore-tsa 0.11.0", + "sigstore-types 0.11.0", + "thiserror 2.0.21", + "tls_codec", + "tracing", + "x509-cert 0.2.5", +] + +[[package]] +name = "sigstore-verify" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc73ef1cd580920f1233358cebe550a43369daf8110b57cf820576888fbc0a8d" +dependencies = [ + "base64 0.22.1", + "const-oid 0.9.6", + "futures-io", + "hex", + "jiff", + "rustls-pki-types", + "rustls-webpki", + "serde", + "serde_json", + "serde_json_canonicalizer", + "sigstore-bundle 0.14.0", + "sigstore-crypto 0.14.0", + "sigstore-merkle 0.14.0", + "sigstore-rekor 0.14.0", + "sigstore-trust-root 0.14.0", + "sigstore-tsa 0.14.0", + "sigstore-types 0.14.0", "thiserror 2.0.21", "tls_codec", "tracing", @@ -10696,10 +10855,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.3", "once_cell", "rustix 1.1.5", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -10773,7 +10932,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874" dependencies = [ "rustix 1.1.5", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -11884,7 +12043,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] diff --git a/crates/mise-sigstore/Cargo.toml b/crates/mise-sigstore/Cargo.toml index d53c132049a..4b7dc39ffdd 100644 --- a/crates/mise-sigstore/Cargo.toml +++ b/crates/mise-sigstore/Cargo.toml @@ -20,7 +20,7 @@ reqwest = { version = "0.13", default-features = false, features = ["json"] } serde = { version = "1", features = ["derive"] } serde_json = "1" sha2 = "0.11" -sigstore-verify = { version = "0.11", default-features = false } +sigstore-verify = { version = "0.14", default-features = false } snap = "1" thiserror = "2" tokio = { version = "1", features = ["fs", "io-util", "time"] } diff --git a/crates/mise-sigstore/src/bundle.rs b/crates/mise-sigstore/src/bundle.rs index 55e3d965719..9e829c18c9c 100644 --- a/crates/mise-sigstore/src/bundle.rs +++ b/crates/mise-sigstore/src/bundle.rs @@ -51,7 +51,7 @@ pub(crate) fn verify_bundle<'a>( signer_workflow: Option<&str>, trusted_root: &TrustedRoot, ) -> Result<()> { - let mut policy = VerificationPolicy::default(); + let mut policy = VerificationPolicy::any_identity(); // sigstore-verify's default policy *requires* an inclusion proof when // `verify_tlog` is on. GitHub artifact attestations and TSA-only bundles // never carry one, so we'd reject them outright. Skip tlog only when the @@ -59,7 +59,7 @@ pub(crate) fn verify_bundle<'a>( // ship a Rekor inclusion proof, still get full tlog verification (Rekor // checkpoint signature, SET, inclusion-proof Merkle path). if !bundle.has_inclusion_proof() { - policy = policy.skip_tlog(); + policy = policy.skip_tlog_unsafe(); } // GitHub-internal leaf certs don't carry an SCT extension (GitHub's CA // doesn't log to public CT). `skip_sct` keeps full certificate-chain @@ -70,7 +70,10 @@ pub(crate) fn verify_bundle<'a>( } let result = sigstore_verify::verify(artifact, bundle, &policy, trusted_root)?; - verify_signer_workflow_identity(result.identity.as_deref(), signer_workflow)?; + verify_signer_workflow_identity( + result.identity().map(|identity| identity.as_str()), + signer_workflow, + )?; Ok(()) } @@ -185,9 +188,7 @@ pub(crate) fn verify_cert_chain(leaf_der: &[u8], trusted_root: &TrustedRoot) -> .as_secs(); let validation_time = UnixTime::since_unix_epoch(std::time::Duration::from_secs(not_after)); - let all_certs = trusted_root.fulcio_certs().map_err(|e| { - AttestationError::Verification(format!("failed to load CA certs from trust root: {e}")) - })?; + let all_certs = trusted_root.fulcio_certs(); if all_certs.is_empty() { return Err(AttestationError::Verification( "trust root contains no CA certificates".to_string(), diff --git a/crates/mise-sigstore/src/certificate.rs b/crates/mise-sigstore/src/certificate.rs index ec4237a5ec9..e8bdb2b2da4 100644 --- a/crates/mise-sigstore/src/certificate.rs +++ b/crates/mise-sigstore/src/certificate.rs @@ -46,7 +46,7 @@ pub(crate) fn bundle_source_repository(bundle: &Bundle) -> Option { let sigstore_verify::types::SignatureContent::DsseEnvelope(envelope) = &bundle.content else { return None; }; - release_statement_repository(&envelope.decode_payload()) + release_statement_repository(envelope.payload.as_bytes()) } pub(crate) fn certificate_source_repository(cert: &x509_cert::Certificate) -> Option { diff --git a/crates/mise-sigstore/src/cosign.rs b/crates/mise-sigstore/src/cosign.rs index 36ad5182793..5e049d2bda9 100644 --- a/crates/mise-sigstore/src/cosign.rs +++ b/crates/mise-sigstore/src/cosign.rs @@ -73,7 +73,13 @@ pub async fn verify_cosign_signature_with_key( // Bundle path: needs the trust root for tlog (Rekor) verification. let trusted_root = production_trusted_root().await?; let artifact = tokio::fs::read(artifact_path).await?; - sigstore_verify::verify_with_key(artifact.as_slice(), &bundle, &public_key, &trusted_root)?; + sigstore_verify::verify_with_key( + artifact.as_slice(), + &bundle, + &public_key, + &sigstore_verify::PublicKeyVerificationPolicy::default(), + &trusted_root, + )?; return Ok(true); } @@ -91,22 +97,19 @@ pub(crate) fn verify_public_key_bundle( ) -> Result<()> { use sigstore_verify::bundle::{ValidationOptions, validate_bundle_with_options}; use sigstore_verify::crypto::{ - KeyType, SigningScheme, detect_key_type, verify_signature, verify_signature_prehashed, + KeyAlgorithm, SigningScheme, verify_signature, verify_signature_prehashed, }; validate_bundle_with_options( bundle, - &ValidationOptions { - require_inclusion_proof: true, - require_timestamp: false, - }, + &ValidationOptions::new().with_require_inclusion_proof(true), ) .map_err(|e| AttestationError::Verification(format!("bundle validation failed: {e}")))?; - let scheme = match detect_key_type(public_key) { - KeyType::Ed25519 => SigningScheme::Ed25519, - KeyType::EcdsaP256 => SigningScheme::EcdsaP256Sha256, - KeyType::Unknown => { + let scheme = match KeyAlgorithm::from_spki(public_key) { + Ok(KeyAlgorithm::Ed25519) => SigningScheme::Ed25519, + Ok(KeyAlgorithm::EcdsaP256) => SigningScheme::EcdsaP256Sha256, + _ => { return Err(AttestationError::Verification( "unsupported or unrecognized public key type".to_string(), )); @@ -115,7 +118,7 @@ pub(crate) fn verify_public_key_bundle( match &bundle.content { SignatureContent::MessageSignature(msg_sig) => { - let artifact_hash = Sha256Hash::try_from_slice(&Sha256::digest(artifact))?; + let artifact_hash = Sha256Hash::try_from(Sha256::digest(artifact).as_slice())?; if let Some(digest) = &msg_sig.message_digest { if digest.algorithm != HashAlgorithm::Sha2256 { return Err(AttestationError::Verification(format!( @@ -145,18 +148,19 @@ pub(crate) fn verify_public_key_bundle( })?; } SignatureContent::DsseEnvelope(envelope) => { - let payload = envelope.decode_payload(); - let pae = sigstore_verify::types::pae(&envelope.payload_type, &payload); - if !envelope - .signatures - .iter() - .any(|sig| verify_signature(public_key, &pae, &sig.sig, scheme).is_ok()) - { + let payload = envelope.payload.as_bytes(); + let pae = sigstore_verify::types::pae(&envelope.payload_type, payload); + if verify_signature(public_key, &pae, &envelope.signature.sig, scheme).is_err() { return Err(AttestationError::Verification( "DSSE signature verification failed: no valid signatures found".to_string(), )); } - verify_dsse_artifact_subject(&payload, artifact)?; + verify_dsse_artifact_subject(payload, artifact)?; + } + _ => { + return Err(AttestationError::UnsupportedFormat( + "unsupported bundle signature content".to_string(), + )); } } @@ -260,12 +264,12 @@ pub(crate) fn verify_raw_signature( signature: &[u8], public_key: &DerPublicKey, ) -> Result<()> { - use sigstore_verify::crypto::{KeyType, SigningScheme, detect_key_type, verify_signature}; + use sigstore_verify::crypto::{KeyAlgorithm, SigningScheme, verify_signature}; - let scheme = match detect_key_type(public_key) { - KeyType::Ed25519 => SigningScheme::Ed25519, - KeyType::EcdsaP256 => SigningScheme::EcdsaP256Sha256, - KeyType::Unknown => { + let scheme = match KeyAlgorithm::from_spki(public_key) { + Ok(KeyAlgorithm::Ed25519) => SigningScheme::Ed25519, + Ok(KeyAlgorithm::EcdsaP256) => SigningScheme::EcdsaP256Sha256, + _ => { return Err(AttestationError::Verification( "unsupported or unrecognized public key type".to_string(), )); diff --git a/crates/mise-sigstore/src/lib.rs b/crates/mise-sigstore/src/lib.rs index 784069f71bd..c0b56e6534d 100644 --- a/crates/mise-sigstore/src/lib.rs +++ b/crates/mise-sigstore/src/lib.rs @@ -11,8 +11,7 @@ use reqwest::header::{AUTHORIZATION, HeaderMap, HeaderValue, USER_AGENT}; use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; use sigstore_verify::VerificationPolicy; -pub use sigstore_verify::trust_root::DEFAULT_TUF_URL; -use sigstore_verify::trust_root::{PRODUCTION_TUF_ROOT, SigstoreInstance, TrustedRoot, TufConfig}; +use sigstore_verify::trust_root::{SigstoreInstance, TrustedRoot, TufBootstrap, TufConfig}; use sigstore_verify::types::bundle::VerificationMaterialContent; use sigstore_verify::types::{ Artifact, Bundle, DerCertificate, DerPublicKey, HashAlgorithm, Sha256Hash, SignatureBytes, @@ -33,6 +32,9 @@ mod retry; mod slsa; mod trust; +/// The Sigstore public-good TUF repository URL. +pub const DEFAULT_TUF_URL: &str = "https://tuf-repo-cdn.sigstore.dev"; + pub use client::{ Attestation, AttestationClient, AttestationClientBuilder, FetchParams, GitHubSource, sources, }; diff --git a/crates/mise-sigstore/src/slsa.rs b/crates/mise-sigstore/src/slsa.rs index f2e97120001..92b499ea444 100644 --- a/crates/mise-sigstore/src/slsa.rs +++ b/crates/mise-sigstore/src/slsa.rs @@ -365,7 +365,7 @@ pub(crate) fn verify_bundle_slsa_subjects( ) -> Result<()> { let payload = match &bundle.content { sigstore_verify::types::SignatureContent::DsseEnvelope(envelope) => { - envelope.decode_payload() + envelope.payload.as_bytes() } _ => { return Err(AttestationError::UnsupportedFormat( @@ -373,5 +373,5 @@ pub(crate) fn verify_bundle_slsa_subjects( )); } }; - verify_intoto_payload_subjects(&payload, artifacts, min_level) + verify_intoto_payload_subjects(payload, artifacts, min_level) } diff --git a/crates/mise-sigstore/src/tests/certificate.rs b/crates/mise-sigstore/src/tests/certificate.rs index 14fb8f4dc9a..f2dc5afda19 100644 --- a/crates/mise-sigstore/src/tests/certificate.rs +++ b/crates/mise-sigstore/src/tests/certificate.rs @@ -3,16 +3,15 @@ use super::*; #[test] fn select_tuf_config_default_uses_production_url() { // No override → canonical Sigstore public-good TUF URL (default behavior). - assert_eq!(select_tuf_config(None).url, DEFAULT_TUF_URL); + assert_eq!(DEFAULT_TUF_URL, SigstoreInstance::PublicGood.tuf_url()); + assert!(format!("{:?}", select_tuf_config(None)).contains(DEFAULT_TUF_URL)); } #[test] fn select_tuf_config_override_uses_mirror_url() { - // Override → the mirror URL, while still pinning PRODUCTION_TUF_ROOT - // (the latter is enforced by TufConfig::custom, covered by the - // sigstore-trust-root crate's own tests). + // Override → the mirror URL, while still pinning the production root. let mirror = "https://tuf-mirror.example.com/".to_string(); - assert_eq!(select_tuf_config(Some(mirror.clone())).url, mirror); + assert!(format!("{:?}", select_tuf_config(Some(mirror.clone()))).contains(&mirror)); } #[test] diff --git a/crates/mise-sigstore/src/trust.rs b/crates/mise-sigstore/src/trust.rs index a801432ea7b..ed22f0e0de2 100644 --- a/crates/mise-sigstore/src/trust.rs +++ b/crates/mise-sigstore/src/trust.rs @@ -2,7 +2,7 @@ use super::*; /// Override the Sigstore public-good TUF URL (e.g. a mirror derived from mise's /// `settings.url_replacements`). Passing a mirror URL still bootstraps from the -/// embedded production root ([`PRODUCTION_TUF_ROOT`]), so a mirror cannot forge +/// embedded production root ([`SigstoreInstance::tuf_root`]), so a mirror cannot forge /// the chain of trust — TUF verifies all fetched metadata against that pinned /// root. Passing `None` restores the default behavior. pub fn set_tuf_url(url: Option) { @@ -19,9 +19,12 @@ pub(crate) fn select_tuf_config(override_url: Option) -> TufConfig { match override_url { // SECURITY: pin the embedded production root even when fetching from a // mirror. A custom URL has no embedded-root fallback, and the mirror - // serves identical TUF content; bootstrapping with PRODUCTION_TUF_ROOT + // serves identical TUF content; bootstrapping with the production root // means every metadata file is verified against the canonical root. - Some(url) => TufConfig::custom(url).with_root(PRODUCTION_TUF_ROOT), + Some(url) => TufConfig::custom( + url, + TufBootstrap::trusted(SigstoreInstance::PublicGood.tuf_root()), + ), // Equivalent to `TrustedRoot::production()` (which is itself // `from_tuf(TufConfig::production())`) — the default path is unchanged. None => TufConfig::production(),