Skip to content

Commit 4eafea1

Browse files
committed
chore: add SLSA version value to Provenance table
Signed-off-by: Ben Selwyn-Smith <[email protected]>
1 parent 7460c86 commit 4eafea1

File tree

3 files changed

+40
-7
lines changed

3 files changed

+40
-7
lines changed

src/macaron/database/table_definitions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ class Provenance(ORMBase):
479479
component: Mapped["Component"] = relationship(back_populates="provenance")
480480

481481
#: The SLSA version.
482-
version: Mapped[str] = mapped_column(String, nullable=False)
482+
version: Mapped[str] = mapped_column(String, nullable=True)
483483

484484
#: The SLSA level.
485485
slsa_level: Mapped[int] = mapped_column(Integer, default=0)

src/macaron/provenance/provenance_extractor.py

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ def extract_repo_and_commit_from_provenance(payload: InTotoPayload) -> tuple[str
4343
If the extraction process fails for any reason.
4444
"""
4545
predicate_type = payload.statement.get("predicateType")
46-
if isinstance(payload, InTotoV1Payload):
47-
if predicate_type == "https://slsa.dev/provenance/v1":
48-
return _extract_from_slsa_v1(payload)
49-
elif isinstance(payload, InTotoV01Payload):
46+
if isinstance(payload, InTotoV1Payload) and predicate_type == "https://slsa.dev/provenance/v1":
47+
return _extract_from_slsa_v1(payload)
48+
49+
if isinstance(payload, InTotoV01Payload):
5050
if predicate_type == "https://slsa.dev/provenance/v0.2":
5151
return _extract_from_slsa_v02(payload)
5252
if predicate_type == "https://slsa.dev/provenance/v0.1":
@@ -56,12 +56,40 @@ def extract_repo_and_commit_from_provenance(payload: InTotoPayload) -> tuple[str
5656

5757
msg = (
5858
f"Extraction from provenance not supported for versions: "
59-
f"predicate_type {predicate_type}, in-toto {str(type(payload))}."
59+
f"predicate_type {payload.statement.get('predicateType')}, in-toto {str(type(payload))}."
6060
)
6161
logger.debug(msg)
6262
raise ProvenanceError(msg)
6363

6464

65+
def extract_predicate_version(payload: InTotoPayload) -> str | None:
66+
"""Extract and return the SLSA version from the passed payload.
67+
68+
Parameters
69+
----------
70+
payload: InTotoPayload
71+
The payload to extract from.
72+
73+
Returns
74+
-------
75+
str | None
76+
The SLSA version, or None if .
77+
"""
78+
predicate_type = payload.statement.get("predicateType")
79+
if isinstance(payload, InTotoV1Payload) and predicate_type == "https://slsa.dev/provenance/v1":
80+
return "SLSA-1.0"
81+
82+
if isinstance(payload, InTotoV01Payload):
83+
if predicate_type == "https://slsa.dev/provenance/v0.2":
84+
return "SLSA-0.2"
85+
if predicate_type == "https://slsa.dev/provenance/v0.1":
86+
return "SLSA-0.1"
87+
if predicate_type == "https://witness.testifysec.com/attestation-collection/v0.1":
88+
return "WITNESS-0.1"
89+
90+
return None
91+
92+
6593
def _extract_from_slsa_v01(payload: InTotoV01Payload) -> tuple[str | None, str | None]:
6694
"""Extract the repository and commit metadata from the slsa v01 provenance payload."""
6795
predicate: dict[str, JsonType] | None = payload.statement.get("predicate")

src/macaron/slsa_analyzer/analyzer.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
from macaron.provenance.provenance_extractor import (
4242
check_if_input_purl_provenance_conflict,
4343
check_if_input_repo_provenance_conflict,
44+
extract_predicate_version,
4445
extract_repo_and_commit_from_provenance,
4546
)
4647
from macaron.provenance.provenance_finder import ProvenanceFinder, find_provenance_from_ci
@@ -487,6 +488,9 @@ def run_single(
487488
slsa_level = determine_provenance_slsa_level(
488489
analyze_ctx, provenance_payload, provenance_is_verified, provenance_l3_verified
489490
)
491+
slsa_version = None
492+
if provenance_payload:
493+
slsa_version = extract_predicate_version(provenance_payload)
490494

491495
analyze_ctx.dynamic_data["provenance_info"] = table_definitions.Provenance(
492496
component=component,
@@ -495,7 +499,8 @@ def run_single(
495499
verified=provenance_is_verified,
496500
provenance_payload=provenance_payload,
497501
slsa_level=slsa_level,
498-
# TODO Add SLSA version, release tag, release digest.
502+
slsa_version=slsa_version,
503+
# TODO Add release tag, release digest.
499504
)
500505
if provenance_payload:
501506
analyze_ctx.dynamic_data["is_inferred_prov"] = False

0 commit comments

Comments
 (0)