Reduce integrated LibTomMath size by dropping negative exponent support
authorJouni Malinen <j@w1.fi>
Wed, 4 Jun 2008 08:26:52 +0000 (11:26 +0300)
committerJouni Malinen <j@w1.fi>
Wed, 4 Jun 2008 08:26:52 +0000 (11:26 +0300)
Current uses do not require support for negative exponent in exptmod, so we
can save about 1.5 kB in leaving out invmod.

src/tls/libtommath.c

index b637707..f5442ff 100644 (file)
@@ -30,6 +30,9 @@
 #define BN_S_MP_MUL_HIGH_DIGS_C /* Note: #undef in tommath_superclass.h; this
                                 * would require other than mp_reduce */
 
+/* Current uses do not require support for negative exponent in exptmod, so we
+ * can save about 1.5 kB in leaving out invmod. */
+#define LTM_NO_NEG_EXP
 
 /* from tommath.h */
 
@@ -122,16 +125,18 @@ static int mp_mod_2d(mp_int * a, int b, mp_int * c);
 static int mp_div_2d(mp_int * a, int b, mp_int * c, mp_int * d);
 static int mp_init_copy(mp_int * a, mp_int * b);
 static int mp_mul_2d(mp_int * a, int b, mp_int * c);
+#ifndef LTM_NO_NEG_EXP
 static int mp_div_2(mp_int * a, mp_int * b);
+static int mp_invmod(mp_int * a, mp_int * b, mp_int * c);
+static int mp_invmod_slow(mp_int * a, mp_int * b, mp_int * c);
+#endif /* LTM_NO_NEG_EXP */
 static int mp_copy(mp_int * a, mp_int * b);
 static int mp_count_bits(mp_int * a);
 static int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d);
 static int mp_mod(mp_int * a, mp_int * b, mp_int * c);
 static int mp_grow(mp_int * a, int size);
 static int mp_cmp_mag(mp_int * a, mp_int * b);
-static int mp_invmod(mp_int * a, mp_int * b, mp_int * c);
 static int mp_abs(mp_int * a, mp_int * b);
-static int mp_invmod_slow(mp_int * a, mp_int * b, mp_int * c);
 static int mp_sqr(mp_int * a, mp_int * b);
 static int mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d);
 static int mp_reduce_2k_setup_l(mp_int *a, mp_int *d);
@@ -546,6 +551,9 @@ static int mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y)
 
   /* if exponent X is negative we have to recurse */
   if (X->sign == MP_NEG) {
+#ifdef LTM_NO_NEG_EXP
+        return MP_VAL;
+#else /* LTM_NO_NEG_EXP */
 #ifdef BN_MP_INVMOD_C
      mp_int tmpG, tmpX;
      int err;
@@ -578,6 +586,7 @@ static int mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y)
      /* no invmod */
      return MP_VAL;
 #endif
+#endif /* LTM_NO_NEG_EXP */
   }
 
 /* modified diminished radix reduction */
@@ -668,6 +677,7 @@ static int mp_cmp_d(mp_int * a, mp_digit b)
 }
 
 
+#ifndef LTM_NO_NEG_EXP
 /* hac 14.61, pp608 */
 static int mp_invmod (mp_int * a, mp_int * b, mp_int * c)
 {
@@ -694,6 +704,7 @@ static int mp_invmod (mp_int * a, mp_int * b, mp_int * c)
 #endif
   return MP_VAL;
 }
+#endif /* LTM_NO_NEG_EXP */
 
 
 /* get the size for an unsigned equivalent */
@@ -704,6 +715,7 @@ static int mp_unsigned_bin_size (mp_int * a)
 }
 
 
+#ifndef LTM_NO_NEG_EXP
 /* hac 14.61, pp608 */
 static int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c)
 {
@@ -857,6 +869,7 @@ top:
 LBL_ERR:mp_clear_multi (&x, &y, &u, &v, &A, &B, &C, &D, NULL);
   return res;
 }
+#endif /* LTM_NO_NEG_EXP */
 
 
 /* compare maginitude of two ints (unsigned) */
@@ -1264,6 +1277,7 @@ static void mp_set (mp_int * a, mp_digit b)
 }
 
 
+#ifndef LTM_NO_NEG_EXP
 /* b = a/2 */
 static int mp_div_2(mp_int * a, mp_int * b)
 {
@@ -1310,6 +1324,7 @@ static int mp_div_2(mp_int * a, mp_int * b)
   mp_clamp (b);
   return MP_OKAY;
 }
+#endif /* LTM_NO_NEG_EXP */
 
 
 /* shift left by a certain bit count */