Required updating wycheproofModVer to pull the most recent test vectors. Tests against SHA1, SHA224, SHA256, SHA384, and SHA512 constructions but not the SHA3 variants. Change-Id: I5b66632ac0c7106bd9b405f6636922a6383d8b9e Reviewed-on: https://go-review.googlesource.com/c/crypto/+/234718 Run-TryBot: Katie Hockman <katie@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Katie Hockman <katie@golang.org>
106 lines
2.7 KiB
Go
106 lines
2.7 KiB
Go
// Copyright 2020 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package wycheproof
|
|
|
|
import (
|
|
"crypto/hmac"
|
|
"testing"
|
|
)
|
|
|
|
func TestHMAC(t *testing.T) {
|
|
// MacTestVector
|
|
type MacTestVector struct {
|
|
|
|
// A brief description of the test case
|
|
Comment string `json:"comment,omitempty"`
|
|
|
|
// A list of flags
|
|
Flags []string `json:"flags,omitempty"`
|
|
|
|
// the key
|
|
Key string `json:"key,omitempty"`
|
|
|
|
// the plaintext
|
|
Msg string `json:"msg,omitempty"`
|
|
|
|
// Test result
|
|
Result string `json:"result,omitempty"`
|
|
|
|
// the authentication tag
|
|
Tag string `json:"tag,omitempty"`
|
|
|
|
// Identifier of the test case
|
|
TcId int `json:"tcId,omitempty"`
|
|
}
|
|
|
|
// MacTestGroup
|
|
type MacTestGroup struct {
|
|
|
|
// the keySize in bits
|
|
KeySize int `json:"keySize,omitempty"`
|
|
|
|
// the expected size of the tag in bits
|
|
TagSize int `json:"tagSize,omitempty"`
|
|
Tests []*MacTestVector `json:"tests,omitempty"`
|
|
Type interface{} `json:"type,omitempty"`
|
|
}
|
|
|
|
// Notes a description of the labels used in the test vectors
|
|
type Notes struct {
|
|
}
|
|
|
|
// Root
|
|
type Root struct {
|
|
|
|
// the primitive tested in the test file
|
|
Algorithm string `json:"algorithm,omitempty"`
|
|
|
|
// the version of the test vectors.
|
|
GeneratorVersion string `json:"generatorVersion,omitempty"`
|
|
|
|
// additional documentation
|
|
Header []string `json:"header,omitempty"`
|
|
|
|
// a description of the labels used in the test vectors
|
|
Notes *Notes `json:"notes,omitempty"`
|
|
|
|
// the number of test vectors in this test
|
|
NumberOfTests int `json:"numberOfTests,omitempty"`
|
|
Schema interface{} `json:"schema,omitempty"`
|
|
TestGroups []*MacTestGroup `json:"testGroups,omitempty"`
|
|
}
|
|
|
|
fileHashAlgs := map[string]string{
|
|
"hmac_sha1_test.json": "SHA-1",
|
|
"hmac_sha224_test.json": "SHA-224",
|
|
"hmac_sha256_test.json": "SHA-256",
|
|
"hmac_sha384_test.json": "SHA-384",
|
|
"hmac_sha512_test.json": "SHA-512",
|
|
}
|
|
|
|
for f := range fileHashAlgs {
|
|
var root Root
|
|
readTestVector(t, f, &root)
|
|
for _, tg := range root.TestGroups {
|
|
h := parseHash(fileHashAlgs[f])
|
|
// Skip test vectors where the tag length does not equal the
|
|
// hash length, since crypto/hmac does not support generating
|
|
// these truncated tags.
|
|
if tg.TagSize/8 != h.Size() {
|
|
continue
|
|
}
|
|
for _, tv := range tg.Tests {
|
|
hm := hmac.New(h.New, decodeHex(tv.Key))
|
|
hm.Write(decodeHex(tv.Msg))
|
|
tag := hm.Sum(nil)
|
|
got := hmac.Equal(decodeHex(tv.Tag), tag)
|
|
if want := shouldPass(tv.Result, tv.Flags, nil); want != got {
|
|
t.Errorf("%s, tcid: %d, type: %s, comment: %q, unexpected result", f, tv.TcId, tv.Result, tv.Comment)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|