// 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" "testing" ) func fromHex(s string) []byte { b, err := hex.DecodeString(s) if err != nil { panic(err) } return b } var testVectors = []struct { hashsize int conf *Config msg, hash string }{ { hashsize: 64, conf: nil, msg: "", hash: "BC5B4C50925519C290CC634277AE3D6257212395CBA733BBAD37A4AF0FA06AF4" + "1FCA7903D06564FEA7A2D3730DBDB80C1F85562DFCC070334EA4D1D9E72CBA7A", }, { hashsize: 64, conf: nil, msg: "FBD17C26B61A82E12E125F0D459B96C91AB4837DFF22B39B78439430CDFC5DC8" + "78BB393A1A5F79BEF30995A85A12923339BA8AB7D8FC6DC5FEC6F4ED22C122BB", hash: "02D01535C2DF280FDE92146DF054B0609273C73056C93B94B82F5E7DCC5BE697" + "9978C4BE24331CAA85D892D2E710C6C9B4904CD056A53547B866BEE097C0FB17", }, { hashsize: 20, conf: nil, msg: "FBD17C26B61A82E12E125F0D459B96C91AB4837DFF22B39B78439430CDFC5DC8" + "78BB393A1A5F79BEF30995A85A12923339BA8AB7D8FC6DC5FEC6F4ED22C122BB" + "E7EB61981892966DE5CEF576F71FC7A80D14DAB2D0C03940B95B9FB3A727C66A" + "6E1FF0DC311B9AA21A3054484802154C1826C2A27A0914152AEB76F1168D4410", hash: "EF03079D61B57C6047E15FA2B35B46FA24279539", }, { hashsize: 32, conf: nil, msg: "FBD17C26B61A82E12E125F0D459B96C91AB4837DFF22B39B78439430CDFC5DC8" + "78BB393A1A5F79BEF30995A85A12923339BA8AB7D8FC6DC5FEC6F4ED22C122BB" + "E7EB61981892966DE5CEF576F71FC7A80D14DAB2D0C03940B95B9FB3A727C66A" + "6E1FF0DC311B9AA21A3054484802154C1826C2A27A0914152AEB76F1168D4410", hash: "809DD3F763A11AF90912BBB92BC0D94361CBADAB10142992000C88B4CEB88648", }, { hashsize: 48, conf: nil, msg: "FBD17C26B61A82E12E125F0D459B96C91AB4837DFF22B39B78439430CDFC5DC8" + "78BB393A1A5F79BEF30995A85A12923339BA8AB7D8FC6DC5FEC6F4ED22C122BB" + "E7EB61981892966DE5CEF576F71FC7A80D14DAB2D0C03940B95B9FB3A727C66A" + "6E1FF0DC311B9AA21A3054484802154C1826C2A27A0914152AEB76F1168D4410", hash: "825F5CBD5DA8807A7B4D3E7BD9CD089CA3A256BCC064CD73A9355BF3AE67F2BF" + "93AC7074B3B19907A0665BA3A878B262", }, { hashsize: 64, conf: nil, msg: "FBD17C26B61A82E12E125F0D459B96C91AB4837DFF22B39B78439430CDFC5DC8" + "78BB393A1A5F79BEF30995A85A12923339BA8AB7D8FC6DC5FEC6F4ED22C122BB" + "E7EB61981892966DE5CEF576F71FC7A80D14DAB2D0C03940B95B9FB3A727C66A" + "6E1FF0DC311B9AA21A3054484802154C1826C2A27A0914152AEB76F1168D4410", hash: "1A0D5ABF4432E7C612D658F8DCFA35B0D1AB68B8D6BD4DD115C23CC57B5C5BCD" + "DE9BFF0ECE4208596E499F211BC07594D0CB6F3C12B0E110174B2A9B4B2CB6A9", }, { hashsize: 128, conf: nil, msg: "FBD17C26B61A82E12E125F0D459B96C91AB4837DFF22B39B78439430CDFC5DC8" + "78BB393A1A5F79BEF30995A85A12923339BA8AB7D8FC6DC5FEC6F4ED22C122BB" + "E7EB61981892966DE5CEF576F71FC7A80D14DAB2D0C03940B95B9FB3A727C66A" + "6E1FF0DC311B9AA21A3054484802154C1826C2A27A0914152AEB76F1168D4410", hash: "8C25D314110D1C0D58054C96A19D571E26A45D5362AA8F47547E53E0BE4A830A" + "5F2C29CCD88E2185FEBAD024A4696F2DBE8307DC150E7A58B3793B1A93FAE252" + "3E2D239C59A23A1CC127B3C481A9809162E60B4CB01C011B9630322C8FE9745D" + "56D0F3AED54B3490578DB4692901EAFC1960C15359176A9C0990B32B8CA8F94B", }, { hashsize: 64, conf: &Config{Key: fromHex("")}, msg: "D3090C72", hash: "1259AFC2CB025EEF2F681E128F889BBCE57F9A502D57D1A17239A12E71603559" + "16B72223790FD9A8B367EC96212A3ED239331ED72EF3DEB17685A8D5FD75158D", }, { hashsize: 64, conf: &Config{Key: fromHex("CB41F1706CDE09651203C2D0EFBADDF847A0D315CB2E53FF8BAC41DA0002672E" + "920244C66E02D5F0DAD3E94C42BB65F0D14157DECF4105EF5609D5B0984457C1")}, msg: "D3090C72167517F7C7AD82A70C2FD3F6", hash: "478D7B6C0CC6E35D9EBBDEDF39128E5A36585DB6222891692D1747D401DE34CE" + "3DB6FCBAB6C968B7F2620F4A844A2903B547775579993736D2493A75FF6752A1", }, } 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)) } } } } }