diff --git a/mint/run/core/aws-sdk-go/quick-tests.go b/mint/run/core/aws-sdk-go/quick-tests.go index 2194564b8..daf4caa42 100644 --- a/mint/run/core/aws-sdk-go/quick-tests.go +++ b/mint/run/core/aws-sdk-go/quick-tests.go @@ -725,6 +725,93 @@ func testListMultipartUploads(s3Client *s3.S3) { successLogger(function, args, startTime).Info() } +func testSSECopyObject(s3Client *s3.S3) { + // initialize logging params + startTime := time.Now() + function := "testSSECopyObjectSourceEncrypted" + bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "aws-sdk-go-test-") + object := randString(60, rand.NewSource(time.Now().UnixNano()), "") + args := map[string]interface{}{ + "bucketName": bucketName, + "objectName": object, + } + _, err := s3Client.CreateBucket(&s3.CreateBucketInput{ + Bucket: aws.String(bucketName), + }) + if err != nil { + failureLog(function, args, startTime, "", "AWS SDK Go CreateBucket Failed", err).Fatal() + return + } + defer cleanup(s3Client, bucketName, object+"-enc", function, args, startTime, true) + defer cleanup(s3Client, bucketName, object+"-noenc", function, args, startTime, false) + var wrongSuccess = errors.New("Succeeded instead of failing. ") + + // create encrypted object + sseCustomerKey := aws.String("32byteslongsecretkeymustbegiven2") + _, errPutEnc := s3Client.PutObject(&s3.PutObjectInput{ + Body: aws.ReadSeekCloser(strings.NewReader("fileToUpload")), + Bucket: aws.String(bucketName), + Key: aws.String(object + "-enc"), + SSECustomerAlgorithm: aws.String("AES256"), + SSECustomerKey: sseCustomerKey, + }) + if errPutEnc != nil { + failureLog(function, args, startTime, "", fmt.Sprintf("AWS SDK Go PUT expected to succeed but got %v", errPutEnc), errPutEnc).Fatal() + return + } + + // copy the encrypted object + _, errCopyEnc := s3Client.CopyObject(&s3.CopyObjectInput{ + SSECustomerAlgorithm: aws.String("AES256"), + SSECustomerKey: sseCustomerKey, + CopySource: aws.String(bucketName + "/" + object + "-enc"), + Bucket: aws.String(bucketName), + Key: aws.String(object + "-copy"), + }) + if errCopyEnc == nil { + failureLog(function, args, startTime, "", "AWS SDK Go CopyObject expected to fail, but it succeeds ", wrongSuccess).Fatal() + return + } + var invalidSSECustomerAlgorithm = "Requests specifying Server Side Encryption with Customer provided keys must provide a valid encryption algorithm" + if !strings.Contains(errCopyEnc.Error(), invalidSSECustomerAlgorithm) { + failureLog(function, args, startTime, "", fmt.Sprintf("AWS SDK Go CopyObject expected error %v got %v", invalidSSECustomerAlgorithm, errCopyEnc), errCopyEnc).Fatal() + return + } + + // create non-encrypted object + _, errPut := s3Client.PutObject(&s3.PutObjectInput{ + Body: aws.ReadSeekCloser(strings.NewReader("fileToUpload")), + Bucket: aws.String(bucketName), + Key: aws.String(object + "-noenc"), + }) + if errPut != nil { + failureLog(function, args, startTime, "", fmt.Sprintf("AWS SDK Go PUT expected to succeed but got %v", errPut), errPut).Fatal() + return + } + + // copy the non-encrypted object + _, errCopy := s3Client.CopyObject(&s3.CopyObjectInput{ + CopySourceSSECustomerAlgorithm: aws.String("AES256"), + CopySourceSSECustomerKey: sseCustomerKey, + SSECustomerAlgorithm: aws.String("AES256"), + SSECustomerKey: sseCustomerKey, + CopySource: aws.String(bucketName + "/" + object + "-noenc"), + Bucket: aws.String(bucketName), + Key: aws.String(object + "-copy"), + }) + if errCopy == nil { + failureLog(function, args, startTime, "", "AWS SDK Go CopyObject expected to fail, but it succeeds ", wrongSuccess).Fatal() + return + } + var invalidEncryptionParameters = "The encryption parameters are not applicable to this object." + if !strings.Contains(errCopy.Error(), invalidEncryptionParameters) { + failureLog(function, args, startTime, "", fmt.Sprintf("AWS SDK Go CopyObject expected error %v got %v", invalidEncryptionParameters, errCopy), errCopy).Fatal() + return + } + + successLogger(function, args, startTime).Info() +} + func main() { endpoint := os.Getenv("SERVER_ENDPOINT") accessKey := os.Getenv("ACCESS_KEY") @@ -761,6 +848,9 @@ func main() { testSelectObject(s3Client) testCreateBucketError(s3Client) testListMultipartUploads(s3Client) + if secure == "1" { + testSSECopyObject(s3Client) + } if isObjectTaggingImplemented(s3Client) { testObjectTagging(s3Client) }