1package s3crypto 2 3import ( 4 "io" 5) 6 7// Cipher interface allows for either encryption and decryption of an object 8type Cipher interface { 9 Encrypter 10 Decrypter 11} 12 13// Encrypter interface with only the encrypt method 14type Encrypter interface { 15 Encrypt(io.Reader) io.Reader 16} 17 18// Decrypter interface with only the decrypt method 19type Decrypter interface { 20 Decrypt(io.Reader) io.Reader 21} 22 23// CryptoReadCloser handles closing of the body and allowing reads from the decrypted 24// content. 25type CryptoReadCloser struct { 26 Body io.ReadCloser 27 Decrypter io.Reader 28 isClosed bool 29} 30 31// Close lets the CryptoReadCloser satisfy io.ReadCloser interface 32func (rc *CryptoReadCloser) Close() error { 33 rc.isClosed = true 34 return rc.Body.Close() 35} 36 37// Read lets the CryptoReadCloser satisfy io.ReadCloser interface 38func (rc *CryptoReadCloser) Read(b []byte) (int, error) { 39 if rc.isClosed { 40 return 0, io.EOF 41 } 42 return rc.Decrypter.Read(b) 43} 44