Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

67 rindas
1.4 KiB

  1. // +build noasm !amd64
  2. package internal
  3. // helper used for Uint128 representation
  4. type Uint128 struct {
  5. H, L uint64
  6. }
  7. // Adds 2 64bit digits in constant time.
  8. // Returns result and carry (1 or 0)
  9. func Addc64(cin, a, b uint64) (ret, cout uint64) {
  10. t := a + cin
  11. ret = b + t
  12. cout = ((a & b) | ((a | b) & (^ret))) >> 63
  13. return
  14. }
  15. // Substracts 2 64bit digits in constant time.
  16. // Returns result and borrow (1 or 0)
  17. func Subc64(bIn, a, b uint64) (ret, bOut uint64) {
  18. var tmp1 = a - b
  19. // Set bOut if bIn!=0 and tmp1==0 in constant time
  20. bOut = bIn & (1 ^ ((tmp1 | uint64(0-tmp1)) >> 63))
  21. // Constant time check if x<y
  22. bOut |= (a ^ ((a ^ b) | (uint64(a-b) ^ b))) >> 63
  23. ret = tmp1 - bIn
  24. return
  25. }
  26. // Multiplies 2 64bit digits in constant time
  27. func Mul64(a, b uint64) (res Uint128) {
  28. var al, bl, ah, bh, albl, albh, ahbl, ahbh uint64
  29. var res1, res2, res3 uint64
  30. var carry, maskL, maskH, temp uint64
  31. maskL = (^maskL) >> 32
  32. maskH = ^maskL
  33. al = a & maskL
  34. ah = a >> 32
  35. bl = b & maskL
  36. bh = b >> 32
  37. albl = al * bl
  38. albh = al * bh
  39. ahbl = ah * bl
  40. ahbh = ah * bh
  41. res.L = albl & maskL
  42. res1 = albl >> 32
  43. res2 = ahbl & maskL
  44. res3 = albh & maskL
  45. temp = res1 + res2 + res3
  46. carry = temp >> 32
  47. res.L ^= temp << 32
  48. res1 = ahbl >> 32
  49. res2 = albh >> 32
  50. res3 = ahbh & maskL
  51. temp = res1 + res2 + res3 + carry
  52. res.H = temp & maskL
  53. carry = temp & maskH
  54. res.H ^= (ahbh & maskH) + carry
  55. return
  56. }