diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2021-11-27 16:07:42 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-11-27 16:24:49 +0100 |
commit | dcfd8d3d1013ba989fa511f44bb0553a88c1ef10 (patch) | |
tree | 60daf7a0b94df58752928f8f3f0ac3f80fe0ed02 | |
parent | 8cbb70365f653397c8c2b9370214d5aed36ec9fa (diff) | |
download | busybox-w32-dcfd8d3d1013ba989fa511f44bb0553a88c1ef10.tar.gz busybox-w32-dcfd8d3d1013ba989fa511f44bb0553a88c1ef10.tar.bz2 busybox-w32-dcfd8d3d1013ba989fa511f44bb0553a88c1ef10.zip |
tls: P256: fix sp_256_div2_8 - it wouldn't use a[] if low bit is 0
It worked by chance because the only caller passed both parameters
as two pointers to the same array.
My fault (I made this error when converting from 26-bit code).
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | networking/tls_sp_c32.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/networking/tls_sp_c32.c b/networking/tls_sp_c32.c index baed62f41..b3f7888f5 100644 --- a/networking/tls_sp_c32.c +++ b/networking/tls_sp_c32.c | |||
@@ -636,12 +636,14 @@ static void sp_256_rshift1_8(sp_digit* r, sp_digit carry) | |||
636 | } | 636 | } |
637 | #endif | 637 | #endif |
638 | 638 | ||
639 | /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m) */ | 639 | /* Divide the number by 2 mod the modulus (prime). (r = (r / 2) % m) */ |
640 | static void sp_256_div2_8(sp_digit* r, const sp_digit* a, const sp_digit* m) | 640 | static void sp_256_div2_8(sp_digit* r /*, const sp_digit* m*/) |
641 | { | 641 | { |
642 | const sp_digit* m = p256_mod; | ||
643 | |||
642 | int carry = 0; | 644 | int carry = 0; |
643 | if (a[0] & 1) | 645 | if (r[0] & 1) |
644 | carry = sp_256_add_8(r, a, m); | 646 | carry = sp_256_add_8(r, r, m); |
645 | sp_256_norm_8(r); | 647 | sp_256_norm_8(r); |
646 | sp_256_rshift1_8(r, carry); | 648 | sp_256_rshift1_8(r, carry); |
647 | } | 649 | } |
@@ -1125,7 +1127,7 @@ static void sp_256_proj_point_dbl_8(sp_point* r, sp_point* p) | |||
1125 | /* T2 = Y * Y */ | 1127 | /* T2 = Y * Y */ |
1126 | sp_256to512z_mont_sqr_8(t2, r->y /*, p256_mod, p256_mp_mod*/); | 1128 | sp_256to512z_mont_sqr_8(t2, r->y /*, p256_mod, p256_mp_mod*/); |
1127 | /* T2 = T2/2 */ | 1129 | /* T2 = T2/2 */ |
1128 | sp_256_div2_8(t2, t2, p256_mod); | 1130 | sp_256_div2_8(t2 /*, p256_mod*/); |
1129 | /* Y = Y * X */ | 1131 | /* Y = Y * X */ |
1130 | sp_256to512z_mont_mul_8(r->y, r->y, r->x /*, p256_mod, p256_mp_mod*/); | 1132 | sp_256to512z_mont_mul_8(r->y, r->y, r->x /*, p256_mod, p256_mp_mod*/); |
1131 | /* X = T1 * T1 */ | 1133 | /* X = T1 * T1 */ |