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