Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.40 KB | None | 0 0
  1. /*
  2. * montgomeryOpt.c
  3. *
  4. * Created on: Oct 16, 2019
  5. * Author: r0666113
  6. */
  7.  
  8.  
  9.  
  10. #include "montgomeryOpt.h"
  11. #include "asm_montgomeryOpt.h"
  12.  
  13.  
  14. //Add C to t array, starting from element i.
  15. void customAddOpt(uint32_t *t,uint32_t i, uint32_t C){
  16. uint64_t sum;
  17. while (C!= 0)
  18. {
  19. sum = ((uint64_t) t[i]) + ((uint64_t) C);
  20. C = (uint32_t) (sum>>32);
  21. t[i] = (uint32_t) sum;
  22. i = i+1;
  23. }
  24. }
  25.  
  26.  
  27.  
  28.  
  29. void condSubtractOpt(uint32_t *n, uint32_t *res, uint32_t *t_prime, uint32_t size) {
  30. uint8_t i;
  31. uint32_t negative_carry = 0;
  32. for (i=0; i < size; i++) {
  33. res[i] = t_prime[i] - n[i] - negative_carry;
  34. if (t_prime[i] >= n[i]) {
  35. negative_carry = 0;
  36. } else {
  37. negative_carry = 1;
  38. }
  39. }
  40. if (negative_carry==1) { //b is greater than a
  41. for (i=0; i < size; i++) {
  42. res[i] = t_prime[i];
  43. }
  44. }
  45. }
  46.  
  47. void customprintMontOpt(uint32_t *in, char *str, uint32_t size) {
  48. int32_t i;
  49.  
  50. xil_printf("0x");
  51. for (i = size-1; i >= 0 ; i--) {
  52. xil_printf("%8x", in[i]) ;
  53. }
  54. xil_printf("\n\r");
  55. }
  56.  
  57. // Calculates res = a * b * r^(-1) mod n.
  58. // a, b, n, n_prime represent operands of size elements
  59. // res has (size+1) elements
  60. void montMulOpt(uint32_t *a, uint32_t *b, uint32_t *n, uint32_t *n_prime, uint32_t *res, uint32_t size)
  61. {
  62. uint32_t i;
  63. uint32_t c;
  64. uint32_t j;
  65. uint64_t z;
  66. uint64_t sum;
  67. uint32_t length = 2*size + 1;
  68. uint32_t t[length];
  69. uint32_t t_prime[size];
  70. for(uint32_t k=0; k < length; k++){
  71. t[k] =0; // set elements of t to 0
  72. }
  73. //START_TIMING
  74. for(i=0; i < size; i++){
  75. c=0;
  76. for(j=0; j < size; j++){
  77. sum = ((uint64_t) t[i+j]) + ((uint64_t) a[j])*((uint64_t)b[i]) + ((uint64_t)c);
  78. c = (uint32_t) (sum >> 32); //msb
  79. t[i+j] = (uint32_t) (sum); //lsb
  80. }
  81. t[i + size] = c;
  82. }
  83. //STOP_TIMING
  84. /*for (i=0; i < 64; i++) {
  85. res[i] = t[i];
  86. }*/
  87.  
  88. //customprintMont(t, "res", 32);
  89. //12 330
  90. for (i=0; i<size; i++){ //358 per cycle total
  91. c = reduction(n, n_prime, t, i, size);
  92. //START_TIMING About 64 per loop so 2000 total
  93. customAddOpt(t,i+size,c);
  94.  
  95. }
  96.  
  97.  
  98. //Perform the shift result by copying t into res.
  99. for(uint32_t j=0; j<size+1; j++){
  100. t_prime[j] = t[j+size]; // Replaced res with t_prime, because res isn't final
  101. }
  102.  
  103. condSubtractOpt(n, res, t_prime, size);
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement