bn/bn_gf2m.c: make new BN_GF2m_mod_inv work with BN_DEBUG_RAND.
[openssl.git] / crypto / bn / bn_gf2m.c
index 70770a25365ec85c8543f121f0eb3e121f6e9d85..e54a701166a5f65e6aa535d80a58a9bdf17e21ef 100644 (file)
@@ -525,7 +525,7 @@ err:
  */
 int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
        {
-       BIGNUM *b, *c, *u, *v, *tmp;
+       BIGNUM *b, *c = NULL, *u = NULL, *v = NULL, *tmp;
        int ret = 0;
 
        bn_check_top(a);
@@ -631,8 +631,11 @@ int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
                        }
                if (ubits==vbits)
                        {
-                       bn_correct_top(u);
-                       ubits = BN_num_bits(u);
+                       BN_ULONG u;
+                       int utop = (ubits-1)/BN_BITS2;
+
+                       while ((u=udp[utop])==0 && utop) utop--;
+                       ubits = utop*BN_BITS2 + BN_num_bits_word(u);
                        }
                }
        bn_correct_top(b);
@@ -644,6 +647,11 @@ int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
        ret = 1;
 
 err:
+#ifdef BN_DEBUG /* BN_CTX_end would complain about the expanded form */
+        bn_correct_top(c);
+        bn_correct_top(u);
+        bn_correct_top(v);
+#endif
        BN_CTX_end(ctx);
        return ret;
        }