Skip to content

Commit 273db12

Browse files
cpugopherbot
authored andcommitted
crypto/internal/fips140test: add DetECDSA ACVP tests
Adds ACVP test coverage for deterministic ECDSA based on the NIST spec: https://pages.nist.gov/ACVP/draft-fussell-acvp-ecdsa.html Notably there is no corresponding acvp_test.config.json update in this commit because ACVP DetECDSA only specifies sigGen mode. The ACVP ECDSA sigGen tests are not amenable to testing against static data because the test vectors don't provide a key pair to use for the signature, just the message. The module wrapper has to generate its own keypair and return the public key components with the signature. DetECDSA produces deterministic signatures only when signing the same message with the same key. Change-Id: I9921f52e943c96b32e02e79cb5556ba0fabeae17 Reviewed-on: https://go-review.googlesource.com/c/go/+/635341 Auto-Submit: Filippo Valsorda <[email protected]> Reviewed-by: Cherry Mui <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Roland Shoemaker <[email protected]> Reviewed-by: Filippo Valsorda <[email protected]>
1 parent 78132a1 commit 273db12

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

src/crypto/internal/fips140test/acvp_capabilities.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,6 @@
4747
{"algorithm":"ECDSA","mode":"keyGen","revision":"FIPS186-5","curve":["P-224","P-256","P-384","P-521"],"secretGenerationMode":["testing candidates"]},
4848
{"algorithm":"ECDSA","mode":"keyVer","revision":"FIPS186-5","curve":["P-224","P-256","P-384","P-521"]},
4949
{"algorithm":"ECDSA","mode":"sigGen","revision":"FIPS186-5","capabilities":[{"curve":["P-224","P-256","P-384","P-521"],"hashAlg":["SHA2-224","SHA2-256","SHA2-384","SHA2-512","SHA2-512/224","SHA2-512/256","SHA3-224","SHA3-256","SHA3-384","SHA3-512"]}]},
50-
{"algorithm":"ECDSA","mode":"sigVer","revision":"FIPS186-5","capabilities":[{"curve":["P-224","P-256","P-384","P-521"],"hashAlg":["SHA2-224","SHA2-256","SHA2-384","SHA2-512","SHA2-512/224","SHA2-512/256","SHA3-224","SHA3-256","SHA3-384","SHA3-512"]}]}
50+
{"algorithm":"ECDSA","mode":"sigVer","revision":"FIPS186-5","capabilities":[{"curve":["P-224","P-256","P-384","P-521"],"hashAlg":["SHA2-224","SHA2-256","SHA2-384","SHA2-512","SHA2-512/224","SHA2-512/256","SHA3-224","SHA3-256","SHA3-384","SHA3-512"]}]},
51+
{"algorithm":"DetECDSA","mode":"sigGen","revision":"FIPS186-5","capabilities":[{"curve":["P-224","P-256","P-384","P-521"],"hashAlg":["SHA2-224","SHA2-256","SHA2-384","SHA2-512","SHA2-512/224","SHA2-512/256","SHA3-224","SHA3-256","SHA3-384","SHA3-512"]}]}
5152
]

src/crypto/internal/fips140test/acvp_test.go

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,13 @@ type command struct {
7575
handler commandHandler
7676
}
7777

78+
type ecdsaSigType int
79+
80+
const (
81+
ecdsaSigTypeNormal ecdsaSigType = iota
82+
ecdsaSigTypeDeterministic
83+
)
84+
7885
var (
7986
// SHA2 algorithm capabilities:
8087
// https://pages.nist.gov/ACVP/draft-celi-acvp-sha.html#section-7.2
@@ -88,7 +95,7 @@ var (
8895
// https://pages.nist.gov/ACVP/draft-vassilev-acvp-drbg.html#section-7.2
8996
// EDDSA algorithm capabilities:
9097
// https://pages.nist.gov/ACVP/draft-celi-acvp-eddsa.html#section-7
91-
// ECDSA algorithm capabilities:
98+
// ECDSA and DetECDSA algorithm capabilities:
9299
// https://pages.nist.gov/ACVP/draft-fussell-acvp-ecdsa.html#section-7
93100
//go:embed acvp_capabilities.json
94101
capabilitiesJson []byte
@@ -157,10 +164,11 @@ var (
157164
"EDDSA/sigGen": cmdEddsaSigGenAftBft(),
158165
"EDDSA/sigVer": cmdEddsaSigVerAft(),
159166

160-
"ECDSA/keyGen": cmdEcdsaKeyGenAft(),
161-
"ECDSA/keyVer": cmdEcdsaKeyVerAft(),
162-
"ECDSA/sigGen": cmdEcdsaSigGenAft(),
163-
"ECDSA/sigVer": cmdEcdsaSigVerAft(),
167+
"ECDSA/keyGen": cmdEcdsaKeyGenAft(),
168+
"ECDSA/keyVer": cmdEcdsaKeyVerAft(),
169+
"ECDSA/sigGen": cmdEcdsaSigGenAft(ecdsaSigTypeNormal),
170+
"ECDSA/sigVer": cmdEcdsaSigVerAft(),
171+
"DetECDSA/sigGen": cmdEcdsaSigGenAft(ecdsaSigTypeDeterministic),
164172
}
165173
)
166174

@@ -616,21 +624,29 @@ func pointFromAffine(curve elliptic.Curve, x, y *big.Int) ([]byte, error) {
616624
return buf, nil
617625
}
618626

619-
func signEcdsa[P ecdsa.Point[P], H fips140.Hash](c *ecdsa.Curve[P], h func() H, q []byte, sk []byte, digest []byte) (*ecdsa.Signature, error) {
627+
func signEcdsa[P ecdsa.Point[P], H fips140.Hash](c *ecdsa.Curve[P], h func() H, sigType ecdsaSigType, q []byte, sk []byte, digest []byte) (*ecdsa.Signature, error) {
620628
priv, err := ecdsa.NewPrivateKey(c, sk, q)
621629
if err != nil {
622630
return nil, fmt.Errorf("invalid private key: %w", err)
623631
}
624632

625-
sig, err := ecdsa.Sign(c, h, priv, rand.Reader, digest)
633+
var sig *ecdsa.Signature
634+
switch sigType {
635+
case ecdsaSigTypeNormal:
636+
sig, err = ecdsa.Sign(c, h, priv, rand.Reader, digest)
637+
case ecdsaSigTypeDeterministic:
638+
sig, err = ecdsa.SignDeterministic(c, h, priv, digest)
639+
default:
640+
return nil, fmt.Errorf("unsupported signature type: %v", sigType)
641+
}
626642
if err != nil {
627643
return nil, fmt.Errorf("signing failed: %w", err)
628644
}
629645

630646
return sig, nil
631647
}
632648

633-
func cmdEcdsaSigGenAft() command {
649+
func cmdEcdsaSigGenAft(sigType ecdsaSigType) command {
634650
return command{
635651
requiredArgs: 4, // Curve name, private key, hash name, message
636652
handler: func(args [][]byte) ([][]byte, error) {
@@ -661,13 +677,13 @@ func cmdEcdsaSigGenAft() command {
661677
var sig *ecdsa.Signature
662678
switch curve.Params() {
663679
case elliptic.P224().Params():
664-
sig, err = signEcdsa(ecdsa.P224(), newH, q, sk, digest)
680+
sig, err = signEcdsa(ecdsa.P224(), newH, sigType, q, sk, digest)
665681
case elliptic.P256().Params():
666-
sig, err = signEcdsa(ecdsa.P256(), newH, q, sk, digest)
682+
sig, err = signEcdsa(ecdsa.P256(), newH, sigType, q, sk, digest)
667683
case elliptic.P384().Params():
668-
sig, err = signEcdsa(ecdsa.P384(), newH, q, sk, digest)
684+
sig, err = signEcdsa(ecdsa.P384(), newH, sigType, q, sk, digest)
669685
case elliptic.P521().Params():
670-
sig, err = signEcdsa(ecdsa.P521(), newH, q, sk, digest)
686+
sig, err = signEcdsa(ecdsa.P521(), newH, sigType, q, sk, digest)
671687
default:
672688
return nil, fmt.Errorf("unsupported curve: %v", curve)
673689
}

0 commit comments

Comments
 (0)