// Copyright (c) 2016 Andreas Auernhammer. All rights reserved.
|
|
// Use of this source code is governed by a license that can be
|
|
// found in the LICENSE file.
|
|
|
|
package skein
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/hex"
|
|
"hash"
|
|
"testing"
|
|
)
|
|
|
|
func testWrite(msg string, t *testing.T, h hash.Hash, c *Config) {
|
|
var msg1 []byte
|
|
msg0 := make([]byte, 64)
|
|
for i := range msg0 {
|
|
h.Write(msg0[:i])
|
|
msg1 = append(msg1, msg0[:i]...)
|
|
}
|
|
tag0 := h.Sum(nil)
|
|
tag1 := Sum(msg1, h.Size(), c)
|
|
|
|
if !bytes.Equal(tag0, tag1) {
|
|
t.Fatalf("%s\nSum differ from Sum\n Sum: %s \n skein.Sum: %s", msg, hex.EncodeToString(tag0), hex.EncodeToString(tag1))
|
|
}
|
|
}
|
|
|
|
func TestWrite(t *testing.T) {
|
|
testWrite("testWrite(t, New256(nil), nil)", t, New256(nil), nil)
|
|
testWrite("testWrite(t, New256(make([]byte, 16)), &Config{Key: make([]byte, 16)})", t, New256(make([]byte, 16)), &Config{Key: make([]byte, 16)})
|
|
|
|
testWrite("testWrite(t, New512(nil), nil)", t, New512(nil), nil)
|
|
testWrite("testWrite(t, New512(make([]byte, 16)), &Config{Key: make([]byte, 16)})", t, New512(make([]byte, 16)), &Config{Key: make([]byte, 16)})
|
|
|
|
testWrite("testWrite(t, New(128, nil), nil)", t, New(128, nil), nil)
|
|
testWrite("testWrite(t, New(128, &Config{Key: make([]byte, 16)}), &Config{Key: make([]byte, 16)})", t, New(128, &Config{Key: make([]byte, 16)}), &Config{Key: make([]byte, 16)})
|
|
}
|
|
|
|
func TestBlockSize(t *testing.T) {
|
|
h := New(64, nil)
|
|
if bs := h.BlockSize(); bs != BlockSize {
|
|
t.Fatalf("BlockSize() returned: %d - but expected: %d", bs, BlockSize)
|
|
}
|
|
}
|
|
|
|
func TestSum(t *testing.T) {
|
|
sizes := []int{20, 32, 48, 64}
|
|
key := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
|
|
msg := make([]byte, 512)
|
|
for i := range msg {
|
|
msg[i] = byte(i) + key[i%len(key)]
|
|
}
|
|
c := &Config{Key: key}
|
|
|
|
for _, hashsize := range sizes {
|
|
switch hashsize {
|
|
case 20:
|
|
{
|
|
var sum0 [20]byte
|
|
Sum160(&sum0, msg, key)
|
|
sum1 := Sum(msg, hashsize, c)
|
|
if !bytes.Equal(sum0[:], sum1) {
|
|
t.Fatalf("Sum160 differ from Sum: Sum160: %s\n Sum: %s", hex.EncodeToString(sum0[:]), hex.EncodeToString(sum1))
|
|
}
|
|
}
|
|
case 32:
|
|
{
|
|
var sum0 [32]byte
|
|
Sum256(&sum0, msg, key)
|
|
sum1 := Sum(msg, hashsize, c)
|
|
if !bytes.Equal(sum0[:], sum1) {
|
|
t.Fatalf("Sum256 differ from Sum: Sum256: %s\n Sum: %s", hex.EncodeToString(sum0[:]), hex.EncodeToString(sum1))
|
|
}
|
|
}
|
|
case 48:
|
|
{
|
|
var sum0 [48]byte
|
|
Sum384(&sum0, msg, key)
|
|
sum1 := Sum(msg, hashsize, c)
|
|
if !bytes.Equal(sum0[:], sum1) {
|
|
t.Fatalf("Sum384 differ from Sum: Sum384: %s\n Sum: %s", hex.EncodeToString(sum0[:]), hex.EncodeToString(sum1))
|
|
}
|
|
}
|
|
case 64:
|
|
{
|
|
var sum0 [64]byte
|
|
Sum512(&sum0, msg, key)
|
|
sum1 := Sum(msg, hashsize, c)
|
|
if !bytes.Equal(sum0[:], sum1) {
|
|
t.Fatalf("Sum512 differ from Sum: Sum512: %s\n Sum: %s", hex.EncodeToString(sum0[:]), hex.EncodeToString(sum1))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestInitialize(t *testing.T) {
|
|
rec := func() {
|
|
if err := recover(); err == nil {
|
|
t.Fatal("Recover expected error, but no one occured")
|
|
}
|
|
}
|
|
mustFail := func() {
|
|
defer rec()
|
|
s := new(hashFunc)
|
|
s.initialize(0, nil)
|
|
}
|
|
mustFail()
|
|
|
|
c := &Config{
|
|
Key: make([]byte, 16),
|
|
KeyID: make([]byte, 16),
|
|
Personal: make([]byte, 8),
|
|
Nonce: make([]byte, 12),
|
|
PublicKey: make([]byte, 128),
|
|
}
|
|
testWrite("testWrite(t, New(64, c), c)", t, New(64, c), c)
|
|
}
|
|
|
|
// Benchmarks
|
|
|
|
func benchmarkSum(b *testing.B, size int) {
|
|
msg := make([]byte, size)
|
|
b.SetBytes(int64(size))
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
Sum(msg, 64, nil)
|
|
}
|
|
}
|
|
|
|
func benchmarkSum512(b *testing.B, size int) {
|
|
var sum [64]byte
|
|
msg := make([]byte, size)
|
|
b.SetBytes(int64(size))
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
Sum512(&sum, msg, nil)
|
|
}
|
|
}
|
|
|
|
func BenchmarkSum_64(b *testing.B) { benchmarkSum(b, 64) }
|
|
func BenchmarkSum_1K(b *testing.B) { benchmarkSum(b, 1024) }
|
|
func BenchmarkSum512_64(b *testing.B) { benchmarkSum512(b, 64) }
|
|
func BenchmarkSum512_1K(b *testing.B) { benchmarkSum512(b, 1024) }
|
|
|
|
func benchmarkWrite(b *testing.B, size int) {
|
|
h := New512(nil)
|
|
msg := make([]byte, size)
|
|
b.SetBytes(int64(size))
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
h.Write(msg)
|
|
}
|
|
}
|
|
|
|
func BenchmarkWrite_64(b *testing.B) { benchmarkWrite(b, 64) }
|
|
func BenchmarkWrite_1K(b *testing.B) { benchmarkWrite(b, 1024) }
|