Move bn_mul_add_words() and bn_mul_words() from bn_asm.c to bn_mul.c.
authorjsing <jsing@openbsd.org>
Mon, 23 Jan 2023 12:17:57 +0000 (12:17 +0000)
committerjsing <jsing@openbsd.org>
Mon, 23 Jan 2023 12:17:57 +0000 (12:17 +0000)
These are wrapped with #ifndef HAVE_BN_ADD_MUL_WORDS/HAVE_BN_MUL_WORDS,
which are defined for architectures that provide their own assembly
versions.

lib/libcrypto/bn/arch/amd64/bn_arch.h
lib/libcrypto/bn/arch/i386/bn_arch.h
lib/libcrypto/bn/arch/mips64/bn_arch.h
lib/libcrypto/bn/arch/powerpc/bn_arch.h
lib/libcrypto/bn/arch/sparc/bn_arch.h
lib/libcrypto/bn/bn_asm.c
lib/libcrypto/bn/bn_mul.c

index e8c9986..065f6b1 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bn_arch.h,v 1.6 2023/01/23 12:09:06 jsing Exp $ */
+/*     $OpenBSD: bn_arch.h,v 1.7 2023/01/23 12:17:57 jsing Exp $ */
 /*
  * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
  *
 
 #define HAVE_BN_DIV_WORDS
 
+#define HAVE_BN_MUL_ADD_WORDS
 #define HAVE_BN_MUL_COMBA4
 #define HAVE_BN_MUL_COMBA8
+#define HAVE_BN_MUL_WORDS
 
 #define HAVE_BN_SQR
 #define HAVE_BN_SQR_COMBA4
index eeb2735..681c209 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bn_arch.h,v 1.5 2023/01/23 12:09:06 jsing Exp $ */
+/*     $OpenBSD: bn_arch.h,v 1.6 2023/01/23 12:17:57 jsing Exp $ */
 /*
  * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
  *
 
 #define HAVE_BN_DIV_WORDS
 
+#define HAVE_BN_MUL_ADD_WORDS
 #define HAVE_BN_MUL_COMBA4
 #define HAVE_BN_MUL_COMBA8
+#define HAVE_BN_MUL_WORDS
 
 #define HAVE_BN_SQR_COMBA4
 #define HAVE_BN_SQR_COMBA8
index f767661..53771bc 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bn_arch.h,v 1.6 2023/01/23 12:09:06 jsing Exp $ */
+/*     $OpenBSD: bn_arch.h,v 1.7 2023/01/23 12:17:58 jsing Exp $ */
 /*
  * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
  *
 #define HAVE_BN_DIV_WORDS
 #define HAVE_BN_DIV_3_WORDS
 
+#define HAVE_BN_MUL_ADD_WORDS
 #define HAVE_BN_MUL_COMBA4
 #define HAVE_BN_MUL_COMBA8
+#define HAVE_BN_MUL_WORDS
 
 #define HAVE_BN_SQR_COMBA4
 #define HAVE_BN_SQR_COMBA8
index eeb2735..46e932a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bn_arch.h,v 1.5 2023/01/23 12:09:06 jsing Exp $ */
+/*     $OpenBSD: bn_arch.h,v 1.6 2023/01/23 12:17:58 jsing Exp $ */
 /*
  * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
  *
 
 #define HAVE_BN_DIV_WORDS
 
+#define HAVE_BN_MUL_ADD_WORDS
 #define HAVE_BN_MUL_COMBA4
 #define HAVE_BN_MUL_COMBA8
+#define HAVE_BN_MUL_WORDS
 
 #define HAVE_BN_SQR_COMBA4
 #define HAVE_BN_SQR_COMBA8
index eeb2735..46e932a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bn_arch.h,v 1.5 2023/01/23 12:09:06 jsing Exp $ */
+/*     $OpenBSD: bn_arch.h,v 1.6 2023/01/23 12:17:58 jsing Exp $ */
 /*
  * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
  *
 
 #define HAVE_BN_DIV_WORDS
 
+#define HAVE_BN_MUL_ADD_WORDS
 #define HAVE_BN_MUL_COMBA4
 #define HAVE_BN_MUL_COMBA8
+#define HAVE_BN_MUL_WORDS
 
 #define HAVE_BN_SQR_COMBA4
 #define HAVE_BN_SQR_COMBA8
index 143c939..e2b584e 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: bn_asm.c,v 1.22 2023/01/23 12:09:06 jsing Exp $ */
+/* $OpenBSD: bn_asm.c,v 1.23 2023/01/23 12:17:57 jsing Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
 
 #include "bn_local.h"
 
-#if defined(BN_LLONG) || defined(BN_UMULT_HIGH)
-
-BN_ULONG
-bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w)
-{
-       BN_ULONG c1 = 0;
-
-       assert(num >= 0);
-       if (num <= 0)
-               return (c1);
-
-#ifndef OPENSSL_SMALL_FOOTPRINT
-       while (num & ~3) {
-               mul_add(rp[0], ap[0], w, c1);
-               mul_add(rp[1], ap[1], w, c1);
-               mul_add(rp[2], ap[2], w, c1);
-               mul_add(rp[3], ap[3], w, c1);
-               ap += 4;
-               rp += 4;
-               num -= 4;
-       }
-#endif
-       while (num) {
-               mul_add(rp[0], ap[0], w, c1);
-               ap++;
-               rp++;
-               num--;
-       }
-
-       return (c1);
-}
-
-BN_ULONG
-bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w)
-{
-       BN_ULONG c1 = 0;
-
-       assert(num >= 0);
-       if (num <= 0)
-               return (c1);
-
-#ifndef OPENSSL_SMALL_FOOTPRINT
-       while (num & ~3) {
-               mul(rp[0], ap[0], w, c1);
-               mul(rp[1], ap[1], w, c1);
-               mul(rp[2], ap[2], w, c1);
-               mul(rp[3], ap[3], w, c1);
-               ap += 4;
-               rp += 4;
-               num -= 4;
-       }
-#endif
-       while (num) {
-               mul(rp[0], ap[0], w, c1);
-               ap++;
-               rp++;
-               num--;
-       }
-       return (c1);
-}
-
-#else /* !(defined(BN_LLONG) || defined(BN_UMULT_HIGH)) */
-
-BN_ULONG
-bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w)
-{
-       BN_ULONG c = 0;
-       BN_ULONG bl, bh;
-
-       assert(num >= 0);
-       if (num <= 0)
-               return ((BN_ULONG)0);
-
-       bl = LBITS(w);
-       bh = HBITS(w);
-
-#ifndef OPENSSL_SMALL_FOOTPRINT
-       while (num & ~3) {
-               mul_add(rp[0], ap[0], bl, bh, c);
-               mul_add(rp[1], ap[1], bl, bh, c);
-               mul_add(rp[2], ap[2], bl, bh, c);
-               mul_add(rp[3], ap[3], bl, bh, c);
-               ap += 4;
-               rp += 4;
-               num -= 4;
-       }
-#endif
-       while (num) {
-               mul_add(rp[0], ap[0], bl, bh, c);
-               ap++;
-               rp++;
-               num--;
-       }
-       return (c);
-}
-
-BN_ULONG
-bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w)
-{
-       BN_ULONG carry = 0;
-       BN_ULONG bl, bh;
-
-       assert(num >= 0);
-       if (num <= 0)
-               return ((BN_ULONG)0);
-
-       bl = LBITS(w);
-       bh = HBITS(w);
-
-#ifndef OPENSSL_SMALL_FOOTPRINT
-       while (num & ~3) {
-               mul(rp[0], ap[0], bl, bh, carry);
-               mul(rp[1], ap[1], bl, bh, carry);
-               mul(rp[2], ap[2], bl, bh, carry);
-               mul(rp[3], ap[3], bl, bh, carry);
-               ap += 4;
-               rp += 4;
-               num -= 4;
-       }
-#endif
-       while (num) {
-               mul(rp[0], ap[0], bl, bh, carry);
-               ap++;
-               rp++;
-               num--;
-       }
-       return (carry);
-}
-
-#endif /* !(defined(BN_LLONG) || defined(BN_UMULT_HIGH)) */
-
 #if defined(BN_MUL_COMBA) && !defined(OPENSSL_SMALL_FOOTPRINT)
 
 #ifdef OPENSSL_NO_ASM
index 3bf8ce6..bd67910 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: bn_mul.c,v 1.29 2023/01/21 15:40:13 jsing Exp $ */
+/* $OpenBSD: bn_mul.c,v 1.30 2023/01/23 12:17:57 jsing Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
 #include "bn_arch.h"
 #include "bn_local.h"
 
+#ifndef HAVE_BN_MUL_ADD_WORDS
+#if defined(BN_LLONG) || defined(BN_UMULT_HIGH)
+
+BN_ULONG
+bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w)
+{
+       BN_ULONG c1 = 0;
+
+       assert(num >= 0);
+       if (num <= 0)
+               return (c1);
+
+#ifndef OPENSSL_SMALL_FOOTPRINT
+       while (num & ~3) {
+               mul_add(rp[0], ap[0], w, c1);
+               mul_add(rp[1], ap[1], w, c1);
+               mul_add(rp[2], ap[2], w, c1);
+               mul_add(rp[3], ap[3], w, c1);
+               ap += 4;
+               rp += 4;
+               num -= 4;
+       }
+#endif
+       while (num) {
+               mul_add(rp[0], ap[0], w, c1);
+               ap++;
+               rp++;
+               num--;
+       }
+
+       return (c1);
+}
+
+#else /* !(defined(BN_LLONG) || defined(BN_UMULT_HIGH)) */
+
+BN_ULONG
+bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w)
+{
+       BN_ULONG c = 0;
+       BN_ULONG bl, bh;
+
+       assert(num >= 0);
+       if (num <= 0)
+               return ((BN_ULONG)0);
+
+       bl = LBITS(w);
+       bh = HBITS(w);
+
+#ifndef OPENSSL_SMALL_FOOTPRINT
+       while (num & ~3) {
+               mul_add(rp[0], ap[0], bl, bh, c);
+               mul_add(rp[1], ap[1], bl, bh, c);
+               mul_add(rp[2], ap[2], bl, bh, c);
+               mul_add(rp[3], ap[3], bl, bh, c);
+               ap += 4;
+               rp += 4;
+               num -= 4;
+       }
+#endif
+       while (num) {
+               mul_add(rp[0], ap[0], bl, bh, c);
+               ap++;
+               rp++;
+               num--;
+       }
+       return (c);
+}
+
+#endif /* !(defined(BN_LLONG) || defined(BN_UMULT_HIGH)) */
+#endif
+
 #ifndef HAVE_BN_MUL_COMBA4
 void
 bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b)
@@ -213,6 +284,74 @@ bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b)
 }
 #endif
 
+#ifndef HAVE_BN_MUL_WORDS
+#if defined(BN_LLONG) || defined(BN_UMULT_HIGH)
+
+BN_ULONG
+bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w)
+{
+       BN_ULONG c1 = 0;
+
+       assert(num >= 0);
+       if (num <= 0)
+               return (c1);
+
+#ifndef OPENSSL_SMALL_FOOTPRINT
+       while (num & ~3) {
+               mul(rp[0], ap[0], w, c1);
+               mul(rp[1], ap[1], w, c1);
+               mul(rp[2], ap[2], w, c1);
+               mul(rp[3], ap[3], w, c1);
+               ap += 4;
+               rp += 4;
+               num -= 4;
+       }
+#endif
+       while (num) {
+               mul(rp[0], ap[0], w, c1);
+               ap++;
+               rp++;
+               num--;
+       }
+       return (c1);
+}
+#else /* !(defined(BN_LLONG) || defined(BN_UMULT_HIGH)) */
+
+BN_ULONG
+bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w)
+{
+       BN_ULONG carry = 0;
+       BN_ULONG bl, bh;
+
+       assert(num >= 0);
+       if (num <= 0)
+               return ((BN_ULONG)0);
+
+       bl = LBITS(w);
+       bh = HBITS(w);
+
+#ifndef OPENSSL_SMALL_FOOTPRINT
+       while (num & ~3) {
+               mul(rp[0], ap[0], bl, bh, carry);
+               mul(rp[1], ap[1], bl, bh, carry);
+               mul(rp[2], ap[2], bl, bh, carry);
+               mul(rp[3], ap[3], bl, bh, carry);
+               ap += 4;
+               rp += 4;
+               num -= 4;
+       }
+#endif
+       while (num) {
+               mul(rp[0], ap[0], bl, bh, carry);
+               ap++;
+               rp++;
+               num--;
+       }
+       return (carry);
+}
+#endif /* !(defined(BN_LLONG) || defined(BN_UMULT_HIGH)) */
+#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