github.com/aavshr/aws-sdk-go@v1.41.3/service/s3/s3crypto/decryption_client_v2.go (about) 1 package s3crypto 2 3 import ( 4 "github.com/aavshr/aws-sdk-go/aws" 5 "github.com/aavshr/aws-sdk-go/aws/client" 6 "github.com/aavshr/aws-sdk-go/aws/request" 7 "github.com/aavshr/aws-sdk-go/service/s3" 8 "github.com/aavshr/aws-sdk-go/service/s3/s3iface" 9 ) 10 11 // DecryptionClientV2 is an S3 crypto client. The decryption client 12 // will handle all get object requests from Amazon S3. 13 // Supported key wrapping algorithms: 14 // * AWS KMS 15 // * AWS KMS + Context 16 // 17 // Supported content ciphers: 18 // * AES/GCM 19 // * AES/CBC 20 type DecryptionClientV2 struct { 21 options DecryptionClientOptions 22 } 23 24 // DecryptionClientOptions is the configuration options for DecryptionClientV2. 25 type DecryptionClientOptions struct { 26 S3Client s3iface.S3API 27 // LoadStrategy is used to load the metadata either from the metadata of the object 28 // or from a separate file in s3. 29 // 30 // Defaults to our default load strategy. 31 LoadStrategy LoadStrategy 32 33 CryptoRegistry *CryptoRegistry 34 } 35 36 // NewDecryptionClientV2 instantiates a new DecryptionClientV2. The NewDecryptionClientV2 must be configured with the 37 // desired key wrapping and content encryption algorithms that are required to be read by the client. These algorithms 38 // are registered by providing the client a CryptoRegistry that has been constructed with the desired configuration. 39 // NewDecryptionClientV2 will return an error if no key wrapping or content encryption algorithms have been provided. 40 // 41 // Example: 42 // sess := session.Must(session.NewSession()) 43 // cr := s3crypto.NewCryptoRegistry() 44 // if err := s3crypto.RegisterKMSContextWrapWithAnyCMK(cr, kms.New(sess)); err != nil { 45 // panic(err) // handle error 46 // } 47 // if err := s3crypto.RegisterAESGCMContentCipher(cr); err != nil { 48 // panic(err) // handle error 49 // } 50 // svc, err := s3crypto.NewDecryptionClientV2(sess, cr, func(o *s3crypto.DecryptionClientOptions) { 51 // // Custom client options here 52 // }) 53 // if err != nil { 54 // panic(err) // handle error 55 // } 56 func NewDecryptionClientV2( 57 prov client.ConfigProvider, cryptoRegistry *CryptoRegistry, 58 options ...func(clientOptions *DecryptionClientOptions), 59 ) (*DecryptionClientV2, error) { 60 s3client := s3.New(prov) 61 62 s3client.Handlers.Build.PushBack(func(r *request.Request) { 63 request.AddToUserAgent(r, "S3CryptoV2") 64 }) 65 66 clientOptions := &DecryptionClientOptions{ 67 S3Client: s3client, 68 LoadStrategy: defaultV2LoadStrategy{ 69 client: s3client, 70 }, 71 CryptoRegistry: cryptoRegistry, 72 } 73 for _, option := range options { 74 option(clientOptions) 75 } 76 77 if err := cryptoRegistry.valid(); err != nil { 78 return nil, err 79 } 80 81 return &DecryptionClientV2{options: *clientOptions}, nil 82 } 83 84 // GetObjectRequest will make a request to s3 and retrieve the object. In this process 85 // decryption will be done. The SDK only supports V2 reads of KMS and GCM. 86 // 87 // Example: 88 // req, out := svc.GetObjectRequest(&s3.GetObjectInput { 89 // Key: aws.String("testKey"), 90 // Bucket: aws.String("testBucket"), 91 // }) 92 // err := req.Send() 93 func (c *DecryptionClientV2) GetObjectRequest(input *s3.GetObjectInput) (*request.Request, *s3.GetObjectOutput) { 94 return getObjectRequest(c.options, input) 95 } 96 97 // GetObject is a wrapper for GetObjectRequest 98 func (c *DecryptionClientV2) GetObject(input *s3.GetObjectInput) (*s3.GetObjectOutput, error) { 99 req, out := getObjectRequest(c.options, input) 100 return out, req.Send() 101 } 102 103 // GetObjectWithContext is a wrapper for GetObjectRequest with the additional 104 // context, and request options support. 105 // 106 // GetObjectWithContext is the same as GetObject with the additional support for 107 // Context input parameters. The Context must not be nil. A nil Context will 108 // cause a panic. Use the Context to add deadlining, timeouts, etc. In the future 109 // this may create sub-contexts for individual underlying requests. 110 func (c *DecryptionClientV2) GetObjectWithContext(ctx aws.Context, input *s3.GetObjectInput, opts ...request.Option) (*s3.GetObjectOutput, error) { 111 req, out := getObjectRequest(c.options, input) 112 req.SetContext(ctx) 113 req.ApplyOptions(opts...) 114 return out, req.Send() 115 }