1package argon2
2
3import (
4	"crypto/rand"
5	"testing"
6)
7
8var password = make([]byte, 32)
9var salt = make([]byte, 32)
10
11func init() {
12	_, err := rand.Read(password)
13	if err != nil {
14		panic(err)
15	}
16	_, err = rand.Read(salt)
17	if err != nil {
18		panic(err)
19	}
20}
21
22func BenchmarkHash_i_m12_p1(b *testing.B) { benchmarkHash(b, ModeArgon2i, 12, 1) } // 4 MiB
23func BenchmarkHash_i_m12_p2(b *testing.B) { benchmarkHash(b, ModeArgon2i, 12, 2) }
24func BenchmarkHash_i_m12_p4(b *testing.B) { benchmarkHash(b, ModeArgon2i, 12, 4) }
25func BenchmarkHash_i_m15_p1(b *testing.B) { benchmarkHash(b, ModeArgon2i, 15, 1) } // 32 MiB
26func BenchmarkHash_i_m15_p2(b *testing.B) { benchmarkHash(b, ModeArgon2i, 15, 2) }
27func BenchmarkHash_i_m15_p4(b *testing.B) { benchmarkHash(b, ModeArgon2i, 15, 4) }
28func BenchmarkHash_i_m18_p1(b *testing.B) { benchmarkHash(b, ModeArgon2i, 18, 1) } // 256 MiB
29func BenchmarkHash_i_m18_p2(b *testing.B) { benchmarkHash(b, ModeArgon2i, 18, 2) }
30func BenchmarkHash_i_m18_p4(b *testing.B) { benchmarkHash(b, ModeArgon2i, 18, 4) }
31func BenchmarkHash_i_m20_p1(b *testing.B) { benchmarkHash(b, ModeArgon2i, 20, 1) } // 1024 MiB
32func BenchmarkHash_i_m20_p2(b *testing.B) { benchmarkHash(b, ModeArgon2i, 20, 2) }
33func BenchmarkHash_i_m20_p4(b *testing.B) { benchmarkHash(b, ModeArgon2i, 20, 4) }
34
35func BenchmarkHash_d_m12_p1(b *testing.B) { benchmarkHash(b, ModeArgon2d, 12, 1) } // 4 MiB
36func BenchmarkHash_d_m12_p2(b *testing.B) { benchmarkHash(b, ModeArgon2d, 12, 2) }
37func BenchmarkHash_d_m12_p4(b *testing.B) { benchmarkHash(b, ModeArgon2d, 12, 4) }
38func BenchmarkHash_d_m15_p1(b *testing.B) { benchmarkHash(b, ModeArgon2d, 15, 1) } // 32 MiB
39func BenchmarkHash_d_m15_p2(b *testing.B) { benchmarkHash(b, ModeArgon2d, 15, 2) }
40func BenchmarkHash_d_m15_p4(b *testing.B) { benchmarkHash(b, ModeArgon2d, 15, 4) }
41func BenchmarkHash_d_m18_p1(b *testing.B) { benchmarkHash(b, ModeArgon2d, 18, 1) } // 256 MiB
42func BenchmarkHash_d_m18_p2(b *testing.B) { benchmarkHash(b, ModeArgon2d, 18, 2) }
43func BenchmarkHash_d_m18_p4(b *testing.B) { benchmarkHash(b, ModeArgon2d, 18, 4) }
44func BenchmarkHash_d_m20_p1(b *testing.B) { benchmarkHash(b, ModeArgon2d, 20, 1) } // 1024 MiB
45func BenchmarkHash_d_m20_p2(b *testing.B) { benchmarkHash(b, ModeArgon2d, 20, 2) }
46func BenchmarkHash_d_m20_p4(b *testing.B) { benchmarkHash(b, ModeArgon2d, 20, 4) }
47
48func BenchmarkHash_id_m12_p1(b *testing.B) { benchmarkHash(b, ModeArgon2id, 12, 1) } // 4 MiB
49func BenchmarkHash_id_m12_p2(b *testing.B) { benchmarkHash(b, ModeArgon2id, 12, 2) }
50func BenchmarkHash_id_m12_p4(b *testing.B) { benchmarkHash(b, ModeArgon2id, 12, 4) }
51func BenchmarkHash_id_m15_p1(b *testing.B) { benchmarkHash(b, ModeArgon2id, 15, 1) } // 32 MiB
52func BenchmarkHash_id_m15_p2(b *testing.B) { benchmarkHash(b, ModeArgon2id, 15, 2) }
53func BenchmarkHash_id_m15_p4(b *testing.B) { benchmarkHash(b, ModeArgon2id, 15, 4) }
54func BenchmarkHash_id_m18_p1(b *testing.B) { benchmarkHash(b, ModeArgon2id, 18, 1) } // 256 MiB
55func BenchmarkHash_id_m18_p2(b *testing.B) { benchmarkHash(b, ModeArgon2id, 18, 2) }
56func BenchmarkHash_id_m18_p4(b *testing.B) { benchmarkHash(b, ModeArgon2id, 18, 4) }
57func BenchmarkHash_id_m20_p1(b *testing.B) { benchmarkHash(b, ModeArgon2id, 20, 1) } // 1024 MiB
58func BenchmarkHash_id_m20_p2(b *testing.B) { benchmarkHash(b, ModeArgon2id, 20, 2) }
59func BenchmarkHash_id_m20_p4(b *testing.B) { benchmarkHash(b, ModeArgon2id, 20, 4) }
60
61func benchmarkHash(b *testing.B, mode, memory, parallelism int) {
62	ctx := &Context{
63		Iterations:  1,
64		Memory:      1 << uint(memory),
65		Parallelism: parallelism,
66		HashLen:     32,
67		Mode:        mode,
68	}
69
70	b.SetBytes(int64(ctx.Memory) << 10)
71
72	for n := 0; n < b.N; n++ {
73		if _, err := Hash(ctx, password, salt); err != nil {
74			b.Error(err)
75		}
76	}
77}
78