| // Copyright 2026 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 ecdsa_test | |
| import ( | |
| "crypto/ecdsa" | |
| "crypto/internal/cryptotest/wycheproof" | |
| "crypto/x509" | |
| "fmt" | |
| "testing" | |
| ) | |
| func TestECDSAWycheproof(t *testing.T) { | |
| // A map of supported curves to the list of hashes that Wycheproof has | |
| // test vector coverage for. | |
| curveAndHashes := map[string][]string{ | |
| "secp224r1": { | |
| "sha224", | |
| "sha256", | |
| "sha512", | |
| "sha3_224", | |
| "sha3_256", | |
| "sha3_512", | |
| }, | |
| "secp256r1": { | |
| "sha256", | |
| "sha512", | |
| "sha3_256", | |
| "sha3_512", | |
| }, | |
| "secp384r1": { | |
| "sha256", | |
| "sha384", | |
| "sha512", | |
| "sha3_384", | |
| "sha3_512", | |
| }, | |
| "secp521r1": { | |
| "sha512", | |
| "sha3_512", | |
| }, | |
| } | |
| var files []string | |
| for c, hashes := range curveAndHashes { | |
| for _, h := range hashes { | |
| files = append(files, fmt.Sprintf("ecdsa_%s_%s_test.json", c, h)) | |
| } | |
| } | |
| parseSPKIPub := func(p []byte) (*ecdsa.PublicKey, error) { | |
| pubKeyAny, err := x509.ParsePKIXPublicKey(p) | |
| if err != nil { | |
| return nil, err | |
| } | |
| ecdsaPub, ok := pubKeyAny.(*ecdsa.PublicKey) | |
| if !ok { | |
| return nil, fmt.Errorf("unexpected key type %T", pubKeyAny) | |
| } | |
| return ecdsaPub, nil | |
| } | |
| for _, file := range files { | |
| var testdata wycheproof.EcdsaVerifySchemaV1Json | |
| wycheproof.LoadVectorFile(t, file, &testdata) | |
| for tgIdx, tg := range testdata.TestGroups { | |
| pubkey, err := parseSPKIPub(wycheproof.MustDecodeHex(tg.PublicKeyDer)) | |
| if err != nil { | |
| t.Fatalf("test group %d invalid DER encoded public key: %v", tgIdx+1, err) | |
| } | |
| h := wycheproof.ParseHash(tg.Sha) | |
| for _, tv := range tg.Tests { | |
| t.Run(wycheproof.TestName(file, tv), func(t *testing.T) { | |
| t.Parallel() | |
| h := h.New() | |
| h.Write(wycheproof.MustDecodeHex(tv.Msg)) | |
| got := ecdsa.VerifyASN1(pubkey, h.Sum(nil), wycheproof.MustDecodeHex(tv.Sig)) | |
| if want := wycheproof.ShouldPass(t, tv.Result, tv.Flags, nil); got != want { | |
| t.Errorf("VerifyASN1 wanted success: %t", want) | |
| } | |
| }) | |
| } | |
| } | |
| } | |
| } |