Document that |EC_KEY_generate_fips| works for both cases.
Our FIPS module only claims support for RSA signing/verification, and |RSA_generate_key_fips| already performs a sign/verify pair-wise consistency test (PCT). For ECDSA, |EC_KEY_generate_fips| performs a sign/verify PCT too. But when |EC_KEY_generate_fips| is used for key agreement a sign/verify PCT may not be correct. The FIPS IG[1], page 60, says: > Though not a CAST, a pairwise consistency test (PCT) shall be > conducted for every generated public and private key pair for the > applicable approved algorithm (per ISO/IEC 19790:2012 Section > 7.10.3.3). To further clarify, at minimum, the PCT that is required by > the underlying algorithm standard (e.g. SP 800- 56Arev3 or SP > 800-56Brev2) shall be performed. SP 800-56Ar3, page 36, says: > For an ECC key pair (d, Q): Use the private key, d, along with the > generator G and other domain parameters associated with the key pair, > to compute dG (according to the rules of elliptic-curve arithmetic). > Compare the result to the public key, Q. If dG is not equal to Q, then > the pair-wise consistency test fails But |EC_KEY_generate_fips| has always done that via |EC_KEY_check_key|. So I believe that |EC_KEY_generate_fips| works for either case. This change documents that. [1] FIPS 140-3 IG dated 2022-03-14 and with SHA-256 2f232f7f5839e3263284d71c35771c9fdf2e505b02813be999377030c56b37e4 Change-Id: I4b4e2ed92ae3d59e2f2404c41694abeb3eb283f4 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/51988 Reviewed-by: David Benjamin <davidben@google.com>
This commit is contained in:
committed by
Adam Langley
parent
972ab52238
commit
8bbefbfeee
@@ -308,6 +308,9 @@ int EC_KEY_check_key(const EC_KEY *eckey) {
|
||||
}
|
||||
|
||||
// Check the public and private keys match.
|
||||
//
|
||||
// NOTE: this is a FIPS pair-wise consistency check for the ECDH case. See SP
|
||||
// 800-56Ar3, page 36.
|
||||
if (eckey->priv_key != NULL) {
|
||||
EC_RAW_POINT point;
|
||||
if (!ec_point_mul_scalar_base(eckey->group, &point,
|
||||
|
||||
@@ -167,8 +167,9 @@ OPENSSL_EXPORT void EC_KEY_set_conv_form(EC_KEY *key,
|
||||
// about the problem can be found on the error stack.
|
||||
OPENSSL_EXPORT int EC_KEY_check_key(const EC_KEY *key);
|
||||
|
||||
// EC_KEY_check_fips performs a signing pairwise consistency test (FIPS 140-2
|
||||
// 4.9.2). It returns one if it passes and zero otherwise.
|
||||
// EC_KEY_check_fips performs both a signing pairwise consistency test
|
||||
// (FIPS 140-2 4.9.2) and the consistency test from SP 800-56Ar3 section
|
||||
// 5.6.2.1.4. It returns one if it passes and zero otherwise.
|
||||
OPENSSL_EXPORT int EC_KEY_check_fips(const EC_KEY *key);
|
||||
|
||||
// EC_KEY_set_public_key_affine_coordinates sets the public key in |key| to
|
||||
@@ -194,7 +195,9 @@ OPENSSL_EXPORT size_t EC_KEY_key2buf(const EC_KEY *key,
|
||||
OPENSSL_EXPORT int EC_KEY_generate_key(EC_KEY *key);
|
||||
|
||||
// EC_KEY_generate_key_fips behaves like |EC_KEY_generate_key| but performs
|
||||
// additional checks for FIPS compliance.
|
||||
// additional checks for FIPS compliance. This function is applicable when
|
||||
// generating keys for either signing/verification or key agreement because
|
||||
// both types of consistency check (PCT) are performed.
|
||||
OPENSSL_EXPORT int EC_KEY_generate_key_fips(EC_KEY *key);
|
||||
|
||||
// EC_KEY_derive_from_secret deterministically derives a private key for |group|
|
||||
|
||||
Reference in New Issue
Block a user