Skip to content

Commit 862460a

Browse files
authored
feat: support key id in ztdf key access object (#84)
1 parent 79215c7 commit 862460a

File tree

9 files changed

+56
-0
lines changed

9 files changed

+56
-0
lines changed

sdk/src/main/java/io/opentdf/platform/sdk/Config.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public enum IntegrityAlgorithm {
3030
public static class KASInfo {
3131
public String URL;
3232
public String PublicKey;
33+
public String KID;
3334
}
3435

3536
public static class TDFConfig {

sdk/src/main/java/io/opentdf/platform/sdk/KASClient.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ public String getPublicKey(Config.KASInfo kasInfo) {
6767
.getPublicKey();
6868
}
6969

70+
@Override
71+
public String getKid(Config.KASInfo kasInfo) {
72+
return getStub(kasInfo.URL)
73+
.publicKey(PublicKeyRequest.getDefaultInstance())
74+
.getKid();
75+
}
76+
7077
private String normalizeAddress(String urlString) {
7178
URL url;
7279
try {

sdk/src/main/java/io/opentdf/platform/sdk/Manifest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ static public class KeyAccess {
3434
public String wrappedKey;
3535
public String policyBinding;
3636
public String encryptedMetadata;
37+
public String kid;
3738
}
3839

3940
static public class Method {

sdk/src/main/java/io/opentdf/platform/sdk/SDK.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public void close() throws Exception {
2626

2727
public interface KAS extends AutoCloseable {
2828
String getPublicKey(Config.KASInfo kasInfo);
29+
String getKid(Config.KASInfo kasInfo);
2930
String getECPublicKey(Config.KASInfo kasInfo, NanoTDFType.ECCurve curve);
3031
byte[] unwrap(Manifest.KeyAccess keyAccess, String policy);
3132
byte[] unwrapNanoTDF(NanoTDFType.ECCurve curve, String header, String kasURL);

sdk/src/main/java/io/opentdf/platform/sdk/TDF.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ private void prepareManifest(Config.TDFConfig tdfConfig) {
170170
Manifest.KeyAccess keyAccess = new Manifest.KeyAccess();
171171
keyAccess.keyType = kWrapped;
172172
keyAccess.url = kasInfo.URL;
173+
keyAccess.kid = kasInfo.KID;
173174
keyAccess.protocol = kKasProtocol;
174175

175176
// Add policyBinding
@@ -369,6 +370,7 @@ private void fillInPublicKeyInfo(List<Config.KASInfo> kasInfoList, SDK.KAS kas)
369370
}
370371
logger.info("no public key provided for KAS at {}, retrieving", kasInfo.URL);
371372
kasInfo.PublicKey = kas.getPublicKey(kasInfo);
373+
kasInfo.KID = kas.getKid(kasInfo);
372374
}
373375
}
374376

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ void withKasInformation_shouldAddKasInfo() {
3232
Config.KASInfo kasInfo = new Config.KASInfo();
3333
kasInfo.URL = "http://example.com";
3434
kasInfo.PublicKey = "publicKey";
35+
kasInfo.KID = "r1";
3536
Config.TDFConfig config = Config.newTDFConfig(Config.withKasInformation(kasInfo));
3637
assertEquals(1, config.kasInfoList.size());
3738
assertEquals(kasInfo, config.kasInfoList.get(0));

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,39 @@ public void publicKey(PublicKeyRequest request, StreamObserver<PublicKeyResponse
7070
}
7171
}
7272

73+
@Test
74+
void testGettingKid() throws IOException {
75+
AccessServiceGrpc.AccessServiceImplBase accessService = new AccessServiceGrpc.AccessServiceImplBase() {
76+
@Override
77+
public void publicKey(PublicKeyRequest request, StreamObserver<PublicKeyResponse> responseObserver) {
78+
var response = PublicKeyResponse.newBuilder().setKid("r1").build();
79+
responseObserver.onNext(response);
80+
responseObserver.onCompleted();
81+
}
82+
};
83+
84+
Server server = null;
85+
try {
86+
server = startServer(accessService);
87+
Function<String, ManagedChannel> channelFactory = (String url) -> ManagedChannelBuilder
88+
.forTarget(url)
89+
.usePlaintext()
90+
.build();
91+
92+
var keypair = CryptoUtils.generateRSAKeypair();
93+
var dpopKey = new RSAKey.Builder((RSAPublicKey) keypair.getPublic()).privateKey(keypair.getPrivate()).build();
94+
try (var kas = new KASClient(channelFactory, dpopKey)) {
95+
Config.KASInfo kasInfo = new Config.KASInfo();
96+
kasInfo.URL = "localhost:" + server.getPort();
97+
assertThat(kas.getKid(kasInfo)).isEqualTo("r1");
98+
}
99+
} finally {
100+
if (server != null) {
101+
server.shutdownNow();
102+
}
103+
}
104+
}
105+
73106
@Test
74107
void testCallingRewrap() throws IOException {
75108
var dpopKeypair = CryptoUtils.generateRSAKeypair();

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ public String getPublicKey(Config.KASInfo kasInfo) {
4343
return kasPublicKey;
4444
}
4545

46+
@Override
47+
public String getKid(Config.KASInfo kasInfo) {
48+
return "r1";
49+
}
50+
4651
@Override
4752
public String getECPublicKey(Config.KASInfo kasInfo, NanoTDFType.ECCurve curve) {
4853
return kasPublicKey;

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ public String getPublicKey(Config.KASInfo kasInfo) {
3535
return CryptoUtils.getRSAPublicKeyPEM(keypairs.get(index).getPublic());
3636
}
3737

38+
@Override
39+
public String getKid(Config.KASInfo kasInfo) {
40+
return "r1";
41+
}
42+
3843
@Override
3944
public byte[] unwrap(Manifest.KeyAccess keyAccess, String policy) {
4045
int index = Integer.parseInt(keyAccess.url);

0 commit comments

Comments
 (0)