提交 55442b8a 编写于 作者: D Davide Galassi 提交者: Rich Salz

BIGNUM signed add/sub routines refactory

Old code replaced in favor of a clearer implementation.
Performances are not penalized.

Updated the copyright end date to 2018.
Reviewed-by: NDavid Benjamin <davidben@google.com>
Reviewed-by: NRich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/5963)
上级 9f2a3bb1
/* /*
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the OpenSSL license (the "License"). You may not use * Licensed under the OpenSSL license (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
...@@ -10,51 +10,69 @@ ...@@ -10,51 +10,69 @@
#include "internal/cryptlib.h" #include "internal/cryptlib.h"
#include "bn_lcl.h" #include "bn_lcl.h"
/* r can == a or b */ /* signed add of b to a. */
int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
{ {
int a_neg = a->neg, ret; int ret, r_neg, cmp_res;
bn_check_top(a); bn_check_top(a);
bn_check_top(b); bn_check_top(b);
/*- if (a->neg == b->neg) {
* a + b a+b r_neg = a->neg;
* a + -b a-b ret = BN_uadd(r, a, b);
* -a + b b-a } else {
* -a + -b -(a+b) cmp_res = BN_ucmp(a, b);
*/ if (cmp_res > 0) {
if (a_neg ^ b->neg) { r_neg = a->neg;
/* only one is negative */ ret = BN_usub(r, a, b);
if (a_neg) { } else if (cmp_res < 0) {
const BIGNUM *tmp; r_neg = b->neg;
ret = BN_usub(r, b, a);
tmp = a; } else {
a = b; r_neg = 0;
b = tmp; BN_zero(r);
ret = 1;
} }
}
r->neg = r_neg;
bn_check_top(r);
return ret;
}
/* signed sub of b from a. */
int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
{
int ret, r_neg, cmp_res;
/* we are now a - b */ bn_check_top(a);
bn_check_top(b);
if (BN_ucmp(a, b) < 0) { if (a->neg != b->neg) {
if (!BN_usub(r, b, a)) r_neg = a->neg;
return 0; ret = BN_uadd(r, a, b);
r->neg = 1; } else {
cmp_res = BN_ucmp(a, b);
if (cmp_res > 0) {
r_neg = a->neg;
ret = BN_usub(r, a, b);
} else if (cmp_res < 0) {
r_neg = !b->neg;
ret = BN_usub(r, b, a);
} else { } else {
if (!BN_usub(r, a, b)) r_neg = 0;
return 0; BN_zero(r);
r->neg = 0; ret = 1;
} }
return 1;
} }
ret = BN_uadd(r, a, b); r->neg = r_neg;
r->neg = a_neg;
bn_check_top(r); bn_check_top(r);
return ret; return ret;
} }
/* unsigned add of b to a */ /* unsigned add of b to a, r can be equal to a or b. */
int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
{ {
int max, min, dif; int max, min, dif;
...@@ -151,59 +169,3 @@ int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) ...@@ -151,59 +169,3 @@ int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
return 1; return 1;
} }
int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
{
int max;
int add = 0, neg = 0;
bn_check_top(a);
bn_check_top(b);
/*-
* a - b a-b
* a - -b a+b
* -a - b -(a+b)
* -a - -b b-a
*/
if (a->neg) {
if (b->neg) {
const BIGNUM *tmp;
tmp = a;
a = b;
b = tmp;
} else {
add = 1;
neg = 1;
}
} else {
if (b->neg) {
add = 1;
neg = 0;
}
}
if (add) {
if (!BN_uadd(r, a, b))
return 0;
r->neg = neg;
return 1;
}
/* We are actually doing a - b :-) */
max = (a->top > b->top) ? a->top : b->top;
if (bn_wexpand(r, max) == NULL)
return 0;
if (BN_ucmp(a, b) < 0) {
if (!BN_usub(r, b, a))
return 0;
r->neg = 1;
} else {
if (!BN_usub(r, a, b))
return 0;
r->neg = 0;
}
bn_check_top(r);
return 1;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册