Skip to content

Commit d16db4d

Browse files
author
Anirav Kareddy
committed
Rough outline of reEncryptInstructionFile method (default suffix)
1 parent f501b43 commit d16db4d

File tree

1 file changed

+60
-1
lines changed

1 file changed

+60
-1
lines changed

src/main/java/software/amazon/encryption/s3/S3EncryptionClient.java

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
77
import software.amazon.awssdk.awscore.AwsRequestOverrideConfiguration;
88
import software.amazon.awssdk.awscore.exception.AwsServiceException;
9+
import software.amazon.awssdk.core.ResponseBytes;
910
import software.amazon.awssdk.core.ResponseInputStream;
1011
import software.amazon.awssdk.core.async.AsyncRequestBody;
1112
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
@@ -46,29 +47,42 @@
4647
import software.amazon.awssdk.services.s3.model.UploadPartRequest;
4748
import software.amazon.awssdk.services.s3.model.UploadPartResponse;
4849
import software.amazon.encryption.s3.algorithms.AlgorithmSuite;
50+
import software.amazon.encryption.s3.internal.ContentMetadata;
51+
import software.amazon.encryption.s3.internal.ContentMetadataDecodingStrategy;
52+
import software.amazon.encryption.s3.internal.ContentMetadataEncodingStrategy;
4953
import software.amazon.encryption.s3.internal.ConvertSDKRequests;
5054
import software.amazon.encryption.s3.internal.GetEncryptedObjectPipeline;
5155
import software.amazon.encryption.s3.internal.InstructionFileConfig;
5256
import software.amazon.encryption.s3.internal.MultiFileOutputStream;
5357
import software.amazon.encryption.s3.internal.MultipartUploadObjectPipeline;
5458
import software.amazon.encryption.s3.internal.PutEncryptedObjectPipeline;
59+
import software.amazon.encryption.s3.internal.ReEncryptInstructionFileRequest;
60+
import software.amazon.encryption.s3.internal.ReEncryptInstructionFileResponse;
5561
import software.amazon.encryption.s3.internal.UploadObjectObserver;
5662
import software.amazon.encryption.s3.materials.AesKeyring;
5763
import software.amazon.encryption.s3.materials.CryptographicMaterialsManager;
64+
import software.amazon.encryption.s3.materials.DecryptMaterialsRequest;
65+
import software.amazon.encryption.s3.materials.DecryptionMaterials;
5866
import software.amazon.encryption.s3.materials.DefaultCryptoMaterialsManager;
67+
import software.amazon.encryption.s3.materials.EncryptedDataKey;
68+
import software.amazon.encryption.s3.materials.EncryptionMaterials;
5969
import software.amazon.encryption.s3.materials.Keyring;
6070
import software.amazon.encryption.s3.materials.KmsKeyring;
71+
import software.amazon.encryption.s3.materials.MaterialsDescription;
6172
import software.amazon.encryption.s3.materials.MultipartConfiguration;
6273
import software.amazon.encryption.s3.materials.PartialRsaKeyPair;
74+
import software.amazon.encryption.s3.materials.RawKeyring;
6375
import software.amazon.encryption.s3.materials.RsaKeyring;
6476

77+
import javax.crypto.DecapsulateException;
6578
import javax.crypto.SecretKey;
6679
import java.io.IOException;
6780
import java.net.URI;
6881
import java.security.KeyPair;
6982
import java.security.Provider;
7083
import java.security.SecureRandom;
7184
import java.util.ArrayList;
85+
import java.util.Collections;
7286
import java.util.List;
7387
import java.util.Map;
7488
import java.util.Optional;
@@ -154,7 +168,6 @@ public static Consumer<AwsRequestOverrideConfiguration.Builder> withAdditionalCo
154168
builder.putExecutionAttribute(S3EncryptionClient.CONFIGURATION, multipartConfiguration);
155169
}
156170

157-
158171
/**
159172
* Attaches encryption context and multipart configuration to a request.
160173
* * Must be used as a parameter to
@@ -172,6 +185,52 @@ public static Consumer<AwsRequestOverrideConfiguration.Builder> withAdditionalCo
172185
.putExecutionAttribute(S3EncryptionClient.CONFIGURATION, multipartConfiguration);
173186
}
174187

188+
public ReEncryptInstructionFileResponse reEncryptInstructionFile(ReEncryptInstructionFileRequest reEncryptInstructionFileRequest) {
189+
GetObjectRequest request = GetObjectRequest.builder()
190+
.bucket(reEncryptInstructionFileRequest.bucket())
191+
.key(reEncryptInstructionFileRequest.key())
192+
.build();
193+
194+
ResponseInputStream<GetObjectResponse> response = this.getObject(request);
195+
ContentMetadataDecodingStrategy decodingStrategy = new ContentMetadataDecodingStrategy(_instructionFileConfig);
196+
ContentMetadata contentMetadata = decodingStrategy.decode(request, response.response());
197+
198+
AlgorithmSuite algorithmSuite = contentMetadata.algorithmSuite();
199+
EncryptedDataKey encryptedDataKey = contentMetadata.encryptedDataKey();
200+
Map<String, String> currentKeyringMaterialsDescription = contentMetadata.encryptedDataKeyContext();
201+
byte[] iv = contentMetadata.contentIv();
202+
203+
DecryptionMaterials decryptedMaterials = this._cryptoMaterialsManager.decryptMaterials(
204+
DecryptMaterialsRequest.builder()
205+
.algorithmSuite(algorithmSuite)
206+
.encryptedDataKeys(Collections.singletonList(encryptedDataKey))
207+
.build()
208+
);
209+
byte[] plaintextDataKey = decryptedMaterials.plaintextDataKey();
210+
211+
EncryptionMaterials encryptionMaterials = EncryptionMaterials.builder()
212+
.algorithmSuite(algorithmSuite)
213+
.plaintextDataKey(plaintextDataKey)
214+
.build();
215+
216+
RawKeyring newKeyring = reEncryptInstructionFileRequest.newKeyring();
217+
EncryptionMaterials encryptedMaterials = newKeyring.onEncrypt(encryptionMaterials);
218+
219+
if (encryptedMaterials.materialsDescription().equals(currentKeyringMaterialsDescription)) {
220+
throw new S3EncryptionClientException("New keyring must generate new materials description!");
221+
}
222+
223+
ContentMetadataEncodingStrategy encodeStrategy = new ContentMetadataEncodingStrategy(_instructionFileConfig);
224+
encodeStrategy.encodeMetadata(encryptedMaterials, iv, PutObjectRequest.builder()
225+
.bucket(reEncryptInstructionFileRequest.bucket())
226+
.key(reEncryptInstructionFileRequest.key())
227+
.build());
228+
229+
return new ReEncryptInstructionFileResponse(reEncryptInstructionFileRequest.bucket(),
230+
reEncryptInstructionFileRequest.key(), reEncryptInstructionFileRequest.instructionFileSuffix());
231+
232+
}
233+
175234
/**
176235
* See {@link S3EncryptionClient#putObject(PutObjectRequest, RequestBody)}.
177236
* <p>

0 commit comments

Comments
 (0)