summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
authorBob Callaway <bobcallaway@users.noreply.github.com>2024-08-31 11:53:46 -0400
committerGitHub <noreply@github.com>2024-08-31 15:53:46 +0000
commit3a63572187ef435e254a4c753d03a39effae0761 (patch)
tree4f92936facec978c0329b98e0e70fe9ce001d729 /cli
parentb536ed1a7498b8f1c7d46aa9a7ed745870a9e99e (diff)
fix(publish): ensure provenance is spec compliant (#25200)
Fixes: #25199 Ensures that for the SLSA provenance document generated on publishing, `subject` is an array of ResourceDescriptor objects per the in-toto specification [requirements](https://github.com/in-toto/attestation/blob/main/spec/v1/statement.md#fields). --------- Signed-off-by: Bob Callaway <bcallaway@google.com>
Diffstat (limited to 'cli')
-rw-r--r--cli/tools/registry/mod.rs3
-rw-r--r--cli/tools/registry/provenance.rs21
2 files changed, 15 insertions, 9 deletions
diff --git a/cli/tools/registry/mod.rs b/cli/tools/registry/mod.rs
index 24b3051e4..fbdcd9e77 100644
--- a/cli/tools/registry/mod.rs
+++ b/cli/tools/registry/mod.rs
@@ -1049,7 +1049,8 @@ async fn publish_package(
sha256: faster_hex::hex_string(&sha2::Sha256::digest(&meta_bytes)),
},
};
- let bundle = provenance::generate_provenance(http_client, subject).await?;
+ let bundle =
+ provenance::generate_provenance(http_client, vec![subject]).await?;
let tlog_entry = &bundle.verification_material.tlog_entries[0];
log::info!("{}",
diff --git a/cli/tools/registry/provenance.rs b/cli/tools/registry/provenance.rs
index ce3d6ff8a..47169f213 100644
--- a/cli/tools/registry/provenance.rs
+++ b/cli/tools/registry/provenance.rs
@@ -229,16 +229,16 @@ impl Predicate {
struct ProvenanceAttestation {
#[serde(rename = "type")]
_type: &'static str,
- subject: Subject,
+ subject: Vec<Subject>,
predicate_type: &'static str,
predicate: Predicate,
}
impl ProvenanceAttestation {
- pub fn new_github_actions(subject: Subject) -> Self {
+ pub fn new_github_actions(subjects: Vec<Subject>) -> Self {
Self {
_type: INTOTO_STATEMENT_TYPE,
- subject,
+ subject: subjects,
predicate_type: SLSA_PREDICATE_TYPE,
predicate: Predicate::new_github_actions(),
}
@@ -296,7 +296,7 @@ pub struct ProvenanceBundle {
pub async fn generate_provenance(
http_client: &HttpClient,
- subject: Subject,
+ subjects: Vec<Subject>,
) -> Result<ProvenanceBundle, AnyError> {
if !is_gha() {
bail!("Automatic provenance is only available in GitHub Actions");
@@ -308,7 +308,7 @@ pub async fn generate_provenance(
);
};
- let slsa = ProvenanceAttestation::new_github_actions(subject);
+ let slsa = ProvenanceAttestation::new_github_actions(subjects);
let attestation = serde_json::to_string(&slsa)?;
let bundle = attest(http_client, &attestation, INTOTO_PAYLOAD_TYPE).await?;
@@ -738,8 +738,13 @@ mod tests {
sha256: "yourmom".to_string(),
},
};
- let slsa = ProvenanceAttestation::new_github_actions(subject);
- assert_eq!(slsa.subject.name, "jsr:@divy/sdl2@0.0.1");
- assert_eq!(slsa.subject.digest.sha256, "yourmom");
+ let slsa = ProvenanceAttestation::new_github_actions(vec![subject]);
+ assert_eq!(
+ slsa.subject.len(),
+ 1,
+ "Subject should be an array per the in-toto specification"
+ );
+ assert_eq!(slsa.subject[0].name, "jsr:@divy/sdl2@0.0.1");
+ assert_eq!(slsa.subject[0].digest.sha256, "yourmom");
}
}