1 package authenticate 2 3 import ( 4 "bytes" 5 "encoding/base64" 6 "fmt" 7 "testing" 8 "time" 9 ) 10 11 var times []time.Time 12 13 func init() { 14 timeNow = func() time.Time { 15 t := times[0] 16 times = times[1:] 17 return t 18 } 19 } 20 21 func TestSecureEncode(t *testing.T) { 22 tn := time.Date(1985, time.July, 2, 14, 25, 0, 0, time.UTC) 23 tests := []struct { 24 Key []byte 25 CodecError error 26 Timeout time.Duration 27 PlainText []byte 28 CipherText string 29 EncodeTime, DecodeTime time.Time 30 DecodeError error 31 }{ 32 { 33 Key: []byte{0}, 34 CodecError: ErrInvalidAES, 35 }, 36 { 37 Key: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, 38 Timeout: time.Second, 39 PlainText: []byte("Hello, World!"), 40 CipherText: "AAAAAAAAAAAdKAY8ip5Rg52eDtMjh+K9l8a1hzJ8VmWoruZ9B9DeeKM=", 41 EncodeTime: tn, 42 DecodeTime: tn.Add(time.Second * 2), 43 DecodeError: ErrExpired, 44 }, 45 { 46 Key: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, 47 Timeout: time.Second * 2, 48 PlainText: []byte("Hello, World!"), 49 CipherText: "AAAAAAAAAAAdKAY8ip5Rg52eDtMjh+K9l8a1hzJ8VmWoruZ9B9DeeKM=", 50 EncodeTime: tn, 51 DecodeTime: tn.Add(time.Second), 52 }, 53 { 54 Key: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, 55 Timeout: time.Second * 2, 56 PlainText: []byte("Hello, World!FooBarBaz"), 57 CipherText: "AAAAAAAAAAAdKAY86i3wJ25M3dgYUXdLgC3lE/PdEOaVT/BX/qD976cfqDfq0Hgotmc=", 58 EncodeTime: tn, 59 DecodeTime: tn.Add(time.Second), 60 }, 61 } 62 var ( 63 ts [2]time.Time 64 buf [1024]byte 65 ) 66 for n, test := range tests { 67 ts[0] = test.EncodeTime 68 ts[1] = test.DecodeTime 69 times = ts[:] 70 c, err := NewCodec(test.Key, test.Timeout) 71 if err != nil { 72 if test.CodecError == nil { 73 t.Errorf("test %d: unexpected codec error: %s", n+1, err) 74 } else if err != test.CodecError { 75 t.Errorf("test %d: got incorrect codec error: %s", n+1, err) 76 } 77 continue 78 } else if test.CodecError != nil { 79 t.Errorf("test %d: failed to get expected codec error", n+1) 80 continue 81 } 82 d := c.Encode(test.PlainText, buf[:512:512]) 83 bd := base64.StdEncoding.EncodeToString(d) 84 if bd != test.CipherText { 85 t.Errorf("test %d: got incorrect cipher text", n+1) 86 continue 87 } 88 e, err := c.Decode(d, buf[512:512]) 89 if err != nil { 90 if test.DecodeError == nil { 91 t.Errorf("test %d: unexpected decode error: %s", n+1, err) 92 } else if err != test.DecodeError { 93 t.Errorf("test %d: go incorrect decode error: %s", n+1, err) 94 } 95 } else if test.DecodeError != nil { 96 t.Errorf("test %d: failed to get expected decode error", n+1) 97 } else if !bytes.Equal(test.PlainText, e) { 98 fmt.Println(e) 99 t.Errorf("test %d: result does not match plaintext", n+1) 100 } 101 } 102 103 }