Browse Source

Implementing BN_value_two().

On the footprint of openssl's BN_value_one(), I am creating a constant BIGNUM *
two.
Michele Orrù 11 years ago
parent
commit
22458ebd50

+ 2 - 0
src/questions/include/qarith.h

@@ -43,4 +43,6 @@ int BN_sqrtmod(BIGNUM* dv, BIGNUM* rem, BIGNUM* a, BN_CTX* ctx);
 
 RSA* qa_RSA_recover(const RSA *rsapub, const BIGNUM *p, BN_CTX *ctx);
 
+const BIGNUM *BN_value_two(void);
+
 #endif /* _QA_ARITH_H_ */

+ 2 - 19
src/questions/pollard.c

@@ -31,23 +31,6 @@
 #include "qa/questions/qpollard.h"
 
 
-static BIGNUM *two = NULL;
-
-static int
-pollard1_question_setup(void)
-{
-  /* create 2 */
-  BN_dec2bn(&two, "2");
-  return 1;
-}
-
-static int
-pollard1_question_teardown(void)
-{
-  BN_free(two);
-  return 1;
-}
-
 /**
  * \brief Pollard (p-1) factorization.
  *
@@ -112,8 +95,8 @@ pollard1_question_ask_rsa(const RSA* rsa)
 qa_question_t PollardQuestion = {
   .name = "p-1",
   .pretty_name = "Pollard's (p-1) factorization",
-  .setup = pollard1_question_setup,
-  .teardown = pollard1_question_teardown,
+  .setup = NULL,
+  .teardown = NULL,
   .test = NULL,
   .ask_rsa = pollard1_question_ask_rsa,
   .ask_crt = NULL

+ 1 - 5
src/questions/pollardrho.c

@@ -118,7 +118,6 @@ pollardrho_question_ask_rsa(const RSA *rsa)
     *x = NULL,
     *y = NULL;
   BIGNUM *n;
-  BIGNUM* two;
   BIGNUM *tmp;
   BIGNUM *gcd;
   BN_CTX *ctx;
@@ -129,13 +128,11 @@ pollardrho_question_ask_rsa(const RSA *rsa)
   y = BN_new();
   tmp = BN_new();
   n = rsa->n;
-  two = BN_new();
 
   /* initialization */
   BN_one(gcd);
   BN_pseudo_rand(x, 512, 0, 0);
   BN_copy(y, x);
-  BN_one(two); BN_uiadd1(two);
 
 
   while (BN_is_one(gcd)) {
@@ -147,7 +144,7 @@ pollardrho_question_ask_rsa(const RSA *rsa)
     BN_mod_sqr(y, tmp, n, ctx);
     BN_lshift1(tmp, tmp);
     BN_mod_add(y, y, tmp, n, ctx);
-    BN_mod_add(y, y, two, n, ctx);
+    BN_mod_add(y, y, BN_value_two(), n, ctx);
     /* gcd(|x-y|, N) */
     BN_mod_sub(tmp, x, y, n, ctx);
     BN_gcd(gcd, tmp, n, ctx);
@@ -160,7 +157,6 @@ pollardrho_question_ask_rsa(const RSA *rsa)
   BN_free(x);
   BN_free(y);
   BN_free(gcd);
-  BN_free(two);
   return ret;
 }
 

+ 13 - 0
src/questions/qarith.c

@@ -8,6 +8,19 @@
 
 #include "qa/questions/qarith.h"
 
+const BIGNUM *BN_value_two(void)
+{
+  static const BN_ULONG data_two = 2L;
+  static const BIGNUM const_two = {
+    (BN_ULONG *) &data_two,
+    1,
+    1,
+    0,
+    BN_FLG_STATIC_DATA
+  };
+
+  return &const_two;
+}
 
 cf_t* cf_new(void)
 {

+ 0 - 2
src/questions/tests/test_pollard.c

@@ -23,8 +23,6 @@ void test_pollard(void)
 
 int main(int argc, char **argv)
 {
-  PollardQuestion.setup();
   test_pollard();
-  PollardQuestion.teardown();
   return 0;
 }

+ 13 - 0
src/questions/tests/test_qarith.c

@@ -243,6 +243,18 @@ test_BN_abs(void)
   BN_free(a);
 }
 
+
+void test_BN_value_two(void)
+{
+  BIGNUM *two = BN_new();
+
+  BN_dec2bn(&two, "2");
+  assert(!BN_cmp(two, BN_value_two()));
+
+  BN_free(two);
+}
+
+
 int main(int argc, char **argv)
 {
   test_cf();
@@ -250,6 +262,7 @@ int main(int argc, char **argv)
   test_qa_RSA_recover();
   test_BN_min();
   test_BN_abs();
+  test_BN_value_two();
 
   return 0;
 

+ 2 - 4
src/questions/tests/test_williams+1.c

@@ -8,7 +8,6 @@
 
 void test_lucas(void)
 {
-  BIGNUM *two = BN_new();
   BIGNUM *v = BN_new();
   BIGNUM *w = BN_new();
   BIGNUM *h = BN_new();
@@ -18,14 +17,13 @@ void test_lucas(void)
     *wcheck = BN_new();
   BN_CTX *ctx = BN_CTX_new();
 
-  BN_one(two); BN_uiadd1(two);
-  BN_copy(w, two);
+  BN_copy(w, BN_value_two());
   BN_dec2bn(&tau, "5");
   BN_copy(v, tau);
 
   /* <V₁, V₀> */
   assert(!BN_cmp(v, tau));
-  assert(!BN_cmp(w, two));
+  assert(!BN_cmp(w, BN_value_two()));
   /* <V₃, V₂> */
   BN_dec2bn(&h, "3");
   BN_dec2bn(&vcheck, "110");

+ 2 - 4
src/questions/williams+1.c

@@ -45,13 +45,11 @@ lucas(BIGNUM *v, BIGNUM *w,
       BN_sub(u, u, vw);
       BN_sub(u, u, tau);
       /* w = w² - 2 */
-      BN_sub(w, vv, BN_value_one());
-      BN_sub(w, w, BN_value_one());
+      BN_sub(w, vv, BN_value_two());
     } else {
       BN_sqr(vv, v, ctx);
       /* v = v² - 2 */
-      BN_sub(u, vv, BN_value_one());
-      BN_sub(u, u, BN_value_one());
+      BN_sub(u, vv, BN_value_two());
       /* w = vw - τ */
       BN_mul(vw, v, w, ctx);
       BN_sub(w, vw, tau);