Advertisement
Guest User

Untitled

a guest
Feb 25th, 2020
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.39 KB | None | 0 0
  1.     def is_negative(x):
  2.         return int(x + x) & 1
  3.    
  4.     p = 2^255 - 19
  5.     f = GF(p)
  6.     A = 486662
  7.     sqrtm1 = f(2)^((p - 1) / 4)
  8.     if is_negative(sqrtm1): sqrtm1 = -sqrtm1
  9.     u = sqrtm1
  10.    
  11.     def invsqrt(x):
  12.         isr = x^((p - 5) / 8)
  13.         quartic = x * isr^2
  14.         if quartic == -1 or quartic == -sqrtm1:
  15.             isr = isr * sqrtm1
  16.         is_square = quartic == 1 or quartic == -1
  17.         return isr, is_square
  18.    
  19.     def fast_hash_to_curve(q):
  20.         r = u * q^2
  21.         num = A * (A^2 * r - (r + 1)^2)
  22.         den = (r + 1)^3
  23.         # x = -A / (r + 1)
  24.         # y = x^3 + A*x^2 + x
  25.         # y = A^3/(r + 1)^2 - A^3/(r + 1)^3 - A/(r + 1)
  26.         # y = (A^3*r - A*(r + 1)^2) / (r + 1)^3
  27.         isr, is_square = invsqrt(num * den)
  28.         # if is_square: isr = sqrt(1 / (num * den))
  29.         # if not is_square: isr = sqrt(u / (num * den))
  30.         x = -A * (num * (r + 1)^2 * isr^2)
  31.         # x = -A * num * (r + 1)^2 * sqrt(1 / (num * den))^2
  32.         # x = -A * num * (r + 1)^2 * 1 / (num * den)
  33.         # x = -A * (r + 1)^2 * 1 / den
  34.         # x = -A / (r + 1)
  35.         y = num * isr
  36.         # y = num * sqrt(1 / (num * den))
  37.         # y = sqrt(num^2 / (num * den))
  38.         # y = sqrt(num / den)
  39.         if is_square: q = 1
  40.         x = q^2 * x
  41.         # x = q^2 * -A * u / (r + 1)
  42.         # x = -A * u * q^2 / (r + 1)
  43.         # x = -A * r / (r + 1)
  44.         y = q * y
  45.         # y = q * sqrt(u * num / den)
  46.         # y = sqrt(u * q^2 * num / den)
  47.         # y = sqrt(r * num / den)
  48.         if is_negative(y): y = -y
  49.         if not is_square: y = -y
  50.         return (x, y)
  51.    
  52.     def fast_curve_to_hash(p):
  53.         x, y = p
  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 false
  62.         num = t0
  63.         if is_negative(y): 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.         if is_negative(q): q = -q
  70.         return q
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement