You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							115 lines
						
					
					
						
							3.4 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							115 lines
						
					
					
						
							3.4 KiB
						
					
					
				
								package sse_test
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"bytes"
							 | 
						|
									"context"
							 | 
						|
									"crypto/md5"
							 | 
						|
									"crypto/rand"
							 | 
						|
									"encoding/base64"
							 | 
						|
									"fmt"
							 | 
						|
									"io"
							 | 
						|
									"testing"
							 | 
						|
									"time"
							 | 
						|
								
							 | 
						|
									"github.com/aws/aws-sdk-go-v2/aws"
							 | 
						|
									"github.com/aws/aws-sdk-go-v2/config"
							 | 
						|
									"github.com/aws/aws-sdk-go-v2/credentials"
							 | 
						|
									"github.com/aws/aws-sdk-go-v2/service/s3"
							 | 
						|
									"github.com/stretchr/testify/assert"
							 | 
						|
									"github.com/stretchr/testify/require"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								// TestSimpleSSECIntegration tests basic SSE-C with a fixed bucket name
							 | 
						|
								func TestSimpleSSECIntegration(t *testing.T) {
							 | 
						|
									ctx := context.Background()
							 | 
						|
								
							 | 
						|
									// Create S3 client
							 | 
						|
									customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
							 | 
						|
										return aws.Endpoint{
							 | 
						|
											URL:               "http://127.0.0.1:8333",
							 | 
						|
											HostnameImmutable: true,
							 | 
						|
										}, nil
							 | 
						|
									})
							 | 
						|
								
							 | 
						|
									awsCfg, err := config.LoadDefaultConfig(ctx,
							 | 
						|
										config.WithRegion("us-east-1"),
							 | 
						|
										config.WithEndpointResolverWithOptions(customResolver),
							 | 
						|
										config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(
							 | 
						|
											"some_access_key1",
							 | 
						|
											"some_secret_key1",
							 | 
						|
											"",
							 | 
						|
										)),
							 | 
						|
									)
							 | 
						|
									require.NoError(t, err)
							 | 
						|
								
							 | 
						|
									client := s3.NewFromConfig(awsCfg, func(o *s3.Options) {
							 | 
						|
										o.UsePathStyle = true
							 | 
						|
									})
							 | 
						|
								
							 | 
						|
									bucketName := "test-debug-bucket"
							 | 
						|
									objectKey := fmt.Sprintf("test-object-prefixed-%d", time.Now().UnixNano())
							 | 
						|
								
							 | 
						|
									// Generate SSE-C key
							 | 
						|
									key := make([]byte, 32)
							 | 
						|
									rand.Read(key)
							 | 
						|
									keyB64 := base64.StdEncoding.EncodeToString(key)
							 | 
						|
									keyMD5Hash := md5.Sum(key)
							 | 
						|
									keyMD5 := base64.StdEncoding.EncodeToString(keyMD5Hash[:])
							 | 
						|
								
							 | 
						|
									testData := []byte("Hello, simple SSE-C integration test!")
							 | 
						|
								
							 | 
						|
									// Ensure bucket exists
							 | 
						|
									_, err = client.CreateBucket(ctx, &s3.CreateBucketInput{
							 | 
						|
										Bucket: aws.String(bucketName),
							 | 
						|
									})
							 | 
						|
									if err != nil {
							 | 
						|
										t.Logf("Bucket creation result: %v (might be OK if exists)", err)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Wait a moment for bucket to be ready
							 | 
						|
									time.Sleep(1 * time.Second)
							 | 
						|
								
							 | 
						|
									t.Run("PUT with SSE-C", func(t *testing.T) {
							 | 
						|
										_, err := client.PutObject(ctx, &s3.PutObjectInput{
							 | 
						|
											Bucket:               aws.String(bucketName),
							 | 
						|
											Key:                  aws.String(objectKey),
							 | 
						|
											Body:                 bytes.NewReader(testData),
							 | 
						|
											SSECustomerAlgorithm: aws.String("AES256"),
							 | 
						|
											SSECustomerKey:       aws.String(keyB64),
							 | 
						|
											SSECustomerKeyMD5:    aws.String(keyMD5),
							 | 
						|
										})
							 | 
						|
										require.NoError(t, err, "Failed to upload SSE-C object")
							 | 
						|
										t.Log("✅ SSE-C PUT succeeded!")
							 | 
						|
									})
							 | 
						|
								
							 | 
						|
									t.Run("GET with SSE-C", func(t *testing.T) {
							 | 
						|
										resp, err := client.GetObject(ctx, &s3.GetObjectInput{
							 | 
						|
											Bucket:               aws.String(bucketName),
							 | 
						|
											Key:                  aws.String(objectKey),
							 | 
						|
											SSECustomerAlgorithm: aws.String("AES256"),
							 | 
						|
											SSECustomerKey:       aws.String(keyB64),
							 | 
						|
											SSECustomerKeyMD5:    aws.String(keyMD5),
							 | 
						|
										})
							 | 
						|
										require.NoError(t, err, "Failed to retrieve SSE-C object")
							 | 
						|
										defer resp.Body.Close()
							 | 
						|
								
							 | 
						|
										retrievedData, err := io.ReadAll(resp.Body)
							 | 
						|
										require.NoError(t, err, "Failed to read retrieved data")
							 | 
						|
										assert.Equal(t, testData, retrievedData, "Retrieved data doesn't match original")
							 | 
						|
								
							 | 
						|
										// Verify SSE-C headers
							 | 
						|
										assert.Equal(t, "AES256", aws.ToString(resp.SSECustomerAlgorithm))
							 | 
						|
										assert.Equal(t, keyMD5, aws.ToString(resp.SSECustomerKeyMD5))
							 | 
						|
								
							 | 
						|
										t.Log("✅ SSE-C GET succeeded and data matches!")
							 | 
						|
									})
							 | 
						|
								
							 | 
						|
									t.Run("GET without key should fail", func(t *testing.T) {
							 | 
						|
										_, err := client.GetObject(ctx, &s3.GetObjectInput{
							 | 
						|
											Bucket: aws.String(bucketName),
							 | 
						|
											Key:    aws.String(objectKey),
							 | 
						|
										})
							 | 
						|
										assert.Error(t, err, "Should fail to retrieve SSE-C object without key")
							 | 
						|
										t.Log("✅ GET without key correctly failed")
							 | 
						|
									})
							 | 
						|
								}
							 |