-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fixes a small timing sidechannel in ECDSA that can in the worst case lead to a private key compromise. See https://openssl-library.org/news/secadv/20250120.txt for the upstream advisory. CVE: CVE-2024-13176
- Loading branch information
1 parent
538e81b
commit 3b2f7b7
Showing
2 changed files
with
125 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
121 changes: 121 additions & 0 deletions
121
devel/openssl3/files/77c608f4c8857e63e98e66444e2e761c9627916f.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
From 77c608f4c8857e63e98e66444e2e761c9627916f Mon Sep 17 00:00:00 2001 | ||
From: Tomas Mraz <[email protected]> | ||
Date: Wed, 15 Jan 2025 18:27:02 +0100 | ||
Subject: [PATCH] Fix timing side-channel in ECDSA signature computation | ||
|
||
There is a timing signal of around 300 nanoseconds when the top word of | ||
the inverted ECDSA nonce value is zero. This can happen with significant | ||
probability only for some of the supported elliptic curves. In particular | ||
the NIST P-521 curve is affected. To be able to measure this leak, the | ||
attacker process must either be located in the same physical computer or | ||
must have a very fast network connection with low latency. | ||
|
||
Attacks on ECDSA nonce are also known as Minerva attack. | ||
|
||
Fixes CVE-2024-13176 | ||
|
||
Reviewed-by: Tim Hudson <[email protected]> | ||
Reviewed-by: Neil Horman <[email protected]> | ||
Reviewed-by: Paul Dale <[email protected]> | ||
(Merged from https://github.com/openssl/openssl/pull/26429) | ||
|
||
(cherry picked from commit 63c40a66c5dc287485705d06122d3a6e74a6a203) | ||
--- | ||
crypto/bn/bn_exp.c | 21 +++++++++++++++------ | ||
crypto/ec/ec_lib.c | 7 ++++--- | ||
include/crypto/bn.h | 3 +++ | ||
3 files changed, 22 insertions(+), 9 deletions(-) | ||
|
||
diff --git a/crypto/bn/bn_exp.c b/crypto/bn/bn_exp.c | ||
index b876edbfac36e..af52e2ced6914 100644 | ||
--- ./crypto/bn/bn_exp.c | ||
+++ ./crypto/bn/bn_exp.c | ||
@@ -606,7 +606,7 @@ static int MOD_EXP_CTIME_COPY_FROM_PREBUF(BIGNUM *b, int top, | ||
* out by Colin Percival, | ||
* http://www.daemonology.net/hyperthreading-considered-harmful/) | ||
*/ | ||
-int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, | ||
+int bn_mod_exp_mont_fixed_top(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, | ||
const BIGNUM *m, BN_CTX *ctx, | ||
BN_MONT_CTX *in_mont) | ||
{ | ||
@@ -623,10 +623,6 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, | ||
unsigned int t4 = 0; | ||
#endif | ||
|
||
- bn_check_top(a); | ||
- bn_check_top(p); | ||
- bn_check_top(m); | ||
- | ||
if (!BN_is_odd(m)) { | ||
ERR_raise(ERR_LIB_BN, BN_R_CALLED_WITH_EVEN_MODULUS); | ||
return 0; | ||
@@ -1146,7 +1142,7 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, | ||
goto err; | ||
} else | ||
#endif | ||
- if (!BN_from_montgomery(rr, &tmp, mont, ctx)) | ||
+ if (!bn_from_mont_fixed_top(rr, &tmp, mont, ctx)) | ||
goto err; | ||
ret = 1; | ||
err: | ||
@@ -1160,6 +1156,19 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, | ||
return ret; | ||
} | ||
|
||
+int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, | ||
+ const BIGNUM *m, BN_CTX *ctx, | ||
+ BN_MONT_CTX *in_mont) | ||
+{ | ||
+ bn_check_top(a); | ||
+ bn_check_top(p); | ||
+ bn_check_top(m); | ||
+ if (!bn_mod_exp_mont_fixed_top(rr, a, p, m, ctx, in_mont)) | ||
+ return 0; | ||
+ bn_correct_top(rr); | ||
+ return 1; | ||
+} | ||
+ | ||
int BN_mod_exp_mont_word(BIGNUM *rr, BN_ULONG a, const BIGNUM *p, | ||
const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont) | ||
{ | ||
diff --git a/crypto/ec/ec_lib.c b/crypto/ec/ec_lib.c | ||
index 284fc05951b92..d9a6510d55cce 100644 | ||
--- ./crypto/ec/ec_lib.c | ||
+++ ./crypto/ec/ec_lib.c | ||
@@ -21,6 +21,7 @@ | ||
#include <openssl/opensslv.h> | ||
#include <openssl/param_build.h> | ||
#include "crypto/ec.h" | ||
+#include "crypto/bn.h" | ||
#include "internal/nelem.h" | ||
#include "ec_local.h" | ||
|
||
@@ -1265,10 +1266,10 @@ static int ec_field_inverse_mod_ord(const EC_GROUP *group, BIGNUM *r, | ||
if (!BN_sub(e, group->order, e)) | ||
goto err; | ||
/*- | ||
- * Exponent e is public. | ||
- * No need for scatter-gather or BN_FLG_CONSTTIME. | ||
+ * Although the exponent is public we want the result to be | ||
+ * fixed top. | ||
*/ | ||
- if (!BN_mod_exp_mont(r, x, e, group->order, ctx, group->mont_data)) | ||
+ if (!bn_mod_exp_mont_fixed_top(r, x, e, group->order, ctx, group->mont_data)) | ||
goto err; | ||
|
||
ret = 1; | ||
diff --git a/include/crypto/bn.h b/include/crypto/bn.h | ||
index 47d9b44f879f0..bdee28625ce60 100644 | ||
--- ./include/crypto/bn.h | ||
+++ ./include/crypto/bn.h | ||
@@ -73,6 +73,9 @@ int bn_set_words(BIGNUM *a, const BN_ULONG *words, int num_words); | ||
*/ | ||
int bn_mul_mont_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, | ||
BN_MONT_CTX *mont, BN_CTX *ctx); | ||
+int bn_mod_exp_mont_fixed_top(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, | ||
+ const BIGNUM *m, BN_CTX *ctx, | ||
+ BN_MONT_CTX *in_mont); | ||
int bn_to_mont_fixed_top(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, | ||
BN_CTX *ctx); | ||
int bn_from_mont_fixed_top(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, |