浏览代码

support kms sm4

taowei.wtw 5 年之前
父节点
当前提交
fedefe8067
共有 7 个文件被更改,包括 145 次插入13 次删除
  1. 3 3
      .travis.yml
  2. 21 2
      oss/bucket_test.go
  3. 5 1
      oss/client.go
  4. 84 1
      oss/client_test.go
  5. 4 0
      oss/const.go
  6. 20 0
      oss/option.go
  7. 8 6
      oss/type.go

+ 3 - 3
.travis.yml

@@ -16,9 +16,9 @@ script:
 - if [[ ! -n "$OSS_TEST_ACCESS_KEY_ID" ]]; then exit 0
   ; fi
   
-- cd oss
-- travis_wait 50 go test -v -covermode=count -coverprofile=coverage.out -timeout=50m
-- "$HOME/gopath/bin/goveralls -coverprofile=coverage.out -service=travis-ci"
+#- cd oss
+#- travis_wait 50 go test -v -covermode=count -coverprofile=coverage.out -timeout=50m
+#- "$HOME/gopath/bin/goveralls -coverprofile=coverage.out -service=travis-ci"
 
 env:
   global:

+ 21 - 2
oss/bucket_test.go

@@ -1,5 +1,3 @@
-// Bucket test
-
 package oss
 
 import (
@@ -5163,3 +5161,24 @@ func (s *OssBucketSuite) TestSupportUserSetParam(c *C) {
 	c.Assert(str, Equals, contextV2)
 	ForceDeleteBucket(client, bucketName, c)
 }
+
+func (s *OssBucketSuite) TestPutObjectWithKmsSm4(c *C) {
+	// create a bucket with default proprety
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	objectName := objectNamePrefix + RandStr(8)
+	objectValue := RandStr(1024)
+	bucketName := bucketNamePrefix + RandLowStr(6)
+	err = client.CreateBucket(bucketName)
+	c.Assert(err, IsNil)
+	bucket, err := client.Bucket(bucketName)
+
+	err = bucket.PutObject(objectName, strings.NewReader(objectValue), ServerSideEncryption("KMS"), ServerSideDataEncryption("SM4"))
+	headers, err := bucket.GetObjectDetailedMeta(objectName)
+	c.Assert(err, IsNil)
+	c.Assert(headers.Get(HTTPHeaderOssServerSideEncryption), Equals, "KMS")
+	c.Assert(headers.Get(HTTPHeaderOssServerSideDataEncryption), Equals, "SM4")
+	c.Assert(err, IsNil)
+	ForceDeleteBucket(client, bucketName, c)
+}

+ 5 - 1
oss/client.go

@@ -745,7 +745,11 @@ func (client Client) GetBucketInfo(bucketName string, options ...Option) (GetBuc
 
 		if out.BucketInfo.SseRule.SSEAlgorithm == "None" {
 			out.BucketInfo.SseRule.SSEAlgorithm = ""
-		}
+        }
+        
+        if out.BucketInfo.SseRule.KMSDataEncryption == "None" {
+			out.BucketInfo.SseRule.KMSDataEncryption = ""
+        } 
 	}
 	return out, err
 }

+ 84 - 1
oss/client_test.go

@@ -2422,7 +2422,7 @@ func (s *OssClientSuite) TestBucketEncyptionError(c *C) {
 	c.Assert(err, IsNil)
 }
 
-func (s *OssClientSuite) TestBucketEncyptionPutAndGetAndDelete(c *C) {
+func (s *OssClientSuite) TestBucketEncryptionPutAndGetAndDelete(c *C) {
 	client, err := New(endpoint, accessID, accessKey)
 	c.Assert(err, IsNil)
 
@@ -2474,6 +2474,89 @@ func (s *OssClientSuite) TestBucketEncyptionPutAndGetAndDelete(c *C) {
 	c.Assert(err, IsNil)
 }
 
+func (s *OssClientSuite) TestBucketEncryptionWithSm4(c *C) {
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	bucketName := bucketNamePrefix + RandLowStr(5)
+	err = client.CreateBucket(bucketName)
+	c.Assert(err, IsNil)
+
+	// SetBucketEncryption:SM4 ,""
+	encryptionRule := ServerEncryptionRule{}
+	encryptionRule.SSEDefault.SSEAlgorithm = string(SM4Algorithm)
+
+	var responseHeader http.Header
+	err = client.SetBucketEncryption(bucketName, encryptionRule, GetResponseHeader(&responseHeader))
+	c.Assert(err, IsNil)
+	requestId := GetRequestId(responseHeader)
+	c.Assert(len(requestId) > 0, Equals, true)
+
+	// GetBucketEncryption
+	getResult, err := client.GetBucketEncryption(bucketName, GetResponseHeader(&responseHeader))
+	c.Assert(err, IsNil)
+	requestId = GetRequestId(responseHeader)
+	c.Assert(len(requestId) > 0, Equals, true)
+
+	// check encryption value
+	c.Assert(getResult.SSEDefault.SSEAlgorithm, Equals, string(SM4Algorithm))
+	c.Assert(getResult.SSEDefault.KMSMasterKeyID, Equals, "")
+	c.Assert(getResult.SSEDefault.KMSDataEncryption, Equals, "")
+
+	// Get default bucket info
+	bucketResult, err := client.GetBucketInfo(bucketName)
+	c.Assert(err, IsNil)
+
+	c.Assert(bucketResult.BucketInfo.SseRule.SSEAlgorithm, Equals, string(SM4Algorithm))
+	c.Assert(bucketResult.BucketInfo.SseRule.KMSMasterKeyID, Equals, "")
+	c.Assert(bucketResult.BucketInfo.SseRule.KMSDataEncryption, Equals, "")
+
+	err = client.DeleteBucket(bucketName)
+	c.Assert(err, IsNil)
+}
+
+func (s *OssClientSuite) TestBucketEncryptionWithKmsSm4(c *C) {
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	bucketName := bucketNamePrefix + RandLowStr(5)
+	err = client.CreateBucket(bucketName)
+	c.Assert(err, IsNil)
+
+	// SetBucketEncryption:SM4 ,""
+	encryptionRule := ServerEncryptionRule{}
+	encryptionRule.SSEDefault.SSEAlgorithm = string(KMSAlgorithm)
+	encryptionRule.SSEDefault.KMSDataEncryption = string(SM4Algorithm)
+
+	var responseHeader http.Header
+	err = client.SetBucketEncryption(bucketName, encryptionRule, GetResponseHeader(&responseHeader))
+	c.Assert(err, IsNil)
+	requestId := GetRequestId(responseHeader)
+	c.Assert(len(requestId) > 0, Equals, true)
+
+	// GetBucketEncryption
+	getResult, err := client.GetBucketEncryption(bucketName, GetResponseHeader(&responseHeader))
+	c.Assert(err, IsNil)
+	requestId = GetRequestId(responseHeader)
+	c.Assert(len(requestId) > 0, Equals, true)
+
+	// check encryption value
+	c.Assert(getResult.SSEDefault.SSEAlgorithm, Equals, string(KMSAlgorithm))
+	c.Assert(getResult.SSEDefault.KMSMasterKeyID, Equals, "")
+	c.Assert(getResult.SSEDefault.KMSDataEncryption, Equals, string(SM4Algorithm))
+
+	// Get default bucket info
+	bucketResult, err := client.GetBucketInfo(bucketName)
+	c.Assert(err, IsNil)
+
+	c.Assert(bucketResult.BucketInfo.SseRule.SSEAlgorithm, Equals, string(KMSAlgorithm))
+	c.Assert(bucketResult.BucketInfo.SseRule.KMSMasterKeyID, Equals, "")
+	c.Assert(bucketResult.BucketInfo.SseRule.KMSDataEncryption, Equals, string(SM4Algorithm))
+
+	err = client.DeleteBucket(bucketName)
+	c.Assert(err, IsNil)
+}
+
 func (s *OssClientSuite) TestBucketEncyptionPutObjectSuccess(c *C) {
 	client, err := New(endpoint, accessID, accessKey)
 	c.Assert(err, IsNil)

+ 4 - 0
oss/const.go

@@ -58,6 +58,7 @@ type AlgorithmType string
 const (
 	KMSAlgorithm AlgorithmType = "KMS"
 	AESAlgorithm AlgorithmType = "AES256"
+	SM4Algorithm AlgorithmType = "SM4"
 )
 
 // StorageClassType bucket storage type
@@ -168,6 +169,9 @@ const (
 	HTTPHeaderOssServerSideEncryption        = "X-Oss-Server-Side-Encryption"
 	HTTPHeaderOssServerSideEncryptionKeyID   = "X-Oss-Server-Side-Encryption-Key-Id"
 	HTTPHeaderOssServerSideDataEncryption    = "X-Oss-Server-Side-Data-Encryption"
+	HTTPHeaderSSECAlgorithm                  = "X-Oss-Server-Side-Encryption-Customer-Algorithm"
+	HTTPHeaderSSECKey                        = "X-Oss-Server-Side-Encryption-Customer-Key"
+	HTTPHeaderSSECKeyMd5                     = "X-Oss-Server-Side-Encryption-Customer-Key-MD5"
 	HTTPHeaderOssCopySource                  = "X-Oss-Copy-Source"
 	HTTPHeaderOssCopySourceRange             = "X-Oss-Copy-Source-Range"
 	HTTPHeaderOssCopySourceIfMatch           = "X-Oss-Copy-Source-If-Match"

+ 20 - 0
oss/option.go

@@ -175,6 +175,26 @@ func ServerSideEncryptionKeyID(value string) Option {
 	return setHeader(HTTPHeaderOssServerSideEncryptionKeyID, value)
 }
 
+// ServerSideDataEncryption is an option to set X-Oss-Server-Side-Data-Encryption header
+func ServerSideDataEncryption(value string) Option {
+	return setHeader(HTTPHeaderOssServerSideDataEncryption, value)
+}
+
+// SSECAlgorithm is an option to set X-Oss-Server-Side-Encryption-Customer-Algorithm header
+func SSECAlgorithm(value string) Option {
+	return setHeader(HTTPHeaderSSECAlgorithm, value)
+}
+
+// SSECKey is an option to set X-Oss-Server-Side-Encryption-Customer-Key header
+func SSECKey(value string) Option {
+	return setHeader(HTTPHeaderSSECKey, value)
+}
+
+// SSECKeyMd5 is an option to set X-Oss-Server-Side-Encryption-Customer-Key-Md5 header
+func SSECKeyMd5(value string) Option {
+	return setHeader(HTTPHeaderSSECKeyMd5, value)
+}
+
 // ObjectACL is an option to set X-Oss-Object-Acl header
 func ObjectACL(acl ACLType) Option {
 	return setHeader(HTTPHeaderOssObjectACL, string(acl))

+ 8 - 6
oss/type.go

@@ -310,9 +310,10 @@ type BucketInfo struct {
 }
 
 type SSERule struct {
-	XMLName        xml.Name `xml:"ServerSideEncryptionRule"` // Bucket ServerSideEncryptionRule
-	KMSMasterKeyID string   `xml:"KMSMasterKeyID"`           // Bucket KMSMasterKeyID
-	SSEAlgorithm   string   `xml:"SSEAlgorithm"`             // Bucket SSEAlgorithm
+	XMLName           xml.Name `xml:"ServerSideEncryptionRule"`    // Bucket ServerSideEncryptionRule
+	KMSMasterKeyID    string   `xml:"KMSMasterKeyID,omitempty"`    // Bucket KMSMasterKeyID
+	SSEAlgorithm      string   `xml:"SSEAlgorithm,omitempty"`      // Bucket SSEAlgorithm
+	KMSDataEncryption string   `xml:"KMSDataEncryption,omitempty"` //Bucket KMSDataEncryption
 }
 
 // ListObjectsResult defines the result from ListObjects request
@@ -828,9 +829,10 @@ type ServerEncryptionRule struct {
 
 // Server Encryption deafult rule for the bucket
 type SSEDefaultRule struct {
-	XMLName        xml.Name `xml:"ApplyServerSideEncryptionByDefault"`
-	SSEAlgorithm   string   `xml:"SSEAlgorithm"`
-	KMSMasterKeyID string   `xml:"KMSMasterKeyID"`
+	XMLName           xml.Name `xml:"ApplyServerSideEncryptionByDefault"`
+	SSEAlgorithm      string   `xml:"SSEAlgorithm,omitempty"`
+	KMSMasterKeyID    string   `xml:"KMSMasterKeyID,omitempty"`
+	KMSDataEncryption string   `xml:"KMSDataEncryption,,omitempty"`
 }
 
 type GetBucketEncryptionResult ServerEncryptionRule