Skip to content

Commit df412e0

Browse files
committed
Add source tag verification to github attest based verifier
Signed-off-by: Appu Goundan <appu@google.com>
1 parent 748161a commit df412e0

9 files changed

Lines changed: 151 additions & 20 deletions

File tree

cli/slsa-verifier/main_regression_test.go

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1526,12 +1526,57 @@ func Test_runVerifyGithubAttestation(t *testing.T) {
15261526
bcrPublisherBuilderID := "https://github.com/bazel-contrib/publish-to-bcr/.github/workflows/publish.yaml"
15271527

15281528
tests := []struct {
1529-
name string
1530-
artifact string
1531-
source string
1532-
builderID string
1533-
err error
1529+
name string
1530+
artifact string
1531+
source string
1532+
sourceTag *string
1533+
sourceVersionTag *string
1534+
builderID string
1535+
err error
15341536
}{
1537+
{
1538+
name: "module.bazel using publishing builder",
1539+
artifact: "MODULE.bazel",
1540+
source: "github.com/aspect-build/rules_lint",
1541+
builderID: bcrPublisherBuilderID,
1542+
},
1543+
{
1544+
name: "module.bazel using publishing builder and source tag",
1545+
artifact: "MODULE-on-tag.bazel",
1546+
source: "github.com/aspect-build/rules_lint",
1547+
sourceTag: pString("v1.3.4"),
1548+
builderID: bcrPublisherBuilderID,
1549+
},
1550+
{
1551+
name: "module.bazel using publishing builder and incorrect source tag",
1552+
artifact: "MODULE-on-tag.bazel",
1553+
source: "github.com/aspect-build/rules_lint",
1554+
sourceTag: pString("v1.3.5"),
1555+
builderID: bcrPublisherBuilderID,
1556+
err: serrors.ErrorMismatchTag,
1557+
},
1558+
{
1559+
name: "module.bazel using publishing builder and source versioned tag",
1560+
artifact: "MODULE-on-tag.bazel",
1561+
source: "github.com/aspect-build/rules_lint",
1562+
sourceVersionTag: pString("v1.3.4"),
1563+
builderID: bcrPublisherBuilderID,
1564+
},
1565+
{
1566+
name: "module.bazel using publishing builder and partial source versioned tag",
1567+
artifact: "MODULE-on-tag.bazel",
1568+
source: "github.com/aspect-build/rules_lint",
1569+
sourceVersionTag: pString("v1.3"),
1570+
builderID: bcrPublisherBuilderID,
1571+
},
1572+
{
1573+
name: "module.bazel using publishing builder and incorrect source versioned tag",
1574+
artifact: "MODULE-on-tag.bazel",
1575+
source: "github.com/aspect-build/rules_lint",
1576+
sourceVersionTag: pString("v1.3.5"),
1577+
builderID: bcrPublisherBuilderID,
1578+
err: serrors.ErrorMismatchVersionedTag,
1579+
},
15351580
{
15361581
name: "module.bazel using publishing builder",
15371582
artifact: "MODULE.bazel",
@@ -1574,9 +1619,11 @@ func Test_runVerifyGithubAttestation(t *testing.T) {
15741619
// we treat these single entry *.intoto.jsonl bundles as single attestations
15751620
attestationPath := fmt.Sprintf("%s.intoto.jsonl", artifactPath)
15761621
cmd := verify.VerifyGithubAttestationCommand{
1577-
AttestationPath: attestationPath,
1578-
BuilderID: &tt.builderID,
1579-
SourceURI: tt.source,
1622+
AttestationPath: attestationPath,
1623+
BuilderID: &tt.builderID,
1624+
SourceTag: tt.sourceTag,
1625+
SourceVersionTag: tt.sourceVersionTag,
1626+
SourceURI: tt.source,
15801627
}
15811628

15821629
_, err := cmd.Exec(context.Background(), artifactPath)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
"Bazel dependencies"
2+
3+
module(
4+
name = "aspect_rules_lint",
5+
version = "1.3.4",
6+
compatibility_level = 1,
7+
)
8+
9+
bazel_dep(name = "aspect_bazel_lib", version = "2.7.7")
10+
11+
# Needed in the root because we use js_lib_helpers in our aspect impl
12+
# Minimum version needs 'chore: bump bazel-lib to 2.0 by @alexeagle in #1311'
13+
# to allow users on bazel-lib 2.0
14+
bazel_dep(name = "aspect_rules_js", version = "1.40.0")
15+
bazel_dep(name = "bazel_features", version = "1.0.0")
16+
bazel_dep(name = "bazel_skylib", version = "1.4.2")
17+
bazel_dep(name = "platforms", version = "0.0.7")
18+
bazel_dep(name = "rules_multirun", version = "0.9.0")
19+
bazel_dep(name = "rules_multitool", version = "0.4.0")
20+
bazel_dep(name = "rules_diff", version = "1.0.0")
21+
22+
# Needed in the root because we dereference ProtoInfo in our aspect impl
23+
bazel_dep(name = "rules_proto", version = "6.0.0")
24+
25+
# Needed in the root because we dereference the toolchain in our aspect impl
26+
bazel_dep(name = "rules_buf", version = "0.1.1")
27+
28+
multitool = use_extension("@rules_multitool//multitool:extension.bzl", "multitool")
29+
multitool.hub(lockfile = "//format:multitool.lock.json")
30+
multitool.hub(lockfile = "//lint:multitool.lock.json")
31+
use_repo(multitool, "multitool")
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"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"},"tlogEntries":[{"logIndex":"195660311","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"dsse","version":"0.0.1"},"integratedTime":"1744400792","inclusionPromise":{"signedEntryTimestamp":"MEYCIQD9O8mlJxO61Q2RA2TNqD/s/chcnyqV1ywFfXhYVfPzdgIhAJ4JohPCwI4w8dUczG0BOU0ecKwl3KXz7U5A/MouVb6Y"},"inclusionProof":{"logIndex":"73756049","rootHash":"qcjRmhfDT/ST4bUZKPwxdoNtWR3/96ycc3nIoTSELOs=","treeSize":"73756051","hashes":["7SDybmjPvVsgpSZO1KLhi1kBCrjeNv293CQVnRzwkA8=","7qUKLxQorgEM8Udd6RfAT6jTFEEzTbaA/mG63t3DdSw=","pMX3FNNY5Gw5HxkvCQI7gU4jnK0CUcd9jLMfop39mH0=","ecrDPMqwoYQa6Ub01gn4+OhP+mZcSplx/EXHRCSCMGw=","EyXgYjiKElD+8RAZMIeNlVYz6/uRFfhBsrUTT5Gz1r8=","PsyvDwhRew4z1mhH/NZkEh3V31yzDglbaCmZlSmOF1A=","e99hRDfz9PIv48S0TPJehSfNR/o7m6b8KInxd5XTqq0=","cOIIp4bX93gqYoR4rLsLwyevfYS9x3dFSJ7b21xUr9U=","f8/OvcM0ZwVTG2sfoN7/DJwD9BQNJjcJ3ZV9Mf1GAhI=","9WtmPzULWB/Z+vuB98kYTj1jHEM4mBRjRXP3F8z/dw8=","WDa2SJgceO7MYdLyxyaG9hj34lbB7NRR4+OiHScRXTs=","bUMWi9afi8M+WrpEiXczKOIZWruoe38aV/lXN5Z5o9E=","WEm5OgPzJpYROv+4CcrieexCYyQKrLUH3hbxmcQQ+DM=","7v8qPHNDLerpduaMx06eb/MwgoQwczTn/cYGKX/9wZ4="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n73756051\nqcjRmhfDT/ST4bUZKPwxdoNtWR3/96ycc3nIoTSELOs=\n\n— rekor.sigstore.dev wNI9ajBEAiAuhsc5BOiok2v9btk8OvcvNX8wFBgrSTWhayCxEFaLbAIgAIuHT6PPASektFT3BTV5pYws3ju1JKyIZAhRuhoQvcQ=\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiM2NmMTA2OGY1MThjMDE5M2QyYWNjNTc2YWFmYzVmNzM4ZGUxMTQ2NDk3ZTU4N2FmMDlkOWJjYmUyMzAxMWYyMCJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6IjdmNjk3M2YxZDA5YTEwYzE0MzhlMGUzODNkNzg3MmMxZWY5YThjZmYzOGU0YTMxNWY5Y2RhMzA3ZGVjYjdhMzAifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVVQ0lRRDBoRUdjNmw5Z3hLeE1GY1dtQVlWSGRXTFc0bWVLaHNTelNheWptN0lJY0FJZ1hpYUt1NFRzajNVRFpQR0NWbmNnd3orbVdva0wxVGI3bHdMd1BSNzdPcjg9IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VjemFrTkRRbTFUWjBGM1NVSkJaMGxWVEVSMlVESTFXbEJMWW04ckwyMVVMM2h1U0VocVIySnpiSGxOZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwVmQwNUVSWGhOVkdzd1RtcE5lVmRvWTA1TmFsVjNUa1JGZUUxVWF6Rk9hazE1VjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVXhNMFo1YUdSTVJVaHZabHBKUVVaQ2FVeG5SMnB6WWs4clkyUXdOazVOTkZSa1p6QUtWamh5VkdnMFNqWXlSSFJJS3psRGRqUmFVRkZTV0VGWmFqWktURGxvYURCYVJVaEtaRzFXU0dsRU5GbGpWVVl6UlRaUFEwSlpUWGRuWjFZdlRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVklVR1Y0Q2pKbGIzRk1OREZPUnpSVFQzUTJlR3N2ZWt0Nk4zcG5kMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMkpSV1VSV1VqQlNRVkZJTDBKSFRYZFpXVnBtWVVoU01HTklUVFpNZVRsdVlWaFNiMlJYU1hWWk1qbDBUREpLYUdWdFZuTk1WMDUyWW01U2VRcGhWMGwyWTBoV2FXSkhiSHBoUXpFd1lua3hhVmt6U1haTWJXUndaRWRvTVZscE9UTmlNMHB5V20xNGRtUXpUWFpqU0ZacFlrZHNlbUZETlRWWlZ6RnpDbEZJU214YWJrMTJaRWRHYm1ONU9USk5RelIzVEdwRmQwOVJXVXRMZDFsQ1FrRkhSSFo2UVVKQlVWRnlZVWhTTUdOSVRUWk1lVGt3WWpKMGJHSnBOV2dLV1ROU2NHSXlOWHBNYldSd1pFZG9NVmx1Vm5wYVdFcHFZakkxTUZwWE5UQk1iVTUyWWxSQlUwSm5iM0pDWjBWRlFWbFBMMDFCUlVOQ1FWSjNaRmhPYndwTlJGbEhRMmx6UjBGUlVVSm5OemgzUVZGTlJVdEVSbXhOVjBVMVRrUnJlRTVFWkd0T2FsRjRUa1JKTkZwSFJtcE5WR3hzVG5wa2JVMUVVVEJaYW1NMENrMXRXVEZQVkZGNFdtMVJkMFpSV1V0TGQxbENRa0ZIUkhaNlFVSkNRVkZJVlcxV2MxcFhSbnBhVkVGc1FtZHZja0puUlVWQldVOHZUVUZGUmtKQ1pHZ0tZek5DYkZrelVYUlpibFp3WWtkUmRtTnVWbk5hV0U1bVlrZHNkV1JFUVdWQ1oyOXlRbWRGUlVGWlR5OU5RVVZIUWtKQ2VWcFhXbnBNTTFKb1dqTk5kZ3BrYWtWMVRYazBNRTFFYzBkRGFYTkhRVkZSUW1jM09IZEJVV2RGVEZGM2NtRklVakJqU0UwMlRIazVNR0l5ZEd4aWFUVm9XVE5TY0dJeU5YcE1iV1J3Q21SSGFERlpibFo2V2xoS2FtSXlOVEJhVnpVd1RHMU9kbUpVUW5aQ1oyOXlRbWRGUlVGWlR5OU5RVVZLUWtkRlRWZ3lhREJrU0VKNlQyazRkbG95YkRBS1lVaFdhVXh0VG5aaVV6bHBXVmh3YkdKRE1XcGlNalV3WTIxc2FVd3pRakZaYlhod1l6Sm5kR1JIT0hSWmJVNTVUSGsxYm1GWVVtOWtWMGwyWkRJNWVRcGhNbHB6WWpOa2Vrd3pRakZaYlhod1l6Sm5kV1ZYUm5SaVJVSjVXbGRhZWt3elVtaGFNMDEyWkdwQmRVMUROSGhOUkdkSFEybHpSMEZSVVVKbk56aDNDa0ZSYjBWTFozZHZUbXBXYTA1SFdYZFpla0YzVFhwVk0xcEVWWGRaYlVWNFQxUkZNazVVYXpWTk1sa3lUbnBPYkU1VVdtaE9NbEpyV1dwVmQwMUVRV1FLUW1kdmNrSm5SVVZCV1U4dlRVRkZURUpCT0UxRVYyUndaRWRvTVZscE1XOWlNMDR3V2xkUmQwOW5XVXRMZDFsQ1FrRkhSSFo2UVVKRVFWRnpSRU53Yndwa1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFpaV0U1M1dsZE9NRXhYU2pGaFYzaHJURE5LTVdKSFZucFlNbmh3WW01UmQwOUJXVXRMZDFsQ0NrSkJSMFIyZWtGQ1JGRlJjVVJEWjNoYVZFWm9UMVJSTlUxVVVUTmFSRmt3VFZSUmVVOUhVbWhaZWtVMVdsUmpNMXBxUVRCT1Iwa3pUMFJLYlU1VWF6QUtUVmRhYTAxRFFVZERhWE5IUVZGUlFtYzNPSGRCVVRSRlJXZDNVV050Vm0xamVUa3dXVmRrZWt3eldYaE1hazExVGtSQldrSm5iM0pDWjBWRlFWbFBMd3BOUVVWUVFrRnpUVU5VV1hwTlZHTjRUVVJqTUUxVVFYWkNaMjl5UW1kRlJVRlpUeTlOUVVWUlFrTkZUVWd5YURCa1NFSjZUMms0ZGxveWJEQmhTRlpwQ2t4dFRuWmlVemxvWXpOQ2JGa3pVWFJaYmxad1lrZFJkMGRCV1V0TGQxbENRa0ZIUkhaNlFVSkZVVkZMUkVGbk1rMUVhekZOVkVFMVRVUkNjRUpuYjNJS1FtZEZSVUZaVHk5TlFVVlRRa1p6VFZkWGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1doak0wSnNXVE5SZEZsdVZuQmlSMUYyWTI1V2N3cGFXRTVtWWtkc2RXUkRPSFZhTW13d1lVaFdhVXd6WkhaamJYUnRZa2M1TTJONU9YbGFWM2hzV1ZoT2JFeHViSFJpUlVKNVdsZGFla3d6VW1oYU0wMTJDbVJxUlhWTmVUUXdUVVJuUjBOcGMwZEJVVkZDWnpjNGQwRlNUVVZMWjNkdlRWZFZlRmxVYXpCUFZFVXdUakpSTWs1RVJUQk5hbWhyV1ZkTmVFOVhWVE1LVGpKWmQwNUVVbWxPZW1kNVdtcFZOVTVFUm0xYVJFRlZRbWR2Y2tKblJVVkJXVTh2VFVGRlZVSkJXVTFDU0VJeFl6Sm5kMWhuV1V0TGQxbENRa0ZIUkFwMmVrRkNSbEZTVVVSRk5XOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaWldFNTNXbGRPTUV4WFNqRmhWM2hyVEROS01XSkhWbnBZTW5od0NtSnVVWFpaVjA0d1lWYzVkV041T1hsa1Z6VjZUSHBGTUU1RVJYZFBSRmsxVG1wVmVVd3lSakJrUjFaMFkwaFNla3g2UlhkR1oxbExTM2RaUWtKQlIwUUtkbnBCUWtablVVbEVRVnAzWkZkS2MyRlhUWGRuV1hOSFEybHpSMEZSVVVJeGJtdERRa0ZKUldaUlVqZEJTR3RCWkhkRVpGQlVRbkY0YzJOU1RXMU5XZ3BJYUhsYVducGpRMjlyY0dWMVRqUTRjbVlyU0dsdVMwRk1lVzUxYW1kQlFVRmFXVzFaTjNGQ1FVRkJSVUYzUWtsTlJWbERTVkZEYmpGcldFOXlXVzlzQ21sSFJFTnBlV05VT0RacFZESXJZbGhtTmtSRVZDczFiRGhKSzA5b1NVUXpUa0ZKYUVGUE9FTjFaRlZUTkROblQxUTJZVXhsZFdwbFpWRjJSakJ3VldvS2VYTm9TelZqU0M5Mk0yRkxVSGhZWmsxQmIwZERRM0ZIVTAwME9VSkJUVVJCTW1kQlRVZFZRMDFSUkd3MEsyTXJPRzFpU1doUVowOHZXbmcwYTJ0NFl3cExhMVJOTm5WWUswWjJaUzlVUTJsc1YwMHpUbkZHVVZCSFFuWnhhME5FY25kYVQyWndNa1UwVW0xSlEwMUJaRTlJTVd4VFVIRTNWak51Y2xKa1F6VmFDbVZhV2psdUwxTlBOR0ZZTTFwUGVraHFjbUppYkZCRmVsWldhSGhxTkVZMFFqUkNjRU50ZFdsNGRsY3pNbmM5UFFvdExTMHRMVVZPUkNCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2c9PSJ9XX19"}],"timestampVerificationData":{}},"dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjEiLCJzdWJqZWN0IjpbeyJuYW1lIjoiTU9EVUxFLmJhemVsIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImUwNzU4ZjMyMzIzODg3Y2ZlMGI5ZDZlOWYwMWY4MDNmNTBhM2Y1ZWZiNmEyMjlmYzY3OTFlOTliZDkxZWEwMzgifX1dLCJwcmVkaWNhdGVUeXBlIjoiaHR0cHM6Ly9zbHNhLmRldi9wcm92ZW5hbmNlL3YxIiwicHJlZGljYXRlIjp7ImJ1aWxkRGVmaW5pdGlvbiI6eyJidWlsZFR5cGUiOiJodHRwczovL2FjdGlvbnMuZ2l0aHViLmlvL2J1aWxkdHlwZXMvd29ya2Zsb3cvdjEiLCJleHRlcm5hbFBhcmFtZXRlcnMiOnsid29ya2Zsb3ciOnsicmVmIjoicmVmcy90YWdzL3YxLjMuNCIsInJlcG9zaXRvcnkiOiJodHRwczovL2dpdGh1Yi5jb20vYXNwZWN0LWJ1aWxkL3J1bGVzX2xpbnQiLCJwYXRoIjoiLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWwifX0sImludGVybmFsUGFyYW1ldGVycyI6eyJnaXRodWIiOnsiZXZlbnRfbmFtZSI6InB1c2giLCJyZXBvc2l0b3J5X2lkIjoiNjMxNzEwNzQxIiwicmVwb3NpdG9yeV9vd25lcl9pZCI6IjYwOTUxMDkwIiwicnVubmVyX2Vudmlyb25tZW50IjoiZ2l0aHViLWhvc3RlZCJ9fSwicmVzb2x2ZWREZXBlbmRlbmNpZXMiOlt7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXNwZWN0LWJ1aWxkL3J1bGVzX2xpbnRAcmVmcy90YWdzL3YxLjMuNCIsImRpZ2VzdCI6eyJnaXRDb21taXQiOiIxZTFhOTQ5MTQ3ZDY0MTQyOGRhYzE5ZTc3ZjA0NGI3ODJmNTk0MWZkIn19XX0sInJ1bkRldGFpbHMiOnsiYnVpbGRlciI6eyJpZCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbC1jb250cmliL3B1Ymxpc2gtdG8tYmNyLy5naXRodWIvd29ya2Zsb3dzL3B1Ymxpc2gueWFtbEByZWZzL3RhZ3MvdjAuMC4xIn0sIm1ldGFkYXRhIjp7Imludm9jYXRpb25JZCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hc3BlY3QtYnVpbGQvcnVsZXNfbGludC9hY3Rpb25zL3J1bnMvMTQ0MTA4Njk2NTIvYXR0ZW1wdHMvMSJ9fX19","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MEUCIQD0hEGc6l9gxKxMFcWmAYVHdWLW4meKhsSzSayjm7IIcAIgXiaKu4Tsj3UDZPGCVncgwz+mWokL1Tb7lwLwPR77Or8="}]}}

cli/slsa-verifier/verify.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,10 @@ func verifyGithubAttestation() *cobra.Command {
189189
o := &verify.VerifyGithubAttestationOptions{}
190190

191191
cmd := &cobra.Command{
192-
Use: "verify-github-attestation [flags] module-file",
192+
Use: "verify-github-attestation [flags] artifact",
193193
Args: func(cmd *cobra.Command, args []string) error {
194194
if len(args) != 1 {
195-
return errors.New("expects a single path to an module file")
195+
return errors.New("expects a single path to an artifact")
196196
}
197197
return nil
198198
},
@@ -204,6 +204,12 @@ func verifyGithubAttestation() *cobra.Command {
204204
PrintAttestation: o.PrintAttestation,
205205
BuilderID: &o.BuilderID,
206206
}
207+
if cmd.Flags().Changed("source-tag") {
208+
v.SourceTag = &o.SourceTag
209+
}
210+
if cmd.Flags().Changed("source-versioned-tag") {
211+
v.SourceVersionTag = &o.SourceVersionTag
212+
}
207213
if _, err := v.Exec(cmd.Context(), args[0]); err != nil {
208214
fmt.Fprintf(os.Stderr, "%s: %v\n", FAILURE, err)
209215
os.Exit(1)

cli/slsa-verifier/verify/options.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,10 @@ func (o *VerifyNpmOptions) AddFlags(cmd *cobra.Command) {
129129

130130
// VerifyGithubAttestationOptions is the top-level options for the `verify-github-attestation` command.
131131
type VerifyGithubAttestationOptions struct {
132-
SourceURI string
133132
BuilderID string
133+
SourceURI string
134+
SourceTag string
135+
SourceVersionTag string
134136
AttestationPath string
135137
PrintAttestation bool
136138
}
@@ -145,6 +147,11 @@ func (o *VerifyGithubAttestationOptions) AddFlags(cmd *cobra.Command) {
145147
cmd.Flags().StringVar(&o.SourceURI, "source-uri", "",
146148
"expected source repository that should have produced the binary, e.g. github.com/some/repo")
147149

150+
cmd.Flags().StringVar(&o.SourceTag, "source-tag", "", "[optional] expected tag the binary was compiled from")
151+
152+
cmd.Flags().StringVar(&o.SourceVersionTag, "source-versioned-tag", "",
153+
"[optional] expected version the binary was compiled from. Uses semantic version to match the tag")
154+
148155
/* Other options */
149156
cmd.Flags().StringVar(&o.AttestationPath, "attestation-path", "",
150157
"path to an attestation file")

cli/slsa-verifier/verify/verify_github_attestation.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ type VerifyGithubAttestationCommand struct {
2929
AttestationPath string
3030
BuilderID *string
3131
SourceURI string
32+
SourceTag *string
33+
SourceVersionTag *string
3234
BuildWorkflowInputs map[string]string
3335
PrintAttestation bool
3436
}
@@ -43,6 +45,8 @@ func (c *VerifyGithubAttestationCommand) Exec(ctx context.Context, artifact stri
4345
provenanceOpts := &options.ProvenanceOpts{
4446
ExpectedSourceURI: c.SourceURI,
4547
ExpectedDigest: artifactHash,
48+
ExpectedVersionedTag: c.SourceVersionTag,
49+
ExpectedTag: c.SourceTag,
4650
ExpectedWorkflowInputs: c.BuildWorkflowInputs,
4751
}
4852

verifiers/internal/gha/slsaprovenance/v1.0/base.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ type provenanceV1 struct {
1717
prov *Attestation
1818
}
1919

20+
const (
21+
refNameTags = "tags"
22+
refNameHeads = "heads"
23+
)
24+
2025
// Predicate implements ProvenanceV02.Predicate.
2126
func (p *provenanceV1) Predicate() slsa1.ProvenancePredicate {
2227
return p.prov.Predicate

verifiers/internal/gha/slsaprovenance/v1.0/byob.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ func (p *BYOBProvenance) GetBranch() (string, error) {
3737

3838
refType, _ := utils.ParseGitRef(ref)
3939
switch refType {
40-
case "heads": // branch.
40+
case refNameHeads: // branch.
4141
// NOTE: We return the full git ref.
4242
return ref, nil
43-
case "tags":
43+
case refNameTags:
4444
// NOTE: If the ref type is a tag we want to try to parse out the branch from the tag.
4545
sysParams, ok := p.prov.Predicate.BuildDefinition.InternalParameters.(map[string]interface{})
4646
if !ok {
@@ -73,9 +73,9 @@ func (p *BYOBProvenance) GetTag() (string, error) {
7373

7474
refType, _ := utils.ParseGitRef(ref)
7575
switch refType {
76-
case "heads": // branch.
76+
case refNameHeads: // branch.
7777
return "", nil
78-
case "tags":
78+
case refNameTags:
7979
// NOTE: We return the full git ref.
8080
return ref, nil
8181
default:

verifiers/internal/gha/slsaprovenance/v1.0/github_attest.go

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55

66
serrors "github.com/slsa-framework/slsa-verifier/v2/errors"
7+
"github.com/slsa-framework/slsa-verifier/v2/verifiers/utils"
78
)
89

910
// GithubAttestBuildType is the build type for the github attest based builder.
@@ -15,14 +16,10 @@ type GithubAttestProvenance struct {
1516
}
1617

1718
func (p *GithubAttestProvenance) TriggerURI() (string, error) {
18-
externalParams, err := p.getExternalParameters()
19+
workflow, err := p.getWorkflow()
1920
if err != nil {
2021
return "", err
2122
}
22-
workflow, ok := externalParams["workflow"].(map[string]interface{})
23-
if !ok {
24-
return "", fmt.Errorf("%w: %s", serrors.ErrorInvalidFormat, "workflow parameters")
25-
}
2623
repository, ok := workflow["repository"].(string)
2724
if !ok {
2825
return "", fmt.Errorf("%w: %s", serrors.ErrorInvalidFormat, "workflow parameters: repository")
@@ -34,3 +31,36 @@ func (p *GithubAttestProvenance) TriggerURI() (string, error) {
3431
uri := fmt.Sprintf("git+%s@%s", repository, ref)
3532
return uri, nil
3633
}
34+
35+
// GetTag returns the triggering event's tag.
36+
func (p *GithubAttestProvenance) GetTag() (string, error) {
37+
workflow, err := p.getWorkflow()
38+
if err != nil {
39+
return "", err
40+
}
41+
ref, ok := workflow["ref"].(string)
42+
if !ok {
43+
return "", fmt.Errorf("%w: %s", serrors.ErrorInvalidFormat, "workflow parameters: ref")
44+
}
45+
46+
refType, _ := utils.ParseGitRef(ref)
47+
switch refType {
48+
case refNameTags:
49+
return ref, nil
50+
default:
51+
return "", fmt.Errorf("%w: non-tag ref type %q for ref %q",
52+
serrors.ErrorInvalidDssePayload, refType, ref)
53+
}
54+
}
55+
56+
func (p *GithubAttestProvenance) getWorkflow() (map[string]interface{}, error) {
57+
externalParams, err := p.getExternalParameters()
58+
if err != nil {
59+
return nil, err
60+
}
61+
workflow, ok := externalParams["workflow"].(map[string]interface{})
62+
if !ok {
63+
return nil, fmt.Errorf("%w: %s", serrors.ErrorInvalidFormat, "workflow parameters")
64+
}
65+
return workflow, nil
66+
}

0 commit comments

Comments
 (0)