rsa_util.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "sec_osal_light.h"
  2. #include "sec_cust_struct.h"
  3. #include "bgn_internal.h"
  4. #define MOD "BGN"
  5. /**************************************************************************
  6. * FUNCTIONS
  7. **************************************************************************/
  8. void montg_init(ulong *mm, const bgn *P_N)
  9. {
  10. ulong x, m0 = P_N->p[0];
  11. x = m0;
  12. x += ((m0 + 2) & 4) << 1;
  13. x *= (2 - (m0 * x));
  14. if (biL >= 16)
  15. x *= (2 - (m0 * x));
  16. if (biL >= 32)
  17. x *= (2 - (m0 * x));
  18. if (biL >= 64)
  19. x *= (2 - (m0 * x));
  20. *mm = ~x + 1;
  21. }
  22. void montg_mul(bgn *P_A, const bgn *P_B, const bgn *P_N, ulong mm, const bgn *P_T)
  23. {
  24. int i, n, m;
  25. ulong u0, u1, *d;
  26. memset(P_T->p, 0, P_T->n * ciL);
  27. d = P_T->p;
  28. n = P_N->n;
  29. m = (P_B->n < n) ? P_B->n : n;
  30. for (i = 0; i < n; i++) {
  31. u0 = P_A->p[i];
  32. u1 = (d[0] + u0 * P_B->p[0]) * mm;
  33. bgn_mul_hlp(m, P_B->p, d, u0);
  34. bgn_mul_hlp(n, P_N->p, d, u1);
  35. *d++ = u0;
  36. d[n + 1] = 0;
  37. }
  38. memcpy(P_A->p, d, (n + 1) * ciL);
  39. if (bgn_cmp_abs(P_A, P_N) >= 0)
  40. bgn_sub_hlp(n, P_N->p, P_A->p);
  41. else
  42. bgn_sub_hlp(n, P_A->p, P_T->p);
  43. }
  44. void montg_red(bgn *P_A, const bgn *P_N, ulong mm, const bgn *P_T)
  45. {
  46. ulong z = 1;
  47. bgn U;
  48. U.n = U.s = z;
  49. U.p = &z;
  50. montg_mul(P_A, &U, P_N, mm, P_T);
  51. }