-
Notifications
You must be signed in to change notification settings - Fork 126
/
token_test.go
130 lines (115 loc) · 3.33 KB
/
token_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package nosurf
import (
"crypto/rand"
"encoding/base64"
"testing"
)
func TestChecksForPRNG(t *testing.T) {
// Monkeypatch crypto/rand with an always-failing reader
oldReader := rand.Reader
rand.Reader = failReader{}
// Restore it later for other tests
defer func() {
rand.Reader = oldReader
}()
defer func() {
r := recover()
if r == nil {
t.Errorf("Expected checkForPRNG() to panic")
}
}()
checkForPRNG()
}
func TestGeneratesAValidToken(t *testing.T) {
// We can't test much with any certainity here,
// since we generate tokens randomly
// Basically we check that the length of the
// token is what it should be
token := generateToken()
l := len(token)
if l != tokenLength {
t.Errorf("Bad decoded token length: expected %d, got %d", tokenLength, l)
}
}
func TestVerifyTokenChecksLengthCorrectly(t *testing.T) {
for i := 0; i < 64; i++ {
slice := make([]byte, i)
result := verifyToken(slice, slice)
if result {
t.Errorf("VerifyToken should've returned false with slices of length %d", i)
}
}
slice := make([]byte, 64)
result := verifyToken(slice[:32], slice)
if !result {
t.Errorf("VerifyToken should've returned true on a zeroed slice of length 64")
}
}
func TestVerifiesMaskedTokenCorrectly(t *testing.T) {
realToken := []byte("qwertyuiopasdfghjklzxcvbnm123456")
sentToken := []byte("qwertyuiopasdfghjklzxcvbnm123456" +
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
if !verifyToken(realToken, sentToken) {
t.Errorf("VerifyToken returned a false negative")
}
realToken[0] = 'x'
if verifyToken(realToken, sentToken) {
t.Errorf("VerifyToken returned a false positive")
}
}
func TestVerifyTokenBase64Invalid(t *testing.T) {
for _, pairs := range [][]string{
{"foo", "bar"},
{"foo", ""},
{"", "bar"},
{"", ""},
} {
if VerifyToken(pairs[0], pairs[1]) {
t.Errorf("VerifyToken returned a false positive for: %v", pairs)
}
}
}
func TestVerifyTokenUnMasked(t *testing.T) {
for i, tc := range []struct {
real string
send string
valid bool
}{
{
real: "qwertyuiopasdfghjklzxcvbnm123456",
send: "qwertyuiopasdfghjklzxcvbnm123456",
valid: true,
},
{
real: "qwertyuiopasdfghjklzxcvbnm123456",
send: "qwertyuiopasdfghjklzxcvbnm123456" +
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
valid: true,
},
{
real: "qwertyuiopasdfghjklzxcvbnm123456" +
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
send: "qwertyuiopasdfghjklzxcvbnm123456" +
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
valid: true,
},
{
real: "qwertyuiopasdfghjklzxcvbnm123456" +
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
send: "qwertyuiopasdfghjklzxcvbnm123456",
valid: true,
},
} {
if VerifyToken(
base64.StdEncoding.EncodeToString([]byte(tc.real)),
base64.StdEncoding.EncodeToString([]byte(tc.send)),
) != tc.valid {
t.Errorf("Verify token returned wrong result for case %d: %+v", i, tc)
}
}
}