github.com/aavshr/aws-sdk-go@v1.41.3/service/s3/s3crypto/encryption_client.go (about) 1 package s3crypto 2 3 import ( 4 "github.com/aavshr/aws-sdk-go/aws" 5 "github.com/aavshr/aws-sdk-go/aws/awserr" 6 "github.com/aavshr/aws-sdk-go/aws/client" 7 "github.com/aavshr/aws-sdk-go/aws/request" 8 "github.com/aavshr/aws-sdk-go/service/s3" 9 "github.com/aavshr/aws-sdk-go/service/s3/s3iface" 10 ) 11 12 // DefaultMinFileSize is used to check whether we want to write to a temp file 13 // or store the data in memory. 14 const DefaultMinFileSize = 1024 * 512 * 5 15 16 // EncryptionClient is an S3 crypto client. By default the SDK will use Authentication mode which 17 // will use KMS for key wrapping and AES GCM for content encryption. 18 // AES GCM will load all data into memory. However, the rest of the content algorithms 19 // do not load the entire contents into memory. 20 // 21 // deprecated: This feature is in maintenance mode, no new updates will be released. Please see https://docs.aws.amazon.com/general/latest/gr/aws_sdk_cryptography.html for more information. 22 type EncryptionClient struct { 23 S3Client s3iface.S3API 24 ContentCipherBuilder ContentCipherBuilder 25 // SaveStrategy will dictate where the envelope is saved. 26 // 27 // Defaults to the object's metadata 28 SaveStrategy SaveStrategy 29 // TempFolderPath is used to store temp files when calling PutObject. 30 // Temporary files are needed to compute the X-Amz-Content-Sha256 header. 31 TempFolderPath string 32 // MinFileSize is the minimum size for the content to write to a 33 // temporary file instead of using memory. 34 MinFileSize int64 35 } 36 37 func validateV1EncryptionClientConstruction(c *EncryptionClient) error { 38 builder, ok := c.ContentCipherBuilder.(compatibleEncryptionFixture) 39 if !ok { 40 return nil 41 } 42 43 err := builder.isEncryptionVersionCompatible(v1ClientVersion) 44 if err != nil { 45 return awserr.New(clientConstructionErrorCode, "invalid client configuration", err) 46 } 47 return nil 48 } 49 50 // NewEncryptionClient instantiates a new S3 crypto client 51 // 52 // Example: 53 // cmkID := "arn:aws:kms:region:000000000000:key/00000000-0000-0000-0000-000000000000" 54 // sess := session.Must(session.NewSession()) 55 // handler := s3crypto.NewKMSKeyGenerator(kms.New(sess), cmkID) 56 // svc := s3crypto.NewEncryptionClient(sess, s3crypto.AESGCMContentCipherBuilder(handler)) 57 // 58 // deprecated: This feature is in maintenance mode, no new updates will be released. Please see https://docs.aws.amazon.com/general/latest/gr/aws_sdk_cryptography.html for more information. 59 func NewEncryptionClient(prov client.ConfigProvider, builder ContentCipherBuilder, options ...func(*EncryptionClient)) *EncryptionClient { 60 s3client := s3.New(prov) 61 62 s3client.Handlers.Build.PushBack(func(r *request.Request) { 63 request.AddToUserAgent(r, "S3CryptoV1n") 64 }) 65 66 client := &EncryptionClient{ 67 S3Client: s3client, 68 ContentCipherBuilder: builder, 69 SaveStrategy: HeaderV2SaveStrategy{}, 70 MinFileSize: DefaultMinFileSize, 71 } 72 73 for _, option := range options { 74 option(client) 75 } 76 77 return client 78 } 79 80 // PutObjectRequest creates a temp file to encrypt the contents into. It then streams 81 // that data to S3. 82 // 83 // Example: 84 // svc := s3crypto.NewEncryptionClient(session.Must(session.NewSession()), s3crypto.AESGCMContentCipherBuilder(handler)) 85 // req, out := svc.PutObjectRequest(&s3.PutObjectInput { 86 // Key: aws.String("testKey"), 87 // Bucket: aws.String("testBucket"), 88 // Body: strings.NewReader("test data"), 89 // }) 90 // err := req.Send() 91 // 92 // deprecated: This feature is in maintenance mode, no new updates will be released. Please see https://docs.aws.amazon.com/general/latest/gr/aws_sdk_cryptography.html for more information. 93 func (c *EncryptionClient) PutObjectRequest(input *s3.PutObjectInput) (*request.Request, *s3.PutObjectOutput) { 94 req, out := putObjectRequest(c.getClientOptions(), input) 95 if err := validateV1EncryptionClientConstruction(c); err != nil { 96 errHandler := setReqError(err) 97 req.Error = err 98 req.Handlers.Build.Clear() 99 req.Handlers.Send.Clear() 100 req.Handlers.Validate.PushFront(errHandler) 101 req.Handlers.Build.PushFront(errHandler) 102 req.Handlers.Send.PushFront(errHandler) 103 } 104 return req, out 105 } 106 107 func setReqError(err error) func(*request.Request) { 108 return func(r *request.Request) { 109 r.Error = err 110 } 111 } 112 113 // PutObject is a wrapper for PutObjectRequest 114 // 115 // deprecated: This feature is in maintenance mode, no new updates will be released. Please see https://docs.aws.amazon.com/general/latest/gr/aws_sdk_cryptography.html for more information. 116 func (c *EncryptionClient) PutObject(input *s3.PutObjectInput) (*s3.PutObjectOutput, error) { 117 if err := validateV1EncryptionClientConstruction(c); err != nil { 118 return nil, err 119 } 120 return putObject(c.getClientOptions(), input) 121 } 122 123 // PutObjectWithContext is a wrapper for PutObjectRequest with the additional 124 // context, and request options support. 125 // 126 // PutObjectWithContext is the same as PutObject with the additional support for 127 // Context input parameters. The Context must not be nil. A nil Context will 128 // cause a panic. Use the Context to add deadlining, timeouts, etc. In the future 129 // this may create sub-contexts for individual underlying requests. 130 // PutObject is a wrapper for PutObjectRequest 131 // 132 // deprecated: This feature is in maintenance mode, no new updates will be released. Please see https://docs.aws.amazon.com/general/latest/gr/aws_sdk_cryptography.html for more information. 133 func (c *EncryptionClient) PutObjectWithContext(ctx aws.Context, input *s3.PutObjectInput, opts ...request.Option) (*s3.PutObjectOutput, error) { 134 if err := validateV1EncryptionClientConstruction(c); err != nil { 135 return nil, err 136 } 137 return putObjectWithContext(c.getClientOptions(), ctx, input, opts...) 138 } 139 140 func (c *EncryptionClient) getClientOptions() EncryptionClientOptions { 141 return EncryptionClientOptions{ 142 S3Client: c.S3Client, 143 ContentCipherBuilder: c.ContentCipherBuilder, 144 SaveStrategy: c.SaveStrategy, 145 TempFolderPath: c.TempFolderPath, 146 MinFileSize: c.MinFileSize, 147 } 148 }