diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/bn/arch/amd64/bn_arch.c | 6 | ||||
| -rw-r--r-- | src/lib/libcrypto/bn/bn_local.h | 3 | ||||
| -rw-r--r-- | src/lib/libcrypto/bn/bn_sqr.c | 74 |
3 files changed, 44 insertions, 39 deletions
diff --git a/src/lib/libcrypto/bn/arch/amd64/bn_arch.c b/src/lib/libcrypto/bn/arch/amd64/bn_arch.c index 55275aa14e..a377a05681 100644 --- a/src/lib/libcrypto/bn/arch/amd64/bn_arch.c +++ b/src/lib/libcrypto/bn/arch/amd64/bn_arch.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: bn_arch.c,v 1.6 2023/02/22 05:46:37 jsing Exp $ */ | 1 | /* $OpenBSD: bn_arch.c,v 1.7 2023/06/24 16:01:44 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2023 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2023 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -96,9 +96,9 @@ bn_mul_comba8(BN_ULONG *rd, BN_ULONG *ad, BN_ULONG *bd) | |||
| 96 | 96 | ||
| 97 | #ifdef HAVE_BN_SQR | 97 | #ifdef HAVE_BN_SQR |
| 98 | int | 98 | int |
| 99 | bn_sqr(BIGNUM *r, const BIGNUM *a, int rn, BN_CTX *ctx) | 99 | bn_sqr(BIGNUM *r, const BIGNUM *a, int r_len, BN_CTX *ctx) |
| 100 | { | 100 | { |
| 101 | bignum_sqr(rn, (uint64_t *)r->d, a->top, (uint64_t *)a->d); | 101 | bignum_sqr(r_len, (uint64_t *)r->d, a->top, (uint64_t *)a->d); |
| 102 | 102 | ||
| 103 | return 1; | 103 | return 1; |
| 104 | } | 104 | } |
diff --git a/src/lib/libcrypto/bn/bn_local.h b/src/lib/libcrypto/bn/bn_local.h index c86e4d032b..17f5447bec 100644 --- a/src/lib/libcrypto/bn/bn_local.h +++ b/src/lib/libcrypto/bn/bn_local.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: bn_local.h,v 1.23 2023/06/21 07:41:55 jsing Exp $ */ | 1 | /* $OpenBSD: bn_local.h,v 1.24 2023/06/24 16:01:43 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 | * |
| @@ -252,7 +252,6 @@ void bn_mul_normal(BN_ULONG *r, BN_ULONG *a, int na, BN_ULONG *b, int nb); | |||
| 252 | void bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b); | 252 | void bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b); |
| 253 | void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b); | 253 | void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b); |
| 254 | 254 | ||
| 255 | void bn_sqr_normal(BN_ULONG *r, const BN_ULONG *a, int n, BN_ULONG *tmp); | ||
| 256 | void bn_sqr_comba4(BN_ULONG *r, const BN_ULONG *a); | 255 | void bn_sqr_comba4(BN_ULONG *r, const BN_ULONG *a); |
| 257 | void bn_sqr_comba8(BN_ULONG *r, const BN_ULONG *a); | 256 | void bn_sqr_comba8(BN_ULONG *r, const BN_ULONG *a); |
| 258 | 257 | ||
diff --git a/src/lib/libcrypto/bn/bn_sqr.c b/src/lib/libcrypto/bn/bn_sqr.c index d414800feb..4eab796c90 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.30 2023/04/19 10:51:22 jsing Exp $ */ | 1 | /* $OpenBSD: bn_sqr.c,v 1.31 2023/06/24 16:01:43 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 | * |
| @@ -191,52 +191,58 @@ bn_sqr_words(BN_ULONG *r, const BN_ULONG *a, int n) | |||
| 191 | } | 191 | } |
| 192 | #endif | 192 | #endif |
| 193 | 193 | ||
| 194 | /* tmp must have 2*n words */ | 194 | #ifndef HAVE_BN_SQR |
| 195 | void | 195 | static void |
| 196 | bn_sqr_normal(BN_ULONG *r, const BN_ULONG *a, int n, BN_ULONG *tmp) | 196 | bn_sqr_normal(BN_ULONG *r, int r_len, const BN_ULONG *a, int a_len, |
| 197 | BN_ULONG *tmp) | ||
| 197 | { | 198 | { |
| 198 | int i, j, max; | ||
| 199 | const BN_ULONG *ap; | 199 | const BN_ULONG *ap; |
| 200 | BN_ULONG *rp; | 200 | BN_ULONG *rp; |
| 201 | BN_ULONG w; | ||
| 202 | int n; | ||
| 203 | |||
| 204 | if (a_len <= 0) | ||
| 205 | return; | ||
| 201 | 206 | ||
| 202 | max = n * 2; | ||
| 203 | ap = a; | 207 | ap = a; |
| 208 | w = ap[0]; | ||
| 209 | ap++; | ||
| 210 | |||
| 204 | rp = r; | 211 | rp = r; |
| 205 | rp[0] = rp[max - 1] = 0; | 212 | rp[0] = rp[r_len - 1] = 0; |
| 206 | rp++; | 213 | rp++; |
| 207 | j = n; | ||
| 208 | 214 | ||
| 209 | if (--j > 0) { | 215 | /* Compute initial product - r[n:1] = a[n:1] * a[0] */ |
| 210 | ap++; | 216 | n = a_len - 1; |
| 211 | rp[j] = bn_mul_words(rp, ap, j, ap[-1]); | 217 | rp[n] = bn_mul_words(rp, ap, n, w); |
| 212 | rp += 2; | 218 | rp += 2; |
| 213 | } | 219 | n--; |
| 214 | 220 | ||
| 215 | for (i = n - 2; i > 0; i--) { | 221 | /* Compute and sum remaining products. */ |
| 216 | j--; | 222 | while (n > 0) { |
| 223 | w = ap[0]; | ||
| 217 | ap++; | 224 | ap++; |
| 218 | rp[j] = bn_mul_add_words(rp, ap, j, ap[-1]); | 225 | |
| 226 | rp[n] = bn_mul_add_words(rp, ap, n, w); | ||
| 219 | rp += 2; | 227 | rp += 2; |
| 228 | n--; | ||
| 220 | } | 229 | } |
| 221 | 230 | ||
| 222 | bn_add_words(r, r, r, max); | 231 | /* Double the sum of products. */ |
| 223 | 232 | bn_add_words(r, r, r, r_len); | |
| 224 | /* There will not be a carry */ | ||
| 225 | |||
| 226 | bn_sqr_words(tmp, a, n); | ||
| 227 | 233 | ||
| 228 | bn_add_words(r, r, tmp, max); | 234 | /* Add squares. */ |
| 235 | bn_sqr_words(tmp, a, a_len); | ||
| 236 | bn_add_words(r, r, tmp, r_len); | ||
| 229 | } | 237 | } |
| 230 | 238 | ||
| 231 | |||
| 232 | /* | 239 | /* |
| 233 | * bn_sqr() computes a * a, storing the result in r. The caller must ensure that | 240 | * bn_sqr() computes a * a, storing the result in r. The caller must ensure that |
| 234 | * r is not the same BIGNUM as a and that r has been expanded to rn = a->top * 2 | 241 | * r is not the same BIGNUM as a and that r has been expanded to rn = a->top * 2 |
| 235 | * words. | 242 | * words. |
| 236 | */ | 243 | */ |
| 237 | #ifndef HAVE_BN_SQR | ||
| 238 | int | 244 | int |
| 239 | bn_sqr(BIGNUM *r, const BIGNUM *a, int rn, BN_CTX *ctx) | 245 | bn_sqr(BIGNUM *r, const BIGNUM *a, int r_len, BN_CTX *ctx) |
| 240 | { | 246 | { |
| 241 | BIGNUM *tmp; | 247 | BIGNUM *tmp; |
| 242 | int ret = 0; | 248 | int ret = 0; |
| @@ -245,10 +251,10 @@ bn_sqr(BIGNUM *r, const BIGNUM *a, int rn, BN_CTX *ctx) | |||
| 245 | 251 | ||
| 246 | if ((tmp = BN_CTX_get(ctx)) == NULL) | 252 | if ((tmp = BN_CTX_get(ctx)) == NULL) |
| 247 | goto err; | 253 | goto err; |
| 248 | 254 | if (!bn_wexpand(tmp, r_len)) | |
| 249 | if (!bn_wexpand(tmp, rn)) | ||
| 250 | goto err; | 255 | goto err; |
| 251 | bn_sqr_normal(r->d, a->d, a->top, tmp->d); | 256 | |
| 257 | bn_sqr_normal(r->d, r_len, a->d, a->top, tmp->d); | ||
| 252 | 258 | ||
| 253 | ret = 1; | 259 | ret = 1; |
| 254 | 260 | ||
| @@ -263,7 +269,7 @@ int | |||
| 263 | BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) | 269 | BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) |
| 264 | { | 270 | { |
| 265 | BIGNUM *rr; | 271 | BIGNUM *rr; |
| 266 | int rn; | 272 | int r_len; |
| 267 | int ret = 1; | 273 | int ret = 1; |
| 268 | 274 | ||
| 269 | BN_CTX_start(ctx); | 275 | BN_CTX_start(ctx); |
| @@ -278,10 +284,10 @@ BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) | |||
| 278 | if (rr == NULL) | 284 | if (rr == NULL) |
| 279 | goto err; | 285 | goto err; |
| 280 | 286 | ||
| 281 | rn = a->top * 2; | 287 | r_len = a->top * 2; |
| 282 | if (rn < a->top) | 288 | if (r_len < a->top) |
| 283 | goto err; | 289 | goto err; |
| 284 | if (!bn_wexpand(rr, rn)) | 290 | if (!bn_wexpand(rr, r_len)) |
| 285 | goto err; | 291 | goto err; |
| 286 | 292 | ||
| 287 | if (a->top == 4) { | 293 | if (a->top == 4) { |
| @@ -289,11 +295,11 @@ BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) | |||
| 289 | } else if (a->top == 8) { | 295 | } else if (a->top == 8) { |
| 290 | bn_sqr_comba8(rr->d, a->d); | 296 | bn_sqr_comba8(rr->d, a->d); |
| 291 | } else { | 297 | } else { |
| 292 | if (!bn_sqr(rr, a, rn, ctx)) | 298 | if (!bn_sqr(rr, a, r_len, ctx)) |
| 293 | goto err; | 299 | goto err; |
| 294 | } | 300 | } |
| 295 | 301 | ||
| 296 | rr->top = rn; | 302 | rr->top = r_len; |
| 297 | bn_correct_top(rr); | 303 | bn_correct_top(rr); |
| 298 | 304 | ||
| 299 | rr->neg = 0; | 305 | rr->neg = 0; |
