in src/main/java/software/amazon/encryption/s3/internal/PutEncryptedObjectPipeline.java [41:81]
public CompletableFuture<PutObjectResponse> putObject(PutObjectRequest request, AsyncRequestBody requestBody) {
final Long contentLength;
if (request.contentLength() != null) {
if (requestBody.contentLength().isPresent() && !request.contentLength().equals(requestBody.contentLength().get())) {
// if the contentLength values do not match, throw an exception, since we don't know which is correct
throw new S3EncryptionClientException("The contentLength provided in the request object MUST match the " +
"contentLength in the request body");
} else if (!requestBody.contentLength().isPresent()) {
// no contentLength in request body, use the one in request
contentLength = request.contentLength();
} else {
// only remaining case is when the values match, so either works here
contentLength = request.contentLength();
}
} else {
contentLength = requestBody.contentLength().orElseThrow(() -> new S3EncryptionClientException("Unbounded streams are currently not supported."));
}
if (contentLength > AlgorithmSuite.ALG_AES_256_GCM_IV12_TAG16_NO_KDF.cipherMaxContentLengthBytes()) {
throw new S3EncryptionClientException("The contentLength of the object you are attempting to encrypt exceeds" +
"the maximum length allowed for GCM encryption.");
}
EncryptionMaterialsRequest encryptionMaterialsRequest = EncryptionMaterialsRequest.builder()
.s3Request(request)
.plaintextLength(contentLength)
.build();
EncryptionMaterials materials = _cryptoMaterialsManager.getEncryptionMaterials(encryptionMaterialsRequest);
EncryptedContent encryptedContent = _asyncContentEncryptionStrategy.encryptContent(materials, requestBody);
Map<String, String> metadata = new HashMap<>(request.metadata());
metadata = _contentMetadataEncodingStrategy.encodeMetadata(materials, encryptedContent.getIv(), metadata);
PutObjectRequest encryptedPutRequest = request.toBuilder()
.overrideConfiguration(API_NAME_INTERCEPTOR)
.contentLength(encryptedContent.getCiphertextLength())
.metadata(metadata)
.build();
return _s3AsyncClient.putObject(encryptedPutRequest, encryptedContent.getAsyncCiphertext());
}