diff options
Diffstat (limited to 'src/lib/libcrypto')
-rw-r--r-- | src/lib/libcrypto/bn/bn_sqr.c | 58 |
1 files changed, 23 insertions, 35 deletions
diff --git a/src/lib/libcrypto/bn/bn_sqr.c b/src/lib/libcrypto/bn/bn_sqr.c index 5ea1bd45b9..2879d34c0e 100644 --- a/src/lib/libcrypto/bn/bn_sqr.c +++ b/src/lib/libcrypto/bn/bn_sqr.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: bn_sqr.c,v 1.34 2023/06/24 17:06:54 jsing Exp $ */ | 1 | /* $OpenBSD: bn_sqr.c,v 1.35 2023/07/02 13:11:23 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -160,41 +160,45 @@ bn_sqr_comba8(BN_ULONG *r, const BN_ULONG *a) | |||
160 | } | 160 | } |
161 | #endif | 161 | #endif |
162 | 162 | ||
163 | #ifndef HAVE_BN_SQR_WORDS | 163 | #ifndef HAVE_BN_SQR |
164 | /* | 164 | /* |
165 | * bn_sqr_words() computes (r[i*2+1]:r[i*2]) = a[i] * a[i]. | 165 | * bn_sqr_add_words() computes (r[i*2+1]:r[i*2]) = (r[i*2+1]:r[i*2]) + a[i] * a[i]. |
166 | */ | 166 | */ |
167 | void | 167 | static void |
168 | bn_sqr_words(BN_ULONG *r, const BN_ULONG *a, int n) | 168 | bn_sqr_add_words(BN_ULONG *r, const BN_ULONG *a, int n) |
169 | { | 169 | { |
170 | BN_ULONG x3, x2, x1, x0; | ||
171 | BN_ULONG carry = 0; | ||
172 | |||
170 | assert(n >= 0); | 173 | assert(n >= 0); |
171 | if (n <= 0) | 174 | if (n <= 0) |
172 | return; | 175 | return; |
173 | 176 | ||
174 | #ifndef OPENSSL_SMALL_FOOTPRINT | ||
175 | while (n & ~3) { | 177 | while (n & ~3) { |
176 | bn_mulw(a[0], a[0], &r[1], &r[0]); | 178 | bn_mulw(a[0], a[0], &x1, &x0); |
177 | bn_mulw(a[1], a[1], &r[3], &r[2]); | 179 | bn_mulw(a[1], a[1], &x3, &x2); |
178 | bn_mulw(a[2], a[2], &r[5], &r[4]); | 180 | bn_qwaddqw(x3, x2, x1, x0, r[3], r[2], r[1], r[0], carry, |
179 | bn_mulw(a[3], a[3], &r[7], &r[6]); | 181 | &carry, &r[3], &r[2], &r[1], &r[0]); |
182 | bn_mulw(a[2], a[2], &x1, &x0); | ||
183 | bn_mulw(a[3], a[3], &x3, &x2); | ||
184 | bn_qwaddqw(x3, x2, x1, x0, r[7], r[6], r[5], r[4], carry, | ||
185 | &carry, &r[7], &r[6], &r[5], &r[4]); | ||
186 | |||
180 | a += 4; | 187 | a += 4; |
181 | r += 8; | 188 | r += 8; |
182 | n -= 4; | 189 | n -= 4; |
183 | } | 190 | } |
184 | #endif | ||
185 | while (n) { | 191 | while (n) { |
186 | bn_mulw(a[0], a[0], &r[1], &r[0]); | 192 | bn_mulw_addw_addw(a[0], a[0], r[0], carry, &carry, &r[0]); |
193 | bn_addw(r[1], carry, &carry, &r[1]); | ||
187 | a++; | 194 | a++; |
188 | r += 2; | 195 | r += 2; |
189 | n--; | 196 | n--; |
190 | } | 197 | } |
191 | } | 198 | } |
192 | #endif | ||
193 | 199 | ||
194 | #ifndef HAVE_BN_SQR | ||
195 | static void | 200 | static void |
196 | bn_sqr_normal(BN_ULONG *r, int r_len, const BN_ULONG *a, int a_len, | 201 | bn_sqr_normal(BN_ULONG *r, int r_len, const BN_ULONG *a, int a_len) |
197 | BN_ULONG *tmp) | ||
198 | { | 202 | { |
199 | const BN_ULONG *ap; | 203 | const BN_ULONG *ap; |
200 | BN_ULONG *rp; | 204 | BN_ULONG *rp; |
@@ -234,8 +238,7 @@ bn_sqr_normal(BN_ULONG *r, int r_len, const BN_ULONG *a, int a_len, | |||
234 | bn_add_words(r, r, r, r_len); | 238 | bn_add_words(r, r, r, r_len); |
235 | 239 | ||
236 | /* Add squares. */ | 240 | /* Add squares. */ |
237 | bn_sqr_words(tmp, a, a_len); | 241 | bn_sqr_add_words(r, a, a_len); |
238 | bn_add_words(r, r, tmp, r_len); | ||
239 | } | 242 | } |
240 | 243 | ||
241 | /* | 244 | /* |
@@ -246,24 +249,9 @@ bn_sqr_normal(BN_ULONG *r, int r_len, const BN_ULONG *a, int a_len, | |||
246 | int | 249 | int |
247 | bn_sqr(BIGNUM *r, const BIGNUM *a, int r_len, BN_CTX *ctx) | 250 | bn_sqr(BIGNUM *r, const BIGNUM *a, int r_len, BN_CTX *ctx) |
248 | { | 251 | { |
249 | BIGNUM *tmp; | 252 | bn_sqr_normal(r->d, r_len, a->d, a->top); |
250 | int ret = 0; | ||
251 | |||
252 | BN_CTX_start(ctx); | ||
253 | 253 | ||
254 | if ((tmp = BN_CTX_get(ctx)) == NULL) | 254 | return 1; |
255 | goto err; | ||
256 | if (!bn_wexpand(tmp, r_len)) | ||
257 | goto err; | ||
258 | |||
259 | bn_sqr_normal(r->d, r_len, a->d, a->top, tmp->d); | ||
260 | |||
261 | ret = 1; | ||
262 | |||
263 | err: | ||
264 | BN_CTX_end(ctx); | ||
265 | |||
266 | return ret; | ||
267 | } | 255 | } |
268 | #endif | 256 | #endif |
269 | 257 | ||