@@ -134,45 +134,70 @@ func TestEncodeAndDecodeAccessTokenB64(t *testing.T) {
134134 assert.Equal(t, []byte(token), decoded)
135135}
136136
137−func TestEncryptAndDecryptBase64(t *testing.T) {
137+func TestEncryptAndDecrypt(t *testing.T) {
138138 var err error
139139
140− // Test all 3 valid AES sizes
141− for _, secretSize := range []int{16, 24, 32} {
142− secret := make([]byte, secretSize)
143− _, err = io.ReadFull(rand.Reader, secret)
144− assert.Equal(t, nil, err)
145−
146− // NewCipher creates a Base64 wrapper of CFBCipher
147− c, err := NewCipher(secret)
148− assert.Equal(t, nil, err)
149−
150− // Test various sizes sessions might be
151− for _, dataSize := range []int{10, 100, 1000, 5000, 10000} {
152− data := make([]byte, dataSize)
153− _, err := io.ReadFull(rand.Reader, data)
140+ // Test our 3 cipher types
141+ for _, initCipher := range []func([]byte) (Cipher, error){NewCipher, NewCFBCipher, NewGCMCipher} {
142+ // Test all 3 valid AES sizes
143+ for _, secretSize := range []int{16, 24, 32} {
144+ secret := make([]byte, secretSize)
145+ _, err = io.ReadFull(rand.Reader, secret)
154146 assert.Equal(t, nil, err)
155147
156− encrypted, err := c.Encrypt(data)
148+ c, err := initCipher(secret)
157149 assert.Equal(t, nil, err)
158150
159− decrypted, err := c.Decrypt(encrypted)
160− assert.Equal(t, nil, err)
161− assert.Equal(t, data, decrypted)
151+ // Test various sizes sessions might be
152+ for _, dataSize := range []int{10, 100, 1000, 5000, 10000} {
153+ data := make([]byte, dataSize)
154+ _, err := io.ReadFull(rand.Reader, data)
155+ assert.Equal(t, nil, err)
156+
157+ encrypted, err := c.Encrypt(data)
158+ assert.Equal(t, nil, err)
159+ assert.NotEqual(t, encrypted, data)
160+
161+ decrypted, err := c.Decrypt(encrypted)
162+ assert.Equal(t, nil, err)
163+ assert.Equal(t, data, decrypted)
164+ assert.NotEqual(t, encrypted, decrypted)
165+ }
162166 }
163167 }
164168}
165169
166−func TestDecryptBase64WrongSecret(t *testing.T) {
167− var err error
170+func TestDecryptWrongSecret(t *testing.T) {
171+ secret1 := []byte("0123456789abcdefghijklmnopqrstuv")
172+ secret2 := []byte("9876543210abcdefghijklmnopqrstuv")
173+
174+ // Test CFB & Base64 (GCM is authenticated, it errors differently)
175+ for _, initCipher := range []func([]byte) (Cipher, error){NewCipher, NewCFBCipher} {
176+ c1, err := initCipher(secret1)
177+ assert.Equal(t, nil, err)
178+
179+ c2, err := initCipher(secret2)
180+ assert.Equal(t, nil, err)
181+
182+ data := []byte("f3928pufm982374dj02y485dsl34890u2t9nd4028s94dm58y2394087dhmsyt29h8df")
168183
184+ ciphertext, err := c1.Encrypt(data)
185+ assert.Equal(t, nil, err)
186+
187+ wrongData, err := c2.Decrypt(ciphertext)
188+ assert.Equal(t, nil, err)
189+ assert.NotEqual(t, data, wrongData)
190+ }
191+}
192+
193+func TestDecryptGCMWrongSecret(t *testing.T) {
169194 secret1 := []byte("0123456789abcdefghijklmnopqrstuv")
170195 secret2 := []byte("9876543210abcdefghijklmnopqrstuv")
171196
172− c1, err := NewCipher(secret1)
197+ c1, err := NewGCMCipher(secret1)
173198 assert.Equal(t, nil, err)
174199
175− c2, err := NewCipher(secret2)
200+ c2, err := NewGCMCipher(secret2)
176201 assert.Equal(t, nil, err)
177202
178203 data := []byte("f3928pufm982374dj02y485dsl34890u2t9nd4028s94dm58y2394087dhmsyt29h8df")
@@ -180,21 +205,25 @@ func TestDecryptBase64WrongSecret(t *testing.T) {
180205 ciphertext, err := c1.Encrypt(data)
181206 assert.Equal(t, nil, err)
182207
183− wrongData, err := c2.Decrypt(ciphertext)
184− assert.Equal(t, nil, err)
185− assert.NotEqual(t, data, wrongData)
208+ // GCM is authenticated - this should lead to message authentication failed
209+ _, err = c2.Decrypt(ciphertext)
210+ assert.Error(t, err)
186211}
187212
188−func TestEncryptAndDecryptCFB(t *testing.T) {
213+func TestIntermixCiphersErrors(t *testing.T) {
189214 var err error
190215
216+ // Encrypt with GCM, Decrypt with CFB: Results in Garbage data
191217 // Test all 3 valid AES sizes
192218 for _, secretSize := range []int{16, 24, 32} {
193219 secret := make([]byte, secretSize)
194220 _, err = io.ReadFull(rand.Reader, secret)
195221 assert.Equal(t, nil, err)
196222
197− c, err := NewCFBCipher(secret)
223+ gcm, err := NewGCMCipher(secret)
224+ assert.Equal(t, nil, err)
225+
226+ cfb, err := NewCFBCipher(secret)
198227 assert.Equal(t, nil, err)
199228
200229 // Test various sizes sessions might be
@@ -203,36 +232,46 @@ func TestEncryptAndDecryptCFB(t *testing.T) {
203232 _, err := io.ReadFull(rand.Reader, data)
204233 assert.Equal(t, nil, err)
205234
206− encrypted, err := c.Encrypt(data)
235+ encrypted, err := gcm.Encrypt(data)
207236 assert.Equal(t, nil, err)
237+ assert.NotEqual(t, encrypted, data)
208238
209− decrypted, err := c.Decrypt(encrypted)
239+ decrypted, err := cfb.Decrypt(encrypted)
210240 assert.Equal(t, nil, err)
211− assert.Equal(t, data, decrypted)
241+ // Data is mangled
242+ assert.NotEqual(t, data, decrypted)
243+ assert.NotEqual(t, encrypted, decrypted)
212244 }
213245 }
214−}
215246
216−func TestDecryptCFBWrongSecret(t *testing.T) {
217− var err error
218−
219− secret1 := []byte("0123456789abcdefghijklmnopqrstuv")
220− secret2 := []byte("9876543210abcdefghijklmnopqrstuv")
247+ // Encrypt with CFB, Decrypt with GCM: Results in errors
248+ // Test all 3 valid AES sizes
249+ for _, secretSize := range []int{16, 24, 32} {
250+ secret := make([]byte, secretSize)
251+ _, err = io.ReadFull(rand.Reader, secret)
252+ assert.Equal(t, nil, err)
221253
222− c1, err := NewCFBCipher(secret1)
223− assert.Equal(t, nil, err)
254+ gcm, err := NewGCMCipher(secret)
255+ assert.Equal(t, nil, err)
224256
225− c2, err := NewCFBCipher(secret2)
226− assert.Equal(t, nil, err)
257+ cfb, err := NewCFBCipher(secret)
258+ assert.Equal(t, nil, err)
227259
228− data := []byte("f3928pufm982374dj02y485dsl34890u2t9nd4028s94dm58y2394087dhmsyt29h8df")
260+ // Test various sizes sessions might be
261+ for _, dataSize := range []int{10, 100, 1000, 5000, 10000} {
262+ data := make([]byte, dataSize)
263+ _, err := io.ReadFull(rand.Reader, data)
264+ assert.Equal(t, nil, err)
229265
230− ciphertext, err := c1.Encrypt(data)
231− assert.Equal(t, nil, err)
266+ encrypted, err := cfb.Encrypt(data)
267+ assert.Equal(t, nil, err)
268+ assert.NotEqual(t, encrypted, data)
232269
233− wrongData, err := c2.Decrypt(ciphertext)
234− assert.Equal(t, nil, err)
235− assert.NotEqual(t, data, wrongData)
270+ // GCM is authenticated - this should lead to message authentication failed
271+ _, err = gcm.Decrypt(encrypted)
272+ assert.Error(t, err)
273+ }
274+ }
236275}
237276
238277func TestEncodeIntoAndDecodeIntoAccessToken(t *testing.T) {