-
Notifications
You must be signed in to change notification settings - Fork 0
/
main_test.go
258 lines (215 loc) · 8.43 KB
/
main_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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
package main
import (
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"strings"
"testing"
"golang.org/x/crypto/bcrypt"
)
const plaintext = `Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Phasellus non purus nec sem fringilla vestibulum. Phasellus ornare justo quis enim euismod,
vitae posuere augue malesuada. Duis nec lacus risus. Integer vulputate tincidunt diam,
eget tristique nulla iaculis nec. Praesent auctor eget orci in tempus. Cras lorem elit,
posuere sed velit non, pulvinar aliquet mauris. Cras porttitor leo vitae venenatis sagittis.
Integer in pharetra quam. Donec faucibus, dolor non condimentum fringilla, ante ex eleifend purus,
ac sollicitudin diam augue congue erat. Vestibulum malesuada dolor vitae purus faucibus tincidunt.
Mauris hendrerit lacinia sapien eget pellentesque. Praesent eget volutpat neque, elementum fermentum libero.
Suspendisse consequat maximus laoreet. Phasellus nec volutpat tellus, vel egestas nisl.
Suspendisse diam augue, egestas sit amet laoreet vel, aliquam nec quam. Nunc lobortis tellus urna,
ut rutrum dolor commodo nec. Morbi dignissim nulla eget tortor tempus, eu iaculis felis dapibus.
Maecenas sapien turpis, iaculis eu faucibus eu, blandit a ex. Proin egestas, turpis ac cursus pulvinar,
elit orci fermentum mi, nec ornare eros leo a neque. Proin vitae gravida mi. Ut at nunc nisl.
Nulla consequat aliquet magna. Aenean venenatis a ante non varius. Cras sed nisl tortor.
Duis sagittis ac quam et hendrerit. Sed congue faucibus tortor suscipit convallis. Suspendisse potenti.
Nulla consectetur vestibulum nunc, non volutpat odio lobortis mollis.
Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Maecenas in ex sodales, euismod risus eu, dapibus elit. Fusce finibus placerat vulputate.
Integer molestie erat id convallis fringilla. Vivamus eu diam sed ex blandit volutpat. Etiam at convallis nibh.
In a magna nisi. Sed non nisi justo. Vestibulum quis orci orci. Mauris et nibh nisi. Cras et rhoncus nunc.
Aenean maximus nibh eu nisi tempor gravida. Maecenas interdum venenatis elit ac convallis.
Nam nulla risus, consectetur at finibus ut, vestibulum congue nunc. Curabitur dignissim et velit et faucibus.
Nullam vel mauris ac neque fermentum laoreet. Maecenas ipsum justo, pulvinar at posuere pellentesque, semper sed erat.
Pellentesque eu tortor et eros pretium volutpat eu sed quam. Maecenas volutpat sem lacus, vel elementum sapien vehicula sed.
Mauris a lobortis sem, sit amet viverra massa. Proin porta nibh sed metus mattis, at iaculis sapien malesuada.
Nulla iaculis tortor a augue imperdiet, id tincidunt neque feugiat. Duis egestas eu lacus a feugiat.
Nam commodo nunc quis arcu hendrerit, non blandit mi volutpat.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;
Nunc a nisi sed mauris vestibulum condimentum. Nam mauris justo, lobortis quis nunc ut, ultrices dignissim leo.
Quisque quis quam nec libero pharetra scelerisque in et dui. Praesent turpis nunc, varius sit amet iaculis nec, iaculis in diam.
Proin eu elementum diam, id condimentum nunc. Sed pulvinar ipsum augue, in cursus leo consectetur sed.
Aliquam posuere, lectus vel sagittis molestie, lectus odio consequat ipsum, in facilisis ipsum metus vel augue.
Ut ut ligula ut diam suscipit ultrices. Vivamus mattis porttitor sagittis. Mauris vel est dui.
Curabitur posuere libero eu pharetra porta. Sed porttitor rhoncus sagittis. Vivamus efficitur dictum velit at congue.
Ut vitae leo sit amet purus consequat eleifend. Aliquam a hendrerit sem. Sed non odio at odio cursus rutrum non auctor turpis.
Sed congue vitae erat quis commodo. Sed eleifend pretium augue, in posuere sapien feugiat id. Donec commodo, ex eu ultricies imperdiet,
dolor libero bibendum ante, vitae sodales tortor diam a orci. Vivamus consectetur arcu ut congue.`
func TestPasswordHash(t *testing.T) {
pass := "qewhy#fcu3!rt"
_, err := hashPassword(pass)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
}
func TestHashPassword(t *testing.T) {
password := "test123"
hashedPassword, err := hashPassword(password)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
if err = bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password)); err != nil {
t.Errorf("Password does not match hash: %v", err)
}
}
func TestCheckPasswordHash(t *testing.T) {
pass := "qewhy#fcu3!rt"
hash, err := hashPassword(pass)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
if !checkPasswordHash(pass, hash) {
t.Error("Password does not match hash")
}
}
func TestCheckHashPassword(t *testing.T) {
password := "test123"
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), 14)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
if !checkPasswordHash(password, string(hashedPassword)) {
t.Error("Password does not match hash")
}
}
func TestGenKey(t *testing.T) {
key, err := genKey()
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
if key[0] == 0 && key[1] == 0 && key[2] == 0 {
t.Fatal("Empty key")
}
}
func TestGenKey2(t *testing.T) {
key, err := genKey()
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
if len(key) != 32 {
t.Errorf("Unexpected key length: expected 32, got %v", len(key))
}
}
func TestEncrypt(t *testing.T) {
ct, key, err := encrypt(plaintext)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
if len(ct) < 2 {
t.Fatal("Unexpected text length")
}
if len([]byte(key)) < aes.BlockSize {
t.Errorf("Unexpected key length: expected 32, got %v", len(key))
}
}
func TestEncrypt2(t *testing.T) {
encoded, key, err := encrypt(plaintext)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
if len(key) != 32 {
t.Errorf("Unexpected key length: expected 32, got %v", len(key))
}
decoded, err := base64.RawStdEncoding.DecodeString(encoded)
if err != nil {
t.Errorf("Unexpected error decoding base64: %v", err)
}
block, err := aes.NewCipher(key)
if err != nil {
t.Errorf("Unexpected error creating cipher block: %v", err)
}
if len(decoded) < aes.BlockSize {
t.Errorf("Unexpected decoded length: expected at least %v, got %v", aes.BlockSize, len(decoded))
}
iv := decoded[:aes.BlockSize]
decoded = decoded[aes.BlockSize:]
stream := cipher.NewCFBDecrypter(block, iv)
stream.XORKeyStream(decoded, decoded)
if string(decoded) != plaintext {
t.Errorf("Unexpected decrypted message: expected %q, got %q", plaintext, string(decoded))
}
}
func TestDecrypt(t *testing.T) {
ct, key, err := encrypt(plaintext)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
text, err := decrypt(key, ct)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
if text != plaintext {
t.Fatalf("Unexpected decrypted message: expected %q, got %q", plaintext, text)
}
}
func TestDecrypt2(t *testing.T) {
encoded, key, err := encrypt(plaintext)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
decoded, err := decrypt(key, encoded)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
if decoded != plaintext {
t.Fatalf("Unexpected decrypted message: expected %q, got %q", plaintext, decoded)
}
// test for invalid base64 string
if _, err = decrypt(key, "invalidbase64"); err == nil {
t.Errorf("Expected an error for invalid base64 string, but got none")
}
// test for incorrect key
key2, err := genKey()
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
encoded, _, err = encrypt(plaintext)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
if _, err = decrypt(key2, encoded); err != nil {
t.Errorf("Expected an error for incorrect key, but got %v", err)
}
}
func TestGenPassword(t *testing.T) {
// Test length of generated password is between 7 and 16 characters long
password := genPassword()
if len(password) < 7 || len(password) > 16 {
t.Errorf("Expected generated password to have length between 7 and 16, but got %d", len(password))
}
// Test that generated password contains only allowed characters
for _, c := range password {
if !strings.ContainsRune(charSet, c) {
t.Errorf("Generated password contains illegal character: %q", c)
}
}
}
func TestReverse(t *testing.T) {
testCases := []struct {
input string
expected string
}{
{"", ""},
{"a", "a"},
{"abc", "cba"},
{"hello world", "dlrow olleh"},
{"12345", "54321"},
}
for _, tc := range testCases {
t.Run(tc.input, func(t *testing.T) {
actual := reverse(tc.input)
if actual != tc.expected {
t.Errorf("Expected %q but got %q", tc.expected, actual)
}
})
}
}