Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.88 KB | None | 0 0
  1. void montgomeryLadder(mpz_t result, mpz_t base, mpz_t exponent, mpz_t module) {
  2.     mpz_t *array;
  3.     for(int i = 0; i < 2; i++) {
  4.         mpz_init(array[i]);
  5.     }
  6.     mpz_set_ui(array[0], 1);
  7.     mpz_set(array[1], base);
  8.  
  9.     long k = mpz_sizeinbase(exponent, 2);
  10.     for(int i = k - 1; i >= 0; i--) {
  11.         int bit = mpz_tstbit(exponent, i);
  12.         mpz_mul(array[!bit], array[0], array[1]);
  13.         mpz_mod(array[!bit], array[!bit], module);
  14.         mpz_mul(array[bit], array[bit], array[bit]);
  15.         mpz_mod(array[bit], array[bit], module);
  16.     }
  17.     mpz_set(result, array[0]);
  18.     for(int i = 0; i < 2; i++) {
  19.         mpz_clear(array[i]);
  20.     }
  21. }
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29. ...
  30.  
  31.  
  32. if(mpz_cmp_ui(gcdNumber,1) == 0) {
  33.                         /* Original implementation with returning x^d, where x is a message */
  34.                         /*mpz_t val;
  35.                         mpz_init(val);
  36.                         mpz_powm(val, number, privatekey, module);
  37.                         long response_len=mpz_sizeinbase(val,10) + 2;
  38.                         char *response = (char*) malloc(response_len);
  39.                         mpz_get_str(response, 10, val);
  40.                         n = write(newsockfd, response, strlen(response));
  41.                         free(response);*/
  42.  
  43.  
  44.                         /* Blinding in the server exponent to d to prevent timing attacks (Assignment 1) */
  45.                         /*mpz_t r;
  46.                         mpz_init(r);
  47.                         coPrimeGen(r, module);
  48.                         mpz_mod(r, r, module);
  49.                         mpz_powm(r, r, publickey, module);
  50.                         mpz_t message;
  51.                         mpz_init(message);
  52.                         mpz_mul(message, r, number);
  53.                         mpz_mod(message, message, module);
  54.                         mpz_powm(message, message, privatekey, module);
  55.                        
  56.                         mpz_t rInverse;
  57.                         mpz_init(rInverse);
  58.                         mpz_invert(rInverse, r, module);
  59.  
  60.                         mpz_mul(message, message, rInverse);
  61.                         mpz_mod(message, message, module);
  62.                         long response_len=mpz_sizeinbase(message,10) + 2;
  63.                         char *response = (char*) malloc(response_len);
  64.                         mpz_get_str(response, 10, message);
  65.                         n = write(newsockfd, response, strlen(response));
  66.                         free(response);*/
  67.  
  68.                         /* Constant time exponentiation made with Montgomery's ladder */
  69.                         mpz_t val;
  70.                         mpz_init(val);
  71.                         montgomeryLadder(val, number, privatekey, module);
  72.                         long response_len=mpz_sizeinbase(val,10) + 2;
  73.                         char *response = (char*) malloc(response_len);
  74.                         mpz_get_str(response, 10, val);
  75.                         n = write(newsockfd, response, strlen(response));
  76.                         free(response);
  77.                     }
  78.                     else {
  79.                         char *response = "Doesn't belong to Z*_{N}.";
  80.                         n = write(newsockfd, response, strlen(response));
  81.                     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement