Skip to content
This repository was archived by the owner on Oct 18, 2021. It is now read-only.

Commit 3cd4a50

Browse files
authored
storage: Implement SSE support (#13)
* storage: Implement SSE support * fix nil key * rename error * replace nil key check by HasEncryptionKey check
1 parent 0b1afa6 commit 3cd4a50

File tree

7 files changed

+154
-21
lines changed

7 files changed

+154
-21
lines changed

error.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package azblob
2+
3+
import "errors"
4+
5+
var (
6+
// ErrInvalidEncryptionKey will be returned while encryption key is invalid.
7+
// Encryption key must be a 32-byte AES-256 key.
8+
ErrInvalidEncryptionKey = errors.New("invalid encryption key")
9+
)

generated.go

Lines changed: 70 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ require (
66
github.com/Azure/azure-pipeline-go v0.2.3
77
github.com/Azure/azure-storage-blob-go v0.13.0
88
github.com/aos-dev/go-integration-test/v3 v3.0.0-20210205075620-0b779f4b3afc
9-
github.com/aos-dev/go-storage/v3 v3.4.3-0.20210417162535-67db0dd18784
9+
github.com/aos-dev/go-storage/v3 v3.5.1-0.20210422060150-bc0fae4c3fa7
1010
github.com/google/uuid v1.2.0
1111
)

go.sum

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,13 @@ github.com/aos-dev/go-integration-test/v3 v3.0.0-20210205075620-0b779f4b3afc/go.
2020
github.com/aos-dev/go-storage/v3 v3.0.1-0.20210205074802-e8a5b22166c2/go.mod h1:JznhvyhPDnETfZ3RyWm3mT/S5ic+uuYFWagSIkUZujc=
2121
github.com/aos-dev/go-storage/v3 v3.4.3-0.20210417162535-67db0dd18784 h1:eeKDDn+8RPtYuk7lrQC48OtTNeSRF/l9P5YHa/Q3omk=
2222
github.com/aos-dev/go-storage/v3 v3.4.3-0.20210417162535-67db0dd18784/go.mod h1:PZJT0Ta7YxVM5QoYoh8Q/X4I6e/z/7gOJqm85Aib4nY=
23+
github.com/aos-dev/go-storage/v3 v3.5.1-0.20210422060150-bc0fae4c3fa7 h1:YirUP3+06blEpQ/o6VT0RXRf5ystxNB91iaYgO0SoWM=
24+
github.com/aos-dev/go-storage/v3 v3.5.1-0.20210422060150-bc0fae4c3fa7/go.mod h1:JFshvl851ZDDXtFGWDFKqkg34QEPH0xuhLJ2LjikZYc=
2325
github.com/aos-dev/specs/go v0.0.0-20210205073047-af8ef94af73d/go.mod h1:XTNlLZtPA1inITyDH5hNnQXVjvvKUvo+lurs5GYB8NA=
2426
github.com/aos-dev/specs/go v0.0.0-20210312090615-23109627848b h1:qIehSnBbr31ATAckM9u9h6gSz+9PkGqu79vTngx6wPw=
2527
github.com/aos-dev/specs/go v0.0.0-20210312090615-23109627848b/go.mod h1:XTNlLZtPA1inITyDH5hNnQXVjvvKUvo+lurs5GYB8NA=
28+
github.com/aos-dev/specs/go v0.0.0-20210420062803-1a60efa2eae3 h1:LiW0Ki0Gw6opu11JwMhxWw5M+V6I9JypJ5eAIp+Rqt4=
29+
github.com/aos-dev/specs/go v0.0.0-20210420062803-1a60efa2eae3/go.mod h1:gNah3KaPJEfysh7uCCX+sYjQC3g2yx2VgBkFlT945Ws=
2630
github.com/dave/dst v0.26.2 h1:lnxLAKI3tx7MgLNVDirFCsDTlTG9nKTk7GcptKcWSwY=
2731
github.com/dave/dst v0.26.2/go.mod h1:UMDJuIRPfyUCC78eFuB+SV/WI8oDeyFDvM/JR6NI3IU=
2832
github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ=
@@ -58,6 +62,8 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWb
5862
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
5963
github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM=
6064
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
65+
github.com/pelletier/go-toml v1.9.0 h1:NOd0BRdOKpPf0SxkL3HxSQOG7rNh+4kl6PHcBPFs7Q0=
66+
github.com/pelletier/go-toml v1.9.0/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
6167
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
6268
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
6369
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=

service.toml

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@ optional = ["default_storage_pairs", "pair_policy", "work_dir"]
1414
optional = ["list_mode"]
1515

1616
[namespace.storage.op.read]
17-
optional = ["offset", "io_callback", "size"]
17+
optional = ["offset", "io_callback", "size", "encryption_key", "encryption_scope"]
1818

1919
[namespace.storage.op.write]
20-
optional = ["content_md5", "content_type", "io_callback", "access_tier"]
20+
optional = ["content_md5", "content_type", "io_callback", "access_tier", "encryption_key", "encryption_scope"]
21+
22+
[namespace.storage.op.stat]
23+
optional = ["encryption_key", "encryption_scope"]
2124

2225
[pairs.access_tier]
2326
type = "string"
@@ -30,5 +33,19 @@ description = "set default pairs for service actions"
3033
type = "DefaultStoragePairs"
3134
description = "set default pairs for storager actions"
3235

36+
[pairs.encryption_key]
37+
type = "byte_array"
38+
description = "is the customer's 32-byte AES-256 key"
39+
40+
[pairs.encryption_scope]
41+
type = "string"
42+
description = "Specifies the name of the encryption scope. See https://docs.microsoft.com/en-us/azure/storage/blobs/encryption-scope-overview for details."
43+
3344
[infos.object.meta.access-tier]
45+
type = "string"
46+
47+
[infos.object.meta.encryption-key-sha256]
48+
type = "string"
49+
50+
[infos.object.meta.encryption-scope]
3451
type = "string"

storage.go

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,16 @@ func (s *Storage) read(ctx context.Context, path string, w io.Writer, opt pairSt
137137
count = opt.Size
138138
}
139139

140+
var cpk azblob.ClientProvidedKeyOptions
141+
if opt.HasEncryptionKey {
142+
cpk, err = calculateEncryptionHeaders(opt.EncryptionKey, opt.EncryptionScope)
143+
if err != nil {
144+
return 0, err
145+
}
146+
}
140147
output, err := s.bucket.NewBlockBlobURL(rp).Download(
141148
ctx, offset, count,
142-
azblob.BlobAccessConditions{}, false, azblob.ClientProvidedKeyOptions{})
149+
azblob.BlobAccessConditions{}, false, cpk)
143150
if err != nil {
144151
return 0, err
145152
}
@@ -161,7 +168,15 @@ func (s *Storage) read(ctx context.Context, path string, w io.Writer, opt pairSt
161168
func (s *Storage) stat(ctx context.Context, path string, opt pairStorageStat) (o *Object, err error) {
162169
rp := s.getAbsPath(path)
163170

164-
output, err := s.bucket.NewBlockBlobURL(rp).GetProperties(ctx, azblob.BlobAccessConditions{}, azblob.ClientProvidedKeyOptions{})
171+
var cpk azblob.ClientProvidedKeyOptions
172+
if opt.HasEncryptionKey {
173+
cpk, err = calculateEncryptionHeaders(opt.EncryptionKey, opt.EncryptionScope)
174+
if err != nil {
175+
return
176+
}
177+
}
178+
179+
output, err := s.bucket.NewBlockBlobURL(rp).GetProperties(ctx, azblob.BlobAccessConditions{}, cpk)
165180
if err != nil {
166181
return nil, err
167182
}
@@ -188,6 +203,12 @@ func (s *Storage) stat(ctx context.Context, path string, opt pairStorageStat) (o
188203
if v := output.AccessTier(); v != "" {
189204
sm[MetadataAccessTier] = v
190205
}
206+
if v := output.EncryptionKeySha256(); v != "" {
207+
sm[MetadataEncryptionKeySha256] = v
208+
}
209+
if v := output.EncryptionScope(); v != "" {
210+
sm[MetadataEncryptionScope] = v
211+
}
191212
o.SetServiceMetadata(sm)
192213

193214
return o, nil
@@ -216,11 +237,17 @@ func (s *Storage) write(ctx context.Context, path string, r io.Reader, size int6
216237
headers.ContentType = opt.ContentType
217238
}
218239

240+
var cpk azblob.ClientProvidedKeyOptions
241+
if opt.HasEncryptionKey {
242+
cpk, err = calculateEncryptionHeaders(opt.EncryptionKey, opt.EncryptionScope)
243+
if err != nil {
244+
return 0, err
245+
}
246+
}
219247
_, err = s.bucket.NewBlockBlobURL(rp).Upload(
220248
ctx, iowrap.SizedReadSeekCloser(r, size),
221249
headers, azblob.Metadata{}, azblob.BlobAccessConditions{},
222-
accessTier, azblob.BlobTagsMap{}, azblob.ClientProvidedKeyOptions{},
223-
)
250+
accessTier, azblob.BlobTagsMap{}, cpk)
224251
if err != nil {
225252
return 0, err
226253
}

utils.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package azblob
22

33
import (
44
"context"
5+
"crypto/sha256"
56
"encoding/base64"
67
"fmt"
78

@@ -301,3 +302,20 @@ func (s *Storage) formatFileObject(v azblob.BlobItemInternal) (o *typ.Object, er
301302
func (s *Storage) newObject(done bool) *typ.Object {
302303
return typ.NewObject(s, done)
303304
}
305+
306+
func calculateEncryptionHeaders(key []byte, scope string) (cpk azblob.ClientProvidedKeyOptions, err error) {
307+
if len(key) != 32 {
308+
err = ErrInvalidEncryptionKey
309+
return
310+
}
311+
keyBase64 := base64.StdEncoding.EncodeToString(key)
312+
keySha256 := sha256.Sum256(key)
313+
keySha256Base64 := base64.StdEncoding.EncodeToString(keySha256[:])
314+
cpk = azblob.ClientProvidedKeyOptions{
315+
EncryptionKey: &keyBase64,
316+
EncryptionKeySha256: &keySha256Base64,
317+
EncryptionAlgorithm: "AES256",
318+
EncryptionScope: &scope,
319+
}
320+
return
321+
}

0 commit comments

Comments
 (0)