1/*
2balloon -- Balloon password hashing function
3Copyright (C) 2016-2020 Sergey Matveev <stargrave@stargrave.org>
4
5This program is free software: you can redistribute it and/or modify
6it under the terms of the GNU Lesser General Public License as
7the Free Software Foundation, version 3 of the License.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12GNU Lesser General Public License for more details.
13
14You should have received a copy of the GNU Lesser General Public
15License along with this program.  If not, see
16<http://www.gnu.org/licenses/>.
17*/
18
19package balloon
20
21import (
22	"crypto/rand"
23	"crypto/sha512"
24	"testing"
25	"testing/quick"
26)
27
28func TestB(t *testing.T) {
29	f := func(passwd, salt []byte, s, t uint8) bool {
30		if len(passwd) == 0 || len(salt) == 0 {
31			return true
32		}
33		B(sha512.New(), passwd, salt, uint64(s)%16+1, uint64(t)%16+1)
34		return true
35	}
36	if err := quick.Check(f, nil); err != nil {
37		t.Error(err)
38	}
39}
40
41func TestH(t *testing.T) {
42	f := func(passwd, salt []byte, s, t, p uint8) bool {
43		if len(passwd) == 0 || len(salt) == 0 {
44			return true
45		}
46		H(sha512.New, passwd, salt, int(s)%16+1, int(t)%16+1, int(p)%8+1)
47		return true
48	}
49	if err := quick.Check(f, nil); err != nil {
50		t.Error(err)
51	}
52}
53
54func BenchmarkB(b *testing.B) {
55	passwd := make([]byte, 8)
56	rand.Read(passwd)
57	salt := make([]byte, 8)
58	rand.Read(salt)
59	h := sha512.New()
60	sCost := uint64(1 << 10 / h.Size())
61	b.ResetTimer()
62	for i := 0; i < b.N; i++ {
63		B(h, passwd, salt, sCost, 4)
64	}
65}
66
67func BenchmarkH(b *testing.B) {
68	passwd := make([]byte, 8)
69	rand.Read(passwd)
70	salt := make([]byte, 8)
71	rand.Read(salt)
72	sCost := 1 << 10 / sha512.New().Size()
73	b.ResetTimer()
74	for i := 0; i < b.N; i++ {
75		H(sha512.New, passwd, salt, sCost, 4, 4)
76	}
77}
78