tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

base.py (1511B)


      1 # Future imports for Python 2.7, mandatory in 3.0
      2 from __future__ import division
      3 from __future__ import print_function
      4 from __future__ import unicode_literals
      5 
      6 b = 256
      7 q = 2**255 - 19
      8 l = 2**252 + 27742317777372353535851937790883648493
      9 
     10 def expmod(b,e,m):
     11  if e == 0: return 1
     12  t = expmod(b,e/2,m)**2 % m
     13  if e & 1: t = (t*b) % m
     14  return t
     15 
     16 def inv(x):
     17  return expmod(x,q-2,q)
     18 
     19 d = -121665 * inv(121666)
     20 I = expmod(2,(q-1)/4,q)
     21 
     22 def xrecover(y):
     23  xx = (y*y-1) * inv(d*y*y+1)
     24  x = expmod(xx,(q+3)/8,q)
     25  if (x*x - xx) % q != 0: x = (x*I) % q
     26  if x % 2 != 0: x = q-x
     27  return x
     28 
     29 By = 4 * inv(5)
     30 Bx = xrecover(By)
     31 B = [Bx % q,By % q]
     32 
     33 def edwards(P,Q):
     34  x1 = P[0]
     35  y1 = P[1]
     36  x2 = Q[0]
     37  y2 = Q[1]
     38  x3 = (x1*y2+x2*y1) * inv(1+d*x1*x2*y1*y2)
     39  y3 = (y1*y2+x1*x2) * inv(1-d*x1*x2*y1*y2)
     40  return [x3 % q,y3 % q]
     41 
     42 def radix255(x):
     43  x = x % q
     44  if x + x > q: x -= q
     45  x = [x,0,0,0,0,0,0,0,0,0]
     46  bits = [26,25,26,25,26,25,26,25,26,25]
     47  for i in range(9):
     48    carry = (x[i] + 2**(bits[i]-1)) / 2**bits[i]
     49    x[i] -= carry * 2**bits[i]
     50    x[i + 1] += carry
     51  result = ""
     52  for i in range(9):
     53    result = result+str(x[i])+","
     54  result = result+str(x[9])
     55  return result
     56 
     57 Bi = B
     58 for i in range(32):
     59  print("{")
     60  Bij = Bi
     61  for j in range(8):
     62    print(" {")
     63    print("  {",radix255(Bij[1]+Bij[0]),"},")
     64    print("  {",radix255(Bij[1]-Bij[0]),"},")
     65    print("  {",radix255(2*d*Bij[0]*Bij[1]),"},")
     66    Bij = edwards(Bij,Bi)
     67    print(" },")
     68  print("},")
     69  for k in range(8):
     70    Bi = edwards(Bi,Bi)