www.usr.com/support/gpl/USR9107_release.1.4.tar.gz
[bcm963xx.git] / userapps / opensource / sshd / libtommath / bn_mp_reduce_is_2k.c
index 3e4a757..0fb8384 100755 (executable)
@@ -1,38 +1,48 @@
-/* LibTomMath, multiple-precision integer library -- Tom St Denis\r
- *\r
- * LibTomMath is library that provides for multiple-precision\r
- * integer arithmetic as well as number theoretic functionality.\r
- *\r
- * The library is designed directly after the MPI library by\r
- * Michael Fromberger but has been written from scratch with\r
- * additional optimizations in place.\r
- *\r
- * The library is free for all purposes without any express\r
- * guarantee it works.\r
- *\r
- * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org\r
- */\r
-#include <tommath.h>\r
-\r
-/* determines if mp_reduce_2k can be used */\r
-int \r
-mp_reduce_is_2k(mp_int *a)\r
-{\r
-   int ix, iy;\r
-   \r
-   if (a->used == 0) {\r
-      return 0;\r
-   } else if (a->used == 1) {\r
-      return 1;\r
-   } else if (a->used > 1) {\r
-      iy = mp_count_bits(a);\r
-      for (ix = DIGIT_BIT; ix < iy; ix++) {\r
-          if ((a->dp[ix/DIGIT_BIT] & \r
-              ((mp_digit)1 << (mp_digit)(ix % DIGIT_BIT))) == 0) {\r
-             return 0;\r
-          }\r
-      }\r
-   }\r
-   return 1;\r
-}\r
-\r
+#include <tommath.h>
+#ifdef BN_MP_REDUCE_IS_2K_C
+/* LibTomMath, multiple-precision integer library -- Tom St Denis
+ *
+ * LibTomMath is a library that provides multiple-precision
+ * integer arithmetic as well as number theoretic functionality.
+ *
+ * The library was designed directly after the MPI library by
+ * Michael Fromberger but has been written from scratch with
+ * additional optimizations in place.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org
+ */
+
+/* determines if mp_reduce_2k can be used */
+int mp_reduce_is_2k(mp_int *a)
+{
+   int ix, iy, iw;
+   mp_digit iz;
+   
+   if (a->used == 0) {
+      return MP_NO;
+   } else if (a->used == 1) {
+      return MP_YES;
+   } else if (a->used > 1) {
+      iy = mp_count_bits(a);
+      iz = 1;
+      iw = 1;
+    
+      /* Test every bit from the second digit up, must be 1 */
+      for (ix = DIGIT_BIT; ix < iy; ix++) {
+          if ((a->dp[iw] & iz) == 0) {
+             return MP_NO;
+          }
+          iz <<= 1;
+          if (iz > (mp_digit)MP_MASK) {
+             ++iw;
+             iz = 1;
+          }
+      }
+   }
+   return MP_YES;
+}
+
+#endif