Skip to content

Commit 0e81bff

Browse files
authored
Merge pull request #704 from sigstore/bundles-pt2
Change all APIs to use bundle instead of keylessSignature
2 parents ae185ca + a6f2df6 commit 0e81bff

File tree

16 files changed

+348
-255
lines changed

16 files changed

+348
-255
lines changed

fuzzing/src/main/java/fuzzing/FulcioCertificateVerifierFuzzer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
package fuzzing;
1717

1818
import com.code_intelligence.jazzer.api.FuzzedDataProvider;
19-
import dev.sigstore.KeylessVerificationRequest.CertificateIdentity;
19+
import dev.sigstore.VerificationOptions.CertificateIdentity;
2020
import dev.sigstore.fulcio.client.FulcioCertificateVerifier;
2121
import dev.sigstore.fulcio.client.FulcioVerificationException;
2222
import java.io.ByteArrayInputStream;

sigstore-cli/src/main/java/dev/sigstore/cli/Sign.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package dev.sigstore.cli;
1717

1818
import dev.sigstore.KeylessSigner;
19-
import dev.sigstore.bundle.Bundle;
2019
import dev.sigstore.encryption.certificates.Certificates;
2120
import dev.sigstore.oidc.client.OidcClients;
2221
import java.nio.charset.StandardCharsets;
@@ -66,18 +65,15 @@ public Integer call() throws Exception {
6665
signerBuilder.oidcClients(OidcClients.of(new TokenStringOidcClient(identityToken)));
6766
}
6867
var signer = signerBuilder.build();
69-
var signingResult = signer.signFile(artifact);
68+
var bundle = signer.signFile2(artifact);
7069
if (signatureFiles.sigAndCert != null) {
7170
Files.write(
7271
signatureFiles.sigAndCert.signatureFile,
73-
Base64.getEncoder().encode(signingResult.getSignature()));
72+
Base64.getEncoder().encode(bundle.getMessageSignature().get().getSignature()));
7473
Files.write(
75-
signatureFiles.sigAndCert.certificateFile,
76-
Certificates.toPemBytes(signingResult.getCertPath()));
74+
signatureFiles.sigAndCert.certificateFile, Certificates.toPemBytes(bundle.getCertPath()));
7775
} else {
78-
Files.write(
79-
signatureFiles.bundleFile,
80-
Bundle.from(signingResult).toJson().getBytes(StandardCharsets.UTF_8));
76+
Files.write(signatureFiles.bundleFile, bundle.toJson().getBytes(StandardCharsets.UTF_8));
8177
}
8278
return 0;
8379
}

sigstore-cli/src/main/java/dev/sigstore/cli/Verify.java

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@
1919
import static com.google.common.io.Files.newReader;
2020

2121
import com.google.common.hash.Hashing;
22-
import dev.sigstore.KeylessSignature;
23-
import dev.sigstore.KeylessVerificationRequest;
24-
import dev.sigstore.KeylessVerificationRequest.CertificateIdentity;
25-
import dev.sigstore.KeylessVerificationRequest.VerificationOptions;
2622
import dev.sigstore.KeylessVerifier;
23+
import dev.sigstore.VerificationOptions;
24+
import dev.sigstore.VerificationOptions.CertificateIdentity;
2725
import dev.sigstore.bundle.Bundle;
26+
import dev.sigstore.bundle.Bundle.HashAlgorithm;
27+
import dev.sigstore.bundle.Bundle.MessageSignature;
28+
import dev.sigstore.bundle.ImmutableBundle;
2829
import dev.sigstore.encryption.certificates.Certificates;
30+
import dev.sigstore.rekor.client.RekorEntryFetcher;
2931
import java.nio.charset.StandardCharsets;
3032
import java.nio.file.Files;
3133
import java.nio.file.Path;
@@ -90,20 +92,29 @@ static class Policy {
9092
@Override
9193
public Integer call() throws Exception {
9294
byte[] digest = asByteSource(artifact.toFile()).hash(Hashing.sha256()).asBytes();
93-
KeylessSignature keylessSignature;
9495

96+
Bundle bundle;
9597
if (signatureFiles.sigAndCert != null) {
9698
byte[] signature =
9799
Base64.getMimeDecoder()
98100
.decode(Files.readAllBytes(signatureFiles.sigAndCert.signatureFile));
99101
CertPath certPath =
100102
Certificates.fromPemChain(Files.readAllBytes(signatureFiles.sigAndCert.certificateFile));
101-
keylessSignature =
102-
KeylessSignature.builder().signature(signature).certPath(certPath).digest(digest).build();
103+
RekorEntryFetcher fetcher =
104+
target == null
105+
? RekorEntryFetcher.sigstorePublicGood()
106+
: target.staging
107+
? RekorEntryFetcher.sigstoreStaging()
108+
: RekorEntryFetcher.fromTrustedRoot(target.trustedRoot);
109+
bundle =
110+
ImmutableBundle.builder()
111+
.messageSignature(MessageSignature.of(HashAlgorithm.SHA2_256, digest, signature))
112+
.certPath(certPath)
113+
.addEntries(
114+
fetcher.getEntryFromRekor(digest, Certificates.getLeaf(certPath), signature))
115+
.build();
103116
} else {
104-
Bundle bundle =
105-
Bundle.from(newReader(signatureFiles.bundleFile.toFile(), StandardCharsets.UTF_8));
106-
keylessSignature = bundle.toKeylessSignature();
117+
bundle = Bundle.from(newReader(signatureFiles.bundleFile.toFile(), StandardCharsets.UTF_8));
107118
}
108119

109120
var verificationOptionsBuilder = VerificationOptions.builder();
@@ -114,20 +125,15 @@ public Integer call() throws Exception {
114125
.subjectAlternativeName(policy.certificateSan)
115126
.build());
116127
}
117-
var verificationOptions = verificationOptionsBuilder.alwaysUseRemoteRekorEntry(false).build();
128+
var verificationOptions = verificationOptionsBuilder.build();
118129

119130
var verifier =
120131
target == null
121132
? new KeylessVerifier.Builder().sigstorePublicDefaults().build()
122133
: target.staging
123134
? new KeylessVerifier.Builder().sigstoreStagingDefaults().build()
124135
: new KeylessVerifier.Builder().fromTrustedRoot(target.trustedRoot).build();
125-
verifier.verify(
126-
artifact,
127-
KeylessVerificationRequest.builder()
128-
.keylessSignature(keylessSignature)
129-
.verificationOptions(verificationOptions)
130-
.build());
136+
verifier.verify(artifact, bundle, verificationOptions);
131137
return 0;
132138
}
133139
}

sigstore-gradle/sigstore-gradle-sign-base-plugin/src/main/kotlin/dev/sigstore/sign/work/SignWorkAction.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ abstract class SignWorkAction : WorkAction<SignWorkParameters> {
5555
}.build()
5656
}
5757

58-
val result = signer.signFile(inputFile.toPath())
59-
val bundleJson = Bundle.from(result).toJson()
58+
val result = signer.signFile2(inputFile.toPath())
59+
val bundleJson = result.toJson()
6060
parameters.outputSignature.get().asFile.writeText(bundleJson)
6161
}
6262
}

sigstore-java/src/main/java/dev/sigstore/KeylessSigner.java

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@
2222
import com.google.errorprone.annotations.CanIgnoreReturnValue;
2323
import com.google.errorprone.annotations.CheckReturnValue;
2424
import com.google.errorprone.annotations.concurrent.GuardedBy;
25-
import dev.sigstore.KeylessVerifier.Builder;
25+
import dev.sigstore.bundle.Bundle;
26+
import dev.sigstore.bundle.Bundle.HashAlgorithm;
27+
import dev.sigstore.bundle.Bundle.MessageSignature;
28+
import dev.sigstore.bundle.ImmutableBundle;
2629
import dev.sigstore.encryption.certificates.Certificates;
2730
import dev.sigstore.encryption.signers.Signer;
2831
import dev.sigstore.encryption.signers.Signers;
@@ -270,13 +273,13 @@ public Builder sigstoreStagingDefaults() {
270273
* @return a list of keyless singing results.
271274
*/
272275
@CheckReturnValue
273-
public List<KeylessSignature> sign(List<byte[]> artifactDigests) throws KeylessSignerException {
276+
public List<Bundle> sign(List<byte[]> artifactDigests) throws KeylessSignerException {
274277

275278
if (artifactDigests.size() == 0) {
276279
throw new IllegalArgumentException("Require one or more digests");
277280
}
278281

279-
var result = ImmutableList.<KeylessSignature>builder();
282+
var result = ImmutableList.<Bundle>builder();
280283

281284
for (var artifactDigest : artifactDigests) {
282285
byte[] signature;
@@ -334,11 +337,11 @@ public List<KeylessSignature> sign(List<byte[]> artifactDigests) throws KeylessS
334337
}
335338

336339
result.add(
337-
KeylessSignature.builder()
338-
.digest(artifactDigest)
340+
ImmutableBundle.builder()
339341
.certPath(signingCert)
340-
.signature(signature)
341-
.entry(rekorResponse.getEntry())
342+
.addEntries(rekorResponse.getEntry())
343+
.messageSignature(
344+
MessageSignature.of(HashAlgorithm.SHA2_256, artifactDigest, signature))
342345
.build());
343346
}
344347
return result.build();
@@ -409,7 +412,7 @@ private void renewSigningCertificate()
409412
* @return a keyless singing results.
410413
*/
411414
@CheckReturnValue
412-
public KeylessSignature sign(byte[] artifactDigest) throws KeylessSignerException {
415+
public Bundle sign(byte[] artifactDigest) throws KeylessSignerException {
413416
return sign(List.of(artifactDigest)).get(0);
414417
}
415418

@@ -420,7 +423,7 @@ public KeylessSignature sign(byte[] artifactDigest) throws KeylessSignerExceptio
420423
* @return a map of artifacts and their keyless singing results.
421424
*/
422425
@CheckReturnValue
423-
public Map<Path, KeylessSignature> signFiles(List<Path> artifacts) throws KeylessSignerException {
426+
public Map<Path, Bundle> signFiles(List<Path> artifacts) throws KeylessSignerException {
424427
if (artifacts.size() == 0) {
425428
throw new IllegalArgumentException("Require one or more paths");
426429
}
@@ -434,21 +437,32 @@ public Map<Path, KeylessSignature> signFiles(List<Path> artifacts) throws Keyles
434437
}
435438
}
436439
var signingResult = sign(digests);
437-
var result = ImmutableMap.<Path, KeylessSignature>builder();
440+
var result = ImmutableMap.<Path, Bundle>builder();
438441
for (int i = 0; i < artifacts.size(); i++) {
439442
result.put(artifacts.get(i), signingResult.get(i));
440443
}
441444
return result.build();
442445
}
443446

444447
/**
445-
* Convenience wrapper around {@link #sign(List)} to accept a file instead of digests
448+
* Convenience wrapper around {@link #sign(List)} to accept a single file This is a compat method
449+
* and will be switched out with signFile2
446450
*
447451
* @param artifact the artifacts to sign.
448452
* @return a keyless singing results.
449453
*/
450454
@CheckReturnValue
451455
public KeylessSignature signFile(Path artifact) throws KeylessSignerException {
456+
return signFiles(List.of(artifact)).get(artifact).toKeylessSignature();
457+
}
458+
459+
/**
460+
* Convenience wrapper around {@link #sign(List)} to accept a signe file
461+
*
462+
* @param artifact the artifacts to sign
463+
* @return a sigstore bundle
464+
*/
465+
public Bundle signFile2(Path artifact) throws KeylessSignerException {
452466
return signFiles(List.of(artifact)).get(artifact);
453467
}
454468
}

sigstore-java/src/main/java/dev/sigstore/KeylessVerificationRequest.java

Lines changed: 0 additions & 68 deletions
This file was deleted.

0 commit comments

Comments
 (0)