Rewrite bn_correct_top().
authorjsing <jsing@openbsd.org>
Wed, 30 Nov 2022 03:08:39 +0000 (03:08 +0000)
committerjsing <jsing@openbsd.org>
Wed, 30 Nov 2022 03:08:39 +0000 (03:08 +0000)
bn_correct_top() is currently a macro and far more complex than it needs
to be - rewrite it as a function.

ok tb@

lib/libcrypto/bn/bn_lib.c
lib/libcrypto/bn/bn_local.h

index df43da5..851c337 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: bn_lib.c,v 1.65 2022/11/30 02:52:25 jsing Exp $ */
+/* $OpenBSD: bn_lib.c,v 1.66 2022/11/30 03:08:39 jsing Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -253,6 +253,13 @@ BN_num_bits(const BIGNUM *a)
        return ((i * BN_BITS2) + BN_num_bits_word(a->d[i]));
 }
 
+void
+bn_correct_top(BIGNUM *a)
+{
+       while (a->top > 0 && a->d[a->top - 1] == 0)
+               a->top--;
+}
+
 /* The caller MUST check that words > b->dmax before calling this */
 static BN_ULONG *
 bn_expand_internal(const BIGNUM *b, int words)
index 7bddcb2..48d24c5 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: bn_local.h,v 1.2 2022/11/26 17:23:17 tb Exp $ */
+/* $OpenBSD: bn_local.h,v 1.3 2022/11/30 03:08:39 jsing Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -509,21 +509,10 @@ BN_ULONG bn_sub_part_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
     int cl, int dl);
 int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_ULONG *np, const BN_ULONG *n0, int num);
 
+void bn_correct_top(BIGNUM *a);
 int bn_expand(BIGNUM *a, int bits);
 int bn_wexpand(BIGNUM *a, int words);
 
-#define bn_correct_top(a) \
-        { \
-        BN_ULONG *ftl; \
-       int tmp_top = (a)->top; \
-       if (tmp_top > 0) \
-               { \
-               for (ftl= &((a)->d[tmp_top-1]); tmp_top > 0; tmp_top--) \
-                       if (*(ftl--)) break; \
-               (a)->top = tmp_top; \
-               } \
-       }
-
 BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w);
 BN_ULONG bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w);
 void     bn_sqr_words(BN_ULONG *rp, const BN_ULONG *ap, int num);