You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
4.2 KiB

// 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) }