Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.22 KB | None | 0 0
  1. A = fe(486662)
  2. sqrtm1 = (fe(2)**((p - 1) // 4)).abs()
  3. u = fe(2)
  4. ufactor = -u * sqrtm1
  5. ufactor_sqrt = (ufactor)**((p + 3) // 8)
  6.  
  7. def invsqrt(x):
  8.     isr = x**((p - 5) // 8)
  9.     quartic = x * isr**2
  10.     if quartic == fe(-1) or quartic == -sqrtm1:
  11.         isr = isr * sqrtm1
  12.     is_square = quartic == fe(1) or quartic == fe(-1)
  13.     return isr, is_square
  14.  
  15. def fast_hash_to_curve(q):
  16.     r = u * q**2
  17.     r1 = (r + fe(1))
  18.     num = A * (A**2 * r - r1**2)
  19.     den = r1**3
  20.     # x = -A / (r + 1)
  21.     # y = x^3 + A*x^2 + x
  22.     # y = A^3/(r + 1)^2 - A^3/(r + 1)^3 - A/(r + 1)
  23.     # y = (A^3*r - A*(r + 1)^2) / (r + 1)^3
  24.     isr, is_square = invsqrt(num * den)
  25.     # if is_square: isr = sqrt(1 / (num * den))
  26.     # if not is_square: isr = sqrt(sqrtm1 / (num * den))
  27.     x = -A * (num * r1**2 * isr**2)
  28.     # x = -A * num * (r + 1)^2 * sqrt(1 / (num * den))^2
  29.     # x = -A * num * (r + 1)^2 * 1 / (num * den)
  30.     # x = -A * (r + 1)^2 * 1 / den
  31.     # x = -A / (r + 1)
  32.     y = num * isr
  33.     # y = num * sqrt(1 / (num * den))
  34.     # y = sqrt(num^2 / (num * den))
  35.     # y = sqrt(num / den)
  36.     qx = q**2 * ufactor
  37.     qy = q * ufactor_sqrt
  38.     if is_square: qx = fe(1)
  39.     if is_square: qy = fe(1)
  40.     x = qx * x
  41.     # x = q^2 * -u * sqrt(-1) * -A * sqrt(-1) / (r + 1)
  42.     # x = -A * u * q^2 / (r + 1)
  43.     # x = -A * r / (r + 1)
  44.     y = qy * y
  45.     # y = q * sqrt(-u * sqrtm1) * sqrt(sqrt(-1) * num / den)
  46.     # y = sqrt(q^2 * u * num / den)
  47.     # y = sqrt(r * num / den)
  48.     y = y.abs()
  49.     if not is_square: y = -y
  50.     return (x, y)
  51.  
  52. def fast_curve_to_hash(point):
  53.     x, y = point
  54.     t0 = A + x
  55.     t1 = x
  56.     # if is_positive(y): r = u*q^2 = -(A + x)/x
  57.     # if is_negative(y): r = u*q^2 = -x/(A + x)
  58.     isr, is_square = invsqrt(-t0 * t1 * u)
  59.     # isr = sqrt(-1 / ((A + x) * x * u))
  60.     if not is_square:
  61.         return None
  62.     num = t0
  63.     if y.is_positive(): num = t1
  64.     q = num * isr
  65.     # if is_positive(y): q = (A + x) * sqrt(1 / (-x * (A + x) * u)) = sqrt(-(A + x) / (x * u))
  66.     # if is_positive(y): q = sqrt(-(A + x) / (x * u))
  67.     # if is_negative(y): q = x * sqrt(1 / (-x * (A + x) * u)) = sqrt(-x / ((A + x) * u))
  68.     # if is_negative(y): q = sqrt(-x / ((A + x) * u))
  69.     q = q.abs()
  70.     return q
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement