curve.sage 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. # stark curve https://docs.starkware.co/starkex/crypto/stark-curve.html
  2. import random
  3. p = 3618502788666131213697322783095070105623107215331596699973092056135872020481
  4. alpha = 1
  5. # $$y^2 = x^3 + \alpha \dot x + \beta$$ (mod p)
  6. beta = 3141592653589793238462643383279502884197169399375105820974944592307816406665
  7. F = GF(p)
  8. E = EllipticCurve(F, [alpha,beta])
  9. ec_order = E.order()
  10. # ECDSA scheme generator
  11. G_generator = E(874739451078007766457464989774322083649278607533249481151382481072868806602, 152666792071518830868575557812948353041420400780739481342941381225525861407)
  12. p_scalar = 3618502788666131213697322783095070105526743751716087489154079457884512865583
  13. K = GF(p_scalar)
  14. class CurvePoint():
  15. def __init__(self, x=None, y=None):
  16. if x==None or y==None:
  17. self.point = CurvePoint.random()
  18. else:
  19. self.point = E(x,y)
  20. self.x = self.point[0]
  21. self.y = self.point[1]
  22. def zero():
  23. return G_generator * 0
  24. def __repr__(self):
  25. return bytes("[ x: {}, y: {}, z: 1]".format(self.x, self.y), encoding='utf-8')
  26. def __str__(self):
  27. return self.__repr__()
  28. def random(max=p):
  29. return G_generator * random.randint(0, max)
  30. def __add__(self, rhs):
  31. return self.point + rhs.point
  32. def __sub__(self, rhs):
  33. return self.point - rhs.point
  34. def __neg__(self):
  35. return -1 * self.point
  36. def generator():
  37. return G_generator
  38. def __mul__(self, factor):
  39. return factor * self.point
  40. def msm(points, scalars):
  41. assert len(points) == len(scalars), 'len(p): {}, len(s): {}'.format(len(points), len(scalars))
  42. return sum([s*p for (s, p) in zip(points, scalars)])