Skip to content

Commit 390e539

Browse files
committed
Added ACCP Provider and ecdh caching
1 parent a6dd59a commit 390e539

3 files changed

Lines changed: 48 additions & 2 deletions

File tree

Dockerfile

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

4+
RUN apk add --no-cache gcompat
5+
46
WORKDIR /app
57
EXPOSE 8080
68

pom.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +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>
2122
<enclave-api.version>2.1.6</enclave-api.version>
2223
<enclave-aws.version>2.1.0</enclave-aws.version>
2324
<enclave-azure.version>2.1.19</enclave-azure.version>
@@ -203,6 +204,13 @@
203204
<version>5.12.0</version>
204205
<scope>test</scope>
205206
</dependency>
207+
<!-- ACCP - Amazon Corretto Crypto Provider -->
208+
<dependency>
209+
<groupId>software.amazon.cryptools</groupId>
210+
<artifactId>AmazonCorrettoCryptoProvider</artifactId>
211+
<version>${accp.version}</version>
212+
<classifier>linux-x86_64</classifier>
213+
</dependency>
206214
</dependencies>
207215

208216
<profiles>

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

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,42 @@ 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+
94130
private static final String REQUEST = "request";
95131
private final HealthComponent healthComponent = HealthManager.instance.registerComponent("http-server");
96132
private final Cipher aesGcm;
@@ -408,8 +444,8 @@ private void handleClientSideTokenGenerateImpl(RoutingContext rc) throws NoSuchA
408444
return;
409445
}
410446

411-
// Perform key agreement
412-
final KeyAgreement ka = KeyAgreement.getInstance("ECDH");
447+
// Perform key agreement (uses cached provider: ACCP > Conscrypt > SunEC)
448+
final KeyAgreement ka = getKeyAgreement();
413449
ka.init(clientSideKeypair.getPrivateKey());
414450
ka.doPhase(clientPublicKey, true);
415451

0 commit comments

Comments
 (0)