github.com/aliyun/aliyun-oss-go-sdk@v3.0.2+incompatible/oss/crypto/cipher.go (about) 1 package osscrypto 2 3 import ( 4 "io" 5 ) 6 7 // Cipher is interface for encryption or decryption of an object 8 type Cipher interface { 9 Encrypter 10 Decrypter 11 } 12 13 // Encrypter is interface with only encrypt method 14 type Encrypter interface { 15 Encrypt(io.Reader) io.Reader 16 } 17 18 // Decrypter is interface with only decrypt method 19 type Decrypter interface { 20 Decrypt(io.Reader) io.Reader 21 } 22 23 // CryptoEncrypter provides close method for Encrypter 24 type CryptoEncrypter struct { 25 Body io.Reader 26 Encrypter io.Reader 27 isClosed bool 28 } 29 30 // Close lets the CryptoEncrypter satisfy io.ReadCloser interface 31 func (rc *CryptoEncrypter) Close() error { 32 rc.isClosed = true 33 if closer, ok := rc.Body.(io.ReadCloser); ok { 34 return closer.Close() 35 } 36 return nil 37 } 38 39 // Read lets the CryptoEncrypter satisfy io.ReadCloser interface 40 func (rc *CryptoEncrypter) Read(b []byte) (int, error) { 41 if rc.isClosed { 42 return 0, io.EOF 43 } 44 return rc.Encrypter.Read(b) 45 } 46 47 // CryptoDecrypter provides close method for Decrypter 48 type CryptoDecrypter struct { 49 Body io.Reader 50 Decrypter io.Reader 51 isClosed bool 52 } 53 54 // Close lets the CryptoDecrypter satisfy io.ReadCloser interface 55 func (rc *CryptoDecrypter) Close() error { 56 rc.isClosed = true 57 if closer, ok := rc.Body.(io.ReadCloser); ok { 58 return closer.Close() 59 } 60 return nil 61 } 62 63 // Read lets the CryptoDecrypter satisfy io.ReadCloser interface 64 func (rc *CryptoDecrypter) Read(b []byte) (int, error) { 65 if rc.isClosed { 66 return 0, io.EOF 67 } 68 return rc.Decrypter.Read(b) 69 }