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.
 
 
 
 
 

41 lines
1.2 KiB

  1. /* Copyright (c) 2014-2016 Cryptography Research, Inc.
  2. * Released under the MIT License. See LICENSE.txt for license information.
  3. */
  4. #define GF_HEADROOM 2
  5. #define LIMB(x) (x##ull)&((1ull<<28)-1), (x##ull)>>28
  6. #define FIELD_LITERAL(a,b,c,d,e,f,g,h) \
  7. {{LIMB(a),LIMB(b),LIMB(c),LIMB(d),LIMB(e),LIMB(f),LIMB(g),LIMB(h)}}
  8. #define LIMB_PLACE_VALUE(i) 28
  9. void gf_add_RAW (gf out, const gf a, const gf b) {
  10. for (unsigned int i=0; i<sizeof(*out)/sizeof(out->limb[0]); i++) {
  11. out->limb[i] = a->limb[i] + b->limb[i];
  12. }
  13. }
  14. void gf_sub_RAW (gf out, const gf a, const gf b) {
  15. for (unsigned int i=0; i<sizeof(*out)/sizeof(out->limb[0]); i++) {
  16. out->limb[i] = a->limb[i] - b->limb[i];
  17. }
  18. }
  19. void gf_bias (gf a, int amt) {
  20. uint32_t co1 = ((1ull<<28)-1)*amt, co2 = co1-amt;
  21. for (unsigned int i=0; i<sizeof(*a)/sizeof(a->limb[0]); i++) {
  22. a->limb[i] += (i==sizeof(*a)/sizeof(a->limb[0])/2) ? co2 : co1;
  23. }
  24. }
  25. void gf_weak_reduce (gf a) {
  26. uint32_t mask = (1ull<<28) - 1;
  27. uint32_t tmp = a->limb[15] >> 28;
  28. a->limb[8] += tmp;
  29. for (unsigned int i=15; i>0; i--) {
  30. a->limb[i] = (a->limb[i] & mask) + (a->limb[i-1]>>28);
  31. }
  32. a->limb[0] = (a->limb[0] & mask) + tmp;
  33. }