Skip to content

Commit 827a5c3

Browse files
committed
make sure we get the right provider in tests
1 parent 6fc81f1 commit 827a5c3

6 files changed

Lines changed: 73 additions & 35 deletions

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.opentdf.platform.sdk;
2+
3+
import org.bouncycastle.jce.provider.BouncyCastleProvider;
4+
import org.junit.jupiter.api.extension.BeforeAllCallback;
5+
import org.junit.jupiter.api.extension.ExtensionContext;
6+
7+
import java.security.Provider;
8+
import java.security.Security;
9+
import java.util.Arrays;
10+
11+
public class CryptoProviderSetupExtension implements BeforeAllCallback {
12+
private BouncyCastleProvider securityProvider;
13+
14+
@Override
15+
public synchronized void beforeAll(ExtensionContext extensionContext) {
16+
if (this.securityProvider == null) {
17+
var existingProviders = Security.getProviders();
18+
Arrays.asList(existingProviders).stream().map(Provider::getName).forEach(Security::removeProvider);
19+
if (Security.getProviders().length != 0) {
20+
throw new IllegalStateException("unable to remove all providers");
21+
}
22+
23+
Security.addProvider(this.securityProvider = new BouncyCastleProvider());
24+
}
25+
}
26+
}

sdk/src/test/java/io/opentdf/platform/sdk/ECKeyPairTest.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,17 @@ void ecPublicKeyInPemformat() {
5454
String keypairAPubicKey = keyPairA.publicKeyInPEMFormat();
5555
String keypairAPrivateKey = keyPairA.privateKeyInPEMFormat();
5656

57-
ECPublicKey publicKeyA = PemUtils.publicKeyFromPem(keypairAPubicKey);
58-
ECPrivateKey privateKeyA = PemUtils.privateKeyFromPem(keypairAPrivateKey);
57+
ECPublicKey publicKeyA = PemTestUtils.publicKeyFromPem(keypairAPubicKey);
58+
ECPrivateKey privateKeyA = PemTestUtils.privateKeyFromPem(keypairAPrivateKey);
5959

6060
System.out.println(keypairAPubicKey);
6161
System.out.println(keypairAPrivateKey);
6262

6363
byte[] compressedKey1 = keyPairA.compressECPublickey();
64-
byte[] compressedKey2 = PemUtils.compressECPublickey(keyPairA.publicKeyInPEMFormat());
64+
byte[] compressedKey2 = PemTestUtils.compressECPublickey(keyPairA.publicKeyInPEMFormat());
6565
assertArrayEquals(compressedKey1, compressedKey2);
6666

67-
String publicKey = PemUtils.publicKeyFromECPoint(compressedKey1, SECP256R1.getCurveName());
67+
String publicKey = PemTestUtils.publicKeyFromECPoint(compressedKey1, SECP256R1.getCurveName());
6868
assertEquals(keyPairA.publicKeyInPEMFormat(), publicKey);
6969

7070
ECKeyPair keyPairB = new ECKeyPair();
@@ -74,8 +74,8 @@ void ecPublicKeyInPemformat() {
7474
System.out.println(keypairBPubicKey);
7575
System.out.println(keypairBPrivateKey);
7676

77-
ECPublicKey publicKeyB = PemUtils.publicKeyFromPem(keypairBPubicKey);
78-
ECPrivateKey privateKeyB = PemUtils.privateKeyFromPem(keypairBPrivateKey);
77+
ECPublicKey publicKeyB = PemTestUtils.publicKeyFromPem(keypairBPubicKey);
78+
ECPrivateKey privateKeyB = PemTestUtils.privateKeyFromPem(keypairBPrivateKey);
7979

8080
byte[] symmetricKey1 = ECKeyPair.computeECDHKey(publicKeyA, privateKeyB);
8181
byte[] symmetricKey2 = ECKeyPair.computeECDHKey(publicKeyB, privateKeyA);
@@ -94,14 +94,14 @@ void extractPemPubKeyFromX509() throws CertificateException, IOException, NoSuch
9494
"zj0EAwIDSAAwRQIhAItk5SmcWSg06tnOCEqTa6UsChaycX/cmAT8PTDRnaRcAiAl\n" +
9595
"Vr2EvlA2x5mWFE/+nDdxxzljYjLZuSDQMEI/J6u0/Q==\n" +
9696
"-----END CERTIFICATE-----";
97-
String pubKey = PemUtils.getPEMPublicKeyFromX509Cert(x509ECPubKey);
97+
String pubKey = PemTestUtils.getPEMPublicKeyFromX509Cert(x509ECPubKey);
9898
System.out.println(pubKey);
9999

100-
ECPublicKey publicKey = PemUtils.publicKeyFromPem(pubKey);
101-
byte[] compressedKey = PemUtils.compressECPublickey(pubKey);
100+
ECPublicKey publicKey = PemTestUtils.publicKeyFromPem(pubKey);
101+
byte[] compressedKey = PemTestUtils.compressECPublickey(pubKey);
102102
System.out.println(Arrays.toString(compressedKey));
103103

104-
compressedKey = PemUtils.compressECPublickey(pubKey);
104+
compressedKey = PemTestUtils.compressECPublickey(pubKey);
105105
System.out.println(Arrays.toString(compressedKey));
106106
System.out.println(compressedKey.length);
107107

@@ -112,7 +112,7 @@ void extractPemPubKeyFromX509() throws CertificateException, IOException, NoSuch
112112
System.out.println(keypairPubicKey);
113113
System.out.println(keypairPrivateKey);
114114

115-
byte[] symmetricKey = ECKeyPair.computeECDHKey(publicKey, PemUtils.privateKeyFromPem(keypairPrivateKey));
115+
byte[] symmetricKey = ECKeyPair.computeECDHKey(publicKey, PemTestUtils.privateKeyFromPem(keypairPrivateKey));
116116
System.out.println(Arrays.toString(symmetricKey));
117117

118118
byte[] key = ECKeyPair.calculateHKDF(ECKeys.salt.getBytes(StandardCharsets.UTF_8), symmetricKey);
@@ -138,11 +138,11 @@ void testECDH() {
138138
String expectedKey = "3KGgsptHbTsbxJtql6sHUcx255KcUhxdeJWKjmPMlcc=";
139139

140140
// SDK side
141-
ECPublicKey kasPubKey = PemUtils.publicKeyFromPem(ECKeys.kasPublicKey);
142-
ECPrivateKey kasPriKey = PemUtils.privateKeyFromPem(ECKeys.kasPrivateKey);
141+
ECPublicKey kasPubKey = PemTestUtils.publicKeyFromPem(ECKeys.kasPublicKey);
142+
ECPrivateKey kasPriKey = PemTestUtils.privateKeyFromPem(ECKeys.kasPrivateKey);
143143

144-
ECPublicKey sdkPubKey = PemUtils.publicKeyFromPem(ECKeys.sdkPublicKey);
145-
ECPrivateKey sdkPriKey = PemUtils.privateKeyFromPem(ECKeys.sdkPrivateKey);
144+
ECPublicKey sdkPubKey = PemTestUtils.publicKeyFromPem(ECKeys.sdkPublicKey);
145+
ECPrivateKey sdkPriKey = PemTestUtils.privateKeyFromPem(ECKeys.sdkPrivateKey);
146146

147147
byte[] symmetricKey = ECKeyPair.computeECDHKey(kasPubKey, sdkPriKey);
148148
byte[] key = ECKeyPair.calculateHKDF(ECKeys.salt.getBytes(StandardCharsets.UTF_8), symmetricKey);
@@ -155,11 +155,11 @@ void testECDH() {
155155
encodedKey = Base64.getEncoder().encodeToString(key);
156156
assertEquals(encodedKey, expectedKey);
157157

158-
byte[] ecPoint = PemUtils.compressECPublickey(ECKeys.sdkPublicKey);
158+
byte[] ecPoint = PemTestUtils.compressECPublickey(ECKeys.sdkPublicKey);
159159
String encodeECPoint = Base64.getEncoder().encodeToString(ecPoint);
160160
assertEquals(encodeECPoint, "Al3vx59pBnP8tRxuUFw18aK9ym6rFrxZRhpVQytUQ+Kg");
161161

162-
String publicKey = PemUtils.publicKeyFromECPoint(ecPoint,
162+
String publicKey = PemTestUtils.publicKeyFromECPoint(ecPoint,
163163
SECP256R1.name());
164164
assertArrayEquals(ECKeys.sdkPublicKey.toCharArray(), publicKey.toCharArray());
165165
}

sdk/src/test/java/io/opentdf/platform/sdk/PemUtils.java renamed to sdk/src/test/java/io/opentdf/platform/sdk/PemTestUtils.java

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,30 @@
2020
import java.security.KeyFactory;
2121
import java.security.NoSuchAlgorithmException;
2222
import java.security.PublicKey;
23+
import java.security.Security;
2324
import java.security.interfaces.ECPrivateKey;
2425
import java.security.interfaces.ECPublicKey;
2526
import java.security.spec.InvalidKeySpecException;
2627
import java.security.spec.X509EncodedKeySpec;
28+
import java.util.Objects;
2729

2830
/**
2931
* BouncyCastle-flavored PEM/X.509 helpers used only by tests. Kept here so the SDK
3032
* production classpath does not have a BouncyCastle dependency. The implementations
3133
* use BouncyCastle internally but expose standard JCA key interfaces, so callers can
3234
* pass results directly to JCA-based APIs.
3335
*/
34-
final class PemUtils {
36+
final class PemTestUtils {
37+
private static final JcaPEMKeyConverter converter;
3538

39+
static {
40+
var provider = Objects.requireNonNull(
41+
Security.getProvider("BC"),
42+
"BC provider must be registered");
43+
converter = new JcaPEMKeyConverter().setProvider(provider);
44+
}
3645

37-
private PemUtils() {
46+
private PemTestUtils() {
3847
}
3948

4049
static ECPublicKey publicKeyFromPem(String pemEncoding) {
@@ -43,7 +52,6 @@ static ECPublicKey publicKeyFromPem(String pemEncoding) {
4352
SubjectPublicKeyInfo publicKeyInfo = (SubjectPublicKeyInfo) parser.readObject();
4453
parser.close();
4554

46-
JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
4755
return (ECPublicKey) converter.getPublicKey(publicKeyInfo);
4856
} catch (IOException e) {
4957
throw new RuntimeException(e);
@@ -56,7 +64,6 @@ static ECPrivateKey privateKeyFromPem(String pemEncoding) {
5664
PrivateKeyInfo privateKeyInfo = (PrivateKeyInfo) parser.readObject();
5765
parser.close();
5866

59-
JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
6067
return (ECPrivateKey) converter.getPrivateKey(privateKeyInfo);
6168
} catch (IOException e) {
6269
throw new RuntimeException(e);
@@ -65,17 +72,7 @@ static ECPrivateKey privateKeyFromPem(String pemEncoding) {
6572

6673
static String getPEMPublicKeyFromX509Cert(String pemInX509Format) {
6774
try {
68-
PEMParser parser = new PEMParser(new StringReader(pemInX509Format));
69-
X509CertificateHolder x509CertificateHolder = (X509CertificateHolder) parser.readObject();
70-
parser.close();
71-
SubjectPublicKeyInfo publicKeyInfo = x509CertificateHolder.getSubjectPublicKeyInfo();
72-
JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
73-
ECPublicKey publicKey;
74-
try {
75-
publicKey = (ECPublicKey) converter.getPublicKey(publicKeyInfo);
76-
} catch (PEMException e) {
77-
throw new RuntimeException(e);
78-
}
75+
ECPublicKey publicKey = getEcPublicKey(pemInX509Format);
7976

8077
StringWriter writer = new StringWriter();
8178
PemWriter pemWriter = new PemWriter(writer);
@@ -88,6 +85,20 @@ static String getPEMPublicKeyFromX509Cert(String pemInX509Format) {
8885
}
8986
}
9087

88+
private static ECPublicKey getEcPublicKey(String pemInX509Format) throws IOException {
89+
PEMParser parser = new PEMParser(new StringReader(pemInX509Format));
90+
X509CertificateHolder x509CertificateHolder = (X509CertificateHolder) parser.readObject();
91+
parser.close();
92+
SubjectPublicKeyInfo publicKeyInfo = x509CertificateHolder.getSubjectPublicKeyInfo();
93+
ECPublicKey publicKey;
94+
try {
95+
publicKey = (ECPublicKey) converter.getPublicKey(publicKeyInfo);
96+
} catch (PEMException e) {
97+
throw new RuntimeException(e);
98+
}
99+
return publicKey;
100+
}
101+
91102
static byte[] compressECPublickey(String pemECPubKey) {
92103
try {
93104
KeyFactory ecKeyFac = KeyFactory.getInstance("EC");

sdk/src/test/java/io/opentdf/platform/sdk/TDFTest.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import io.opentdf.platform.policy.kasregistry.KeyAccessServerRegistryServiceClient;
1111
import io.opentdf.platform.policy.kasregistry.ListKeyAccessServersRequest;
1212
import io.opentdf.platform.policy.kasregistry.ListKeyAccessServersResponse;
13-
import io.opentdf.platform.sdk.Config.KASInfo;
1413
import io.opentdf.platform.sdk.TDF.Reader;
1514
import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
1615
import org.junit.jupiter.api.BeforeAll;
@@ -89,9 +88,9 @@ public byte[] unwrap(Manifest.KeyAccess keyAccess, String policy, KeyType sessio
8988
if (sessionKeyType.isEc()) {
9089
var kasPrivateKey = CryptoUtils
9190
.getPrivateKeyPEM(keypairs.get(index).getPrivate());
92-
var privateKey = PemUtils.privateKeyFromPem(kasPrivateKey);
91+
var privateKey = PemTestUtils.privateKeyFromPem(kasPrivateKey);
9392
var clientEphemeralPublicKey = keyAccess.ephemeralPublicKey;
94-
var publicKey = PemUtils.publicKeyFromPem(clientEphemeralPublicKey);
93+
var publicKey = PemTestUtils.publicKeyFromPem(clientEphemeralPublicKey);
9594
byte[] symKey = ECKeyPair.computeECDHKey(publicKey, privateKey);
9695

9796
var sessionKey = ECKeyPair.calculateHKDF(GLOBAL_KEY_SALT, symKey);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.opentdf.platform.sdk.CryptoProviderSetupExtension
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
junit.jupiter.extensions.autodetection.enabled = true

0 commit comments

Comments
 (0)