Provide and use bn_clzw() in place of bn_word_clz().
authorjsing <jsing@openbsd.org>
Wed, 21 Jun 2023 07:48:41 +0000 (07:48 +0000)
committerjsing <jsing@openbsd.org>
Wed, 21 Jun 2023 07:48:41 +0000 (07:48 +0000)
On some architectures, we can provide an optimised (often single
instruction) count-leading-zero implementation. In order to do this
effectively, provide bn_clzw() as a static inline that can be replaced
by an architecture specific version. The default implementation defers
to the bn_word_clz() function (which may also be architecture specific).

ok tb@

lib/libcrypto/bn/bn_internal.h
lib/libcrypto/bn/bn_lib.c
lib/libcrypto/bn/bn_primitives.c

index f5c69c5..b712b73 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bn_internal.h,v 1.13 2023/06/21 07:41:55 jsing Exp $ */
+/*     $OpenBSD: bn_internal.h,v 1.14 2023/06/21 07:48:41 jsing Exp $ */
 /*
  * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
  *
@@ -58,6 +58,14 @@ bn_ct_eq_zero_mask(BN_ULONG w)
 }
 #endif
 
+#ifndef HAVE_BN_CLZW
+static inline int
+bn_clzw(BN_ULONG w)
+{
+       return bn_word_clz(w);
+}
+#endif
+
 /*
  * Big number primitives are named as the operation followed by a suffix
  * that indicates the number of words that it operates on, where 'w' means
index b8eb565..bac0290 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: bn_lib.c,v 1.87 2023/06/21 07:41:55 jsing Exp $ */
+/* $OpenBSD: bn_lib.c,v 1.88 2023/06/21 07:48:41 jsing Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -162,7 +162,7 @@ BN_value_one(void)
 int
 BN_num_bits_word(BN_ULONG w)
 {
-       return BN_BITS2 - bn_word_clz(w);
+       return BN_BITS2 - bn_clzw(w);
 }
 
 int
index e9caec4..66427a9 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: bn_primitives.c,v 1.1 2023/06/21 07:41:55 jsing Exp $ */
+/* $OpenBSD: bn_primitives.c,v 1.2 2023/06/21 07:48:41 jsing Exp $ */
 /*
  * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
  *
@@ -21,6 +21,7 @@
 #include "bn_internal.h"
 #include "bn_local.h"
 
+#ifndef HAVE_BN_CLZW
 #ifndef HAVE_BN_WORD_CLZ
 int
 bn_word_clz(BN_ULONG w)
@@ -41,6 +42,7 @@ bn_word_clz(BN_ULONG w)
        return BN_BITS2 - bits;
 }
 #endif
+#endif
 
 #ifndef HAVE_BN_BITSIZE
 int
@@ -58,6 +60,6 @@ bn_bitsize(const BIGNUM *bn)
                i++;
        }
 
-       return (n + 1) * BN_BITS2 - bn_word_clz(x);
+       return (n + 1) * BN_BITS2 - bn_clzw(x);
 }
 #endif