Skip to content

Commit 7bb8a58

Browse files
committed
Move v2 clients to standard
- Change all *V2 clients to be default. - Remove old clients that didn't use TUF - Merge fulcio cert and sct checks into single check via api Signed-off-by: Appu Goundan <[email protected]>
1 parent 2e7b9bd commit 7bb8a58

33 files changed

+664
-2585
lines changed

fuzzing/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ repositories {
99
dependencies {
1010
implementation(project(":sigstore-java"))
1111
implementation("com.code-intelligence:jazzer-api:0.20.1")
12+
implementation("com.google.guava:guava:31.1-jre")
1213
}
1314

1415
// copy to the fuzzing builder's output directory. This is an existing directory with

fuzzing/src/main/java/fuzzing/FulcioVerifierFuzzer.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,24 @@
2929
import java.security.spec.InvalidKeySpecException;
3030
import java.util.ArrayList;
3131
import java.util.List;
32+
import util.Tuf;
3233

3334
public class FulcioVerifierFuzzer {
3435
public static void fuzzerTestOneInput(FuzzedDataProvider data) {
3536
try {
3637
int[] intArray = data.consumeInts(data.consumeInt(1, 10));
37-
byte[] byteArray = data.consumeRemainingAsBytes();
3838

39-
List<Certificate> certList = new ArrayList<Certificate>();
40-
List<byte[]> byteArrayList = new ArrayList<byte[]>();
39+
var cas = Tuf.certificateAuthoritiesFrom(data);
40+
var ctLogs = Tuf.transparencyLogsFrom(data);
4141

42+
byte[] byteArray = data.consumeRemainingAsBytes();
43+
List<Certificate> certList = new ArrayList<Certificate>();
4244
CertificateFactory cf = CertificateFactory.getInstance("X.509");
4345
certList.add(cf.generateCertificate(new ByteArrayInputStream(byteArray)));
4446
certList.add(cf.generateCertificate(new ByteArrayInputStream(byteArray)));
45-
byteArrayList.add(byteArray);
46-
byteArrayList.add(byteArray);
4747

4848
SigningCertificate sc = SigningCertificate.from(cf.generateCertPath(certList));
49-
FulcioVerifier fv = FulcioVerifier.newFulcioVerifier(byteArray, byteArrayList);
49+
FulcioVerifier fv = FulcioVerifier.newFulcioVerifier(cas, ctLogs);
5050

5151
for (int choice : intArray) {
5252
switch (choice % 4) {
@@ -56,11 +56,8 @@ public static void fuzzerTestOneInput(FuzzedDataProvider data) {
5656
case 1:
5757
sc.getLeafCertificate();
5858
break;
59-
case 2:
60-
fv.verifySct(sc);
61-
break;
6259
case 3:
63-
fv.verifyCertChain(sc);
60+
fv.verifySigningCertificate(sc);
6461
break;
6562
}
6663
}

fuzzing/src/main/java/fuzzing/RekorVerifierFuzzer.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,33 +21,27 @@
2121
import dev.sigstore.rekor.client.RekorResponse;
2222
import dev.sigstore.rekor.client.RekorVerificationException;
2323
import dev.sigstore.rekor.client.RekorVerifier;
24-
import java.io.IOException;
2524
import java.net.URI;
2625
import java.net.URISyntaxException;
2726
import java.nio.charset.StandardCharsets;
28-
import java.security.NoSuchAlgorithmException;
29-
import java.security.spec.InvalidKeySpecException;
27+
import util.Tuf;
3028

3129
public class RekorVerifierFuzzer {
3230
private static final String URL = "https://false.url.for.RekorTypes.fuzzing.com";
3331

3432
public static void fuzzerTestOneInput(FuzzedDataProvider data) {
3533
try {
34+
var tLogs = Tuf.transparencyLogsFrom(data);
3635
byte[] byteArray = data.consumeRemainingAsBytes();
3736
String string = new String(byteArray, StandardCharsets.UTF_8);
3837

3938
URI uri = new URI(URL);
4039
RekorEntry entry = RekorResponse.newRekorResponse(uri, string).getEntry();
41-
RekorVerifier verifier = RekorVerifier.newRekorVerifier(byteArray);
40+
RekorVerifier verifier = RekorVerifier.newRekorVerifier(tLogs);
4241

4342
verifier.verifyEntry(entry);
4443
verifier.verifyInclusionProof(entry);
45-
} catch (URISyntaxException
46-
| InvalidKeySpecException
47-
| NoSuchAlgorithmException
48-
| IOException
49-
| RekorParseException
50-
| RekorVerificationException e) {
44+
} catch (URISyntaxException | RekorParseException | RekorVerificationException e) {
5145
// Known exception
5246
}
5347
}

fuzzing/src/main/java/util/Tuf.java

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
/*
2+
* Copyright 2023 The Sigstore Authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package util;
17+
18+
import com.code_intelligence.jazzer.api.FuzzedDataProvider;
19+
import com.google.common.hash.Hashing;
20+
import dev.sigstore.trustroot.CertificateAuthorities;
21+
import dev.sigstore.trustroot.CertificateAuthority;
22+
import dev.sigstore.trustroot.ImmutableCertificateAuthorities;
23+
import dev.sigstore.trustroot.ImmutableCertificateAuthority;
24+
import dev.sigstore.trustroot.ImmutableLogId;
25+
import dev.sigstore.trustroot.ImmutablePublicKey;
26+
import dev.sigstore.trustroot.ImmutableSubject;
27+
import dev.sigstore.trustroot.ImmutableTransparencyLog;
28+
import dev.sigstore.trustroot.ImmutableTransparencyLogs;
29+
import dev.sigstore.trustroot.ImmutableValidFor;
30+
import dev.sigstore.trustroot.TransparencyLog;
31+
import dev.sigstore.trustroot.TransparencyLogs;
32+
import java.io.ByteArrayInputStream;
33+
import java.net.URI;
34+
import java.security.cert.CertPath;
35+
import java.security.cert.Certificate;
36+
import java.security.cert.CertificateException;
37+
import java.security.cert.CertificateFactory;
38+
import java.time.Instant;
39+
import java.util.ArrayList;
40+
import java.util.List;
41+
42+
public final class Tuf {
43+
44+
// arbitrarily decided max certificate size in bytes
45+
private static final int MAX_CERT_SIZE = 10240;
46+
47+
// ecdsa key size in bytes
48+
private static final int ECDSA_KEY_BYTES = 91;
49+
50+
public static TransparencyLogs transparencyLogsFrom(FuzzedDataProvider data) {
51+
return ImmutableTransparencyLogs.builder().addTransparencyLog(genTlog(data)).build();
52+
}
53+
54+
public static CertificateAuthorities certificateAuthoritiesFrom(FuzzedDataProvider data)
55+
throws CertificateException {
56+
return ImmutableCertificateAuthorities.builder().addCertificateAuthority(genCA(data)).build();
57+
}
58+
59+
private static CertPath genCertPath(FuzzedDataProvider data) throws CertificateException {
60+
List<Certificate> certList = new ArrayList<Certificate>();
61+
CertificateFactory cf = CertificateFactory.getInstance("X.509");
62+
certList.add(
63+
cf.generateCertificate(new ByteArrayInputStream(data.consumeBytes(MAX_CERT_SIZE))));
64+
certList.add(
65+
cf.generateCertificate(new ByteArrayInputStream(data.consumeBytes(MAX_CERT_SIZE))));
66+
return cf.generateCertPath(certList);
67+
}
68+
69+
private static CertificateAuthority genCA(FuzzedDataProvider data) throws CertificateException {
70+
return ImmutableCertificateAuthority.builder()
71+
.validFor(ImmutableValidFor.builder().start(Instant.EPOCH).build())
72+
.subject(ImmutableSubject.builder().commonName("test").organization("test").build())
73+
.certPath(genCertPath(data))
74+
.uri(URI.create("test"))
75+
.build();
76+
}
77+
78+
private static TransparencyLog genTlog(FuzzedDataProvider data) {
79+
var pk =
80+
ImmutablePublicKey.builder()
81+
.keyDetails("PKIX_ECDSA_P256_SHA_256")
82+
.rawBytes(data.consumeBytes(ECDSA_KEY_BYTES))
83+
.validFor(ImmutableValidFor.builder().start(Instant.EPOCH).build())
84+
.build();
85+
var logId = Hashing.sha256().hashBytes(pk.getRawBytes()).asBytes();
86+
return ImmutableTransparencyLog.builder()
87+
.baseUrl(URI.create("test"))
88+
.hashAlgorithm("SHA2_256")
89+
.publicKey(pk)
90+
.logId(ImmutableLogId.builder().keyId(logId).build())
91+
.build();
92+
}
93+
}

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
@@ -19,6 +19,7 @@ package dev.sigstore.sign.work
1919
import dev.sigstore.KeylessSigner
2020
import dev.sigstore.bundle.BundleFactory
2121
import dev.sigstore.oidc.client.OidcClient
22+
import dev.sigstore.oidc.client.OidcClients
2223
import dev.sigstore.sign.OidcClientConfiguration
2324
import org.gradle.api.file.RegularFileProperty
2425
import org.gradle.api.provider.Property
@@ -50,8 +51,7 @@ abstract class SignWorkAction : WorkAction<SignWorkParameters> {
5051
val signer = clients.computeIfAbsent(oidcClient.key()) {
5152
KeylessSigner.builder().apply {
5253
sigstorePublicDefaults()
53-
@Suppress("DEPRECATION")
54-
oidcClient(oidcClient.build() as OidcClient)
54+
oidcClients(OidcClients.of(oidcClient.build() as OidcClient))
5555
}.build()
5656
}
5757

0 commit comments

Comments
 (0)