summaryrefslogtreecommitdiff
path: root/lib/libcrypto/bn/bn_mul.c
diff options
context:
space:
mode:
authorJoel Sing <jsing@cvs.openbsd.org>2023-02-22 05:57:20 +0000
committerJoel Sing <jsing@cvs.openbsd.org>2023-02-22 05:57:20 +0000
commit4826d4106d2ad507dc1a9814d97df14990e871cc (patch)
tree8c20230faee02e8a5ba4e1c84ac77f7382510fd4 /lib/libcrypto/bn/bn_mul.c
parent04edc08a299f292c602a63564a2ec0f4c3510c9a (diff)
Replace bn_sub_part_words() with bn_sub().
Now that bn_sub() handles word arrays with potentially different lengths, we no longer need bn_sub_part_words() - call bn_sub() instead. This allows us to entirely remove the unnecessarily complex bn_sub_part_words() code. ok tb@
Diffstat (limited to 'lib/libcrypto/bn/bn_mul.c')
-rw-r--r--lib/libcrypto/bn/bn_mul.c172
1 files changed, 17 insertions, 155 deletions
diff --git a/lib/libcrypto/bn/bn_mul.c b/lib/libcrypto/bn/bn_mul.c
index 1d56e57b76b..5e270b988f3 100644
--- a/lib/libcrypto/bn/bn_mul.c
+++ b/lib/libcrypto/bn/bn_mul.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bn_mul.c,v 1.33 2023/02/15 18:10:16 jsing Exp $ */
+/* $OpenBSD: bn_mul.c,v 1.34 2023/02/22 05:57:19 jsing Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
@@ -269,144 +269,6 @@ bn_mul_add_words(BN_ULONG *r, const BN_ULONG *a, int num, BN_ULONG w)
}
#endif
-#if defined(OPENSSL_NO_ASM) || !defined(OPENSSL_BN_ASM_PART_WORDS)
-/*
- * Here follows a specialised variant of bn_sub_words(), which has the property
- * performing operations on arrays of different sizes. The sizes of those arrays
- * is expressed through cl, which is the common length (basically,
- * min(len(a),len(b))), and dl, which is the delta between the two lengths,
- * calculated as len(a)-len(b). All lengths are the number of BN_ULONGs. For the
- * operations that require a result array as parameter, it must have the length
- * cl+abs(dl).
- */
-BN_ULONG
-bn_sub_part_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int cl,
- int dl)
-{
- BN_ULONG c, t;
-
- assert(cl >= 0);
- c = bn_sub_words(r, a, b, cl);
-
- if (dl == 0)
- return c;
-
- r += cl;
- a += cl;
- b += cl;
-
- if (dl < 0) {
- for (;;) {
- t = b[0];
- r[0] = (0 - t - c) & BN_MASK2;
- if (t != 0)
- c = 1;
- if (++dl >= 0)
- break;
-
- t = b[1];
- r[1] = (0 - t - c) & BN_MASK2;
- if (t != 0)
- c = 1;
- if (++dl >= 0)
- break;
-
- t = b[2];
- r[2] = (0 - t - c) & BN_MASK2;
- if (t != 0)
- c = 1;
- if (++dl >= 0)
- break;
-
- t = b[3];
- r[3] = (0 - t - c) & BN_MASK2;
- if (t != 0)
- c = 1;
- if (++dl >= 0)
- break;
-
- b += 4;
- r += 4;
- }
- } else {
- int save_dl = dl;
- while (c) {
- t = a[0];
- r[0] = (t - c) & BN_MASK2;
- if (t != 0)
- c = 0;
- if (--dl <= 0)
- break;
-
- t = a[1];
- r[1] = (t - c) & BN_MASK2;
- if (t != 0)
- c = 0;
- if (--dl <= 0)
- break;
-
- t = a[2];
- r[2] = (t - c) & BN_MASK2;
- if (t != 0)
- c = 0;
- if (--dl <= 0)
- break;
-
- t = a[3];
- r[3] = (t - c) & BN_MASK2;
- if (t != 0)
- c = 0;
- if (--dl <= 0)
- break;
-
- save_dl = dl;
- a += 4;
- r += 4;
- }
- if (dl > 0) {
- if (save_dl > dl) {
- switch (save_dl - dl) {
- case 1:
- r[1] = a[1];
- if (--dl <= 0)
- break;
- case 2:
- r[2] = a[2];
- if (--dl <= 0)
- break;
- case 3:
- r[3] = a[3];
- if (--dl <= 0)
- break;
- }
- a += 4;
- r += 4;
- }
- }
- if (dl > 0) {
- for (;;) {
- r[0] = a[0];
- if (--dl <= 0)
- break;
- r[1] = a[1];
- if (--dl <= 0)
- break;
- r[2] = a[2];
- if (--dl <= 0)
- break;
- r[3] = a[3];
- if (--dl <= 0)
- break;
-
- a += 4;
- r += 4;
- }
- }
- }
- return c;
-}
-#endif
-
void
bn_mul_normal(BN_ULONG *r, BN_ULONG *a, int na, BN_ULONG *b, int nb)
{
@@ -504,15 +366,15 @@ bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2, int dna,
zero = neg = 0;
switch (c1 * 3 + c2) {
case -4:
- bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */
- bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */
+ bn_sub(t, n, &a[n], tna, a, n); /* - */
+ bn_sub(&t[n], n, b, n, &b[n], tnb); /* - */
break;
case -3:
zero = 1;
break;
case -2:
- bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */
- bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); /* + */
+ bn_sub(t, n, &a[n], tna, a, n); /* - */
+ bn_sub(&t[n], n, &b[n], tnb, b, n); /* + */
neg = 1;
break;
case -1:
@@ -521,16 +383,16 @@ bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2, int dna,
zero = 1;
break;
case 2:
- bn_sub_part_words(t, a, &(a[n]), tna, n - tna); /* + */
- bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */
+ bn_sub(t, n, a, n, &a[n], tna); /* + */
+ bn_sub(&t[n], n, b, n, &b[n], tnb); /* - */
neg = 1;
break;
case 3:
zero = 1;
break;
case 4:
- bn_sub_part_words(t, a, &(a[n]), tna, n - tna);
- bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n);
+ bn_sub(t, n, a, n, &a[n], tna);
+ bn_sub(&t[n], n, &b[n], tnb, b, n);
break;
}
@@ -630,14 +492,14 @@ bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n, int tna,
neg = 0;
switch (c1 * 3 + c2) {
case -4:
- bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */
- bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */
+ bn_sub(t, n, &a[n], tna, a, n); /* - */
+ bn_sub(&t[n], n, b, n, &b[n], tnb); /* - */
break;
case -3:
/* break; */
case -2:
- bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */
- bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); /* + */
+ bn_sub(t, n, &a[n], tna, a, n); /* - */
+ bn_sub(&t[n], n, &b[n], tnb, b, n); /* + */
neg = 1;
break;
case -1:
@@ -645,15 +507,15 @@ bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n, int tna,
case 1:
/* break; */
case 2:
- bn_sub_part_words(t, a, &(a[n]), tna, n - tna); /* + */
- bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */
+ bn_sub(t, n, a, n, &a[n], tna); /* + */
+ bn_sub(&t[n], n, b, n, &b[n], tnb); /* - */
neg = 1;
break;
case 3:
/* break; */
case 4:
- bn_sub_part_words(t, a, &(a[n]), tna, n - tna);
- bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n);
+ bn_sub(t, n, a, n, &a[n], tna);
+ bn_sub(&t[n], n, &b[n], tnb, b, n);
break;
}
/* The zero case isn't yet implemented here. The speedup