Skip to content

Commit 6c4a27b

Browse files
authored
feat(sdk): add mime type. (#108)
- Add withMimeType TDF Config option, which will in-turn add it to the Manifest.Payload.MimeType - Add getManifest() function to the reader object. In-sync with Golang SDK.
1 parent 159d2f1 commit 6c4a27b

File tree

4 files changed

+44
-2
lines changed

4 files changed

+44
-2
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class Config {
1616
public static final int TDF3_KEY_SIZE = 2048;
1717
public static final int DEFAULT_SEGMENT_SIZE = 2 * 1024 * 1024; // 2mb
1818
public static final String KAS_PUBLIC_KEY_PATH = "/kas_public_key";
19+
public static final String DEFAULT_MIME_TYPE = "application/octet-stream";
1920

2021
public enum TDFFormat {
2122
JSONFormat,
@@ -65,6 +66,7 @@ public static class TDFConfig {
6566
public List<KASInfo> kasInfoList;
6667
public List<Assertion> assertionList;
6768
public AssertionConfig assertionConfig;
69+
public String mimeType;
6870

6971
public TDFConfig() {
7072
this.defaultSegmentSize = DEFAULT_SEGMENT_SIZE;
@@ -75,6 +77,7 @@ public TDFConfig() {
7577
this.attributes = new ArrayList<>();
7678
this.kasInfoList = new ArrayList<>();
7779
this.assertionList = new ArrayList<>();
80+
this.mimeType = DEFAULT_MIME_TYPE;
7881
}
7982
}
8083

@@ -125,6 +128,10 @@ public static Consumer<TDFConfig> withDisableEncryption() {
125128
return (TDFConfig config) -> config.enableEncryption = false;
126129
}
127130

131+
public static Consumer<TDFConfig> withMimeType(String mimeType) {
132+
return (TDFConfig config) -> config.mimeType = mimeType;
133+
}
134+
128135
public static class NanoTDFConfig {
129136
public ECCMode eccMode;
130137
public NanoTDFType.Cipher cipher;

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ public TDF() {
6060
private static final String kSha256Hash = "SHA256";
6161

6262
private static final String kHmacIntegrityAlgorithm = "HS256";
63-
private static final String kDefaultMimeType = "application/octet-stream";
6463
private static final String kTDFAsZip = "zip";
6564
private static final String kTDFZipReference = "reference";
6665
private static final String kAssertionHash = "assertionHash";
@@ -241,6 +240,10 @@ public String getMetadata() {
241240
return unencryptedMetadata;
242241
}
243242

243+
public Manifest getManifest() {
244+
return manifest;
245+
}
246+
244247
private final String unencryptedMetadata;
245248
private final AesGcm aesGcm;
246249

@@ -422,7 +425,7 @@ public TDFObject createTDF(InputStream payload,
422425

423426
// Add payload info
424427
tdfObject.manifest.payload = new Manifest.Payload();
425-
tdfObject.manifest.payload.mimeType = kDefaultMimeType;
428+
tdfObject.manifest.payload.mimeType = tdfConfig.mimeType;
426429
tdfObject.manifest.payload.protocol = kTDFAsZip;
427430
tdfObject.manifest.payload.type = kTDFZipReference;
428431
tdfObject.manifest.payload.url = TDFWriter.TDF_PAYLOAD_FILE_NAME;

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,11 @@ void withSegmentSize_shouldSetSegmentSize() {
4949
Config.TDFConfig config = Config.newTDFConfig(Config.withSegmentSize(1024));
5050
assertEquals(1024, config.defaultSegmentSize);
5151
}
52+
53+
@Test
54+
void withMimeType_shouldSetMimeType() {
55+
final String mimeType = "application/pdf";
56+
Config.TDFConfig config = Config.newTDFConfig(Config.withMimeType(mimeType));
57+
assertEquals(mimeType, config.mimeType);
58+
}
5259
}

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33

44
import com.nimbusds.jose.jwk.RSAKey;
5+
6+
import io.opentdf.platform.sdk.TDF.TDFObject;
57
import io.opentdf.platform.sdk.nanotdf.NanoTDFType;
68
import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
79
import org.junit.jupiter.api.BeforeAll;
@@ -99,6 +101,8 @@ void testSimpleTDFEncryptAndDecrypt() throws Exception {
99101

100102
var unwrappedData = new ByteArrayOutputStream();
101103
var reader = tdf.loadTDF(new SeekableInMemoryByteChannel(tdfOutputStream.toByteArray()), new Config.AssertionConfig(), kas);
104+
assertThat(reader.getManifest().payload.mimeType).isEqualTo("application/octet-stream");
105+
102106
reader.readPayload(unwrappedData);
103107

104108
assertThat(unwrappedData.toString(StandardCharsets.UTF_8))
@@ -257,6 +261,27 @@ public void write(byte[] b, int off, int len) {}
257261
.isEqualTo(maxSize + 1);
258262
}
259263

264+
@Test
265+
public void testCreateTDFWithMimeType() throws Exception {
266+
267+
final String mimeType = "application/pdf";
268+
269+
Config.TDFConfig config = Config.newTDFConfig(
270+
Config.withKasInformation(getKASInfos()),
271+
Config.withMimeType(mimeType)
272+
);
273+
274+
String plainText = "this is extremely sensitive stuff!!!";
275+
InputStream plainTextInputStream = new ByteArrayInputStream(plainText.getBytes());
276+
ByteArrayOutputStream tdfOutputStream = new ByteArrayOutputStream();
277+
278+
TDF tdf = new TDF();
279+
tdf.createTDF(plainTextInputStream, tdfOutputStream, config, kas);
280+
281+
var reader = tdf.loadTDF(new SeekableInMemoryByteChannel(tdfOutputStream.toByteArray()), new Config.AssertionConfig(), kas);
282+
assertThat(reader.getManifest().payload.mimeType).isEqualTo(mimeType);
283+
}
284+
260285
@Nonnull
261286
private static Config.KASInfo[] getKASInfos() {
262287
var kasInfos = new ArrayList<>();

0 commit comments

Comments
 (0)