Skip to content

Commit 8c0bcf4

Browse files
committed
add test for resolving keys
1 parent 78031d8 commit 8c0bcf4

3 files changed

Lines changed: 56 additions & 6 deletions

File tree

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ Map<String, List<Config.KASInfo>> getSplits(Config.TDFConfig tdfConfig) {
5555
if (tdfConfig.kasInfoList.isEmpty() && splitPlan.isEmpty()) {
5656
throw new SDK.KasInfoMissing("kas information is missing, no key access template specified or inferred");
5757
}
58-
return fillInKeys(tdfConfig, splitPlan);
58+
return resolveKeys(splitPlan);
5959
}
6060

6161
private List<Autoconfigure.KeySplitStep> getAutoconfigurePlan(Config.TDFConfig tdfConfig) {
@@ -144,7 +144,7 @@ private static class Key {
144144
}
145145

146146

147-
private Map<String, List<Config.KASInfo>> fillInKeys(Config.TDFConfig tdfConfig, List<Autoconfigure.KeySplitStep> splitPlan) {
147+
Map<String, List<Config.KASInfo>> resolveKeys(List<Autoconfigure.KeySplitStep> splitPlan) {
148148
Map<String, List<Config.KASInfo>> conjunction = new HashMap<>();
149149
var latestKASInfo = new HashMap<String, Config.KASInfo>();
150150
// Seed anything passed in manually
@@ -162,7 +162,10 @@ private Map<String, List<Config.KASInfo>> fillInKeys(Config.TDFConfig tdfConfig,
162162
logger.info("no public key provided for KAS at {}, retrieving", splitInfo.kas);
163163
var getKI = new Config.KASInfo();
164164
getKI.URL = splitInfo.kas;
165-
getKI.Algorithm = tdfConfig.wrappingKeyType.toString();
165+
if (!tdfConfig.autoconfigure) {
166+
getKI.Algorithm = tdfConfig.wrappingKeyType.toString();
167+
}
168+
getKI.KID = splitInfo.kid;
166169
getKI = services.kas().getPublicKey(getKI);
167170
latestKASInfo.put(splitInfo.kas, getKI);
168171
ki = getKI;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ private PolicyObject createPolicyObject(List<Autoconfigure.AttributeValueFQN> at
139139

140140
private static final Base64.Encoder encoder = Base64.getEncoder();
141141

142-
private void prepareManifest(Config.TDFConfig tdfConfig, SDK.KAS kas, Map<String, List<KASInfo>> splits) {
142+
private void prepareManifest(Config.TDFConfig tdfConfig, Map<String, List<KASInfo>> splits) {
143143
manifest.tdfVersion = tdfConfig.renderVersionInfoInManifest ? TDF_VERSION : null;
144144
manifest.encryptionInformation.keyAccessType = kSplitKeyType;
145145
manifest.encryptionInformation.keyAccessObj = new ArrayList<>();
@@ -349,7 +349,7 @@ TDFObject createTDF(InputStream payload, OutputStream outputStream, Config.TDFCo
349349
Map<String, List<KASInfo>> splits = planner.getSplits(tdfConfig);
350350

351351
TDFObject tdfObject = new TDFObject();
352-
tdfObject.prepareManifest(tdfConfig, services.kas(), splits);
352+
tdfObject.prepareManifest(tdfConfig, splits);
353353

354354
long encryptedSegmentSize = tdfConfig.defaultSegmentSize + kGcmIvSize + kAesBlockSize;
355355
TDFWriter tdfWriter = new TDFWriter(outputStream);

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

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
import org.mockito.Mockito;
1010

1111
import java.util.List;
12+
import java.util.Map;
13+
import java.util.Objects;
14+
import java.util.stream.Collectors;
1215

1316
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
14-
import static org.junit.jupiter.api.Assertions.*;
1517

1618
class PlannerTest {
1719

@@ -85,4 +87,49 @@ void generatePlanFromProvidedKases() {
8587

8688
assertThat(splitPlan.get(0).splitID).isNotEqualTo(splitPlan.get(1).splitID);
8789
}
90+
91+
@Test
92+
void testFillingInKeysWithAutoConfigure() {
93+
var kas = Mockito.mock(SDK.KAS.class);
94+
Mockito.when(kas.getPublicKey(Mockito.any())).thenAnswer(invocation -> {
95+
Config.KASInfo kasInfo = invocation.getArgument(0, Config.KASInfo.class);
96+
var ret = new Config.KASInfo();
97+
ret.URL = kasInfo.URL;
98+
assertThat(kasInfo.Algorithm).isNullOrEmpty();
99+
if (Objects.equals(kasInfo.URL, "https://kas1.example.com")) {
100+
ret.PublicKey = "pem1";
101+
ret.Algorithm = "rsa:2048";
102+
ret.KID = "kid1";
103+
} else if (Objects.equals(kasInfo.URL, "https://kas2.example.com")) {
104+
ret.PublicKey = "pem2";
105+
ret.Algorithm = "ec:secp256r1";
106+
ret.KID = "kid2";
107+
} else {
108+
throw new IllegalArgumentException("Unexpected KAS URL: " + kasInfo.URL);
109+
}
110+
return ret;
111+
});
112+
var tdfConfig = new Config.TDFConfig();
113+
tdfConfig.autoconfigure = true;
114+
tdfConfig.wrappingKeyType = KeyType.RSA2048Key;
115+
var planner = new Planner(new Config.TDFConfig(), new FakeServicesBuilder().setKas(kas).build());
116+
var plan = List.of(
117+
new Autoconfigure.KeySplitStep("https://kas1.example.com", "split1", null),
118+
new Autoconfigure.KeySplitStep("https://kas2.example.com", "split2", "kid2")
119+
);
120+
Map<String, List<Config.KASInfo>> filledInPlan = planner.resolveKeys(plan);
121+
assertThat(filledInPlan.keySet().stream().collect(Collectors.toList())).asList().containsExactlyInAnyOrder("split1", "split2");
122+
assertThat(filledInPlan.get("split1")).asList().hasSize(1);
123+
var split1KasInfo = filledInPlan.get("split1").get(0);
124+
assertThat(split1KasInfo.URL).isEqualTo("https://kas1.example.com");
125+
assertThat(split1KasInfo.KID).isEqualTo("kid1");
126+
assertThat(split1KasInfo.Algorithm).isEqualTo("rsa:2048");
127+
assertThat(split1KasInfo.PublicKey).isEqualTo("pem1");
128+
assertThat(filledInPlan.get("split2")).asList().hasSize(1);
129+
var split2KasInfo = filledInPlan.get("split2").get(0);
130+
assertThat(split2KasInfo.URL).isEqualTo("https://kas2.example.com");
131+
assertThat(split2KasInfo.KID).isEqualTo("kid2");
132+
assertThat(split2KasInfo.Algorithm).isEqualTo("ec:secp256r1");
133+
assertThat(split2KasInfo.PublicKey).isEqualTo("pem2");
134+
}
88135
}

0 commit comments

Comments
 (0)