test_wiener.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #include <assert.h>
  2. #include <math.h>
  3. #include <openssl/ssl.h>
  4. #include <openssl/x509.h>
  5. #include "questions.h"
  6. #include "qwiener.h"
  7. /**
  8. * \brief Testing the continued fractions generator.
  9. */
  10. void test_cf(void)
  11. {
  12. bigfraction_t x = {NULL, NULL};
  13. cf_t* f;
  14. size_t i;
  15. bigfraction_t *it;
  16. BIGNUM* expected;
  17. f = cf_new();
  18. x.h = BN_new();
  19. x.k = BN_new();
  20. expected = BN_new();
  21. /*
  22. * Testing aᵢ
  23. *
  24. * 1
  25. * √2 = 1 + ⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽
  26. * 1
  27. * 2 + ⎽⎽⎽⎽⎽⎽
  28. * 2 + …
  29. *
  30. */
  31. BN_dec2bn(&x.h, "14142135623730951");
  32. BN_dec2bn(&x.k, "10000000000000000");
  33. BN_dec2bn(&expected, "2");
  34. cf_init(f, x.h, x.k);
  35. it = cf_next(f);
  36. assert(BN_is_one(f->a));
  37. for (i=0; i!=5 && it; i++) {
  38. it = cf_next(f);
  39. assert(!BN_cmp(f->a, expected));
  40. }
  41. assert(i==5);
  42. /*
  43. * Testing hᵢ/kᵢ
  44. *
  45. * 1
  46. * φ = (1+√5)/2 = 1 + ⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽
  47. * 1
  48. * 1 + ⎽⎽⎽⎽⎽
  49. * 1 + …
  50. */
  51. const char* fib[] = {"1", "1", "2", "3", "5", "8", "13"};
  52. BN_dec2bn(&x.h, "323606797749979");
  53. BN_dec2bn(&x.k, "200000000000000");
  54. cf_init(f, x.h, x.k);
  55. it = cf_next(f);
  56. for (i=1; i!=7; i++) {
  57. BN_dec2bn(&expected, fib[i]);
  58. assert(!BN_cmp(it->h, expected));
  59. BN_dec2bn(&expected, fib[i-1]);
  60. assert(!BN_cmp(it->k, expected));
  61. it=cf_next(f);
  62. }
  63. BN_dec2bn(&x.h, "60728973");
  64. BN_dec2bn(&x.k, "160523347");
  65. cf_init(f, x.h, x.k);
  66. /* 0 */
  67. it = cf_next(f);
  68. /* 1 / 2 */
  69. it = cf_next(f);
  70. BN_dec2bn(&expected, "2");
  71. assert(BN_is_one(it->h) && !BN_cmp(it->k, expected));
  72. /* 1 / 3 */
  73. it = cf_next(f);
  74. BN_dec2bn(&expected, "3");
  75. assert(BN_is_one(it->h) && !BN_cmp(it->k, expected));
  76. /* 2 / 5 */
  77. it = cf_next(f);
  78. BN_dec2bn(&expected, "2");
  79. assert(!BN_cmp(expected, it->h));
  80. BN_dec2bn(&expected, "5");
  81. assert(!BN_cmp(expected, it->k));
  82. /* 3 / 8 */
  83. it = cf_next(f);
  84. BN_dec2bn(&expected, "3");
  85. assert(!BN_cmp(expected, it->h));
  86. BN_dec2bn(&expected, "8");
  87. assert(!BN_cmp(expected, it->k));
  88. /* 14/ 37 */
  89. it = cf_next(f);
  90. BN_dec2bn(&expected, "14");
  91. assert(!BN_cmp(expected, it->h));
  92. BN_dec2bn(&expected, "37");
  93. assert(!BN_cmp(expected, it->k));
  94. }
  95. void test_BN_sqrtmod(void)
  96. {
  97. BIGNUM *a, *b, *expected;
  98. BIGNUM *root, *rem;
  99. BIGNUM *mayzero;
  100. BN_CTX *ctx;
  101. root = BN_new();
  102. rem = BN_new();
  103. mayzero = BN_new();
  104. ctx = BN_CTX_new();
  105. BN_dec2bn(&a, "144");
  106. BN_dec2bn(&expected, "12");
  107. BN_sqrtmod(root, rem, a, ctx);
  108. assert(!BN_cmp(expected, root));
  109. assert(BN_is_zero(rem));
  110. BN_dec2bn(&a, "15245419238964964");
  111. BN_dec2bn(&expected, "123472342");
  112. BN_sqrtmod(root, rem, a, ctx);
  113. assert(!BN_cmp(root, expected));
  114. assert(BN_is_zero(rem));
  115. BN_dec2bn(&a, "5");
  116. BN_dec2bn(&expected, "2");
  117. BN_sqrtmod(root, rem, a, ctx);
  118. assert(!BN_cmp(root, expected));
  119. assert(BN_is_one(rem));
  120. BN_dec2bn(&a, "106929");
  121. BN_dec2bn(&expected, "327");
  122. BN_sqrtmod(root, rem, a, ctx);
  123. assert(BN_is_zero(rem));
  124. assert(!BN_cmp(root, expected));
  125. BN_free(root);
  126. BN_free(rem);
  127. BN_free(mayzero);
  128. BN_CTX_free(ctx);
  129. BN_free(a);
  130. BN_free(expected);
  131. }
  132. void test_wiener(void)
  133. {
  134. X509 *crt;
  135. FILE *fp = fopen("test/wiener_test.crt", "r");
  136. crt = PEM_read_X509(fp, NULL, 0, NULL);
  137. if (!crt) {
  138. ERR_print_errors();
  139. exit(EXIT_FAILURE);
  140. }
  141. WienerQuestion.setup();
  142. assert(WienerQuestion.test(crt));
  143. assert(WienerQuestion.ask(crt));
  144. WienerQuestion.teardown();
  145. }
  146. int main(int argc, char ** argv)
  147. {
  148. test_cf();
  149. test_BN_sqrtmod();
  150. test_wiener();
  151. return 0;
  152. }