Skip to content

Commit 8d6b650

Browse files
committed
crypto: dh - implement FIPS PCT
JIRA: https://issues.redhat.com/browse/RHEL-25845 Upstream Status: RHEL only The below patch from Nicolai is not going to be accepted upstream. Add a panic on a failed test per FIPS certification requirement. From: Nicolai Stange <nstange@suse.de> Date: Tue, 30 Nov 2021 16:51:12 +0100 Subject: [PATCH] crypto: dh - implement FIPS PCT References: jsc#SLE-21132,bsc#1191256 Patch-mainline: Never, not upstreamable SP800-56Arev3, 5.6.2.1.4 ("Owner Assurance of Pair-wise Consistency") requires that a pair-wise consistency check needs to be conducted on a keypair. A pair-wise consistency test (PCT) is meant to ensure that a some provided public key is indeed associated with the given private one. As the kernel's DH implementation always computes the public key from the private one, this is guaranteed already as per the API. However, in the course of the certification process, there had been a lengthy discussion regarding this topic, with the result that a PCT is nonetheless mandatory. Simply implement a PCT for DH and move on. As mandated by SP800-56Arev3, 5.6.2.1.4, the PCT involves recomputing the public key and comparing it against the one under test. Signed-off-by: Nicolai Stange <nstange@suse.de> Signed-off-by: Vladis Dronov <vdronov@redhat.com>
1 parent 2cc9d0c commit 8d6b650

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

crypto/dh.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,10 +228,35 @@ static int dh_compute_value(struct kpp_request *req)
228228

229229
/* SP800-56A rev 3 5.6.2.1.3 key check */
230230
} else {
231+
MPI val_pct;
232+
231233
if (dh_is_pubkey_valid(ctx, val)) {
232234
ret = -EAGAIN;
233235
goto err_free_val;
234236
}
237+
238+
/*
239+
* SP800-56Arev3, 5.6.2.1.4: ("Owner Assurance
240+
* of Pair-wise Consistency"): recompute the
241+
* public key and check if the results match.
242+
*/
243+
val_pct = mpi_alloc(0);
244+
if (!val_pct) {
245+
ret = -ENOMEM;
246+
goto err_free_val;
247+
}
248+
249+
ret = _compute_val(ctx, base, val_pct);
250+
if (ret) {
251+
mpi_free(val_pct);
252+
goto err_free_val;
253+
}
254+
255+
if (mpi_cmp(val, val_pct) != 0) {
256+
fips_fail_notify();
257+
panic("dh: pair-wise consistency test failed\n");
258+
}
259+
mpi_free(val_pct);
235260
}
236261
}
237262

0 commit comments

Comments
 (0)