66#include < aws/core/platform/FileSystem.h>
77#include < aws/core/utils/HashingUtils.h>
88#include < aws/core/utils/logging/LogMacros.h>
9+ #include < aws/core/utils/crypto/Hash.h>
10+ #include < aws/core/utils/crypto/CRC32.h>
11+ #include < aws/core/utils/crypto/CRC64.h>
12+ #include < aws/core/utils/crypto/Sha1.h>
13+ #include < aws/core/utils/crypto/Sha256.h>
914#include < aws/core/utils/memory/AWSMemory.h>
1015#include < aws/core/utils/memory/stl/AWSStreamFwd.h>
1116#include < aws/core/utils/memory/stl/AWSStringStream.h>
@@ -399,6 +404,25 @@ namespace Aws
399404 bool isRetry = !handle->GetMultiPartId ().empty ();
400405 uint64_t sentBytes = 0 ;
401406
407+ const auto fullObjectHashCalculator = [](const std::shared_ptr<TransferHandle>& handle, bool isRetry, S3::Model::ChecksumAlgorithm algorithm) -> std::shared_ptr<Aws::Utils::Crypto::Hash> {
408+ if (handle->GetChecksum ().empty () && !isRetry) {
409+ if (algorithm == S3::Model::ChecksumAlgorithm::CRC32) {
410+ return Aws::MakeShared<Aws::Utils::Crypto::CRC32>(" TransferManager" );
411+ }
412+ if (algorithm == S3::Model::ChecksumAlgorithm::CRC32C) {
413+ return Aws::MakeShared<Aws::Utils::Crypto::CRC32C>(" TransferManager" );
414+ }
415+ if (algorithm == S3::Model::ChecksumAlgorithm::SHA1) {
416+ return Aws::MakeShared<Aws::Utils::Crypto::Sha1>(" TransferManager" );
417+ }
418+ if (algorithm == S3::Model::ChecksumAlgorithm::SHA256) {
419+ return Aws::MakeShared<Aws::Utils::Crypto::Sha256>(" TransferManager" );
420+ }
421+ return Aws::MakeShared<Aws::Utils::Crypto::CRC64>(" TransferManager" );
422+ }
423+ return nullptr ;
424+ }(handle, isRetry, m_transferConfig.checksumAlgorithm );
425+
402426 if (!isRetry) {
403427 Aws::S3::Model::CreateMultipartUploadRequest createMultipartRequest = m_transferConfig.createMultipartUploadTemplate ;
404428 createMultipartRequest.SetChecksumAlgorithm (m_transferConfig.checksumAlgorithm );
@@ -466,6 +490,10 @@ namespace Aws
466490 streamToPut->seekg ((partsIter->first - 1 ) * m_transferConfig.bufferSize );
467491 streamToPut->read (reinterpret_cast <char *>(buffer), lengthToWrite);
468492
493+ if (fullObjectHashCalculator) {
494+ fullObjectHashCalculator->Update (buffer, static_cast <size_t >(lengthToWrite));
495+ }
496+
469497 auto streamBuf = Aws::New<Aws::Utils::Stream::PreallocatedStreamBuf>(CLASS_TAG, buffer, static_cast <size_t >(lengthToWrite));
470498 auto preallocatedStreamReader = Aws::MakeShared<Aws::IOStream>(CLASS_TAG, streamBuf);
471499
@@ -525,6 +553,13 @@ namespace Aws
525553 handle->UpdateStatus (DetermineIfFailedOrCanceled (*handle));
526554 TriggerTransferStatusUpdatedCallback (handle);
527555 }
556+ else if (fullObjectHashCalculator && handle->GetChecksum ().empty ()) {
557+ // Finalize checksum calculation and set on handle
558+ auto hashResult = fullObjectHashCalculator->GetHash ();
559+ if (hashResult.IsSuccess ()) {
560+ handle->SetChecksum (Aws::Utils::HashingUtils::Base64Encode (hashResult.GetResult ()));
561+ }
562+ }
528563 }
529564
530565 void TransferManager::DoSinglePartUpload (const std::shared_ptr<TransferHandle>& handle)
@@ -1560,4 +1595,4 @@ namespace Aws
15601595 }
15611596 }
15621597 }
1563- }
1598+ }
0 commit comments