Skip to content

Client Side Encryption with S3EncryptionMultipartUploaderV2 fails on large files. #2512

Open

Description

@elt4n0

Describe the bug

When using S3EncryptionMultipartUploaderV2 with a file larger than 4GB a warning is thrown during encryption, and an exception is thrown during upload. This does not happen with smaller files.

Expected Behavior

Success on S3EncryptionMultipartUploaderV2::upload()

Current Behavior

When using S3EncryptionMultipartUploaderV2 with a file larger than 4GB this message appears:

PHP Warning: openssl_encrypt(): data is too long in libs\aws\aws-sdk-php\src\Crypto\AesGcmEncryptingStream.php on line 108

After a while, exception is thrown:

An exception occurred while completing a multipart upload: Error executing "CompleteMultipartUpload" on "encryption-test/lfmb_TESNICO.mp4?uploadId=345dd8b5-b470-4c92-8525-86298794e9e4"; AWS HTTP error: Client error: `POST encryption-test/lfmb_TESNICO.mp4?uploadId=345dd8b5-b470-4c92-8525-86298794e9e4` resulted in a `400 Bad Request` response:
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>MalformedXML</Code><Message>The XML you provided was not well-formed (truncated...)
 MalformedXML (client): The XML you provided was not well-formed or did not validate against our published schema. - <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>MalformedXML</Code><Message>The XML you provided was not well-formed or did not validate against our published schema.</Message><Key>lfmb_TESNICO.mp4</Key><BucketName>encryption-test</BucketName><Resource>/encryption-test/lfmb_TESNICO.mp4</Resource><RequestId>170FDB5FFCA88848</RequestId><HostId>4bf9e65b-bbb0-488d-9da9-d54f60abb5c0</HostId></Error>

Reproduction Steps

$uploader = new S3EncryptionMultipartUploaderV2( 
         new Aws\S3\S3Client([
            'version' => 'latest',
            'region'  => 'us-east-1',
            'use_path_style_endpoint' => true,
            'credentials' => [
                    'key'    => $options['credentials']['key'],
                    'secret' => $options['credentials']['secret'],
                ]
        ]), ,fopen('path to a file larger than 4GB', 'r'),
            [
                '@MaterialsProvider' => $materialsProvider,
                '@CipherOptions' => [ 'Cipher' => 'gcm', 'KeySize' => 128 ],
                '@KmsEncryptionContext' => [],
                'bucket' => $this->bucket,
                'key' => 'thenamefile',
                'concurrency' => 5,
                'part_size' => null,
            ]
        );

$uploader->upload();

Possible Solution

openssl_encrypt is know have trouble with large files.
Maybe include a mechanism to encode by chunks.

Additional Information/Context

No response

SDK version used

"aws/aws-sdk-php": "^3.147"

Environment details (Version of PHP (php -v)? OS name and version, etc.)

PHP 7.4.30 (cli) (built: Jun 7 2022 15:36:03) ( NTS Visual C++ 2017 x64 )

Activity

  1. added
    bugThis issue is a bug.
    needs-triageThis issue or PR still needs to be triaged.
    on Aug 29, 2022
  2. added
    investigatingThis issue is being investigated and/or work is in progress to resolve the issue.
    on Aug 29, 2022
  3. yenfryherrerafeliz commented on Sep 2, 2022

    @yenfryherrerafeliz
    Contributor

    Hi @elt4n0, thanks for opening this issue. I have reproduced the reported behavior and indeed the issue is coming from openssl library. I am going to leave this issue under review so we can address this further, and will provide updates accordingly.

    Thanks!

  4. removed
    investigatingThis issue is being investigated and/or work is in progress to resolve the issue.
    on Dec 7, 2022
  5. added
    queuedThis issues is on the AWS team's backlog
    and removed on Dec 4, 2023
  6. added
    documentationThis is a problem with documentation.
    and removed
    bugThis issue is a bug.
    on Dec 31, 2025
  7. stobrien89 commented on Dec 31, 2025

    @stobrien89
    Member

    Hi @elt4n0,

    Sorry for the delay in contact. We just recently released S3EncryptionMultipartUploaderV3 and S3EncryptionClientV3 as a security fix for a vulnerabilities in the older versions. We recommend upgrading as soon as possible.

    About the 4GB limitation— I've discussed this with the AWS Cryptography team and they would prefer we don't encrypt/encode using chunking. Unfortunately this is a limitation present in all of the S3 Encryption implementations, and something we need to document.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

documentationThis is a problem with documentation.p2This is a standard priority issuequeuedThis issues is on the AWS team's backlog

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions