Skip to content

Commit 019f7bc

Browse files
PR #1252 review suggestions fixed
* no need for zipped file * remve un needed method
1 parent 50de35f commit 019f7bc

7 files changed

Lines changed: 74 additions & 44 deletions

File tree

sigstore-java/src/main/java/dev/sigstore/fulcio/client/FulcioVerifier.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,6 @@ private FulcioVerifier(
9494
this.ctVerifier = ctVerifier;
9595
}
9696

97-
@VisibleForTesting
98-
void verifySct(CertPath fullCertPath) throws FulcioVerificationException {
99-
verifySct(fullCertPath, CTLogOptions.builder().isEnabled(true).build());
100-
}
101-
10297
@VisibleForTesting
10398
void verifySct(CertPath fullCertPath, CTLogOptions ctLogOptions)
10499
throws FulcioVerificationException {

sigstore-java/src/test/java/dev/sigstore/KeylessVerifierTest.java

Lines changed: 10 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@
3737
import java.security.cert.X509Certificate;
3838
import java.util.List;
3939
import java.util.stream.Stream;
40-
import java.util.zip.ZipEntry;
41-
import java.util.zip.ZipInputStream;
4240
import org.hamcrest.CoreMatchers;
4341
import org.hamcrest.MatcherAssert;
4442
import org.junit.jupiter.api.Assertions;
@@ -421,9 +419,7 @@ public void verifyCertificateMatches_noneMatch() throws Exception {
421419
.issuer(StringMatcher.string("not-match-again"))
422420
.build())));
423421
Assertions.assertEquals(
424-
"No provided certificate identities matched values in certificate: [{issuer:'String:"
425-
+ " not-match',san:'String: not-match'},{issuer:'String: not-match-again',san:'String:"
426-
+ " not-match-again'}]",
422+
"No provided certificate identities matched values in certificate: [{issuer:'String: not-match',san:'String: not-match'},{issuer:'String: not-match-again',san:'String: not-match-again'}]",
427423
ex.getMessage());
428424
}
429425

@@ -887,22 +883,11 @@ public void testVerify_wrongArtifactHashAlgorithm() throws Exception {
887883
"Provided artifact digest does not match digest used for verification"));
888884
}
889885

890-
// The fixture below is a real SLSA build-provenance attestation produced by GitHub Actions for a
891-
// *private* repository. Attestations for private repositories are signed by GitHub's own Sigstore
892-
// instance, which (unlike the public-good instance) does not publish to a transparency log and
893-
// does not use certificate transparency: the bundle carries zero tlog entries and relies on a
894-
// signed RFC 3161 timestamp for trusted time, and the trust root that GitHub distributes for it
895-
// (via `gh attestation trusted-root`) contains zero CT logs. Verifying such a bundle therefore
896-
// requires a policy that disables both transparency-log and certificate-transparency checks.
897-
//
898-
// The zip file contains two files:
899-
// - attestation.sigstore.json : the sigstore bundle (DSSE, in-toto SLSA provenance predicate)
900-
// - trusted_root.jsonl : the trust roots as JSON Lines. `gh attestation trusted-root`
901-
// emits more than one (public-good and GitHub); sigstore-java
902-
// consumes a single trust root, so the tests below select the
903-
// GitHub one (the line describing the fulcio.githubapp.com CA).
904-
private static final String GH_PRIVATE_ATTESTATION_ZIP =
905-
"dev/sigstore/samples/bundles/bundle-github-private-no-tlog.zip";
886+
// A real SLSA build-provenance attestation from a GitHub *private* repository: no
887+
// transparency-log entry, no CT log, signed RFC 3161 timestamp only. See the README in the
888+
// fixture directory for provenance and how it was obtained.
889+
private static final String GH_PRIVATE_DIR =
890+
"dev/sigstore/samples/bundles/github-private-no-tlog/";
906891
private static final String GH_PRIVATE_SIGNER_SAN =
907892
"https://github.com/neverendingsupport/slsa-attestations/.github/workflows/attest.yml@9f6d9dc1bfc02986955721eb15f89ad618f1cedb";
908893
private static final String GH_PRIVATE_OIDC_ISSUER =
@@ -980,15 +965,15 @@ private static ImmutableVerificationOptions.Builder gitHubPrivateOptions() {
980965
private static Bundle gitHubPrivateBundle() throws Exception {
981966
return Bundle.from(
982967
new StringReader(
983-
new String(
984-
readZipEntry(GH_PRIVATE_ATTESTATION_ZIP, "attestation.sigstore.json"),
968+
Resources.toString(
969+
Resources.getResource(GH_PRIVATE_DIR + "attestation.sigstore.json"),
985970
StandardCharsets.UTF_8)));
986971
}
987972

988973
private static KeylessVerifier gitHubPrivateVerifier(Path tempDir) throws Exception {
989974
var jsonl =
990-
new String(
991-
readZipEntry(GH_PRIVATE_ATTESTATION_ZIP, "trusted_root.jsonl"), StandardCharsets.UTF_8);
975+
Resources.toString(
976+
Resources.getResource(GH_PRIVATE_DIR + "trusted_root.jsonl"), StandardCharsets.UTF_8);
992977
var gitHubTrustedRoot =
993978
jsonl
994979
.lines()
@@ -1003,16 +988,4 @@ private static KeylessVerifier gitHubPrivateVerifier(Path tempDir) throws Except
1003988
.trustedRootProvider(TrustedRootProvider.from(trustedRootPath))
1004989
.build();
1005990
}
1006-
1007-
private static byte[] readZipEntry(String zipResource, String entryName) throws Exception {
1008-
try (var zis = new ZipInputStream(Resources.getResource(zipResource).openStream())) {
1009-
ZipEntry entry;
1010-
while ((entry = zis.getNextEntry()) != null) {
1011-
if (entry.getName().equals(entryName)) {
1012-
return zis.readAllBytes();
1013-
}
1014-
}
1015-
}
1016-
throw new IllegalStateException("entry '" + entryName + "' not found in " + zipResource);
1017-
}
1018991
}

sigstore-java/src/test/java/dev/sigstore/fulcio/client/FulcioVerifierTest.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
package dev.sigstore.fulcio.client;
1717

1818
import com.google.common.io.Resources;
19+
import dev.sigstore.ImmutableCTLogOptions;
20+
import dev.sigstore.VerificationOptions.CTLogOptions;
1921
import dev.sigstore.bundle.Bundle;
2022
import dev.sigstore.encryption.certificates.Certificates;
2123
import dev.sigstore.trustroot.ImmutableLogId;
@@ -26,6 +28,7 @@
2628
import java.nio.charset.StandardCharsets;
2729
import java.util.Collections;
2830
import java.util.List;
31+
import org.jspecify.annotations.NonNull;
2932
import org.junit.jupiter.api.Assertions;
3033
import org.junit.jupiter.api.BeforeAll;
3134
import org.junit.jupiter.api.Test;
@@ -81,7 +84,7 @@ public void testVerifySct_noSct() throws Exception {
8184
var fulcioVerifier = FulcioVerifier.newFulcioVerifier(trustRoot);
8285

8386
try {
84-
fulcioVerifier.verifySct(signingCertificate);
87+
fulcioVerifier.verifySct(signingCertificate, enabledCTLog());
8588
Assertions.fail();
8689
} catch (FulcioVerificationException fve) {
8790
Assertions.assertEquals("No valid SCTs were found during verification", fve.getMessage());
@@ -122,7 +125,12 @@ public void invalidEmbeddedSct() throws Exception {
122125

123126
var fve =
124127
Assertions.assertThrows(
125-
FulcioVerificationException.class, () -> fulcioVerifier.verifySct(signingCertificate));
128+
FulcioVerificationException.class,
129+
() -> fulcioVerifier.verifySct(signingCertificate, enabledCTLog()));
126130
Assertions.assertEquals("No valid SCTs were found, all(1) SCTs were invalid", fve.getMessage());
127131
}
132+
133+
private static @NonNull ImmutableCTLogOptions enabledCTLog() {
134+
return CTLogOptions.builder().isEnabled(true).build();
135+
}
128136
}
Binary file not shown.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# GitHub private-repo attestation (no transparency log)
2+
3+
`attestation.sigstore.json` and `trusted_root.jsonl` are a real SLSA build-provenance
4+
attestation produced by GitHub Actions for a **private** repository.
5+
6+
Attestations for private repositories are signed by GitHub's own Sigstore instance,
7+
which — unlike the public-good instance — does **not** publish to a transparency log and
8+
does **not** use certificate transparency:
9+
10+
- the bundle carries **zero** transparency-log entries and relies on a signed RFC 3161
11+
timestamp for trusted time;
12+
- the trust root GitHub distributes for it contains **zero** CT logs.
13+
14+
Verifying such a bundle therefore requires a policy that disables both transparency-log
15+
and certificate-transparency checks (`VerificationOptions` with `TLogOptions` /
16+
`CTLogOptions` `isEnabled(false)`). See `KeylessVerifierTest`.
17+
18+
## Files
19+
20+
- `attestation.sigstore.json` — the Sigstore bundle (DSSE envelope, in-toto SLSA
21+
provenance predicate).
22+
- `trusted_root.jsonl` — trust roots as JSON Lines. `gh attestation trusted-root` emits
23+
more than one (public-good first, then GitHub). sigstore-java consumes a single trust
24+
root, so the test selects the GitHub one (the line describing the `fulcio.githubapp.com`
25+
CA).
26+
27+
## How this fixture was obtained
28+
29+
Both files are the unmodified output of the `gh` CLI, run against a **private**
30+
repository whose build had already produced a SLSA build-provenance attestation for a
31+
released artifact.
32+
33+
Download the attestation bundle for the built artifact, scoping the lookup to its private
34+
repository:
35+
36+
```sh
37+
gh attestation download <artifact-file> --repo <owner>/<private-repo>
38+
```
39+
40+
This writes a `sha256-<digest>.jsonl` file in the current directory containing the
41+
Sigstore bundle; it is copied verbatim to `attestation.sigstore.json`.
42+
43+
Fetch the matching trust roots (public-good instance first, then GitHub's instance):
44+
45+
```sh
46+
gh attestation trusted-root > trusted_root.jsonl
47+
```
48+
49+
Any private repository with a build-provenance attestation reproduces an equivalent
50+
fixture: because the repository is private, GitHub signs it with its own Sigstore
51+
instance, so the resulting bundle carries no transparency-log entries.
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":"MIIHQDCCBsagAwIBAgIUa39WPiLHvriy0BbZ+r6W6E9QoX8wCgYIKoZIzj0EAwMwODEVMBMGA1UEChMMR2l0SHViLCBJbmMuMR8wHQYDVQQDExZGdWxjaW8gSW50ZXJtZWRpYXRlIGwyMB4XDTI2MDcyNDE1MzAyN1oXDTI2MDcyNDE1NDAyN1owADBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCzR6pDNd61vOrLV+lssLkX83Dw/zNGKEprrEfInxjWcASil70eYKlWm5UdtMpb9rYKMGU2s2mlx56bQZzuJsl2jggXkMIIF4DAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwHQYDVR0OBBYEFA5tlV/Yh7mAI5usmY0iLk9s+ErMMB8GA1UdIwQYMBaAFIHjTsG/Xu4ILqbvj2S+p69FoJvPMIGMBgNVHREBAf8EgYEwf4Z9aHR0cHM6Ly9naXRodWIuY29tL25ldmVyZW5kaW5nc3VwcG9ydC9zbHNhLWF0dGVzdGF0aW9ucy8uZ2l0aHViL3dvcmtmbG93cy9hdHRlc3QueW1sQDlmNmQ5ZGMxYmZjMDI5ODY5NTU3MjFlYjE1Zjg5YWQ2MThmMWNlZGIwOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTASBgorBgEEAYO/MAECBARwdXNoMDYGCisGAQQBg78wAQMEKGNhMzQyZTU2Nzg3OTg2Y2Q0ZThkZmMwYzg4MzA2OTY3MTZkM2I0NDEwFQYKKwYBBAGDvzABBAQHUmVsZWFzZTA0BgorBgEEAYO/MAEFBCZuZXZlcmVuZGluZ3N1cHBvcnQvbmVzLWphdmEtdGVzdC1saWItYTAjBgorBgEEAYO/MAEGBBVyZWZzL3RhZ3MvbmVzLXYxLjAuMTIwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGNBgorBgEEAYO/MAEJBH8MfWh0dHBzOi8vZ2l0aHViLmNvbS9uZXZlcmVuZGluZ3N1cHBvcnQvc2xzYS1hdHRlc3RhdGlvbnMvLmdpdGh1Yi93b3JrZmxvd3MvYXR0ZXN0LnltbEA5ZjZkOWRjMWJmYzAyOTg2OTU1NzIxZWIxNWY4OWFkNjE4ZjFjZWRiMDgGCisGAQQBg78wAQoEKgwoOWY2ZDlkYzFiZmMwMjk4Njk1NTcyMWViMTVmODlhZDYxOGYxY2VkYjAdBgorBgEEAYO/MAELBA8MDWdpdGh1Yi1ob3N0ZWQwSQYKKwYBBAGDvzABDAQ7DDlodHRwczovL2dpdGh1Yi5jb20vbmV2ZXJlbmRpbmdzdXBwb3J0L25lcy1qYXZhLXRlc3QtbGliLWEwOAYKKwYBBAGDvzABDQQqDChjYTM0MmU1Njc4Nzk4NmNkNGU4ZGZjMGM4ODMwNjk2NzE2ZDNiNDQxMCUGCisGAQQBg78wAQ4EFwwVcmVmcy90YWdzL25lcy12MS4wLjEyMBoGCisGAQQBg78wAQ8EDAwKMTI5NjQyODQxNzA1BgorBgEEAYO/MAEQBCcMJWh0dHBzOi8vZ2l0aHViLmNvbS9uZXZlcmVuZGluZ3N1cHBvcnQwGQYKKwYBBAGDvzABEQQLDAkxMTMzOTQzOTYwgYEGCisGAQQBg78wARIEcwxxaHR0cHM6Ly9naXRodWIuY29tL25ldmVyZW5kaW5nc3VwcG9ydC9uZXMtamF2YS10ZXN0LWxpYi1hLy5naXRodWIvd29ya2Zsb3dzL25lcy1yZWxlYXNlLnltbEByZWZzL3RhZ3MvbmVzLXYxLjAuMTIwOAYKKwYBBAGDvzABEwQqDChjYTM0MmU1Njc4Nzk4NmNkNGU4ZGZjMGM4ODMwNjk2NzE2ZDNiNDQxMBQGCisGAQQBg78wARQEBgwEcHVzaDBtBgorBgEEAYO/MAEVBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9uZXZlcmVuZGluZ3N1cHBvcnQvbmVzLWphdmEtdGVzdC1saWItYS9hY3Rpb25zL3J1bnMvMzAwNjY2OTg5NzUvYXR0ZW1wdHMvMzAXBgorBgEEAYO/MAEWBAkMB3ByaXZhdGUwVQYKKwYBBAGDvzABGARHDEVyZXBvOm5ldmVyZW5kaW5nc3VwcG9ydC9uZXMtamF2YS10ZXN0LWxpYi1hOnJlZjpyZWZzL3RhZ3MvbmVzLXYxLjAuMTIwCgYIKoZIzj0EAwMDaAAwZQIxAJ6aTFDtBXArjgKmtzRRnqGgoPgGG2/0O38NJQtadgIiZebfw188PcS9TeHVUncQgQIwQEyyaxjimHq5q6BWFQeyNholRT4XJ6qyTcyogoy1oIDF8LmH6KfQoQHGUynIcMF/"},"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIIC0TADAgEAMIICyAYJKoZIhvcNAQcCoIICuTCCArUCAQMxDTALBglghkgBZQMEAgIwgbsGCyqGSIb3DQEJEAEEoIGrBIGoMIGlAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQg9wRSwDiSoN/9BVtwwSPSLO0VhDm7CDR9dC2EqM3UH1oCFFcFv2bliQEgqQF2Vgm7oJaQMxN1GA8yMDI2MDcyNDE1MzAyN1owAwIBAaA2pDQwMjEVMBMGA1UEChMMR2l0SHViLCBJbmMuMRkwFwYDVQQDExBUU0EgVGltZXN0YW1waW5noAAxggHfMIIB2wIBATBKMDIxFTATBgNVBAoTDEdpdEh1YiwgSW5jLjEZMBcGA1UEAxMQVFNBIGludGVybWVkaWF0ZQIUFzPb1un+DvofqFPzAXiB5slHM1IwCwYJYIZIAWUDBAICoIIBBTAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDcyNDE1MzAyN1owPwYJKoZIhvcNAQkEMTIEML0bFLAXQTUhJhhV64ysYiaE+dW8+W9to5DmKcWO+rvX76ZmjMmuwm3OJBi9YKlQGzCBhwYLKoZIhvcNAQkQAi8xeDB2MHQwcgQgRBbIrnMUamOhN8LlW+jecOPJrzBzvzmLqrqo2wgXztcwTjA2pDQwMjEVMBMGA1UEChMMR2l0SHViLCBJbmMuMRkwFwYDVQQDExBUU0EgaW50ZXJtZWRpYXRlAhQXM9vW6f4O+h+oU/MBeIHmyUczUjAKBggqhkjOPQQDAwRoMGYCMQCwdP5T8aUvaO0OUpW5m4gTHVjKe9XfCm0nU+xzBFRuuCclWgGdHVfgL1uEF/7TzoYCMQCr8X65t64LlX6sMFfsmeskPlxglNomGSgiEVTBpiJk91WTgGdM717fc2+u8C83Dko="}]}},"dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjEiLCJzdWJqZWN0IjpbeyJuYW1lIjoiYS1tb2R1bGUtMS0xLjAuMC1uZXMtamF2YS10ZXN0LWxpYi1hLTEuMC4xMi1zb3VyY2VzLmphciIsImRpZ2VzdCI6eyJzaGEyNTYiOiIxMzgyODBmZDMzMDJiOTcwNjU5NjYyMTc2MTk0NWExYWU5NThmOTNhMTVlNDM3MmRkYWU0ZmMwMGE5M2IwOWEyIn19LHsibmFtZSI6ImEtbW9kdWxlLTEtMS4wLjAtbmVzLWphdmEtdGVzdC1saWItYS0xLjAuMTIuamFyIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImNhYTAxNWVmNjllOWJjMzFhNDEzMjJkNmM3MTU2M2VkOTYwMGM3NWJiOTg4ZTRkNjM5YjFlZGM1Nzg1ODA1NTEifX0seyJuYW1lIjoiYS1tb2R1bGUtMS0xLjAuMC1uZXMtamF2YS10ZXN0LWxpYi1hLTEuMC4xMi5wb20iLCJkaWdlc3QiOnsic2hhMjU2IjoiYWZlOGIxMzZlY2VhZjRkNzgxYWM4MDYwNGRiZTc0OGVlNDZhNDA3NDYyZjNjM2EzOTUyYjFhOGM2MzA3ZGQ0NSJ9fSx7Im5hbWUiOiJhLW1vZHVsZS0yLTEuMC4wLW5lcy1qYXZhLXRlc3QtbGliLWEtMS4wLjEyLXNvdXJjZXMuamFyIiwiZGlnZXN0Ijp7InNoYTI1NiI6Ijk4NzBmZWZlYjE5OWU2ZWVhN2VlNWQ2Yjc5NjNiODg5NzEyZDAzNTk0Y2I4YmYxZDg2NjE1OTczYmIzMWM5YTcifX0seyJuYW1lIjoiYS1tb2R1bGUtMi0xLjAuMC1uZXMtamF2YS10ZXN0LWxpYi1hLTEuMC4xMi5qYXIiLCJkaWdlc3QiOnsic2hhMjU2IjoiMjY3ZmQ1NzUzMjExYzM2MjVhMDA3NWVlODFlMzM5MmI0OWQxNmJkMjNmNTk1OTIyYzQwNDI0OWQ3MWQwMzllMCJ9fSx7Im5hbWUiOiJhLW1vZHVsZS0yLTEuMC4wLW5lcy1qYXZhLXRlc3QtbGliLWEtMS4wLjEyLnBvbSIsImRpZ2VzdCI6eyJzaGEyNTYiOiI0NmQwN2NkOTA2NGI4NzFlMTY2ZjYwMDQ3MmMwMDc1YzEwMzMyNTc5NjlkYjIwODdmODNiYzFiNTRjZGM4NzMzIn19LHsibmFtZSI6ImEtbW9kdWxlLTMtMS4wLjAtbmVzLWphdmEtdGVzdC1saWItYS0xLjAuMTItc291cmNlcy5qYXIiLCJkaWdlc3QiOnsic2hhMjU2IjoiMGQyYzEwNjEwN2ZjM2ViOTdjZTZlMjFjNWVkMTkxMmJmZTY3NzRlNGNkNTc4Yjc0NGFmMzQzNTYxYjVkNTk3MSJ9fSx7Im5hbWUiOiJhLW1vZHVsZS0zLTEuMC4wLW5lcy1qYXZhLXRlc3QtbGliLWEtMS4wLjEyLmphciIsImRpZ2VzdCI6eyJzaGEyNTYiOiI0N2I2ZTA0YTFkYzQ5YjBiMzUzYmNiODA2NjQxMWQwMDE0MWViYWVkMGZhMjA4NmE2NTJjOTUzNDJhOGJiMTRhIn19LHsibmFtZSI6ImEtbW9kdWxlLTMtMS4wLjAtbmVzLWphdmEtdGVzdC1saWItYS0xLjAuMTIucG9tIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjQ4NGNmMzE4ODYwYmUwODFjZDVlNGM4YzkwMmRkNGRmYjlhMWViN2NjZDBhZTliMzQ0MzFlZjEwMGUxNzIxZWIifX0seyJuYW1lIjoibmVzLWphdmEtdGVzdC1saWItYS0xLjAuMC1uZXMtamF2YS10ZXN0LWxpYi1hLTEuMC4xMi5wb20iLCJkaWdlc3QiOnsic2hhMjU2IjoiNWI4NTExNDExNTFkYmM5MzVlMzMyZDQ0ZTMwNTcxOTJkODc5YmNiYWQ3ZTA1Zjc5MjZkMzVlMzdjOTVmOTg0NiJ9fV0sInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjEiLCJwcmVkaWNhdGUiOnsiYnVpbGREZWZpbml0aW9uIjp7ImJ1aWxkVHlwZSI6Imh0dHBzOi8vYWN0aW9ucy5naXRodWIuaW8vYnVpbGR0eXBlcy93b3JrZmxvdy92MSIsImV4dGVybmFsUGFyYW1ldGVycyI6eyJ3b3JrZmxvdyI6eyJyZWYiOiJyZWZzL3RhZ3MvbmVzLXYxLjAuMTIiLCJyZXBvc2l0b3J5IjoiaHR0cHM6Ly9naXRodWIuY29tL25ldmVyZW5kaW5nc3VwcG9ydC9uZXMtamF2YS10ZXN0LWxpYi1hIiwicGF0aCI6Ii5naXRodWIvd29ya2Zsb3dzL25lcy1yZWxlYXNlLnltbCJ9fSwiaW50ZXJuYWxQYXJhbWV0ZXJzIjp7ImdpdGh1YiI6eyJldmVudF9uYW1lIjoicHVzaCIsInJlcG9zaXRvcnlfaWQiOiIxMjk2NDI4NDE3IiwicmVwb3NpdG9yeV9vd25lcl9pZCI6IjExMzM5NDM5NiIsInJ1bm5lcl9lbnZpcm9ubWVudCI6ImdpdGh1Yi1ob3N0ZWQifX0sInJlc29sdmVkRGVwZW5kZW5jaWVzIjpbeyJ1cmkiOiJnaXQraHR0cHM6Ly9naXRodWIuY29tL25ldmVyZW5kaW5nc3VwcG9ydC9uZXMtamF2YS10ZXN0LWxpYi1hQHJlZnMvdGFncy9uZXMtdjEuMC4xMiIsImRpZ2VzdCI6eyJnaXRDb21taXQiOiJjYTM0MmU1Njc4Nzk4NmNkNGU4ZGZjMGM4ODMwNjk2NzE2ZDNiNDQxIn19XX0sInJ1bkRldGFpbHMiOnsiYnVpbGRlciI6eyJpZCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9uZXZlcmVuZGluZ3N1cHBvcnQvc2xzYS1hdHRlc3RhdGlvbnMvLmdpdGh1Yi93b3JrZmxvd3MvYXR0ZXN0LnltbEA5ZjZkOWRjMWJmYzAyOTg2OTU1NzIxZWIxNWY4OWFkNjE4ZjFjZWRiIn0sIm1ldGFkYXRhIjp7Imludm9jYXRpb25JZCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9uZXZlcmVuZGluZ3N1cHBvcnQvbmVzLWphdmEtdGVzdC1saWItYS9hY3Rpb25zL3J1bnMvMzAwNjY2OTg5NzUvYXR0ZW1wdHMvMyJ9fX19","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MEYCIQCdMQAky8sN1kNzf0XmENcKFvUbANBpcUL1Dnx+0nV7NwIhAOz95buyD0Px3atfL85VsJTYehZQAsRC/8HLvTEdAhlL"}]}}

0 commit comments

Comments
 (0)