Skip to content

Commit 6139317

Browse files
committed
Moved crypto code to a service and updated ACCP
1 parent 390e539 commit 6139317

4 files changed

Lines changed: 58 additions & 40 deletions

File tree

Dockerfile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# sha from https://hub.docker.com/layers/library/eclipse-temurin/21.0.9_10-jre-alpine-3.23/images/sha256-f599f6fa11f007b6dcf6e85ec2c372c1eba2b6940a7828eb6e665665ea5edd1c
2-
FROM eclipse-temurin@sha256:243e711289b0f17e05a4df60454bbb1b8ed7b126db4de2d5535da994b7417111
2+
FROM eclipse-temurin@sha256:89517925fa675c6c4b770bee7c44d38a7763212741b0d6fca5a5103caab21a97
33

44
RUN apk add --no-cache gcompat
55

@@ -20,12 +20,16 @@ COPY ./target/${JAR_NAME}-${JAR_VERSION}-static.tar.gz /app/static.tar.gz
2020
COPY ./conf/default-config.json /app/conf/
2121
COPY ./conf/*.xml /app/conf/
2222

23+
# Fix CVE-2025-68973: Update gnupg to patched version
24+
RUN apk update && apk upgrade gnupg && rm -rf /var/cache/apk/*
25+
2326
RUN tar xzvf /app/static.tar.gz --no-same-owner --no-same-permissions && rm -f /app/static.tar.gz
2427

2528
RUN adduser -D uid2-operator && mkdir -p /opt/uid2 && chmod 777 -R /opt/uid2 && mkdir -p /app && chmod 705 -R /app && mkdir -p /app/file-uploads && chmod 777 -R /app/file-uploads && mkdir -p /app/pod_terminating && chmod 777 -R /app/pod_terminating
2629
USER uid2-operator
2730

2831
CMD java \
32+
-XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints \
2933
-XX:MaxRAMPercentage=95 -XX:-UseCompressedOops -XX:+PrintFlagsFinal -XX:-OmitStackTraceInFastThrow \
3034
-Djava.security.egd=file:/dev/./urandom \
3135
-Dvertx.logger-delegate-factory-class-name=io.vertx.core.logging.SLF4JLogDelegateFactory \

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<vertx.verticle>com.uid2.operator.vertx.UIDOperatorVerticle</vertx.verticle>
1919
<!-- check micrometer.version vertx-micrometer-metrics consumes before bumping up -->
2020
<micrometer.version>1.12.2</micrometer.version>
21-
<accp.version>2.3.3</accp.version>
21+
<accp.version>2.5.0</accp.version>
2222
<enclave-api.version>2.1.6</enclave-api.version>
2323
<enclave-aws.version>2.1.0</enclave-aws.version>
2424
<enclave-azure.version>2.1.19</enclave-azure.version>
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.uid2.operator.service;
2+
3+
import com.uid2.operator.vertx.UIDOperatorVerticle;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
7+
import javax.crypto.KeyAgreement;
8+
import java.security.NoSuchAlgorithmException;
9+
import java.security.NoSuchProviderException;
10+
11+
public class CryptoProviderService {
12+
private static final Logger LOGGER = LoggerFactory.getLogger(CryptoProviderService.class);
13+
14+
// ECDH provider selection: tries ACCP first, falls back to default (SunEC)
15+
private static final String ECDH_PROVIDER_NAME = initEcdhProvider();
16+
private static final ThreadLocal<KeyAgreement> THREAD_LOCAL_KEY_AGREEMENT = ThreadLocal.withInitial(() -> {
17+
try {
18+
return createKeyAgreement();
19+
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
20+
throw new RuntimeException("Failed to create KeyAgreement", e);
21+
}
22+
});
23+
24+
private static String initEcdhProvider() {
25+
// Try ACCP (Amazon Corretto Crypto Provider) first
26+
try {
27+
KeyAgreement ka = KeyAgreement.getInstance("ECDH", "AmazonCorrettoCryptoProvider");
28+
LOGGER.info("ECDH using AmazonCorrettoCryptoProvider");
29+
return "AmazonCorrettoCryptoProvider";
30+
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
31+
// ACCP not available, fall through
32+
LOGGER.info("AmazonCorrettoCryptoProvider is not available");
33+
}
34+
35+
// Fall back to default provider (SunEC on most JDKs)
36+
LOGGER.info("ECDH using default provider (SunEC)");
37+
return null;
38+
}
39+
40+
private static KeyAgreement createKeyAgreement() throws NoSuchAlgorithmException, NoSuchProviderException {
41+
if (ECDH_PROVIDER_NAME != null) {
42+
return KeyAgreement.getInstance("ECDH", ECDH_PROVIDER_NAME);
43+
}
44+
return KeyAgreement.getInstance("ECDH");
45+
}
46+
47+
public static KeyAgreement getKeyAgreement() {
48+
return THREAD_LOCAL_KEY_AGREEMENT.get();
49+
}
50+
}

src/main/java/com/uid2/operator/vertx/UIDOperatorVerticle.java

Lines changed: 2 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -91,42 +91,6 @@ public class UIDOperatorVerticle extends AbstractVerticle {
9191
private static final ObjectMapper OBJECT_MAPPER = Mapper.getApiInstance();
9292
private static final long SECOND_IN_MILLIS = 1000;
9393

94-
// ECDH provider selection: tries ACCP first, falls back to default (SunEC)
95-
private static final String ECDH_PROVIDER_NAME = initEcdhProvider();
96-
private static final ThreadLocal<KeyAgreement> THREAD_LOCAL_KEY_AGREEMENT = ThreadLocal.withInitial(() -> {
97-
try {
98-
return createKeyAgreement();
99-
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
100-
throw new RuntimeException("Failed to create KeyAgreement", e);
101-
}
102-
});
103-
104-
private static String initEcdhProvider() {
105-
// Try ACCP (Amazon Corretto Crypto Provider) first
106-
try {
107-
KeyAgreement ka = KeyAgreement.getInstance("ECDH", "AmazonCorrettoCryptoProvider");
108-
LOGGER.info("ECDH using AmazonCorrettoCryptoProvider");
109-
return "AmazonCorrettoCryptoProvider";
110-
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
111-
// ACCP not available, fall through
112-
}
113-
114-
// Fall back to default provider (SunEC on most JDKs)
115-
LOGGER.info("ECDH using default provider (SunEC)");
116-
return null;
117-
}
118-
119-
private static KeyAgreement createKeyAgreement() throws NoSuchAlgorithmException, NoSuchProviderException {
120-
if (ECDH_PROVIDER_NAME != null) {
121-
return KeyAgreement.getInstance("ECDH", ECDH_PROVIDER_NAME);
122-
}
123-
return KeyAgreement.getInstance("ECDH");
124-
}
125-
126-
private static KeyAgreement getKeyAgreement() {
127-
return THREAD_LOCAL_KEY_AGREEMENT.get();
128-
}
129-
13094
private static final String REQUEST = "request";
13195
private final HealthComponent healthComponent = HealthManager.instance.registerComponent("http-server");
13296
private final Cipher aesGcm;
@@ -444,8 +408,8 @@ private void handleClientSideTokenGenerateImpl(RoutingContext rc) throws NoSuchA
444408
return;
445409
}
446410

447-
// Perform key agreement (uses cached provider: ACCP > Conscrypt > SunEC)
448-
final KeyAgreement ka = getKeyAgreement();
411+
// Perform key agreement (uses cached provider: ACCP > SunEC)
412+
final KeyAgreement ka = CryptoProviderService.getKeyAgreement();
449413
ka.init(clientSideKeypair.getPrivateKey());
450414
ka.doPhase(clientPublicKey, true);
451415

0 commit comments

Comments
 (0)