Skip to content

Commit 1a01a6c

Browse files
authored
Merge pull request #1028 from sigstore/tuf-config
Require signing config from TUF and remove legacy fallback
2 parents 0ba9ca3 + 5c6d7e2 commit 1a01a6c

File tree

4 files changed

+22
-40
lines changed

4 files changed

+22
-40
lines changed

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@
6262
import dev.sigstore.timestamp.client.TimestampResponse;
6363
import dev.sigstore.timestamp.client.TimestampVerificationException;
6464
import dev.sigstore.timestamp.client.TimestampVerifier;
65-
import dev.sigstore.trustroot.LegacySigningConfig;
6665
import dev.sigstore.trustroot.Service;
6766
import dev.sigstore.trustroot.SigstoreConfigurationException;
6867
import dev.sigstore.tuf.SigstoreTufClient;
@@ -359,10 +358,7 @@ public KeylessSigner build()
359358
public Builder sigstorePublicDefaults() {
360359
var sigstoreTufClientBuilder = SigstoreTufClient.builder().usePublicGoodInstance();
361360
trustedRootProvider = TrustedRootProvider.from(sigstoreTufClientBuilder);
362-
// TODO: signing config is not pushed to prod yet
363-
signingConfigProvider =
364-
SigningConfigProvider.fromOrDefault(
365-
sigstoreTufClientBuilder, LegacySigningConfig.PUBLIC_GOOD);
361+
signingConfigProvider = SigningConfigProvider.from(sigstoreTufClientBuilder);
366362
signingAlgorithm = AlgorithmRegistry.SigningAlgorithm.PKIX_ECDSA_P256_SHA_256;
367363
minSigningCertificateLifetime(DEFAULT_MIN_SIGNING_CERTIFICATE_LIFETIME);
368364
return this;

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

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -42,29 +42,11 @@ static SigningConfigProvider from(SigstoreTufClient.Builder tufClientBuilder) {
4242
};
4343
}
4444

45-
// Temporary while the tuf repos catches up, this will still fail if the remove TUF isn't
46-
// available to check for signing config
47-
static SigningConfigProvider fromOrDefault(
48-
SigstoreTufClient.Builder tufClientBuilder, SigstoreSigningConfig defaultConfig) {
49-
Preconditions.checkNotNull(tufClientBuilder);
50-
return () -> {
51-
try {
52-
var tufClient = tufClientBuilder.build();
53-
tufClient.update();
54-
var fromTuf = tufClient.getSigstoreSigningConfig();
55-
return fromTuf == null ? defaultConfig : fromTuf;
56-
} catch (IOException ex) {
57-
throw new SigstoreConfigurationException(
58-
"Could not initialize signing config from provided tuf client", ex);
59-
}
60-
};
61-
}
62-
6345
static SigningConfigProvider from(Path signingConfig) {
6446
Preconditions.checkNotNull(signingConfig);
6547
return () -> {
66-
try {
67-
return SigstoreSigningConfig.from(Files.newInputStream(signingConfig));
48+
try (var is = Files.newInputStream(signingConfig)) {
49+
return SigstoreSigningConfig.from(is);
6850
} catch (IOException ex) {
6951
throw new SigstoreConfigurationException(
7052
"Could not initialize signing config from " + signingConfig, ex);

sigstore-java/src/main/java/dev/sigstore/tuf/SigstoreTufClient.java

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import java.security.spec.InvalidKeySpecException;
3131
import java.time.Duration;
3232
import java.time.Instant;
33-
import javax.annotation.Nullable;
3433

3534
/**
3635
* Wrapper around {@link dev.sigstore.tuf.Updater} that provides access to sigstore specific
@@ -48,10 +47,7 @@ public class SigstoreTufClient {
4847
private final Updater updater;
4948
private Instant lastUpdate;
5049
private SigstoreTrustedRoot sigstoreTrustedRoot;
51-
// TODO: this is nullable because we expect all future sigstore tuf repos to contain a signing
52-
// config
53-
// but while we transition, we need to handle the null case.
54-
@Nullable private SigstoreSigningConfig sigstoreSigningConfig;
50+
private SigstoreSigningConfig sigstoreSigningConfig;
5551
private final Duration cacheValidity;
5652

5753
@VisibleForTesting
@@ -181,15 +177,9 @@ public void forceUpdate() throws SigstoreConfigurationException {
181177
throw new SigstoreConfigurationException("Failed to read trusted root from target store", ex);
182178
}
183179
try {
184-
if (updater.getTargetStore().hasTarget(SIGNING_CONFIG_FILENAME)) {
185-
sigstoreSigningConfig =
186-
SigstoreSigningConfig.from(
187-
updater.getTargetStore().getTargetInputSteam(SIGNING_CONFIG_FILENAME));
188-
} else {
189-
sigstoreSigningConfig = null;
190-
// TODO: Remove when prod and staging TUF repos have fully configured signing configs, but
191-
// right now sigstore tuf repos not having sigstoreSigningConfig is a valid state.
192-
}
180+
sigstoreSigningConfig =
181+
SigstoreSigningConfig.from(
182+
updater.getTargetStore().getTargetInputSteam(SIGNING_CONFIG_FILENAME));
193183
} catch (IOException ex) {
194184
throw new SigstoreConfigurationException(
195185
"Failed to read signing config from target store", ex);
@@ -200,7 +190,6 @@ public SigstoreTrustedRoot getSigstoreTrustedRoot() {
200190
return sigstoreTrustedRoot;
201191
}
202192

203-
@Nullable
204193
public SigstoreSigningConfig getSigstoreSigningConfig() {
205194
return sigstoreSigningConfig;
206195
}

sigstore-java/src/test/java/dev/sigstore/tuf/SigstoreTufClientTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
package dev.sigstore.tuf;
1717

1818
import com.google.protobuf.util.JsonFormat;
19+
import dev.sigstore.proto.trustroot.v1.ServiceConfiguration;
20+
import dev.sigstore.proto.trustroot.v1.ServiceSelector;
21+
import dev.sigstore.proto.trustroot.v1.SigningConfig;
1922
import dev.sigstore.proto.trustroot.v1.TrustedRoot;
2023
import dev.sigstore.trustroot.SigstoreSigningConfig;
2124
import dev.sigstore.trustroot.SigstoreTrustedRoot;
@@ -121,12 +124,24 @@ public void testUpdate_noUpdateWhenCacheValid() throws Exception {
121124
}
122125

123126
private static Updater mockUpdater() throws IOException {
127+
var serviceConfig = ServiceConfiguration.newBuilder().setSelector(ServiceSelector.ANY).build();
124128
var trustRootBytes =
125129
JsonFormat.printer().print(TrustedRoot.newBuilder()).getBytes(StandardCharsets.UTF_8);
130+
var signingConfigBytes =
131+
JsonFormat.printer()
132+
.print(
133+
SigningConfig.newBuilder()
134+
.setMediaType(SigstoreSigningConfig.MEDIA_TYPE)
135+
.setTsaConfig(serviceConfig)
136+
.setRekorTlogConfig(serviceConfig))
137+
.getBytes(StandardCharsets.UTF_8);
126138
var mockUpdater = Mockito.mock(Updater.class);
127139
var mockTargetStore = Mockito.mock(TargetStore.class);
128140
Mockito.when(mockTargetStore.getTargetInputSteam(SigstoreTufClient.TRUST_ROOT_FILENAME))
129141
.thenAnswer((Answer<InputStream>) invocation -> new ByteArrayInputStream(trustRootBytes));
142+
Mockito.when(mockTargetStore.getTargetInputSteam(SigstoreTufClient.SIGNING_CONFIG_FILENAME))
143+
.thenAnswer(
144+
(Answer<InputStream>) invocation -> new ByteArrayInputStream(signingConfigBytes));
130145
Mockito.when(mockUpdater.getTargetStore()).thenReturn(mockTargetStore);
131146

132147
return mockUpdater;

0 commit comments

Comments
 (0)