1package s3crypto
2
3import (
4	"bytes"
5	"fmt"
6	"io"
7	"io/ioutil"
8
9	"github.com/aws/aws-sdk-go/aws"
10	"github.com/aws/aws-sdk-go/service/kms/kmsiface"
11)
12
13type mockGenerator struct{}
14
15func (m mockGenerator) GenerateCipherData(keySize, ivSize int) (CipherData, error) {
16	cd := CipherData{
17		Key: make([]byte, keySize),
18		IV:  make([]byte, ivSize),
19	}
20	return cd, nil
21}
22
23func (m mockGenerator) DecryptKey(key []byte) ([]byte, error) {
24	return make([]byte, 16), nil
25}
26
27type mockGeneratorV2 struct{}
28
29func (m mockGeneratorV2) GenerateCipherDataWithCEKAlg(ctx aws.Context, keySize int, ivSize int, cekAlg string) (CipherData, error) {
30	cd := CipherData{
31		Key: make([]byte, keySize),
32		IV:  make([]byte, ivSize),
33	}
34	return cd, nil
35}
36
37func (m mockGeneratorV2) DecryptKey(key []byte) ([]byte, error) {
38	return make([]byte, 16), nil
39}
40
41func (m mockGeneratorV2) isEncryptionVersionCompatible(version clientVersion) error {
42	if version != v2ClientVersion {
43		return fmt.Errorf("mock error about version")
44	}
45	return nil
46}
47
48type mockCipherBuilder struct {
49	generator CipherDataGenerator
50}
51
52func (builder mockCipherBuilder) isEncryptionVersionCompatible(version clientVersion) error {
53	if version != v1ClientVersion {
54		return fmt.Errorf("mock error about version")
55	}
56	return nil
57}
58
59func (builder mockCipherBuilder) ContentCipher() (ContentCipher, error) {
60	cd, err := builder.generator.GenerateCipherData(32, 16)
61	if err != nil {
62		return nil, err
63	}
64	return &mockContentCipher{cd}, nil
65}
66
67type mockCipherBuilderV2 struct {
68	generator CipherDataGeneratorWithCEKAlg
69}
70
71func (builder mockCipherBuilderV2) isEncryptionVersionCompatible(version clientVersion) error {
72	if version != v2ClientVersion {
73		return fmt.Errorf("mock error about version")
74	}
75	return nil
76}
77
78func (builder mockCipherBuilderV2) ContentCipher() (ContentCipher, error) {
79	cd, err := builder.generator.GenerateCipherDataWithCEKAlg(aws.BackgroundContext(), 32, 16, "mock-cek-alg")
80	if err != nil {
81		return nil, err
82	}
83	return &mockContentCipher{cd}, nil
84}
85
86type mockContentCipher struct {
87	cd CipherData
88}
89
90func (cipher *mockContentCipher) GetCipherData() CipherData {
91	return cipher.cd
92}
93
94func (cipher *mockContentCipher) EncryptContents(src io.Reader) (io.Reader, error) {
95	b, err := ioutil.ReadAll(src)
96	if err != nil {
97		return nil, err
98	}
99	size := len(b)
100	b = bytes.Repeat([]byte{1}, size)
101	return bytes.NewReader(b), nil
102}
103
104func (cipher *mockContentCipher) DecryptContents(src io.ReadCloser) (io.ReadCloser, error) {
105	b, err := ioutil.ReadAll(src)
106	if err != nil {
107		return nil, err
108	}
109	size := len(b)
110	return ioutil.NopCloser(bytes.NewReader(make([]byte, size))), nil
111}
112
113type mockKMS struct {
114	kmsiface.KMSAPI
115}
116
117type mockPadder struct {
118}
119
120func (m mockPadder) Pad(i []byte, i2 int) ([]byte, error) {
121	return i, nil
122}
123
124func (m mockPadder) Unpad(i []byte) ([]byte, error) {
125	return i, nil
126}
127
128func (m mockPadder) Name() string {
129	return "mockPadder"
130}
131