Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

55 lignes
2.2 KiB

  1. #include "sample.h"
  2. #include "fips202.h"
  3. void PQCLEAN_NTRUHPS4096821_CLEAN_sample_fg(poly *f, poly *g, const unsigned char uniformbytes[NTRU_SAMPLE_FG_BYTES]) {
  4. PQCLEAN_NTRUHPS4096821_CLEAN_sample_iid(f, uniformbytes);
  5. PQCLEAN_NTRUHPS4096821_CLEAN_sample_fixed_type(g, uniformbytes + NTRU_SAMPLE_IID_BYTES);
  6. }
  7. void PQCLEAN_NTRUHPS4096821_CLEAN_sample_rm(poly *r, poly *m, const unsigned char uniformbytes[NTRU_SAMPLE_RM_BYTES]) {
  8. PQCLEAN_NTRUHPS4096821_CLEAN_sample_iid(r, uniformbytes);
  9. PQCLEAN_NTRUHPS4096821_CLEAN_sample_fixed_type(m, uniformbytes + NTRU_SAMPLE_IID_BYTES);
  10. }
  11. void PQCLEAN_NTRUHPS4096821_CLEAN_sample_iid(poly *r, const unsigned char uniformbytes[NTRU_SAMPLE_IID_BYTES]) {
  12. int i;
  13. /* {0,1,...,255} -> {0,1,2}; Pr[0] = 86/256, Pr[1] = Pr[-1] = 85/256 */
  14. for (i = 0; i < NTRU_N - 1; i++) {
  15. r->coeffs[i] = PQCLEAN_NTRUHPS4096821_CLEAN_mod3(uniformbytes[i]);
  16. }
  17. r->coeffs[NTRU_N - 1] = 0;
  18. }
  19. #include "crypto_sort.h"
  20. void PQCLEAN_NTRUHPS4096821_CLEAN_sample_fixed_type(poly *r, const unsigned char u[NTRU_SAMPLE_FT_BYTES]) {
  21. // Assumes NTRU_SAMPLE_FT_BYTES = ceil(30*(n-1)/8)
  22. uint32_t s[NTRU_N - 1];
  23. int i;
  24. // Use 30 bits of u per word
  25. for (i = 0; i < (NTRU_N - 1) / 4; i++) {
  26. s[4 * i + 0] = (u[15 * i + 0] << 2) + (u[15 * i + 1] << 10) + (u[15 * i + 2] << 18) + ((uint32_t) u[15 * i + 3] << 26);
  27. s[4 * i + 1] = ((u[15 * i + 3] & 0xc0) >> 4) + (u[15 * i + 4] << 4) + (u[15 * i + 5] << 12) + (u[15 * i + 6] << 20) + ((uint32_t) u[15 * i + 7] << 28);
  28. s[4 * i + 2] = ((u[15 * i + 7] & 0xf0) >> 2) + (u[15 * i + 8] << 6) + (u[15 * i + 9] << 14) + (u[15 * i + 10] << 22) + ((uint32_t) u[15 * i + 11] << 30);
  29. s[4 * i + 3] = (u[15 * i + 11] & 0xfc) + (u[15 * i + 12] << 8) + (u[15 * i + 13] << 15) + ((uint32_t) u[15 * i + 14] << 24);
  30. }
  31. for (i = 0; i < NTRU_WEIGHT / 2; i++) {
  32. s[i] |= 1;
  33. }
  34. for (i = NTRU_WEIGHT / 2; i < NTRU_WEIGHT; i++) {
  35. s[i] |= 2;
  36. }
  37. PQCLEAN_NTRUHPS4096821_CLEAN_crypto_sort(s, NTRU_N - 1);
  38. for (i = 0; i < NTRU_N - 1; i++) {
  39. r->coeffs[i] = ((uint16_t) (s[i] & 3));
  40. }
  41. r->coeffs[NTRU_N - 1] = 0;
  42. }