You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

139 lines
3.3 KiB

  1. #include "vec.h"
  2. #include "params.h"
  3. vec PQCLEAN_MCELIECE6960119_VEC_vec_setbits(vec b) {
  4. vec ret = -b;
  5. return ret;
  6. }
  7. vec PQCLEAN_MCELIECE6960119_VEC_vec_set1_16b(uint16_t v) {
  8. vec ret;
  9. ret = v;
  10. ret |= ret << 16;
  11. ret |= ret << 32;
  12. return ret;
  13. }
  14. void PQCLEAN_MCELIECE6960119_VEC_vec_copy(vec *out, const vec *in) {
  15. int i;
  16. for (i = 0; i < GFBITS; i++) {
  17. out[i] = in[i];
  18. }
  19. }
  20. vec PQCLEAN_MCELIECE6960119_VEC_vec_or_reduce(const vec *a) {
  21. int i;
  22. vec ret;
  23. ret = a[0];
  24. for (i = 1; i < GFBITS; i++) {
  25. ret |= a[i];
  26. }
  27. return ret;
  28. }
  29. int PQCLEAN_MCELIECE6960119_VEC_vec_testz(vec a) {
  30. a |= a >> 32;
  31. a |= a >> 16;
  32. a |= a >> 8;
  33. a |= a >> 4;
  34. a |= a >> 2;
  35. a |= a >> 1;
  36. return (int)(a & 1) ^ 1;
  37. }
  38. void PQCLEAN_MCELIECE6960119_VEC_vec_mul(vec *h, const vec *f, const vec *g) {
  39. int i, j;
  40. vec buf[ 2 * GFBITS - 1 ];
  41. for (i = 0; i < 2 * GFBITS - 1; i++) {
  42. buf[i] = 0;
  43. }
  44. for (i = 0; i < GFBITS; i++) {
  45. for (j = 0; j < GFBITS; j++) {
  46. buf[i + j] ^= f[i] & g[j];
  47. }
  48. }
  49. for (i = 2 * GFBITS - 2; i >= GFBITS; i--) {
  50. buf[i - GFBITS + 4] ^= buf[i];
  51. buf[i - GFBITS + 3] ^= buf[i];
  52. buf[i - GFBITS + 1] ^= buf[i];
  53. buf[i - GFBITS + 0] ^= buf[i];
  54. }
  55. for (i = 0; i < GFBITS; i++) {
  56. h[i] = buf[i];
  57. }
  58. }
  59. /* bitsliced field squarings */
  60. void PQCLEAN_MCELIECE6960119_VEC_vec_sq(vec *out, const vec *in) {
  61. int i;
  62. vec result[GFBITS], t;
  63. t = in[11] ^ in[12];
  64. result[0] = in[0] ^ in[11];
  65. result[1] = in[7] ^ t;
  66. result[2] = in[1] ^ in[7];
  67. result[3] = in[8] ^ t;
  68. result[4] = in[2] ^ in[7];
  69. result[4] = result[4] ^ in[8];
  70. result[4] = result[4] ^ t;
  71. result[5] = in[7] ^ in[9];
  72. result[6] = in[3] ^ in[8];
  73. result[6] = result[6] ^ in[9];
  74. result[6] = result[6] ^ in[12];
  75. result[7] = in[8] ^ in[10];
  76. result[8] = in[4] ^ in[9];
  77. result[8] = result[8] ^ in[10];
  78. result[9] = in[9] ^ in[11];
  79. result[10] = in[5] ^ in[10];
  80. result[10] = result[10] ^ in[11];
  81. result[11] = in[10] ^ in[12];
  82. result[12] = in[6] ^ t;
  83. for (i = 0; i < GFBITS; i++) {
  84. out[i] = result[i];
  85. }
  86. }
  87. /* bitsliced field inverses */
  88. void PQCLEAN_MCELIECE6960119_VEC_vec_inv(vec *out, const vec *in) {
  89. vec tmp_11[ GFBITS ];
  90. vec tmp_1111[ GFBITS ];
  91. PQCLEAN_MCELIECE6960119_VEC_vec_copy(out, in);
  92. PQCLEAN_MCELIECE6960119_VEC_vec_sq(out, out);
  93. PQCLEAN_MCELIECE6960119_VEC_vec_mul(tmp_11, out, in); // ^11
  94. PQCLEAN_MCELIECE6960119_VEC_vec_sq(out, tmp_11);
  95. PQCLEAN_MCELIECE6960119_VEC_vec_sq(out, out);
  96. PQCLEAN_MCELIECE6960119_VEC_vec_mul(tmp_1111, out, tmp_11); // ^1111
  97. PQCLEAN_MCELIECE6960119_VEC_vec_sq(out, tmp_1111);
  98. PQCLEAN_MCELIECE6960119_VEC_vec_sq(out, out);
  99. PQCLEAN_MCELIECE6960119_VEC_vec_sq(out, out);
  100. PQCLEAN_MCELIECE6960119_VEC_vec_sq(out, out);
  101. PQCLEAN_MCELIECE6960119_VEC_vec_mul(out, out, tmp_1111); // ^11111111
  102. PQCLEAN_MCELIECE6960119_VEC_vec_sq(out, out);
  103. PQCLEAN_MCELIECE6960119_VEC_vec_sq(out, out);
  104. PQCLEAN_MCELIECE6960119_VEC_vec_sq(out, out);
  105. PQCLEAN_MCELIECE6960119_VEC_vec_sq(out, out);
  106. PQCLEAN_MCELIECE6960119_VEC_vec_mul(out, out, tmp_1111); // ^111111111111
  107. PQCLEAN_MCELIECE6960119_VEC_vec_sq(out, out); // ^1111111111110
  108. }