123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600 |
- From 0372649a943fb23f7f08c7acdbc01464b9df03f0 Mon Sep 17 00:00:00 2001
- From: Bernd Edlinger <bernd.edlinger@hotmail.de>
- Date: Tue, 14 Feb 2023 14:28:47 +0100
- Subject: Revert "Fix Timing Oracle in RSA decryption"
- This reverts commit 43d8f88511991533f53680a751e9326999a6a31f.
- Reviewed-by: Paul Dale <pauli@openssl.org>
- Reviewed-by: Tomas Mraz <tomas@openssl.org>
- (Merged from https://github.com/openssl/openssl/pull/20284)
- ---
- crypto/bn/bn_blind.c | 14 ++++++++++++++
- crypto/bn/bn_err.c | 2 --
- crypto/bn/bn_local.h | 14 --------------
- crypto/rsa/rsa_ossl.c | 17 ++++-------------
- include/crypto/bn.h | 5 -----
- include/openssl/bnerr.h | 1 -
- 6 files changed, 18 insertions(+), 35 deletions(-)
- diff --git a/crypto/bn/bn_blind.c b/crypto/bn/bn_blind.c
- index dd5beea7c9..15d9e0a544 100644
- --- a/crypto/bn/bn_blind.c
- +++ b/crypto/bn/bn_blind.c
- @@ -13,6 +13,20 @@
-
- #define BN_BLINDING_COUNTER 32
-
- +struct bn_blinding_st {
- + BIGNUM *A;
- + BIGNUM *Ai;
- + BIGNUM *e;
- + BIGNUM *mod; /* just a reference */
- + CRYPTO_THREAD_ID tid;
- + int counter;
- + unsigned long flags;
- + BN_MONT_CTX *m_ctx;
- + int (*bn_mod_exp) (BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
- + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
- + CRYPTO_RWLOCK *lock;
- +};
- +
- BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, BIGNUM *mod)
- {
- BN_BLINDING *ret = NULL;
- diff --git a/crypto/bn/bn_err.c b/crypto/bn/bn_err.c
- index 6f5464b540..6ea5fc3d5c 100644
- --- a/crypto/bn/bn_err.c
- +++ b/crypto/bn/bn_err.c
- @@ -73,8 +73,6 @@ static const ERR_STRING_DATA BN_str_functs[] = {
- {ERR_PACK(ERR_LIB_BN, BN_F_BN_SET_WORDS, 0), "bn_set_words"},
- {ERR_PACK(ERR_LIB_BN, BN_F_BN_STACK_PUSH, 0), "BN_STACK_push"},
- {ERR_PACK(ERR_LIB_BN, BN_F_BN_USUB, 0), "BN_usub"},
- - {ERR_PACK(ERR_LIB_BN, BN_F_OSSL_BN_RSA_DO_UNBLIND, 0),
- - "ossl_bn_rsa_do_unblind"},
- {0, NULL}
- };
-
- diff --git a/crypto/bn/bn_local.h b/crypto/bn/bn_local.h
- index 30b7614fdb..ee6342b60c 100644
- --- a/crypto/bn/bn_local.h
- +++ b/crypto/bn/bn_local.h
- @@ -283,20 +283,6 @@ struct bn_gencb_st {
- } cb;
- };
-
- -struct bn_blinding_st {
- - BIGNUM *A;
- - BIGNUM *Ai;
- - BIGNUM *e;
- - BIGNUM *mod; /* just a reference */
- - CRYPTO_THREAD_ID tid;
- - int counter;
- - unsigned long flags;
- - BN_MONT_CTX *m_ctx;
- - int (*bn_mod_exp) (BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
- - const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
- - CRYPTO_RWLOCK *lock;
- -};
- -
- /*-
- * BN_window_bits_for_exponent_size -- macro for sliding window mod_exp functions
- *
- diff --git a/crypto/rsa/rsa_ossl.c b/crypto/rsa/rsa_ossl.c
- index 2e3ee4ab33..53cf2d03c9 100644
- --- a/crypto/rsa/rsa_ossl.c
- +++ b/crypto/rsa/rsa_ossl.c
- @@ -465,20 +465,11 @@ static int rsa_ossl_private_decrypt(int flen, const unsigned char *from,
- BN_free(d);
- }
-
- - if (blinding) {
- - /*
- - * ossl_bn_rsa_do_unblind() combines blinding inversion and
- - * 0-padded BN BE serialization
- - */
- - j = ossl_bn_rsa_do_unblind(ret, blinding, unblind, rsa->n, ctx,
- - buf, num);
- - if (j == 0)
- - goto err;
- - } else {
- - j = BN_bn2binpad(ret, buf, num);
- - if (j < 0)
- + if (blinding)
- + if (!rsa_blinding_invert(blinding, ret, unblind, ctx))
- goto err;
- - }
- +
- + j = BN_bn2binpad(ret, buf, num);
-
- switch (padding) {
- case RSA_PKCS1_PADDING:
- diff --git a/include/crypto/bn.h b/include/crypto/bn.h
- index 9f866ed71a..250914c46a 100644
- --- a/include/crypto/bn.h
- +++ b/include/crypto/bn.h
- @@ -86,10 +86,5 @@ int bn_lshift_fixed_top(BIGNUM *r, const BIGNUM *a, int n);
- int bn_rshift_fixed_top(BIGNUM *r, const BIGNUM *a, int n);
- int bn_div_fixed_top(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m,
- const BIGNUM *d, BN_CTX *ctx);
- -int ossl_bn_rsa_do_unblind(const BIGNUM *intermediate,
- - const BN_BLINDING *blinding,
- - const BIGNUM *possible_arg2,
- - const BIGNUM *to_mod, BN_CTX *ctx,
- - unsigned char *buf, int num);
-
- #endif
- diff --git a/include/openssl/bnerr.h b/include/openssl/bnerr.h
- index 5c83777f9f..a703efc92b 100644
- --- a/include/openssl/bnerr.h
- +++ b/include/openssl/bnerr.h
- @@ -72,7 +72,6 @@ int ERR_load_BN_strings(void);
- # define BN_F_BN_SET_WORDS 144
- # define BN_F_BN_STACK_PUSH 148
- # define BN_F_BN_USUB 115
- -# define BN_F_OSSL_BN_RSA_DO_UNBLIND 151
-
- /*
- * BN reason codes.
- --
- 2.25.1
- From 3f499b24f3bcd66db022074f7e8b4f6ee266a3ae Mon Sep 17 00:00:00 2001
- From: Bernd Edlinger <bernd.edlinger@hotmail.de>
- Date: Mon, 13 Feb 2023 17:46:41 +0100
- Subject: Alternative fix for CVE-2022-4304
- This is about a timing leak in the topmost limb
- of the internal result of RSA_private_decrypt,
- before the padding check.
- There are in fact at least three bugs together that
- caused the timing leak:
- First and probably most important is the fact that
- the blinding did not use the constant time code path
- at all when the RSA object was used for a private
- decrypt, due to the fact that the Montgomery context
- rsa->_method_mod_n was not set up early enough in
- rsa_ossl_private_decrypt, when BN_BLINDING_create_param
- needed it, and that was persisted as blinding->m_ctx,
- although the RSA object creates the Montgomery context
- just a bit later.
- Then the infamous bn_correct_top was used on the
- secret value right after the blinding was removed.
- And finally the function BN_bn2binpad did not use
- the constant-time code path since the BN_FLG_CONSTTIME
- was not set on the secret value.
- In order to address the first problem, this patch
- makes sure that the rsa->_method_mod_n is initialized
- right before the blinding context.
- And to fix the second problem, we add a new utility
- function bn_correct_top_consttime, a const-time
- variant of bn_correct_top.
- Together with the fact, that BN_bn2binpad is already
- constant time if the flag BN_FLG_CONSTTIME is set,
- this should eliminate the timing oracle completely.
- In addition the no-asm variant may also have
- branches that depend on secret values, because the last
- invocation of bn_sub_words in bn_from_montgomery_word
- had branches when the function is compiled by certain
- gcc compiler versions, due to the clumsy coding style.
- So additionally this patch stream-lined the no-asm
- C-code in order to avoid branches where possible and
- improve the resulting code quality.
- Reviewed-by: Paul Dale <pauli@openssl.org>
- Reviewed-by: Tomas Mraz <tomas@openssl.org>
- (Merged from https://github.com/openssl/openssl/pull/20284)
- ---
- crypto/bn/bn_asm.c | 106 +++++++++++++++++++++++-------------------
- crypto/bn/bn_blind.c | 3 +-
- crypto/bn/bn_lib.c | 22 +++++++++
- crypto/bn/bn_local.h | 26 +++++------
- crypto/rsa/rsa_ossl.c | 13 +++---
- 5 files changed, 101 insertions(+), 69 deletions(-)
- diff --git a/crypto/bn/bn_asm.c b/crypto/bn/bn_asm.c
- index 4d83a8cf11..177558c647 100644
- --- a/crypto/bn/bn_asm.c
- +++ b/crypto/bn/bn_asm.c
- @@ -381,25 +381,33 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
- #ifndef OPENSSL_SMALL_FOOTPRINT
- while (n & ~3) {
- t1 = a[0];
- - t2 = b[0];
- - r[0] = (t1 - t2 - c) & BN_MASK2;
- - if (t1 != t2)
- - c = (t1 < t2);
- + t2 = (t1 - c) & BN_MASK2;
- + c = (t2 > t1);
- + t1 = b[0];
- + t1 = (t2 - t1) & BN_MASK2;
- + r[0] = t1;
- + c += (t1 > t2);
- t1 = a[1];
- - t2 = b[1];
- - r[1] = (t1 - t2 - c) & BN_MASK2;
- - if (t1 != t2)
- - c = (t1 < t2);
- + t2 = (t1 - c) & BN_MASK2;
- + c = (t2 > t1);
- + t1 = b[1];
- + t1 = (t2 - t1) & BN_MASK2;
- + r[1] = t1;
- + c += (t1 > t2);
- t1 = a[2];
- - t2 = b[2];
- - r[2] = (t1 - t2 - c) & BN_MASK2;
- - if (t1 != t2)
- - c = (t1 < t2);
- + t2 = (t1 - c) & BN_MASK2;
- + c = (t2 > t1);
- + t1 = b[2];
- + t1 = (t2 - t1) & BN_MASK2;
- + r[2] = t1;
- + c += (t1 > t2);
- t1 = a[3];
- - t2 = b[3];
- - r[3] = (t1 - t2 - c) & BN_MASK2;
- - if (t1 != t2)
- - c = (t1 < t2);
- + t2 = (t1 - c) & BN_MASK2;
- + c = (t2 > t1);
- + t1 = b[3];
- + t1 = (t2 - t1) & BN_MASK2;
- + r[3] = t1;
- + c += (t1 > t2);
- a += 4;
- b += 4;
- r += 4;
- @@ -408,10 +416,12 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
- #endif
- while (n) {
- t1 = a[0];
- - t2 = b[0];
- - r[0] = (t1 - t2 - c) & BN_MASK2;
- - if (t1 != t2)
- - c = (t1 < t2);
- + t2 = (t1 - c) & BN_MASK2;
- + c = (t2 > t1);
- + t1 = b[0];
- + t1 = (t2 - t1) & BN_MASK2;
- + r[0] = t1;
- + c += (t1 > t2);
- a++;
- b++;
- r++;
- @@ -446,7 +456,7 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
- t += c0; /* no carry */ \
- c0 = (BN_ULONG)Lw(t); \
- hi = (BN_ULONG)Hw(t); \
- - c1 = (c1+hi)&BN_MASK2; if (c1<hi) c2++; \
- + c1 = (c1+hi)&BN_MASK2; c2 += (c1<hi); \
- } while(0)
-
- # define mul_add_c2(a,b,c0,c1,c2) do { \
- @@ -455,11 +465,11 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
- BN_ULLONG tt = t+c0; /* no carry */ \
- c0 = (BN_ULONG)Lw(tt); \
- hi = (BN_ULONG)Hw(tt); \
- - c1 = (c1+hi)&BN_MASK2; if (c1<hi) c2++; \
- + c1 = (c1+hi)&BN_MASK2; c2 += (c1<hi); \
- t += c0; /* no carry */ \
- c0 = (BN_ULONG)Lw(t); \
- hi = (BN_ULONG)Hw(t); \
- - c1 = (c1+hi)&BN_MASK2; if (c1<hi) c2++; \
- + c1 = (c1+hi)&BN_MASK2; c2 += (c1<hi); \
- } while(0)
-
- # define sqr_add_c(a,i,c0,c1,c2) do { \
- @@ -468,7 +478,7 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
- t += c0; /* no carry */ \
- c0 = (BN_ULONG)Lw(t); \
- hi = (BN_ULONG)Hw(t); \
- - c1 = (c1+hi)&BN_MASK2; if (c1<hi) c2++; \
- + c1 = (c1+hi)&BN_MASK2; c2 += (c1<hi); \
- } while(0)
-
- # define sqr_add_c2(a,i,j,c0,c1,c2) \
- @@ -483,26 +493,26 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
- BN_ULONG ta = (a), tb = (b); \
- BN_ULONG lo, hi; \
- BN_UMULT_LOHI(lo,hi,ta,tb); \
- - c0 += lo; hi += (c0<lo)?1:0; \
- - c1 += hi; c2 += (c1<hi)?1:0; \
- + c0 += lo; hi += (c0<lo); \
- + c1 += hi; c2 += (c1<hi); \
- } while(0)
-
- # define mul_add_c2(a,b,c0,c1,c2) do { \
- BN_ULONG ta = (a), tb = (b); \
- BN_ULONG lo, hi, tt; \
- BN_UMULT_LOHI(lo,hi,ta,tb); \
- - c0 += lo; tt = hi+((c0<lo)?1:0); \
- - c1 += tt; c2 += (c1<tt)?1:0; \
- - c0 += lo; hi += (c0<lo)?1:0; \
- - c1 += hi; c2 += (c1<hi)?1:0; \
- + c0 += lo; tt = hi + (c0<lo); \
- + c1 += tt; c2 += (c1<tt); \
- + c0 += lo; hi += (c0<lo); \
- + c1 += hi; c2 += (c1<hi); \
- } while(0)
-
- # define sqr_add_c(a,i,c0,c1,c2) do { \
- BN_ULONG ta = (a)[i]; \
- BN_ULONG lo, hi; \
- BN_UMULT_LOHI(lo,hi,ta,ta); \
- - c0 += lo; hi += (c0<lo)?1:0; \
- - c1 += hi; c2 += (c1<hi)?1:0; \
- + c0 += lo; hi += (c0<lo); \
- + c1 += hi; c2 += (c1<hi); \
- } while(0)
-
- # define sqr_add_c2(a,i,j,c0,c1,c2) \
- @@ -517,26 +527,26 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
- BN_ULONG ta = (a), tb = (b); \
- BN_ULONG lo = ta * tb; \
- BN_ULONG hi = BN_UMULT_HIGH(ta,tb); \
- - c0 += lo; hi += (c0<lo)?1:0; \
- - c1 += hi; c2 += (c1<hi)?1:0; \
- + c0 += lo; hi += (c0<lo); \
- + c1 += hi; c2 += (c1<hi); \
- } while(0)
-
- # define mul_add_c2(a,b,c0,c1,c2) do { \
- BN_ULONG ta = (a), tb = (b), tt; \
- BN_ULONG lo = ta * tb; \
- BN_ULONG hi = BN_UMULT_HIGH(ta,tb); \
- - c0 += lo; tt = hi + ((c0<lo)?1:0); \
- - c1 += tt; c2 += (c1<tt)?1:0; \
- - c0 += lo; hi += (c0<lo)?1:0; \
- - c1 += hi; c2 += (c1<hi)?1:0; \
- + c0 += lo; tt = hi + (c0<lo); \
- + c1 += tt; c2 += (c1<tt); \
- + c0 += lo; hi += (c0<lo); \
- + c1 += hi; c2 += (c1<hi); \
- } while(0)
-
- # define sqr_add_c(a,i,c0,c1,c2) do { \
- BN_ULONG ta = (a)[i]; \
- BN_ULONG lo = ta * ta; \
- BN_ULONG hi = BN_UMULT_HIGH(ta,ta); \
- - c0 += lo; hi += (c0<lo)?1:0; \
- - c1 += hi; c2 += (c1<hi)?1:0; \
- + c0 += lo; hi += (c0<lo); \
- + c1 += hi; c2 += (c1<hi); \
- } while(0)
-
- # define sqr_add_c2(a,i,j,c0,c1,c2) \
- @@ -551,8 +561,8 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
- BN_ULONG lo = LBITS(a), hi = HBITS(a); \
- BN_ULONG bl = LBITS(b), bh = HBITS(b); \
- mul64(lo,hi,bl,bh); \
- - c0 = (c0+lo)&BN_MASK2; if (c0<lo) hi++; \
- - c1 = (c1+hi)&BN_MASK2; if (c1<hi) c2++; \
- + c0 = (c0+lo)&BN_MASK2; hi += (c0<lo); \
- + c1 = (c1+hi)&BN_MASK2; c2 += (c1<hi); \
- } while(0)
-
- # define mul_add_c2(a,b,c0,c1,c2) do { \
- @@ -561,17 +571,17 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
- BN_ULONG bl = LBITS(b), bh = HBITS(b); \
- mul64(lo,hi,bl,bh); \
- tt = hi; \
- - c0 = (c0+lo)&BN_MASK2; if (c0<lo) tt++; \
- - c1 = (c1+tt)&BN_MASK2; if (c1<tt) c2++; \
- - c0 = (c0+lo)&BN_MASK2; if (c0<lo) hi++; \
- - c1 = (c1+hi)&BN_MASK2; if (c1<hi) c2++; \
- + c0 = (c0+lo)&BN_MASK2; tt += (c0<lo); \
- + c1 = (c1+tt)&BN_MASK2; c2 += (c1<tt); \
- + c0 = (c0+lo)&BN_MASK2; hi += (c0<lo); \
- + c1 = (c1+hi)&BN_MASK2; c2 += (c1<hi); \
- } while(0)
-
- # define sqr_add_c(a,i,c0,c1,c2) do { \
- BN_ULONG lo, hi; \
- sqr64(lo,hi,(a)[i]); \
- - c0 = (c0+lo)&BN_MASK2; if (c0<lo) hi++; \
- - c1 = (c1+hi)&BN_MASK2; if (c1<hi) c2++; \
- + c0 = (c0+lo)&BN_MASK2; hi += (c0<lo); \
- + c1 = (c1+hi)&BN_MASK2; c2 += (c1<hi); \
- } while(0)
-
- # define sqr_add_c2(a,i,j,c0,c1,c2) \
- diff --git a/crypto/bn/bn_blind.c b/crypto/bn/bn_blind.c
- index 15d9e0a544..e76f6107a7 100644
- --- a/crypto/bn/bn_blind.c
- +++ b/crypto/bn/bn_blind.c
- @@ -191,7 +191,8 @@ int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b,
- n->top = (int)(rtop & ~mask) | (ntop & mask);
- n->flags |= (BN_FLG_FIXED_TOP & ~mask);
- }
- - ret = BN_mod_mul_montgomery(n, n, r, b->m_ctx, ctx);
- + ret = bn_mul_mont_fixed_top(n, n, r, b->m_ctx, ctx);
- + bn_correct_top_consttime(n);
- } else {
- ret = BN_mod_mul(n, n, r, b->mod, ctx);
- }
- diff --git a/crypto/bn/bn_lib.c b/crypto/bn/bn_lib.c
- index eb4a31849b..fe6fb0e40f 100644
- --- a/crypto/bn/bn_lib.c
- +++ b/crypto/bn/bn_lib.c
- @@ -1001,6 +1001,28 @@ BIGNUM *bn_wexpand(BIGNUM *a, int words)
- return (words <= a->dmax) ? a : bn_expand2(a, words);
- }
-
- +void bn_correct_top_consttime(BIGNUM *a)
- +{
- + int j, atop;
- + BN_ULONG limb;
- + unsigned int mask;
- +
- + for (j = 0, atop = 0; j < a->dmax; j++) {
- + limb = a->d[j];
- + limb |= 0 - limb;
- + limb >>= BN_BITS2 - 1;
- + limb = 0 - limb;
- + mask = (unsigned int)limb;
- + mask &= constant_time_msb(j - a->top);
- + atop = constant_time_select_int(mask, j + 1, atop);
- + }
- +
- + mask = constant_time_eq_int(atop, 0);
- + a->top = atop;
- + a->neg = constant_time_select_int(mask, 0, a->neg);
- + a->flags &= ~BN_FLG_FIXED_TOP;
- +}
- +
- void bn_correct_top(BIGNUM *a)
- {
- BN_ULONG *ftl;
- diff --git a/crypto/bn/bn_local.h b/crypto/bn/bn_local.h
- index ee6342b60c..818e34348e 100644
- --- a/crypto/bn/bn_local.h
- +++ b/crypto/bn/bn_local.h
- @@ -515,10 +515,10 @@ unsigned __int64 _umul128(unsigned __int64 a, unsigned __int64 b,
- ret = (r); \
- BN_UMULT_LOHI(low,high,w,tmp); \
- ret += (c); \
- - (c) = (ret<(c))?1:0; \
- + (c) = (ret<(c)); \
- (c) += high; \
- ret += low; \
- - (c) += (ret<low)?1:0; \
- + (c) += (ret<low); \
- (r) = ret; \
- }
-
- @@ -527,7 +527,7 @@ unsigned __int64 _umul128(unsigned __int64 a, unsigned __int64 b,
- BN_UMULT_LOHI(low,high,w,ta); \
- ret = low + (c); \
- (c) = high; \
- - (c) += (ret<low)?1:0; \
- + (c) += (ret<low); \
- (r) = ret; \
- }
-
- @@ -543,10 +543,10 @@ unsigned __int64 _umul128(unsigned __int64 a, unsigned __int64 b,
- high= BN_UMULT_HIGH(w,tmp); \
- ret += (c); \
- low = (w) * tmp; \
- - (c) = (ret<(c))?1:0; \
- + (c) = (ret<(c)); \
- (c) += high; \
- ret += low; \
- - (c) += (ret<low)?1:0; \
- + (c) += (ret<low); \
- (r) = ret; \
- }
-
- @@ -556,7 +556,7 @@ unsigned __int64 _umul128(unsigned __int64 a, unsigned __int64 b,
- high= BN_UMULT_HIGH(w,ta); \
- ret = low + (c); \
- (c) = high; \
- - (c) += (ret<low)?1:0; \
- + (c) += (ret<low); \
- (r) = ret; \
- }
-
- @@ -589,10 +589,10 @@ unsigned __int64 _umul128(unsigned __int64 a, unsigned __int64 b,
- lt=(bl)*(lt); \
- m1=(bl)*(ht); \
- ht =(bh)*(ht); \
- - m=(m+m1)&BN_MASK2; if (m < m1) ht+=L2HBITS((BN_ULONG)1); \
- + m=(m+m1)&BN_MASK2; ht += L2HBITS((BN_ULONG)(m < m1)); \
- ht+=HBITS(m); \
- m1=L2HBITS(m); \
- - lt=(lt+m1)&BN_MASK2; if (lt < m1) ht++; \
- + lt=(lt+m1)&BN_MASK2; ht += (lt < m1); \
- (l)=lt; \
- (h)=ht; \
- }
- @@ -609,7 +609,7 @@ unsigned __int64 _umul128(unsigned __int64 a, unsigned __int64 b,
- h*=h; \
- h+=(m&BN_MASK2h1)>>(BN_BITS4-1); \
- m =(m&BN_MASK2l)<<(BN_BITS4+1); \
- - l=(l+m)&BN_MASK2; if (l < m) h++; \
- + l=(l+m)&BN_MASK2; h += (l < m); \
- (lo)=l; \
- (ho)=h; \
- }
- @@ -623,9 +623,9 @@ unsigned __int64 _umul128(unsigned __int64 a, unsigned __int64 b,
- mul64(l,h,(bl),(bh)); \
- \
- /* non-multiply part */ \
- - l=(l+(c))&BN_MASK2; if (l < (c)) h++; \
- + l=(l+(c))&BN_MASK2; h += (l < (c)); \
- (c)=(r); \
- - l=(l+(c))&BN_MASK2; if (l < (c)) h++; \
- + l=(l+(c))&BN_MASK2; h += (l < (c)); \
- (c)=h&BN_MASK2; \
- (r)=l; \
- }
- @@ -639,7 +639,7 @@ unsigned __int64 _umul128(unsigned __int64 a, unsigned __int64 b,
- mul64(l,h,(bl),(bh)); \
- \
- /* non-multiply part */ \
- - l+=(c); if ((l&BN_MASK2) < (c)) h++; \
- + l+=(c); h += ((l&BN_MASK2) < (c)); \
- (c)=h&BN_MASK2; \
- (r)=l&BN_MASK2; \
- }
- @@ -669,7 +669,7 @@ BN_ULONG bn_sub_part_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
- int cl, int dl);
- int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,
- const BN_ULONG *np, const BN_ULONG *n0, int num);
- -
- +void bn_correct_top_consttime(BIGNUM *a);
- BIGNUM *int_bn_mod_inverse(BIGNUM *in,
- const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx,
- int *noinv);
- diff --git a/crypto/rsa/rsa_ossl.c b/crypto/rsa/rsa_ossl.c
- index 53cf2d03c9..cf5a10ab43 100644
- --- a/crypto/rsa/rsa_ossl.c
- +++ b/crypto/rsa/rsa_ossl.c
- @@ -226,6 +226,7 @@ static int rsa_blinding_invert(BN_BLINDING *b, BIGNUM *f, BIGNUM *unblind,
- * will only read the modulus from BN_BLINDING. In both cases it's safe
- * to access the blinding without a lock.
- */
- + BN_set_flags(f, BN_FLG_CONSTTIME);
- return BN_BLINDING_invert_ex(f, unblind, b, ctx);
- }
-
- @@ -412,6 +413,11 @@ static int rsa_ossl_private_decrypt(int flen, const unsigned char *from,
- goto err;
- }
-
- + if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
- + if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, rsa->lock,
- + rsa->n, ctx))
- + goto err;
- +
- if (!(rsa->flags & RSA_FLAG_NO_BLINDING)) {
- blinding = rsa_get_blinding(rsa, &local_blinding, ctx);
- if (blinding == NULL) {
- @@ -449,13 +455,6 @@ static int rsa_ossl_private_decrypt(int flen, const unsigned char *from,
- goto err;
- }
- BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
- -
- - if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
- - if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, rsa->lock,
- - rsa->n, ctx)) {
- - BN_free(d);
- - goto err;
- - }
- if (!rsa->meth->bn_mod_exp(ret, f, d, rsa->n, ctx,
- rsa->_method_mod_n)) {
- BN_free(d);
- --
- 2.25.1
|