mirror of
https://github.com/ergochat/ergo.git
synced 2024-11-25 13:29:27 +01:00
69 lines
1.8 KiB
Go
69 lines
1.8 KiB
Go
// Copyright (c) 2018 Shivaram Lingamneni
|
|
// released under the MIT license
|
|
|
|
package passwd
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestBasic(t *testing.T) {
|
|
hash, err := GenerateFromPassword([]byte("this is my passphrase"), DefaultCost)
|
|
if err != nil || len(hash) != 60 {
|
|
t.Errorf("bad password hash output: error %s, output %s, len %d", err, hash, len(hash))
|
|
}
|
|
|
|
if CompareHashAndPassword(hash, []byte("this is my passphrase")) != nil {
|
|
t.Errorf("hash comparison failed unexpectedly")
|
|
}
|
|
|
|
if CompareHashAndPassword(hash, []byte("this is not my passphrase")) == nil {
|
|
t.Errorf("hash comparison succeeded unexpectedly")
|
|
}
|
|
}
|
|
|
|
func TestVector(t *testing.T) {
|
|
// sanity check for persisted hashes
|
|
if CompareHashAndPassword(
|
|
[]byte("$2a$12$sJokyLJ5px3Nb51DEDhsQ.wh8nfwEYuMbVYrpqO5v9Ylyj0YyVWj."),
|
|
[]byte("this is my passphrase"),
|
|
) != nil {
|
|
t.Errorf("hash comparison failed unexpectedly")
|
|
}
|
|
}
|
|
|
|
func TestLongPassphrases(t *testing.T) {
|
|
longPassphrase := make([]byte, 168)
|
|
for i := range longPassphrase {
|
|
longPassphrase[i] = 'a'
|
|
}
|
|
hash, err := GenerateFromPassword(longPassphrase, DefaultCost)
|
|
if err != nil {
|
|
t.Errorf("bad password hash output: error %s", err)
|
|
}
|
|
|
|
if CompareHashAndPassword(hash, longPassphrase) != nil {
|
|
t.Errorf("hash comparison failed unexpectedly")
|
|
}
|
|
|
|
// change a byte of the passphrase beyond the normal 80-character
|
|
// bcrypt truncation boundary:
|
|
longPassphrase[150] = 'b'
|
|
if CompareHashAndPassword(hash, longPassphrase) == nil {
|
|
t.Errorf("hash comparison succeeded unexpectedly")
|
|
}
|
|
}
|
|
|
|
// this could be useful for tuning the cost parameter on specific hardware
|
|
func BenchmarkComparisons(b *testing.B) {
|
|
pass := []byte("passphrase for benchmarking")
|
|
hash, err := GenerateFromPassword(pass, DefaultCost)
|
|
if err != nil {
|
|
b.Errorf("bad output")
|
|
}
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
CompareHashAndPassword(hash, pass)
|
|
}
|
|
}
|