format with astyle (step 4)
This commit is contained in:
		
							parent
							
								
									4439fae168
								
							
						
					
					
						commit
						a20d9b102c
					
				| @ -25,36 +25,36 @@ | |||||||
|  */ |  */ | ||||||
| int mp_prime_fermat(mp_int *a, mp_int *b, int *result) | int mp_prime_fermat(mp_int *a, mp_int *b, int *result) | ||||||
| { | { | ||||||
|   mp_int  t; |    mp_int  t; | ||||||
|   int     err; |    int     err; | ||||||
| 
 | 
 | ||||||
|   /* default to composite  */ |    /* default to composite  */ | ||||||
|   *result = MP_NO; |    *result = MP_NO; | ||||||
| 
 | 
 | ||||||
|   /* ensure b > 1 */ |    /* ensure b > 1 */ | ||||||
|   if (mp_cmp_d(b, 1) != MP_GT) { |    if (mp_cmp_d(b, 1) != MP_GT) { | ||||||
|      return MP_VAL; |       return MP_VAL; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* init t */ |    /* init t */ | ||||||
|   if ((err = mp_init(&t)) != MP_OKAY) { |    if ((err = mp_init(&t)) != MP_OKAY) { | ||||||
|     return err; |       return err; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* compute t = b**a mod a */ |    /* compute t = b**a mod a */ | ||||||
|   if ((err = mp_exptmod(b, a, a, &t)) != MP_OKAY) { |    if ((err = mp_exptmod(b, a, a, &t)) != MP_OKAY) { | ||||||
|     goto LBL_T; |       goto LBL_T; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* is it equal to b? */ |    /* is it equal to b? */ | ||||||
|   if (mp_cmp(&t, b) == MP_EQ) { |    if (mp_cmp(&t, b) == MP_EQ) { | ||||||
|     *result = MP_YES; |       *result = MP_YES; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   err = MP_OKAY; |    err = MP_OKAY; | ||||||
| LBL_T: | LBL_T: | ||||||
|   mp_clear(&t); |    mp_clear(&t); | ||||||
|   return err; |    return err; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -22,26 +22,26 @@ | |||||||
|  */ |  */ | ||||||
| int mp_prime_is_divisible(mp_int *a, int *result) | int mp_prime_is_divisible(mp_int *a, int *result) | ||||||
| { | { | ||||||
|   int     err, ix; |    int     err, ix; | ||||||
|   mp_digit res; |    mp_digit res; | ||||||
| 
 | 
 | ||||||
|   /* default to not */ |    /* default to not */ | ||||||
|   *result = MP_NO; |    *result = MP_NO; | ||||||
| 
 | 
 | ||||||
|   for (ix = 0; ix < PRIME_SIZE; ix++) { |    for (ix = 0; ix < PRIME_SIZE; ix++) { | ||||||
|     /* what is a mod LBL_prime_tab[ix] */ |       /* what is a mod LBL_prime_tab[ix] */ | ||||||
|     if ((err = mp_mod_d(a, ltm_prime_tab[ix], &res)) != MP_OKAY) { |       if ((err = mp_mod_d(a, ltm_prime_tab[ix], &res)) != MP_OKAY) { | ||||||
|       return err; |          return err; | ||||||
|     } |       } | ||||||
| 
 | 
 | ||||||
|     /* is the residue zero? */ |       /* is the residue zero? */ | ||||||
|     if (res == 0) { |       if (res == 0) { | ||||||
|       *result = MP_YES; |          *result = MP_YES; | ||||||
|       return MP_OKAY; |          return MP_OKAY; | ||||||
|     } |       } | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   return MP_OKAY; |    return MP_OKAY; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -24,58 +24,58 @@ | |||||||
|  */ |  */ | ||||||
| int mp_prime_is_prime(mp_int *a, int t, int *result) | int mp_prime_is_prime(mp_int *a, int t, int *result) | ||||||
| { | { | ||||||
|   mp_int  b; |    mp_int  b; | ||||||
|   int     ix, err, res; |    int     ix, err, res; | ||||||
| 
 | 
 | ||||||
|   /* default to no */ |    /* default to no */ | ||||||
|   *result = MP_NO; |    *result = MP_NO; | ||||||
| 
 | 
 | ||||||
|   /* valid value of t? */ |    /* valid value of t? */ | ||||||
|   if ((t <= 0) || (t > PRIME_SIZE)) { |    if ((t <= 0) || (t > PRIME_SIZE)) { | ||||||
|     return MP_VAL; |       return MP_VAL; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* is the input equal to one of the primes in the table? */ |    /* is the input equal to one of the primes in the table? */ | ||||||
|   for (ix = 0; ix < PRIME_SIZE; ix++) { |    for (ix = 0; ix < PRIME_SIZE; ix++) { | ||||||
|       if (mp_cmp_d(a, ltm_prime_tab[ix]) == MP_EQ) { |       if (mp_cmp_d(a, ltm_prime_tab[ix]) == MP_EQ) { | ||||||
|          *result = 1; |          *result = 1; | ||||||
|          return MP_OKAY; |          return MP_OKAY; | ||||||
|       } |       } | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* first perform trial division */ |    /* first perform trial division */ | ||||||
|   if ((err = mp_prime_is_divisible(a, &res)) != MP_OKAY) { |    if ((err = mp_prime_is_divisible(a, &res)) != MP_OKAY) { | ||||||
|     return err; |       return err; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* return if it was trivially divisible */ |    /* return if it was trivially divisible */ | ||||||
|   if (res == MP_YES) { |    if (res == MP_YES) { | ||||||
|     return MP_OKAY; |       return MP_OKAY; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* now perform the miller-rabin rounds */ |    /* now perform the miller-rabin rounds */ | ||||||
|   if ((err = mp_init(&b)) != MP_OKAY) { |    if ((err = mp_init(&b)) != MP_OKAY) { | ||||||
|     return err; |       return err; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   for (ix = 0; ix < t; ix++) { |    for (ix = 0; ix < t; ix++) { | ||||||
|     /* set the prime */ |       /* set the prime */ | ||||||
|     mp_set(&b, ltm_prime_tab[ix]); |       mp_set(&b, ltm_prime_tab[ix]); | ||||||
| 
 | 
 | ||||||
|     if ((err = mp_prime_miller_rabin(a, &b, &res)) != MP_OKAY) { |       if ((err = mp_prime_miller_rabin(a, &b, &res)) != MP_OKAY) { | ||||||
|       goto LBL_B; |          goto LBL_B; | ||||||
|     } |       } | ||||||
| 
 | 
 | ||||||
|     if (res == MP_NO) { |       if (res == MP_NO) { | ||||||
|       goto LBL_B; |          goto LBL_B; | ||||||
|     } |       } | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* passed the test */ |    /* passed the test */ | ||||||
|   *result = MP_YES; |    *result = MP_YES; | ||||||
| LBL_B: | LBL_B: | ||||||
|   mp_clear(&b); |    mp_clear(&b); | ||||||
|   return err; |    return err; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -38,28 +38,28 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) | |||||||
|    if (mp_cmp_d(a, ltm_prime_tab[PRIME_SIZE-1]) == MP_LT) { |    if (mp_cmp_d(a, ltm_prime_tab[PRIME_SIZE-1]) == MP_LT) { | ||||||
|       /* find which prime it is bigger than */ |       /* find which prime it is bigger than */ | ||||||
|       for (x = PRIME_SIZE - 2; x >= 0; x--) { |       for (x = PRIME_SIZE - 2; x >= 0; x--) { | ||||||
|           if (mp_cmp_d(a, ltm_prime_tab[x]) != MP_LT) { |          if (mp_cmp_d(a, ltm_prime_tab[x]) != MP_LT) { | ||||||
|              if (bbs_style == 1) { |             if (bbs_style == 1) { | ||||||
|                 /* ok we found a prime smaller or
 |                /* ok we found a prime smaller or
 | ||||||
|                  * equal [so the next is larger] |                 * equal [so the next is larger] | ||||||
|                  * |                 * | ||||||
|                  * however, the prime must be |                 * however, the prime must be | ||||||
|                  * congruent to 3 mod 4 |                 * congruent to 3 mod 4 | ||||||
|                  */ |                 */ | ||||||
|                 if ((ltm_prime_tab[x + 1] & 3) != 3) { |                if ((ltm_prime_tab[x + 1] & 3) != 3) { | ||||||
|                    /* scan upwards for a prime congruent to 3 mod 4 */ |                   /* scan upwards for a prime congruent to 3 mod 4 */ | ||||||
|                    for (y = x + 1; y < PRIME_SIZE; y++) { |                   for (y = x + 1; y < PRIME_SIZE; y++) { | ||||||
|                        if ((ltm_prime_tab[y] & 3) == 3) { |                      if ((ltm_prime_tab[y] & 3) == 3) { | ||||||
|                           mp_set(a, ltm_prime_tab[y]); |                         mp_set(a, ltm_prime_tab[y]); | ||||||
|                           return MP_OKAY; |                         return MP_OKAY; | ||||||
|                        } |                      } | ||||||
|                    } |                   } | ||||||
|                 } |                } | ||||||
|              } else { |             } else { | ||||||
|                 mp_set(a, ltm_prime_tab[x + 1]); |                mp_set(a, ltm_prime_tab[x + 1]); | ||||||
|                 return MP_OKAY; |                return MP_OKAY; | ||||||
|              } |             } | ||||||
|           } |          } | ||||||
|       } |       } | ||||||
|       /* at this point a maybe 1 */ |       /* at this point a maybe 1 */ | ||||||
|       if (mp_cmp_d(a, 1) == MP_EQ) { |       if (mp_cmp_d(a, 1) == MP_EQ) { | ||||||
| @ -118,18 +118,18 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) | |||||||
| 
 | 
 | ||||||
|          /* compute the new residue without using division */ |          /* compute the new residue without using division */ | ||||||
|          for (x = 1; x < PRIME_SIZE; x++) { |          for (x = 1; x < PRIME_SIZE; x++) { | ||||||
|              /* add the step to each residue */ |             /* add the step to each residue */ | ||||||
|              res_tab[x] += kstep; |             res_tab[x] += kstep; | ||||||
| 
 | 
 | ||||||
|              /* subtract the modulus [instead of using division] */ |             /* subtract the modulus [instead of using division] */ | ||||||
|              if (res_tab[x] >= ltm_prime_tab[x]) { |             if (res_tab[x] >= ltm_prime_tab[x]) { | ||||||
|                 res_tab[x]  -= ltm_prime_tab[x]; |                res_tab[x]  -= ltm_prime_tab[x]; | ||||||
|              } |             } | ||||||
| 
 | 
 | ||||||
|              /* set flag if zero */ |             /* set flag if zero */ | ||||||
|              if (res_tab[x] == 0) { |             if (res_tab[x] == 0) { | ||||||
|                 y = 1; |                y = 1; | ||||||
|              } |             } | ||||||
|          } |          } | ||||||
|       } while ((y == 1) && (step < ((((mp_digit)1) << DIGIT_BIT) - kstep))); |       } while ((y == 1) && (step < ((((mp_digit)1) << DIGIT_BIT) - kstep))); | ||||||
| 
 | 
 | ||||||
| @ -145,13 +145,13 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) | |||||||
| 
 | 
 | ||||||
|       /* is this prime? */ |       /* is this prime? */ | ||||||
|       for (x = 0; x < t; x++) { |       for (x = 0; x < t; x++) { | ||||||
|           mp_set(&b, ltm_prime_tab[x]); |          mp_set(&b, ltm_prime_tab[x]); | ||||||
|           if ((err = mp_prime_miller_rabin(a, &b, &res)) != MP_OKAY) { |          if ((err = mp_prime_miller_rabin(a, &b, &res)) != MP_OKAY) { | ||||||
|              goto LBL_ERR; |             goto LBL_ERR; | ||||||
|           } |          } | ||||||
|           if (res == MP_NO) { |          if (res == MP_NO) { | ||||||
|              break; |             break; | ||||||
|           } |          } | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       if (res == MP_YES) { |       if (res == MP_YES) { | ||||||
|  | |||||||
| @ -19,14 +19,14 @@ | |||||||
| static const struct { | static const struct { | ||||||
|    int k, t; |    int k, t; | ||||||
| } sizes[] = { | } sizes[] = { | ||||||
| {   128,    28 }, |    {   128,    28 }, | ||||||
| {   256,    16 }, |    {   256,    16 }, | ||||||
| {   384,    10 }, |    {   384,    10 }, | ||||||
| {   512,     7 }, |    {   512,     7 }, | ||||||
| {   640,     6 }, |    {   640,     6 }, | ||||||
| {   768,     5 }, |    {   768,     5 }, | ||||||
| {   896,     4 }, |    {   896,     4 }, | ||||||
| {  1024,     4 } |    {  1024,     4 } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* returns # of RM trials required for a given bit size */ | /* returns # of RM trials required for a given bit size */ | ||||||
| @ -35,11 +35,11 @@ int mp_prime_rabin_miller_trials(int size) | |||||||
|    int x; |    int x; | ||||||
| 
 | 
 | ||||||
|    for (x = 0; x < (int)(sizeof(sizes)/(sizeof(sizes[0]))); x++) { |    for (x = 0; x < (int)(sizeof(sizes)/(sizeof(sizes[0]))); x++) { | ||||||
|        if (sizes[x].k == size) { |       if (sizes[x].k == size) { | ||||||
|           return sizes[x].t; |          return sizes[x].t; | ||||||
|        } else if (sizes[x].k > size) { |       } else if (sizes[x].k > size) { | ||||||
|           return (x == 0) ? sizes[0].t : sizes[x - 1].t; |          return (x == 0) ? sizes[0].t : sizes[x - 1].t; | ||||||
|        } |       } | ||||||
|    } |    } | ||||||
|    return sizes[x-1].t + 1; |    return sizes[x-1].t + 1; | ||||||
| } | } | ||||||
|  | |||||||
| @ -18,57 +18,57 @@ | |||||||
| /* returns size of ASCII reprensentation */ | /* returns size of ASCII reprensentation */ | ||||||
| int mp_radix_size(mp_int *a, int radix, int *size) | int mp_radix_size(mp_int *a, int radix, int *size) | ||||||
| { | { | ||||||
|   int     res, digs; |    int     res, digs; | ||||||
|   mp_int  t; |    mp_int  t; | ||||||
|   mp_digit d; |    mp_digit d; | ||||||
| 
 | 
 | ||||||
|   *size = 0; |    *size = 0; | ||||||
| 
 | 
 | ||||||
|   /* make sure the radix is in range */ |    /* make sure the radix is in range */ | ||||||
|   if ((radix < 2) || (radix > 64)) { |    if ((radix < 2) || (radix > 64)) { | ||||||
|     return MP_VAL; |       return MP_VAL; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   if (mp_iszero(a) == MP_YES) { |    if (mp_iszero(a) == MP_YES) { | ||||||
|     *size = 2; |       *size = 2; | ||||||
|     return MP_OKAY; |       return MP_OKAY; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* special case for binary */ |    /* special case for binary */ | ||||||
|   if (radix == 2) { |    if (radix == 2) { | ||||||
|     *size = mp_count_bits(a) + ((a->sign == MP_NEG) ? 1 : 0) + 1; |       *size = mp_count_bits(a) + ((a->sign == MP_NEG) ? 1 : 0) + 1; | ||||||
|     return MP_OKAY; |       return MP_OKAY; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* digs is the digit count */ |    /* digs is the digit count */ | ||||||
|   digs = 0; |    digs = 0; | ||||||
| 
 | 
 | ||||||
|   /* if it's negative add one for the sign */ |    /* if it's negative add one for the sign */ | ||||||
|   if (a->sign == MP_NEG) { |    if (a->sign == MP_NEG) { | ||||||
|     ++digs; |       ++digs; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* init a copy of the input */ |    /* init a copy of the input */ | ||||||
|   if ((res = mp_init_copy(&t, a)) != MP_OKAY) { |    if ((res = mp_init_copy(&t, a)) != MP_OKAY) { | ||||||
|     return res; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /* force temp to positive */ |  | ||||||
|   t.sign = MP_ZPOS; |  | ||||||
| 
 |  | ||||||
|   /* fetch out all of the digits */ |  | ||||||
|   while (mp_iszero(&t) == MP_NO) { |  | ||||||
|     if ((res = mp_div_d(&t, (mp_digit)radix, &t, &d)) != MP_OKAY) { |  | ||||||
|       mp_clear(&t); |  | ||||||
|       return res; |       return res; | ||||||
|     } |    } | ||||||
|     ++digs; |  | ||||||
|   } |  | ||||||
|   mp_clear(&t); |  | ||||||
| 
 | 
 | ||||||
|   /* return digs + 1, the 1 is for the NULL byte that would be required. */ |    /* force temp to positive */ | ||||||
|   *size = digs + 1; |    t.sign = MP_ZPOS; | ||||||
|   return MP_OKAY; | 
 | ||||||
|  |    /* fetch out all of the digits */ | ||||||
|  |    while (mp_iszero(&t) == MP_NO) { | ||||||
|  |       if ((res = mp_div_d(&t, (mp_digit)radix, &t, &d)) != MP_OKAY) { | ||||||
|  |          mp_clear(&t); | ||||||
|  |          return res; | ||||||
|  |       } | ||||||
|  |       ++digs; | ||||||
|  |    } | ||||||
|  |    mp_clear(&t); | ||||||
|  | 
 | ||||||
|  |    /* return digs + 1, the 1 is for the NULL byte that would be required. */ | ||||||
|  |    *size = digs + 1; | ||||||
|  |    return MP_OKAY; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -18,21 +18,21 @@ | |||||||
| /* read signed bin, big endian, first byte is 0==positive or 1==negative */ | /* read signed bin, big endian, first byte is 0==positive or 1==negative */ | ||||||
| int mp_read_signed_bin(mp_int *a, const unsigned char *b, int c) | int mp_read_signed_bin(mp_int *a, const unsigned char *b, int c) | ||||||
| { | { | ||||||
|   int     res; |    int     res; | ||||||
| 
 | 
 | ||||||
|   /* read magnitude */ |    /* read magnitude */ | ||||||
|   if ((res = mp_read_unsigned_bin(a, b + 1, c - 1)) != MP_OKAY) { |    if ((res = mp_read_unsigned_bin(a, b + 1, c - 1)) != MP_OKAY) { | ||||||
|     return res; |       return res; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* first byte is 0 for positive, non-zero for negative */ |    /* first byte is 0 for positive, non-zero for negative */ | ||||||
|   if (b[0] == 0) { |    if (b[0] == 0) { | ||||||
|      a->sign = MP_ZPOS; |       a->sign = MP_ZPOS; | ||||||
|   } else { |    } else { | ||||||
|      a->sign = MP_NEG; |       a->sign = MP_NEG; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   return MP_OKAY; |    return MP_OKAY; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -18,35 +18,35 @@ | |||||||
| /* reads a unsigned char array, assumes the msb is stored first [big endian] */ | /* reads a unsigned char array, assumes the msb is stored first [big endian] */ | ||||||
| int mp_read_unsigned_bin(mp_int *a, const unsigned char *b, int c) | int mp_read_unsigned_bin(mp_int *a, const unsigned char *b, int c) | ||||||
| { | { | ||||||
|   int     res; |    int     res; | ||||||
| 
 | 
 | ||||||
|   /* make sure there are at least two digits */ |    /* make sure there are at least two digits */ | ||||||
|   if (a->alloc < 2) { |    if (a->alloc < 2) { | ||||||
|      if ((res = mp_grow(a, 2)) != MP_OKAY) { |       if ((res = mp_grow(a, 2)) != MP_OKAY) { | ||||||
|         return res; |          return res; | ||||||
|      } |       } | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* zero the int */ |    /* zero the int */ | ||||||
|   mp_zero(a); |    mp_zero(a); | ||||||
| 
 | 
 | ||||||
|   /* read the bytes in */ |    /* read the bytes in */ | ||||||
|   while (c-- > 0) { |    while (c-- > 0) { | ||||||
|     if ((res = mp_mul_2d(a, 8, a)) != MP_OKAY) { |       if ((res = mp_mul_2d(a, 8, a)) != MP_OKAY) { | ||||||
|       return res; |          return res; | ||||||
|     } |       } | ||||||
| 
 | 
 | ||||||
| #ifndef MP_8BIT | #ifndef MP_8BIT | ||||||
|     a->dp[0] |= *b++; |       a->dp[0] |= *b++; | ||||||
|     a->used += 1; |       a->used += 1; | ||||||
| #else | #else | ||||||
|     a->dp[0] = (*b & MP_MASK); |       a->dp[0] = (*b & MP_MASK); | ||||||
|     a->dp[1] |= ((*b++ >> 7U) & 1); |       a->dp[1] |= ((*b++ >> 7U) & 1); | ||||||
|     a->used += 2; |       a->used += 2; | ||||||
| #endif | #endif | ||||||
|   } |    } | ||||||
|   mp_clamp(a); |    mp_clamp(a); | ||||||
|   return MP_OKAY; |    return MP_OKAY; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -32,14 +32,14 @@ int mp_reduce_is_2k(mp_int *a) | |||||||
| 
 | 
 | ||||||
|       /* Test every bit from the second digit up, must be 1 */ |       /* Test every bit from the second digit up, must be 1 */ | ||||||
|       for (ix = DIGIT_BIT; ix < iy; ix++) { |       for (ix = DIGIT_BIT; ix < iy; ix++) { | ||||||
|           if ((a->dp[iw] & iz) == 0) { |          if ((a->dp[iw] & iz) == 0) { | ||||||
|              return MP_NO; |             return MP_NO; | ||||||
|           } |          } | ||||||
|           iz <<= 1; |          iz <<= 1; | ||||||
|           if (iz > (mp_digit)MP_MASK) { |          if (iz > (mp_digit)MP_MASK) { | ||||||
|              ++iw; |             ++iw; | ||||||
|              iz = 1; |             iz = 1; | ||||||
|           } |          } | ||||||
|       } |       } | ||||||
|    } |    } | ||||||
|    return MP_YES; |    return MP_YES; | ||||||
|  | |||||||
| @ -27,9 +27,9 @@ int mp_reduce_is_2k_l(mp_int *a) | |||||||
|    } else if (a->used > 1) { |    } else if (a->used > 1) { | ||||||
|       /* if more than half of the digits are -1 we're sold */ |       /* if more than half of the digits are -1 we're sold */ | ||||||
|       for (iy = ix = 0; ix < a->used; ix++) { |       for (iy = ix = 0; ix < a->used; ix++) { | ||||||
|           if (a->dp[ix] == MP_MASK) { |          if (a->dp[ix] == MP_MASK) { | ||||||
|               ++iy; |             ++iy; | ||||||
|           } |          } | ||||||
|       } |       } | ||||||
|       return (iy >= (a->used/2)) ? MP_YES : MP_NO; |       return (iy >= (a->used/2)) ? MP_YES : MP_NO; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -20,12 +20,12 @@ | |||||||
|  */ |  */ | ||||||
| int mp_reduce_setup(mp_int *a, mp_int *b) | int mp_reduce_setup(mp_int *a, mp_int *b) | ||||||
| { | { | ||||||
|   int     res; |    int     res; | ||||||
| 
 | 
 | ||||||
|   if ((res = mp_2expt(a, b->used * 2 * DIGIT_BIT)) != MP_OKAY) { |    if ((res = mp_2expt(a, b->used * 2 * DIGIT_BIT)) != MP_OKAY) { | ||||||
|     return res; |       return res; | ||||||
|   } |    } | ||||||
|   return mp_div(a, b, a, NULL); |    return mp_div(a, b, a, NULL); | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										72
									
								
								bn_mp_rshd.c
									
									
									
									
									
								
							
							
						
						
									
										72
									
								
								bn_mp_rshd.c
									
									
									
									
									
								
							| @ -18,52 +18,52 @@ | |||||||
| /* shift right a certain amount of digits */ | /* shift right a certain amount of digits */ | ||||||
| void mp_rshd(mp_int *a, int b) | void mp_rshd(mp_int *a, int b) | ||||||
| { | { | ||||||
|   int     x; |    int     x; | ||||||
| 
 | 
 | ||||||
|   /* if b <= 0 then ignore it */ |    /* if b <= 0 then ignore it */ | ||||||
|   if (b <= 0) { |    if (b <= 0) { | ||||||
|     return; |       return; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* if b > used then simply zero it and return */ |    /* if b > used then simply zero it and return */ | ||||||
|   if (a->used <= b) { |    if (a->used <= b) { | ||||||
|     mp_zero(a); |       mp_zero(a); | ||||||
|     return; |       return; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   { |    { | ||||||
|     mp_digit *bottom, *top; |       mp_digit *bottom, *top; | ||||||
| 
 | 
 | ||||||
|     /* shift the digits down */ |       /* shift the digits down */ | ||||||
| 
 | 
 | ||||||
|     /* bottom */ |       /* bottom */ | ||||||
|     bottom = a->dp; |       bottom = a->dp; | ||||||
| 
 | 
 | ||||||
|     /* top [offset into digits] */ |       /* top [offset into digits] */ | ||||||
|     top = a->dp + b; |       top = a->dp + b; | ||||||
| 
 | 
 | ||||||
|     /* this is implemented as a sliding window where
 |       /* this is implemented as a sliding window where
 | ||||||
|      * the window is b-digits long and digits from |        * the window is b-digits long and digits from | ||||||
|      * the top of the window are copied to the bottom |        * the top of the window are copied to the bottom | ||||||
|      * |        * | ||||||
|      * e.g. |        * e.g. | ||||||
| 
 | 
 | ||||||
|      b-2 | b-1 | b0 | b1 | b2 | ... | bb |   ----> |        b-2 | b-1 | b0 | b1 | b2 | ... | bb |   ----> | ||||||
|                  /\                   |      ----> |                    /\                   |      ----> | ||||||
|                   \-------------------/      ----> |                     \-------------------/      ----> | ||||||
|      */ |        */ | ||||||
|     for (x = 0; x < (a->used - b); x++) { |       for (x = 0; x < (a->used - b); x++) { | ||||||
|       *bottom++ = *top++; |          *bottom++ = *top++; | ||||||
|     } |       } | ||||||
| 
 | 
 | ||||||
|     /* zero the top digits */ |       /* zero the top digits */ | ||||||
|     for (; x < a->used; x++) { |       for (; x < a->used; x++) { | ||||||
|       *bottom++ = 0; |          *bottom++ = 0; | ||||||
|     } |       } | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* remove excess digits */ |    /* remove excess digits */ | ||||||
|   a->used -= b; |    a->used -= b; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -18,9 +18,9 @@ | |||||||
| /* set to a digit */ | /* set to a digit */ | ||||||
| void mp_set(mp_int *a, mp_digit b) | void mp_set(mp_int *a, mp_digit b) | ||||||
| { | { | ||||||
|   mp_zero(a); |    mp_zero(a); | ||||||
|   a->dp[0] = b & MP_MASK; |    a->dp[0] = b & MP_MASK; | ||||||
|   a->used  = (a->dp[0] != 0) ? 1 : 0; |    a->used  = (a->dp[0] != 0) ? 1 : 0; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -18,28 +18,28 @@ | |||||||
| /* set a 32-bit const */ | /* set a 32-bit const */ | ||||||
| int mp_set_int(mp_int *a, unsigned long b) | int mp_set_int(mp_int *a, unsigned long b) | ||||||
| { | { | ||||||
|   int     x, res; |    int     x, res; | ||||||
| 
 | 
 | ||||||
|   mp_zero(a); |    mp_zero(a); | ||||||
| 
 | 
 | ||||||
|   /* set four bits at a time */ |    /* set four bits at a time */ | ||||||
|   for (x = 0; x < 8; x++) { |    for (x = 0; x < 8; x++) { | ||||||
|     /* shift the number up four bits */ |       /* shift the number up four bits */ | ||||||
|     if ((res = mp_mul_2d(a, 4, a)) != MP_OKAY) { |       if ((res = mp_mul_2d(a, 4, a)) != MP_OKAY) { | ||||||
|       return res; |          return res; | ||||||
|     } |       } | ||||||
| 
 | 
 | ||||||
|     /* OR in the top four bits of the source */ |       /* OR in the top four bits of the source */ | ||||||
|     a->dp[0] |= (b >> 28) & 15; |       a->dp[0] |= (b >> 28) & 15; | ||||||
| 
 | 
 | ||||||
|     /* shift the source up to the next four bits */ |       /* shift the source up to the next four bits */ | ||||||
|     b <<= 4; |       b <<= 4; | ||||||
| 
 | 
 | ||||||
|     /* ensure that digits are not clamped off */ |       /* ensure that digits are not clamped off */ | ||||||
|     a->used += 1; |       a->used += 1; | ||||||
|   } |    } | ||||||
|   mp_clamp(a); |    mp_clamp(a); | ||||||
|   return MP_OKAY; |    return MP_OKAY; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -18,21 +18,21 @@ | |||||||
| /* shrink a bignum */ | /* shrink a bignum */ | ||||||
| int mp_shrink(mp_int *a) | int mp_shrink(mp_int *a) | ||||||
| { | { | ||||||
|   mp_digit *tmp; |    mp_digit *tmp; | ||||||
|   int used = 1; |    int used = 1; | ||||||
| 
 | 
 | ||||||
|   if (a->used > 0) { |    if (a->used > 0) { | ||||||
|     used = a->used; |       used = a->used; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   if (a->alloc != used) { |    if (a->alloc != used) { | ||||||
|     if ((tmp = OPT_CAST(mp_digit) XREALLOC(a->dp, sizeof (mp_digit) * used)) == NULL) { |       if ((tmp = OPT_CAST(mp_digit) XREALLOC(a->dp, sizeof(mp_digit) * used)) == NULL) { | ||||||
|       return MP_MEM; |          return MP_MEM; | ||||||
|     } |       } | ||||||
|     a->dp    = tmp; |       a->dp    = tmp; | ||||||
|     a->alloc = used; |       a->alloc = used; | ||||||
|   } |    } | ||||||
|   return MP_OKAY; |    return MP_OKAY; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -18,7 +18,7 @@ | |||||||
| /* get the size for an signed equivalent */ | /* get the size for an signed equivalent */ | ||||||
| int mp_signed_bin_size(mp_int *a) | int mp_signed_bin_size(mp_int *a) | ||||||
| { | { | ||||||
|   return 1 + mp_unsigned_bin_size(a); |    return 1 + mp_unsigned_bin_size(a); | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										46
									
								
								bn_mp_sqr.c
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								bn_mp_sqr.c
									
									
									
									
									
								
							| @ -18,39 +18,39 @@ | |||||||
| /* computes b = a*a */ | /* computes b = a*a */ | ||||||
| int mp_sqr(mp_int *a, mp_int *b) | int mp_sqr(mp_int *a, mp_int *b) | ||||||
| { | { | ||||||
|   int     res; |    int     res; | ||||||
| 
 | 
 | ||||||
| #ifdef BN_MP_TOOM_SQR_C | #ifdef BN_MP_TOOM_SQR_C | ||||||
|   /* use Toom-Cook? */ |    /* use Toom-Cook? */ | ||||||
|   if (a->used >= TOOM_SQR_CUTOFF) { |    if (a->used >= TOOM_SQR_CUTOFF) { | ||||||
|     res = mp_toom_sqr(a, b); |       res = mp_toom_sqr(a, b); | ||||||
|   /* Karatsuba? */ |       /* Karatsuba? */ | ||||||
|   } else |    } else | ||||||
| #endif | #endif | ||||||
| #ifdef BN_MP_KARATSUBA_SQR_C | #ifdef BN_MP_KARATSUBA_SQR_C | ||||||
|   if (a->used >= KARATSUBA_SQR_CUTOFF) { |       if (a->used >= KARATSUBA_SQR_CUTOFF) { | ||||||
|     res = mp_karatsuba_sqr(a, b); |          res = mp_karatsuba_sqr(a, b); | ||||||
|   } else |       } else | ||||||
| #endif | #endif | ||||||
|   { |       { | ||||||
| #ifdef BN_FAST_S_MP_SQR_C | #ifdef BN_FAST_S_MP_SQR_C | ||||||
|     /* can we use the fast comba multiplier? */ |          /* can we use the fast comba multiplier? */ | ||||||
|     if ((((a->used * 2) + 1) < MP_WARRAY) && |          if ((((a->used * 2) + 1) < MP_WARRAY) && | ||||||
|          (a->used < |              (a->used < | ||||||
|          (1 << (((sizeof(mp_word) * CHAR_BIT) - (2 * DIGIT_BIT)) - 1)))) { |               (1 << (((sizeof(mp_word) * CHAR_BIT) - (2 * DIGIT_BIT)) - 1)))) { | ||||||
|       res = fast_s_mp_sqr(a, b); |             res = fast_s_mp_sqr(a, b); | ||||||
|     } else |          } else | ||||||
| #endif | #endif | ||||||
|     { |          { | ||||||
| #ifdef BN_S_MP_SQR_C | #ifdef BN_S_MP_SQR_C | ||||||
|       res = s_mp_sqr(a, b); |             res = s_mp_sqr(a, b); | ||||||
| #else | #else | ||||||
|       res = MP_VAL; |             res = MP_VAL; | ||||||
| #endif | #endif | ||||||
|     } |          } | ||||||
|   } |       } | ||||||
|   b->sign = MP_ZPOS; |    b->sign = MP_ZPOS; | ||||||
|   return res; |    return res; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -18,20 +18,20 @@ | |||||||
| /* c = a * a (mod b) */ | /* c = a * a (mod b) */ | ||||||
| int mp_sqrmod(mp_int *a, mp_int *b, mp_int *c) | int mp_sqrmod(mp_int *a, mp_int *b, mp_int *c) | ||||||
| { | { | ||||||
|   int     res; |    int     res; | ||||||
|   mp_int  t; |    mp_int  t; | ||||||
| 
 | 
 | ||||||
|   if ((res = mp_init(&t)) != MP_OKAY) { |    if ((res = mp_init(&t)) != MP_OKAY) { | ||||||
|     return res; |       return res; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   if ((res = mp_sqr(a, &t)) != MP_OKAY) { |    if ((res = mp_sqr(a, &t)) != MP_OKAY) { | ||||||
|     mp_clear(&t); |       mp_clear(&t); | ||||||
|     return res; |       return res; | ||||||
|   } |    } | ||||||
|   res = mp_mod(&t, b, c); |    res = mp_mod(&t, b, c); | ||||||
|   mp_clear(&t); |    mp_clear(&t); | ||||||
|   return res; |    return res; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -17,108 +17,108 @@ | |||||||
| 
 | 
 | ||||||
| int mp_sqrtmod_prime(mp_int *n, mp_int *prime, mp_int *ret) | int mp_sqrtmod_prime(mp_int *n, mp_int *prime, mp_int *ret) | ||||||
| { | { | ||||||
|   int res, legendre; |    int res, legendre; | ||||||
|   mp_int t1, C, Q, S, Z, M, T, R, two; |    mp_int t1, C, Q, S, Z, M, T, R, two; | ||||||
|   mp_digit i; |    mp_digit i; | ||||||
| 
 | 
 | ||||||
|   /* first handle the simple cases */ |    /* first handle the simple cases */ | ||||||
|   if (mp_cmp_d(n, 0) == MP_EQ) { |    if (mp_cmp_d(n, 0) == MP_EQ) { | ||||||
|     mp_zero(ret); |       mp_zero(ret); | ||||||
|     return MP_OKAY; |       return MP_OKAY; | ||||||
|   } |    } | ||||||
|   if (mp_cmp_d(prime, 2) == MP_EQ)                              return MP_VAL; /* prime must be odd */ |    if (mp_cmp_d(prime, 2) == MP_EQ)                              return MP_VAL; /* prime must be odd */ | ||||||
|   if ((res = mp_jacobi(n, prime, &legendre)) != MP_OKAY)        return res; |    if ((res = mp_jacobi(n, prime, &legendre)) != MP_OKAY)        return res; | ||||||
|   if (legendre == -1)                                           return MP_VAL; /* quadratic non-residue mod prime */ |    if (legendre == -1)                                           return MP_VAL; /* quadratic non-residue mod prime */ | ||||||
| 
 | 
 | ||||||
|   if ((res = mp_init_multi(&t1, &C, &Q, &S, &Z, &M, &T, &R, &two, NULL)) != MP_OKAY) { |    if ((res = mp_init_multi(&t1, &C, &Q, &S, &Z, &M, &T, &R, &two, NULL)) != MP_OKAY) { | ||||||
|     return res; |       return res; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* SPECIAL CASE: if prime mod 4 == 3
 |    /* SPECIAL CASE: if prime mod 4 == 3
 | ||||||
|    * compute directly: res = n^(prime+1)/4 mod prime |     * compute directly: res = n^(prime+1)/4 mod prime | ||||||
|    * Handbook of Applied Cryptography algorithm 3.36 |     * Handbook of Applied Cryptography algorithm 3.36 | ||||||
|    */ |     */ | ||||||
|   if ((res = mp_mod_d(prime, 4, &i)) != MP_OKAY)                goto cleanup; |    if ((res = mp_mod_d(prime, 4, &i)) != MP_OKAY)                goto cleanup; | ||||||
|   if (i == 3) { |    if (i == 3) { | ||||||
|     if ((res = mp_add_d(prime, 1, &t1)) != MP_OKAY)             goto cleanup; |       if ((res = mp_add_d(prime, 1, &t1)) != MP_OKAY)             goto cleanup; | ||||||
|     if ((res = mp_div_2(&t1, &t1)) != MP_OKAY)                  goto cleanup; |       if ((res = mp_div_2(&t1, &t1)) != MP_OKAY)                  goto cleanup; | ||||||
|     if ((res = mp_div_2(&t1, &t1)) != MP_OKAY)                  goto cleanup; |       if ((res = mp_div_2(&t1, &t1)) != MP_OKAY)                  goto cleanup; | ||||||
|     if ((res = mp_exptmod(n, &t1, prime, ret)) != MP_OKAY)      goto cleanup; |       if ((res = mp_exptmod(n, &t1, prime, ret)) != MP_OKAY)      goto cleanup; | ||||||
|     res = MP_OKAY; |  | ||||||
|     goto cleanup; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /* NOW: Tonelli-Shanks algorithm */ |  | ||||||
| 
 |  | ||||||
|   /* factor out powers of 2 from prime-1, defining Q and S as: prime-1 = Q*2^S */ |  | ||||||
|   if ((res = mp_copy(prime, &Q)) != MP_OKAY)                    goto cleanup; |  | ||||||
|   if ((res = mp_sub_d(&Q, 1, &Q)) != MP_OKAY)                   goto cleanup; |  | ||||||
|   /* Q = prime - 1 */ |  | ||||||
|   mp_zero(&S); |  | ||||||
|   /* S = 0 */ |  | ||||||
|   while (mp_iseven(&Q) != MP_NO) { |  | ||||||
|     if ((res = mp_div_2(&Q, &Q)) != MP_OKAY)                    goto cleanup; |  | ||||||
|     /* Q = Q / 2 */ |  | ||||||
|     if ((res = mp_add_d(&S, 1, &S)) != MP_OKAY)                 goto cleanup; |  | ||||||
|     /* S = S + 1 */ |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /* find a Z such that the Legendre symbol (Z|prime) == -1 */ |  | ||||||
|   if ((res = mp_set_int(&Z, 2)) != MP_OKAY)                     goto cleanup; |  | ||||||
|   /* Z = 2 */ |  | ||||||
|   while (1) { |  | ||||||
|     if ((res = mp_jacobi(&Z, prime, &legendre)) != MP_OKAY)     goto cleanup; |  | ||||||
|     if (legendre == -1) break; |  | ||||||
|     if ((res = mp_add_d(&Z, 1, &Z)) != MP_OKAY)                 goto cleanup; |  | ||||||
|     /* Z = Z + 1 */ |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   if ((res = mp_exptmod(&Z, &Q, prime, &C)) != MP_OKAY)         goto cleanup; |  | ||||||
|   /* C = Z ^ Q mod prime */ |  | ||||||
|   if ((res = mp_add_d(&Q, 1, &t1)) != MP_OKAY)                  goto cleanup; |  | ||||||
|   if ((res = mp_div_2(&t1, &t1)) != MP_OKAY)                    goto cleanup; |  | ||||||
|   /* t1 = (Q + 1) / 2 */ |  | ||||||
|   if ((res = mp_exptmod(n, &t1, prime, &R)) != MP_OKAY)         goto cleanup; |  | ||||||
|   /* R = n ^ ((Q + 1) / 2) mod prime */ |  | ||||||
|   if ((res = mp_exptmod(n, &Q, prime, &T)) != MP_OKAY)          goto cleanup; |  | ||||||
|   /* T = n ^ Q mod prime */ |  | ||||||
|   if ((res = mp_copy(&S, &M)) != MP_OKAY)                       goto cleanup; |  | ||||||
|   /* M = S */ |  | ||||||
|   if ((res = mp_set_int(&two, 2)) != MP_OKAY)                   goto cleanup; |  | ||||||
| 
 |  | ||||||
|   res = MP_VAL; |  | ||||||
|   while (1) { |  | ||||||
|     if ((res = mp_copy(&T, &t1)) != MP_OKAY)                    goto cleanup; |  | ||||||
|     i = 0; |  | ||||||
|     while (1) { |  | ||||||
|       if (mp_cmp_d(&t1, 1) == MP_EQ) break; |  | ||||||
|       if ((res = mp_exptmod(&t1, &two, prime, &t1)) != MP_OKAY) goto cleanup; |  | ||||||
|       i++; |  | ||||||
|     } |  | ||||||
|     if (i == 0) { |  | ||||||
|       if ((res = mp_copy(&R, ret)) != MP_OKAY)                  goto cleanup; |  | ||||||
|       res = MP_OKAY; |       res = MP_OKAY; | ||||||
|       goto cleanup; |       goto cleanup; | ||||||
|     } |    } | ||||||
|     if ((res = mp_sub_d(&M, i, &t1)) != MP_OKAY)                goto cleanup; | 
 | ||||||
|     if ((res = mp_sub_d(&t1, 1, &t1)) != MP_OKAY)               goto cleanup; |    /* NOW: Tonelli-Shanks algorithm */ | ||||||
|     if ((res = mp_exptmod(&two, &t1, prime, &t1)) != MP_OKAY)   goto cleanup; | 
 | ||||||
|     /* t1 = 2 ^ (M - i - 1) */ |    /* factor out powers of 2 from prime-1, defining Q and S as: prime-1 = Q*2^S */ | ||||||
|     if ((res = mp_exptmod(&C, &t1, prime, &t1)) != MP_OKAY)     goto cleanup; |    if ((res = mp_copy(prime, &Q)) != MP_OKAY)                    goto cleanup; | ||||||
|     /* t1 = C ^ (2 ^ (M - i - 1)) mod prime */ |    if ((res = mp_sub_d(&Q, 1, &Q)) != MP_OKAY)                   goto cleanup; | ||||||
|     if ((res = mp_sqrmod(&t1, prime, &C)) != MP_OKAY)           goto cleanup; |    /* Q = prime - 1 */ | ||||||
|     /* C = (t1 * t1) mod prime */ |    mp_zero(&S); | ||||||
|     if ((res = mp_mulmod(&R, &t1, prime, &R)) != MP_OKAY)       goto cleanup; |    /* S = 0 */ | ||||||
|     /* R = (R * t1) mod prime */ |    while (mp_iseven(&Q) != MP_NO) { | ||||||
|     if ((res = mp_mulmod(&T, &C, prime, &T)) != MP_OKAY)        goto cleanup; |       if ((res = mp_div_2(&Q, &Q)) != MP_OKAY)                    goto cleanup; | ||||||
|     /* T = (T * C) mod prime */ |       /* Q = Q / 2 */ | ||||||
|     mp_set(&M, i); |       if ((res = mp_add_d(&S, 1, &S)) != MP_OKAY)                 goto cleanup; | ||||||
|     /* M = i */ |       /* S = S + 1 */ | ||||||
|   } |    } | ||||||
|  | 
 | ||||||
|  |    /* find a Z such that the Legendre symbol (Z|prime) == -1 */ | ||||||
|  |    if ((res = mp_set_int(&Z, 2)) != MP_OKAY)                     goto cleanup; | ||||||
|  |    /* Z = 2 */ | ||||||
|  |    while (1) { | ||||||
|  |       if ((res = mp_jacobi(&Z, prime, &legendre)) != MP_OKAY)     goto cleanup; | ||||||
|  |       if (legendre == -1) break; | ||||||
|  |       if ((res = mp_add_d(&Z, 1, &Z)) != MP_OKAY)                 goto cleanup; | ||||||
|  |       /* Z = Z + 1 */ | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    if ((res = mp_exptmod(&Z, &Q, prime, &C)) != MP_OKAY)         goto cleanup; | ||||||
|  |    /* C = Z ^ Q mod prime */ | ||||||
|  |    if ((res = mp_add_d(&Q, 1, &t1)) != MP_OKAY)                  goto cleanup; | ||||||
|  |    if ((res = mp_div_2(&t1, &t1)) != MP_OKAY)                    goto cleanup; | ||||||
|  |    /* t1 = (Q + 1) / 2 */ | ||||||
|  |    if ((res = mp_exptmod(n, &t1, prime, &R)) != MP_OKAY)         goto cleanup; | ||||||
|  |    /* R = n ^ ((Q + 1) / 2) mod prime */ | ||||||
|  |    if ((res = mp_exptmod(n, &Q, prime, &T)) != MP_OKAY)          goto cleanup; | ||||||
|  |    /* T = n ^ Q mod prime */ | ||||||
|  |    if ((res = mp_copy(&S, &M)) != MP_OKAY)                       goto cleanup; | ||||||
|  |    /* M = S */ | ||||||
|  |    if ((res = mp_set_int(&two, 2)) != MP_OKAY)                   goto cleanup; | ||||||
|  | 
 | ||||||
|  |    res = MP_VAL; | ||||||
|  |    while (1) { | ||||||
|  |       if ((res = mp_copy(&T, &t1)) != MP_OKAY)                    goto cleanup; | ||||||
|  |       i = 0; | ||||||
|  |       while (1) { | ||||||
|  |          if (mp_cmp_d(&t1, 1) == MP_EQ) break; | ||||||
|  |          if ((res = mp_exptmod(&t1, &two, prime, &t1)) != MP_OKAY) goto cleanup; | ||||||
|  |          i++; | ||||||
|  |       } | ||||||
|  |       if (i == 0) { | ||||||
|  |          if ((res = mp_copy(&R, ret)) != MP_OKAY)                  goto cleanup; | ||||||
|  |          res = MP_OKAY; | ||||||
|  |          goto cleanup; | ||||||
|  |       } | ||||||
|  |       if ((res = mp_sub_d(&M, i, &t1)) != MP_OKAY)                goto cleanup; | ||||||
|  |       if ((res = mp_sub_d(&t1, 1, &t1)) != MP_OKAY)               goto cleanup; | ||||||
|  |       if ((res = mp_exptmod(&two, &t1, prime, &t1)) != MP_OKAY)   goto cleanup; | ||||||
|  |       /* t1 = 2 ^ (M - i - 1) */ | ||||||
|  |       if ((res = mp_exptmod(&C, &t1, prime, &t1)) != MP_OKAY)     goto cleanup; | ||||||
|  |       /* t1 = C ^ (2 ^ (M - i - 1)) mod prime */ | ||||||
|  |       if ((res = mp_sqrmod(&t1, prime, &C)) != MP_OKAY)           goto cleanup; | ||||||
|  |       /* C = (t1 * t1) mod prime */ | ||||||
|  |       if ((res = mp_mulmod(&R, &t1, prime, &R)) != MP_OKAY)       goto cleanup; | ||||||
|  |       /* R = (R * t1) mod prime */ | ||||||
|  |       if ((res = mp_mulmod(&T, &C, prime, &T)) != MP_OKAY)        goto cleanup; | ||||||
|  |       /* T = (T * C) mod prime */ | ||||||
|  |       mp_set(&M, i); | ||||||
|  |       /* M = i */ | ||||||
|  |    } | ||||||
| 
 | 
 | ||||||
| cleanup: | cleanup: | ||||||
|   mp_clear_multi(&t1, &C, &Q, &S, &Z, &M, &T, &R, &two, NULL); |    mp_clear_multi(&t1, &C, &Q, &S, &Z, &M, &T, &R, &two, NULL); | ||||||
|   return res; |    return res; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  | |||||||
							
								
								
									
										110
									
								
								bn_mp_sub_d.c
									
									
									
									
									
								
							
							
						
						
									
										110
									
								
								bn_mp_sub_d.c
									
									
									
									
									
								
							| @ -18,71 +18,71 @@ | |||||||
| /* single digit subtraction */ | /* single digit subtraction */ | ||||||
| int mp_sub_d(mp_int *a, mp_digit b, mp_int *c) | int mp_sub_d(mp_int *a, mp_digit b, mp_int *c) | ||||||
| { | { | ||||||
|   mp_digit *tmpa, *tmpc, mu; |    mp_digit *tmpa, *tmpc, mu; | ||||||
|   int       res, ix, oldused; |    int       res, ix, oldused; | ||||||
| 
 | 
 | ||||||
|   /* grow c as required */ |    /* grow c as required */ | ||||||
|   if (c->alloc < (a->used + 1)) { |    if (c->alloc < (a->used + 1)) { | ||||||
|      if ((res = mp_grow(c, a->used + 1)) != MP_OKAY) { |       if ((res = mp_grow(c, a->used + 1)) != MP_OKAY) { | ||||||
|         return res; |          return res; | ||||||
|      } |       } | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* if a is negative just do an unsigned
 |    /* if a is negative just do an unsigned
 | ||||||
|    * addition [with fudged signs] |     * addition [with fudged signs] | ||||||
|    */ |     */ | ||||||
|   if (a->sign == MP_NEG) { |    if (a->sign == MP_NEG) { | ||||||
|      a->sign = MP_ZPOS; |       a->sign = MP_ZPOS; | ||||||
|      res     = mp_add_d(a, b, c); |       res     = mp_add_d(a, b, c); | ||||||
|      a->sign = c->sign = MP_NEG; |       a->sign = c->sign = MP_NEG; | ||||||
| 
 | 
 | ||||||
|      /* clamp */ |       /* clamp */ | ||||||
|      mp_clamp(c); |       mp_clamp(c); | ||||||
| 
 | 
 | ||||||
|      return res; |       return res; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* setup regs */ |    /* setup regs */ | ||||||
|   oldused = c->used; |    oldused = c->used; | ||||||
|   tmpa    = a->dp; |    tmpa    = a->dp; | ||||||
|   tmpc    = c->dp; |    tmpc    = c->dp; | ||||||
| 
 | 
 | ||||||
|   /* if a <= b simply fix the single digit */ |    /* if a <= b simply fix the single digit */ | ||||||
|   if (((a->used == 1) && (a->dp[0] <= b)) || (a->used == 0)) { |    if (((a->used == 1) && (a->dp[0] <= b)) || (a->used == 0)) { | ||||||
|      if (a->used == 1) { |       if (a->used == 1) { | ||||||
|         *tmpc++ = b - *tmpa; |          *tmpc++ = b - *tmpa; | ||||||
|      } else { |       } else { | ||||||
|         *tmpc++ = b; |          *tmpc++ = b; | ||||||
|      } |       } | ||||||
|      ix      = 1; |       ix      = 1; | ||||||
| 
 | 
 | ||||||
|      /* negative/1digit */ |       /* negative/1digit */ | ||||||
|      c->sign = MP_NEG; |       c->sign = MP_NEG; | ||||||
|      c->used = 1; |       c->used = 1; | ||||||
|   } else { |    } else { | ||||||
|      /* positive/size */ |       /* positive/size */ | ||||||
|      c->sign = MP_ZPOS; |       c->sign = MP_ZPOS; | ||||||
|      c->used = a->used; |       c->used = a->used; | ||||||
| 
 | 
 | ||||||
|      /* subtract first digit */ |       /* subtract first digit */ | ||||||
|      *tmpc    = *tmpa++ - b; |       *tmpc    = *tmpa++ - b; | ||||||
|      mu       = *tmpc >> ((sizeof(mp_digit) * CHAR_BIT) - 1); |       mu       = *tmpc >> ((sizeof(mp_digit) * CHAR_BIT) - 1); | ||||||
|      *tmpc++ &= MP_MASK; |       *tmpc++ &= MP_MASK; | ||||||
| 
 | 
 | ||||||
|      /* handle rest of the digits */ |       /* handle rest of the digits */ | ||||||
|      for (ix = 1; ix < a->used; ix++) { |       for (ix = 1; ix < a->used; ix++) { | ||||||
|         *tmpc    = *tmpa++ - mu; |          *tmpc    = *tmpa++ - mu; | ||||||
|         mu       = *tmpc >> ((sizeof(mp_digit) * CHAR_BIT) - 1); |          mu       = *tmpc >> ((sizeof(mp_digit) * CHAR_BIT) - 1); | ||||||
|         *tmpc++ &= MP_MASK; |          *tmpc++ &= MP_MASK; | ||||||
|      } |       } | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   /* zero excess digits */ |    /* zero excess digits */ | ||||||
|   while (ix++ < oldused) { |    while (ix++ < oldused) { | ||||||
|      *tmpc++ = 0; |       *tmpc++ = 0; | ||||||
|   } |    } | ||||||
|   mp_clamp(c); |    mp_clamp(c); | ||||||
|   return MP_OKAY; |    return MP_OKAY; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -18,21 +18,21 @@ | |||||||
| /* d = a - b (mod c) */ | /* d = a - b (mod c) */ | ||||||
| int mp_submod(mp_int *a, mp_int *b, mp_int *c, mp_int *d) | int mp_submod(mp_int *a, mp_int *b, mp_int *c, mp_int *d) | ||||||
| { | { | ||||||
|   int     res; |    int     res; | ||||||
|   mp_int  t; |    mp_int  t; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|   if ((res = mp_init(&t)) != MP_OKAY) { |    if ((res = mp_init(&t)) != MP_OKAY) { | ||||||
|     return res; |       return res; | ||||||
|   } |    } | ||||||
| 
 | 
 | ||||||
|   if ((res = mp_sub(a, b, &t)) != MP_OKAY) { |    if ((res = mp_sub(a, b, &t)) != MP_OKAY) { | ||||||
|     mp_clear(&t); |       mp_clear(&t); | ||||||
|     return res; |       return res; | ||||||
|   } |    } | ||||||
|   res = mp_mod(&t, c, d); |    res = mp_mod(&t, c, d); | ||||||
|   mp_clear(&t); |    mp_clear(&t); | ||||||
|   return res; |    return res; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user