Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

82 linhas
2.6 KiB

  1. #include "mq.h"
  2. #include "params.h"
  3. /* Computes all products x_i * x_j, returns in reduced form */
  4. inline static
  5. void generate_quadratic_terms( gf31 *xij, const gf31 *x ) {
  6. int i, j, k;
  7. k = 0;
  8. for (i = 0; i < N; i++) {
  9. for (j = 0; j <= i; j++) {
  10. xij[k] = PQCLEAN_MQDSS48_CLEAN_mod31((gf31)(x[i] * x[j]));
  11. k++;
  12. }
  13. }
  14. }
  15. /* Computes all terms (x_i * y_j) + (x_j * y_i), returns in reduced form */
  16. inline static
  17. void generate_xiyj_p_xjyi_terms( gf31 *xij, const gf31 *x, const gf31 *y ) {
  18. int i, j, k;
  19. k = 0;
  20. for (i = 0; i < N; i++) {
  21. for (j = 0; j <= i; j++) {
  22. xij[k] = PQCLEAN_MQDSS48_CLEAN_mod31((gf31)(x[i] * y[j] + x[j] * y[i]));
  23. k++;
  24. }
  25. }
  26. }
  27. /* Evaluates the MQ function on a vector of N gf31 elements x (expected to be
  28. in reduced 5-bit representation). Expects the coefficients in F to be in
  29. signed representation (i.e. [-15, 15], packed bytewise).
  30. Outputs M gf31 elements in unique 16-bit representation as fx. */
  31. void PQCLEAN_MQDSS48_CLEAN_MQ(gf31 *fx, const gf31 *x, const signed char *F) {
  32. int i, j;
  33. gf31 _xij[N * (N + 1) >> 1];
  34. int r[M] = {0};
  35. generate_quadratic_terms(_xij, x);
  36. for (i = 0; i < N; i += 2) {
  37. for (j = 0; j < M; j++) {
  38. r[j] += ((int)x[i]) * ((int)F[i * M + 2 * j]) +
  39. ((int)x[i + 1]) * ((int)F[i * M + 2 * j + 1]);
  40. }
  41. }
  42. for (i = 0; i < (N * (N + 1)) >> 1; i += 2) {
  43. for (j = 0; j < M; j++) {
  44. r[j] += ((int)_xij[i]) * ((int)F[N * M + i * M + 2 * j]) +
  45. ((int)_xij[i + 1]) * ((int)F[N * M + i * M + 2 * j + 1]);
  46. }
  47. }
  48. for (i = 0; i < M; i++) {
  49. fx[i] = PQCLEAN_MQDSS48_CLEAN_mod31((gf31)((r[i] >> 15) + (r[i] & 0x7FFF)));
  50. }
  51. }
  52. /* Evaluates the bilinear polar form of the MQ function (i.e. G) on a vector of
  53. N gf31 elements x (expected to be in reduced 5-bit representation). Expects
  54. the coefficients in F to be in signed representation (i.e. [-15, 15], packed
  55. bytewise). Outputs M gf31 elements in unique 16-bit representation as fx. */
  56. void PQCLEAN_MQDSS48_CLEAN_G(gf31 *fx, const gf31 *x, const gf31 *y, const signed char *F) {
  57. int i, j;
  58. gf31 _xij[N * (N + 1) >> 1];
  59. int r[M] = {0};
  60. generate_xiyj_p_xjyi_terms(_xij, x, y);
  61. for (i = 0; i < (N * (N + 1)) >> 1; i += 2) {
  62. for (j = 0; j < M; j++) {
  63. r[j] += ((int)_xij[i]) * ((int)F[N * M + i * M + 2 * j]) +
  64. ((int)_xij[i + 1]) * ((int)F[N * M + i * M + 2 * j + 1]);
  65. }
  66. }
  67. for (i = 0; i < M; i++) {
  68. fx[i] = PQCLEAN_MQDSS48_CLEAN_mod31((gf31)((r[i] >> 15) + (r[i] & 0x7FFF)));
  69. }
  70. }