Skip to content

Commit e80b0d4

Browse files
authored
Merge pull request #2276 from IABTechLab/srm-UID2-6479-change-ecdh-crypto-to-accp
Added ACCP for ECDH for client generate
2 parents 54471e8 + 3b284b8 commit e80b0d4

5 files changed

Lines changed: 80 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: 21 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.5.0</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,26 @@
203204
<version>5.12.0</version>
204205
<scope>test</scope>
205206
</dependency>
207+
208+
<!-- ACCP - Amazon Corretto Crypto Provider (Linux + macOS) -->
209+
<dependency>
210+
<groupId>software.amazon.cryptools</groupId>
211+
<artifactId>AmazonCorrettoCryptoProvider</artifactId>
212+
<version>${accp.version}</version>
213+
<classifier>linux-x86_64</classifier>
214+
</dependency>
215+
<dependency>
216+
<groupId>software.amazon.cryptools</groupId>
217+
<artifactId>AmazonCorrettoCryptoProvider</artifactId>
218+
<version>${accp.version}</version>
219+
<classifier>osx-x86_64</classifier>
220+
</dependency>
221+
<dependency>
222+
<groupId>software.amazon.cryptools</groupId>
223+
<artifactId>AmazonCorrettoCryptoProvider</artifactId>
224+
<version>${accp.version}</version>
225+
<classifier>osx-aarch_64</classifier>
226+
</dependency>
206227
</dependencies>
207228

208229
<profiles>
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.uid2.operator.service;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
import com.amazon.corretto.crypto.provider.AmazonCorrettoCryptoProvider;
6+
7+
import javax.crypto.KeyAgreement;
8+
import java.security.NoSuchAlgorithmException;
9+
import java.security.NoSuchProviderException;
10+
import java.security.Security;
11+
12+
public class CryptoProviderService {
13+
private static final Logger LOGGER = LoggerFactory.getLogger(CryptoProviderService.class);
14+
15+
// ECDH provider selection: tries ACCP first, falls back to default (SunEC)
16+
private static final String ECDH_PROVIDER_NAME = initEcdhProvider();
17+
18+
private static String initEcdhProvider() {
19+
// Try ACCP (Amazon Corretto Crypto Provider) first
20+
try {
21+
// Add ACCP at lowest priority so it doesn't become default for other algorithms
22+
Security.addProvider(AmazonCorrettoCryptoProvider.INSTANCE);
23+
24+
// Verify it works for ECDH
25+
KeyAgreement ka = KeyAgreement.getInstance("ECDH", AmazonCorrettoCryptoProvider.PROVIDER_NAME);
26+
LOGGER.info("ECDH using AmazonCorrettoCryptoProvider (added at lowest priority)");
27+
return AmazonCorrettoCryptoProvider.PROVIDER_NAME;
28+
} catch (Throwable e) {
29+
// ACCP not available
30+
LOGGER.info("AmazonCorrettoCryptoProvider is not available: {}", e.getMessage());
31+
}
32+
33+
// Fall back to default provider
34+
LOGGER.info("ECDH using default provider (SunEC)");
35+
return null;
36+
}
37+
38+
/**
39+
* Create ECDH Key Agreement using ACCP if available, fall back to SunEC if not
40+
* @return ECDH KeyAgreement
41+
* @throws NoSuchAlgorithmException
42+
*/
43+
public static KeyAgreement createKeyAgreement() throws NoSuchAlgorithmException {
44+
if (ECDH_PROVIDER_NAME != null) {
45+
try {
46+
return KeyAgreement.getInstance("ECDH", ECDH_PROVIDER_NAME);
47+
} catch (NoSuchProviderException e) {
48+
LOGGER.info("{} is not available: {}", ECDH_PROVIDER_NAME, e.getMessage());
49+
}
50+
}
51+
return KeyAgreement.getInstance("ECDH");
52+
}
53+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ private void handleClientSideTokenGenerateImpl(RoutingContext rc) throws NoSuchA
409409
}
410410

411411
// Perform key agreement
412-
final KeyAgreement ka = KeyAgreement.getInstance("ECDH");
412+
final KeyAgreement ka = CryptoProviderService.createKeyAgreement();
413413
ka.init(clientSideKeypair.getPrivateKey());
414414
ka.doPhase(clientPublicKey, true);
415415

src/test/java/com/uid2/operator/ClientSideTokenGenerateTestUtil.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.uid2.operator;
22

3+
import com.uid2.operator.service.CryptoProviderService;
4+
35
import javax.crypto.*;
46
import javax.crypto.spec.GCMParameterSpec;
57
import javax.crypto.spec.SecretKeySpec;
@@ -37,7 +39,7 @@ public static PrivateKey stringToPrivateKey(String privateKeyString, KeyFactory
3739
}
3840

3941
public static SecretKey deriveKey(PublicKey serverPublicKey, PrivateKey clientPrivateKey) throws NoSuchAlgorithmException, InvalidKeyException {
40-
KeyAgreement keyAgreement = KeyAgreement.getInstance("ECDH");
42+
KeyAgreement keyAgreement = CryptoProviderService.createKeyAgreement();
4143
keyAgreement.init(clientPrivateKey);
4244
keyAgreement.doPhase(serverPublicKey, true);
4345

0 commit comments

Comments
 (0)