提交 4f75d1d0 编写于 作者: B Billy Brumley 提交者: Matt Caswell

[crypto/bn] fix a few small timing leaks in BN_lshift1 and BN_rshift1

Reviewed-by: NBernd Edlinger <bernd.edlinger@hotmail.de>
Reviewed-by: NPaul Dale <paul.dale@oracle.com>
Reviewed-by: NMatt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/10209)

(cherry picked from commit 305bf9c8668aff78e668131061f4eb088457be5f)
上级 ac613b90
...@@ -34,12 +34,10 @@ int BN_lshift1(BIGNUM *r, const BIGNUM *a) ...@@ -34,12 +34,10 @@ int BN_lshift1(BIGNUM *r, const BIGNUM *a)
for (i = 0; i < a->top; i++) { for (i = 0; i < a->top; i++) {
t = *(ap++); t = *(ap++);
*(rp++) = ((t << 1) | c) & BN_MASK2; *(rp++) = ((t << 1) | c) & BN_MASK2;
c = (t & BN_TBIT) ? 1 : 0; c = t >> (BN_BITS2 - 1);
}
if (c) {
*rp = 1;
r->top++;
} }
*rp = c;
r->top += c;
bn_check_top(r); bn_check_top(r);
return 1; return 1;
} }
...@@ -47,7 +45,7 @@ int BN_lshift1(BIGNUM *r, const BIGNUM *a) ...@@ -47,7 +45,7 @@ int BN_lshift1(BIGNUM *r, const BIGNUM *a)
int BN_rshift1(BIGNUM *r, const BIGNUM *a) int BN_rshift1(BIGNUM *r, const BIGNUM *a)
{ {
BN_ULONG *ap, *rp, t, c; BN_ULONG *ap, *rp, t, c;
int i, j; int i;
bn_check_top(r); bn_check_top(r);
bn_check_top(a); bn_check_top(a);
...@@ -58,23 +56,22 @@ int BN_rshift1(BIGNUM *r, const BIGNUM *a) ...@@ -58,23 +56,22 @@ int BN_rshift1(BIGNUM *r, const BIGNUM *a)
} }
i = a->top; i = a->top;
ap = a->d; ap = a->d;
j = i - (ap[i - 1] == 1);
if (a != r) { if (a != r) {
if (bn_wexpand(r, j) == NULL) if (bn_wexpand(r, i) == NULL)
return 0; return 0;
r->neg = a->neg; r->neg = a->neg;
} }
rp = r->d; rp = r->d;
r->top = i;
t = ap[--i]; t = ap[--i];
c = (t & 1) ? BN_TBIT : 0; rp[i] = t >> 1;
if (t >>= 1) c = t << (BN_BITS2 - 1);
rp[i] = t; r->top -= (t == 1);
while (i > 0) { while (i > 0) {
t = ap[--i]; t = ap[--i];
rp[i] = ((t >> 1) & BN_MASK2) | c; rp[i] = ((t >> 1) & BN_MASK2) | c;
c = (t & 1) ? BN_TBIT : 0; c = t << (BN_BITS2 - 1);
} }
r->top = j;
if (!r->top) if (!r->top)
r->neg = 0; /* don't allow negative zero */ r->neg = 0; /* don't allow negative zero */
bn_check_top(r); bn_check_top(r);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册