// 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 skein256 import ( "bytes" "encoding/hex" "testing" "github.com/aead/skein" ) func fromHex(s string) []byte { b, err := hex.DecodeString(s) if err != nil { panic(err) } return b } var testVectors = []struct { hashsize int conf *skein.Config msg, hash string }{ { hashsize: 32, conf: nil, msg: "", hash: "C8877087DA56E072870DAA843F176E9453115929094C3A40C463A196C29BF7BA", }, { hashsize: 32, conf: nil, msg: "FF", hash: "0B98DCD198EA0E50A7A244C444E25C23DA30C10FC9A1F270A6637F1F34E67ED2", }, { hashsize: 32, conf: nil, msg: "FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0", hash: "8D0FA4EF777FD759DFD4044E6F6A5AC3C774AEC943DCFC07927B723B5DBF408B", }, { hashsize: 32, conf: nil, msg: "FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0" + "DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0", hash: "DF28E916630D0B44C4A849DC9A02F07A07CB30F732318256B15D865AC4AE162F", }, { hashsize: 20, conf: nil, msg: "FBD17C26B61A82E12E125F0D459B96C91AB4837DFF22B39B78439430CDFC5DC8" + "78BB393A1A5F79BEF30995A85A12923339BA8AB7D8FC6DC5FEC6F4ED22C122BB" + "E7EB61981892966DE5CEF576F71FC7A80D14DAB2D0C03940B95B9FB3A727C66A" + "6E1FF0DC311B9AA21A3054484802154C1826C2A27A0914152AEB76F1168D4410", hash: "0CD491B7715704C3A15A45A1CA8D93F8F646D3A1", }, { hashsize: 28, conf: nil, msg: "FBD17C26B61A82E12E125F0D459B96C91AB4837DFF22B39B78439430CDFC5DC8" + "78BB393A1A5F79BEF30995A85A12923339BA8AB7D8FC6DC5FEC6F4ED22C122BB" + "E7EB61981892966DE5CEF576F71FC7A80D14DAB2D0C03940B95B9FB3A727C66A" + "6E1FF0DC311B9AA21A3054484802154C1826C2A27A0914152AEB76F1168D4410", hash: "AFD1E2D0F5B6CD4E1F8B3935FA2497D27EE97E72060ADAC099543487", }, { hashsize: 32, conf: nil, msg: "FBD17C26B61A82E12E125F0D459B96C91AB4837DFF22B39B78439430CDFC5DC8" + "78BB393A1A5F79BEF30995A85A12923339BA8AB7D8FC6DC5FEC6F4ED22C122BB" + "E7EB61981892966DE5CEF576F71FC7A80D14DAB2D0C03940B95B9FB3A727C66A" + "6E1FF0DC311B9AA21A3054484802154C1826C2A27A0914152AEB76F1168D4410", hash: "4DE6FE2BFDAA3717A4261030EF0E044CED9225D066354610842A24A3EAFD1DCF", }, { hashsize: 48, conf: nil, msg: "FBD17C26B61A82E12E125F0D459B96C91AB4837DFF22B39B78439430CDFC5DC8" + "78BB393A1A5F79BEF30995A85A12923339BA8AB7D8FC6DC5FEC6F4ED22C122BB" + "E7EB61981892966DE5CEF576F71FC7A80D14DAB2D0C03940B95B9FB3A727C66A" + "6E1FF0DC311B9AA21A3054484802154C1826C2A27A0914152AEB76F1168D4410", hash: "954620FB31E8B782A2794C6542827026FE069D715DF04261629FCBE81D7D529B" + "95BA021FA4239FB00AFAA75F5FD8E78B", }, { hashsize: 64, conf: nil, msg: "FBD17C26B61A82E12E125F0D459B96C91AB4837DFF22B39B78439430CDFC5DC8" + "78BB393A1A5F79BEF30995A85A12923339BA8AB7D8FC6DC5FEC6F4ED22C122BB" + "E7EB61981892966DE5CEF576F71FC7A80D14DAB2D0C03940B95B9FB3A727C66A" + "6E1FF0DC311B9AA21A3054484802154C1826C2A27A0914152AEB76F1168D4410", hash: "51347E27C7EABBA514959F899A6715EF6AD5CF01C23170590E6A8AF399470BF9" + "0EA7409960A708C1DBAA90E86389DF254ABC763639BB8CDF7FB663B29D9557C3", }, { hashsize: 32, conf: &skein.Config{Key: fromHex("CB41F1706CDE09651203C2D0EFBADDF8")}, msg: "", hash: "886E4EFEFC15F06AA298963971D7A25398FFFE5681C84DB39BD00851F64AE29D", }, { hashsize: 32, conf: &skein.Config{Key: fromHex("")}, msg: "D3090C72167517F7C7AD82A70C2FD3F6443F608301591E59", hash: "DCBD5C8BD09021A840B0EA4AAA2F06E67D7EEBE882B49DE6B74BDC56B60CC48F", }, { hashsize: 48, conf: &skein.Config{Key: fromHex("CB41F1706CDE09651203C2D0EFBADDF847A0D315CB2E53FF8BAC41DA0002672E92")}, msg: "D3090C72167517F7C7AD82A70C2FD3F6443F608301591E598EADB195E8357135" + "BA26FEDE2EE187417F816048D00FC23512737A2113709A77E4170C49A94B7FDF" + "F45FF579A72287743102E7766C35CA5ABC5DFE2F63A1E726CE5FBD2926DB03A2" + "DD18B03FC1508A9AAC45EB362440203A323E09EDEE6324EE2E37B4432C1867ED", hash: "96E6CEBB23573D0A70CE36A67AA05D2403148093F25C695E1254887CC97F9771" + "D2518413AF4286BF2A06B61A53F7FCEC", }, } func TestVectors(t *testing.T) { for i, v := range testVectors { conf, msg, ref := v.conf, fromHex(v.msg), fromHex(v.hash) h := New(v.hashsize, conf) h.Write(msg) sum := h.Sum(nil) if !bytes.Equal(sum, ref) { t.Fatalf("Test vector %d : Hash does not match:\nFound: %s\nExpected: %s", i, hex.EncodeToString(sum), hex.EncodeToString(ref)) } sum = Sum(msg, v.hashsize, conf) if !bytes.Equal(sum, ref) { t.Fatalf("Test vector %d : Hash does not match:\nFound: %s\nExpected: %s", i, hex.EncodeToString(sum), hex.EncodeToString(ref)) } var key []byte if conf != nil { key = conf.Key } switch v.hashsize { case 64: { var out [64]byte Sum512(&out, msg, key) if !bytes.Equal(out[:], ref) { t.Fatalf("Test vector %d : Hash does not match:\nFound: %s\nExpected: %s", i, hex.EncodeToString(out[:]), hex.EncodeToString(ref)) } } case 48: { var out [48]byte Sum384(&out, msg, key) if !bytes.Equal(out[:], ref) { t.Fatalf("Test vector %d : Hash does not match:\nFound: %s\nExpected: %s", i, hex.EncodeToString(out[:]), hex.EncodeToString(ref)) } } case 32: { var out [32]byte Sum256(&out, msg, key) if !bytes.Equal(out[:], ref) { t.Fatalf("Test vector %d : Hash does not match:\nFound: %s\nExpected: %s", i, hex.EncodeToString(out[:]), hex.EncodeToString(ref)) } } case 20: { var out [20]byte Sum160(&out, msg, key) if !bytes.Equal(out[:], ref) { t.Fatalf("Test vector %d : Hash does not match:\nFound: %s\nExpected: %s", i, hex.EncodeToString(out[:]), hex.EncodeToString(ref)) } } } } }