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

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")
})
}