github.com/aavshr/aws-sdk-go@v1.41.3/service/s3/sse.go (about) 1 package s3 2 3 import ( 4 "crypto/md5" 5 "encoding/base64" 6 "net/http" 7 8 "github.com/aavshr/aws-sdk-go/aws/awserr" 9 "github.com/aavshr/aws-sdk-go/aws/request" 10 ) 11 12 var errSSERequiresSSL = awserr.New("ConfigError", "cannot send SSE keys over HTTP.", nil) 13 14 func validateSSERequiresSSL(r *request.Request) { 15 if r.HTTPRequest.URL.Scheme == "https" { 16 return 17 } 18 19 if iface, ok := r.Params.(sseCustomerKeyGetter); ok { 20 if len(iface.getSSECustomerKey()) > 0 { 21 r.Error = errSSERequiresSSL 22 return 23 } 24 } 25 26 if iface, ok := r.Params.(copySourceSSECustomerKeyGetter); ok { 27 if len(iface.getCopySourceSSECustomerKey()) > 0 { 28 r.Error = errSSERequiresSSL 29 return 30 } 31 } 32 } 33 34 const ( 35 sseKeyHeader = "x-amz-server-side-encryption-customer-key" 36 sseKeyMD5Header = sseKeyHeader + "-md5" 37 ) 38 39 func computeSSEKeyMD5(r *request.Request) { 40 var key string 41 if g, ok := r.Params.(sseCustomerKeyGetter); ok { 42 key = g.getSSECustomerKey() 43 } 44 45 computeKeyMD5(sseKeyHeader, sseKeyMD5Header, key, r.HTTPRequest) 46 } 47 48 const ( 49 copySrcSSEKeyHeader = "x-amz-copy-source-server-side-encryption-customer-key" 50 copySrcSSEKeyMD5Header = copySrcSSEKeyHeader + "-md5" 51 ) 52 53 func computeCopySourceSSEKeyMD5(r *request.Request) { 54 var key string 55 if g, ok := r.Params.(copySourceSSECustomerKeyGetter); ok { 56 key = g.getCopySourceSSECustomerKey() 57 } 58 59 computeKeyMD5(copySrcSSEKeyHeader, copySrcSSEKeyMD5Header, key, r.HTTPRequest) 60 } 61 62 func computeKeyMD5(keyHeader, keyMD5Header, key string, r *http.Request) { 63 if len(key) == 0 { 64 // Backwards compatiablity where user just set the header value instead 65 // of using the API parameter, or setting the header value for an 66 // operation without the parameters modeled. 67 key = r.Header.Get(keyHeader) 68 if len(key) == 0 { 69 return 70 } 71 72 // In backwards compatible, the header's value is not base64 encoded, 73 // and needs to be encoded and updated by the SDK's customizations. 74 b64Key := base64.StdEncoding.EncodeToString([]byte(key)) 75 r.Header.Set(keyHeader, b64Key) 76 } 77 78 // Only update Key's MD5 if not already set. 79 if len(r.Header.Get(keyMD5Header)) == 0 { 80 sum := md5.Sum([]byte(key)) 81 keyMD5 := base64.StdEncoding.EncodeToString(sum[:]) 82 r.Header.Set(keyMD5Header, keyMD5) 83 } 84 }