Skip to content

Commit 27188ab

Browse files
committed
Create new materials manager for legacy keyrings.
1 parent 8da86f6 commit 27188ab

File tree

4 files changed

+109
-24
lines changed

4 files changed

+109
-24
lines changed

README.md

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ class Example {
2424
.wrappingKeyId(KMS_WRAPPING_KEY_ID)
2525
.build();
2626

27-
MaterialsManager materialsManager = new DefaultMaterialsManager(keyring);
27+
MaterialsManager materialsManager = DefaultMaterialsManager.builder()
28+
.keyring(keyring)
29+
.build();
2830
S3Client v3Client = S3EncryptionClient.builder()
2931
.materialsManager(materialsManager)
3032
.build();
@@ -51,7 +53,9 @@ class Example {
5153
.wrappingKey(aesKey)
5254
.build();
5355

54-
MaterialsManager materialsManager = new DefaultMaterialsManager(keyring);
56+
MaterialsManager materialsManager = DefaultMaterialsManager.builder()
57+
.keyring(keyring)
58+
.build();
5559
S3Client v3Client = S3EncryptionClient.builder()
5660
.materialsManager(materialsManager)
5761
.build();
@@ -78,7 +82,9 @@ class Example {
7882
.wrappingKeyPair(rsaKey)
7983
.build();
8084

81-
MaterialsManager materialsManager = new DefaultMaterialsManager(keyring);
85+
MaterialsManager materialsManager = DefaultMaterialsManager.builder()
86+
.keyring(keyring)
87+
.build();
8288
S3Client v3Client = S3EncryptionClient.builder()
8389
.materialsManager(materialsManager)
8490
.build();
@@ -102,18 +108,19 @@ class Example {
102108
.build();
103109

104110
// V3
105-
// Create the non-legacy keyring first
106111
Keyring keyring = AesGcmKeyring.builder()
107112
.wrappingKey(aesKey)
108113
.build();
109114

110-
// Create the legacy keyring, passing in the non-legacy keyring
111-
keyring = AesWrapKeyring.builder()
115+
Keyring legacyKeyring = AesWrapKeyring.builder()
112116
.wrappingKey(aesKey)
113117
.nonLegacyKeyring(keyring)
114118
.build();
115119

116-
MaterialsManager materialsManager = new DefaultMaterialsManager(keyring);
120+
MaterialsManager materialsManager = LegacyDecryptMaterialsManager.builder()
121+
.keyring(keyring)
122+
.legacyKeyring(legacyKeyring)
123+
.build();
117124
S3Client v3Client = S3EncryptionClient.builder()
118125
.materialsManager(materialsManager)
119126
.build();

src/main/java/software/amazon/encryption/s3/legacy/materials/AesWrapKeyring.java

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,9 @@ public class AesWrapKeyring implements Keyring {
2121
private static final String CIPHER_ALGORITHM = "AESWrap";
2222

2323
private final SecretKey _wrappingKey;
24-
private final Keyring _nonLegacyKeyring;
2524

2625
private AesWrapKeyring(Builder builder) {
2726
_wrappingKey = builder._wrappingKey;
28-
_nonLegacyKeyring = builder._nonLegacyKeyring;
2927
}
3028

3129
public static Builder builder() {
@@ -34,15 +32,13 @@ public static Builder builder() {
3432

3533
@Override
3634
public EncryptionMaterials onEncrypt(EncryptionMaterials materials) {
37-
return _nonLegacyKeyring.onEncrypt(materials);
35+
throw new S3EncryptionClientException("Encrypt not supported for " + KEY_PROVIDER_ID);
3836
}
3937

4038
@Override
4139
public DecryptionMaterials onDecrypt(DecryptionMaterials materials, List<EncryptedDataKey> encryptedDataKeys) {
42-
materials = _nonLegacyKeyring.onDecrypt(materials, encryptedDataKeys);
43-
4440
if (materials.plaintextDataKey() != null) {
45-
return materials;
41+
throw new S3EncryptionClientException("Decryption materials already contains a plaintext data key.");
4642
}
4743

4844
for (EncryptedDataKey encryptedDataKey : encryptedDataKeys) {
@@ -67,7 +63,6 @@ public DecryptionMaterials onDecrypt(DecryptionMaterials materials, List<Encrypt
6763

6864
public static class Builder {
6965
private SecretKey _wrappingKey;
70-
private Keyring _nonLegacyKeyring;
7166

7267
private Builder() {}
7368

@@ -79,15 +74,7 @@ public Builder wrappingKey(SecretKey wrappingKey) {
7974
return this;
8075
}
8176

82-
public Builder nonLegacyKeyring(Keyring nonLegacyKeyring) {
83-
_nonLegacyKeyring = nonLegacyKeyring;
84-
return this;
85-
}
86-
8777
public AesWrapKeyring build() {
88-
if (_nonLegacyKeyring == null) {
89-
// TODO: should we warn or throw an exception if no encryption method is supported?
90-
}
9178
return new AesWrapKeyring(this);
9279
}
9380
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package software.amazon.encryption.s3.legacy.materials;
2+
3+
import software.amazon.encryption.s3.algorithms.AlgorithmSuite;
4+
import software.amazon.encryption.s3.materials.DecryptMaterialsRequest;
5+
import software.amazon.encryption.s3.materials.DecryptionMaterials;
6+
import software.amazon.encryption.s3.materials.EncryptionMaterials;
7+
import software.amazon.encryption.s3.materials.EncryptionMaterialsRequest;
8+
import software.amazon.encryption.s3.materials.Keyring;
9+
import software.amazon.encryption.s3.materials.MaterialsManager;
10+
11+
/**
12+
* This class supports legacy decrypt as well as non-legacy encrypt and decrypt.
13+
*/
14+
public class LegacyDecryptMaterialsManager implements MaterialsManager {
15+
private final Keyring _keyring;
16+
private Keyring _legacyKeyring;
17+
18+
private LegacyDecryptMaterialsManager(Builder builder) {
19+
_keyring = builder._keyring;
20+
_legacyKeyring = builder._legacyKeyring;
21+
}
22+
23+
public static Builder builder() {
24+
return new Builder();
25+
}
26+
27+
public EncryptionMaterials getEncryptionMaterials(EncryptionMaterialsRequest request) {
28+
EncryptionMaterials materials = EncryptionMaterials.builder()
29+
.algorithmSuite(AlgorithmSuite.ALG_AES_256_GCM_IV12_TAG16_NO_KDF)
30+
.encryptionContext(request.encryptionContext())
31+
.build();
32+
33+
return _keyring.onEncrypt(materials);
34+
}
35+
36+
public DecryptionMaterials decryptMaterials(DecryptMaterialsRequest request) {
37+
DecryptionMaterials materials = DecryptionMaterials.builder()
38+
.algorithmSuite(request.algorithmSuite())
39+
.encryptionContext(request.encryptionContext())
40+
.build();
41+
42+
materials = _legacyKeyring.onDecrypt(materials, request.encryptedDataKeys());
43+
if (materials.plaintextDataKey() != null) {
44+
// Have a legacy-encrypted data key
45+
// TODO: warn here?
46+
return materials;
47+
}
48+
49+
return _keyring.onDecrypt(materials, request.encryptedDataKeys());
50+
}
51+
52+
public static class Builder {
53+
private Keyring _keyring;
54+
private Keyring _legacyKeyring;
55+
56+
private Builder() {}
57+
58+
public Builder keyring(Keyring keyring) {
59+
this._keyring = keyring;
60+
return this;
61+
}
62+
63+
public Builder legacyKeyring(Keyring legacyKeyring) {
64+
this._legacyKeyring = legacyKeyring;
65+
return this;
66+
}
67+
68+
public LegacyDecryptMaterialsManager build() {
69+
// TODO: warn if both keyrings are not set
70+
return new LegacyDecryptMaterialsManager(this);
71+
}
72+
}
73+
}

src/main/java/software/amazon/encryption/s3/materials/DefaultMaterialsManager.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ public class DefaultMaterialsManager implements MaterialsManager {
66
private final Keyring _keyring;
77

88

9-
public DefaultMaterialsManager(Keyring keyring) {
10-
_keyring = keyring;
9+
private DefaultMaterialsManager(Builder builder) {
10+
_keyring = builder._keyring;
11+
}
12+
13+
public static Builder builder() {
14+
return new Builder();
1115
}
1216

1317
public EncryptionMaterials getEncryptionMaterials(EncryptionMaterialsRequest request) {
@@ -28,4 +32,18 @@ public DecryptionMaterials decryptMaterials(DecryptMaterialsRequest request) {
2832
return _keyring.onDecrypt(materials, request.encryptedDataKeys());
2933
}
3034

35+
public static class Builder {
36+
private Keyring _keyring;
37+
38+
private Builder() {}
39+
40+
public Builder keyring(Keyring keyring) {
41+
this._keyring = keyring;
42+
return this;
43+
}
44+
45+
public DefaultMaterialsManager build() {
46+
return new DefaultMaterialsManager(this);
47+
}
48+
}
3149
}

0 commit comments

Comments
 (0)