bltprf.sage 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. q = 0x40000000000000000000000000000000224698fc0994a8dd8c46eb2100000001
  2. K = GF(q)
  3. a = K(0x00)
  4. b = K(0x05)
  5. E = EllipticCurve(K, (a, b))
  6. G = E(0x40000000000000000000000000000000224698fc0994a8dd8c46eb2100000000, 0x02)
  7. p = 0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001
  8. assert E.order() == p
  9. Scalar = GF(p)
  10. k = 3
  11. n = 2^k
  12. a = [Scalar(110), Scalar(56), Scalar(89), Scalar(6543),
  13. Scalar(2), Scalar(110), Scalar(44), Scalar(78)]
  14. x = Scalar.random_element()
  15. b = [x^i for i in range(n)]
  16. G = [E.random_element(), E.random_element(), E.random_element(),
  17. E.random_element(), E.random_element(), E.random_element(),
  18. E.random_element(), E.random_element()]
  19. assert len(a) == len(b) == len(G) == n
  20. # Dot product
  21. def dot(x, y):
  22. result = None
  23. for x_i, y_i in zip(x, y):
  24. if result is None:
  25. result = int(x_i) * y_i
  26. else:
  27. result += int(x_i) * y_i
  28. return result
  29. challenges = []
  30. commits = []
  31. # Iterate k times where n = 2^k
  32. for k in range(k, 0, -1):
  33. half = 2^(k - 1)
  34. assert half * 2 == len(a)
  35. L = dot(a[half:], G[:half])
  36. R = dot(a[:half], G[half:])
  37. #z_L = dot(a[half:], b[:half])
  38. #z_R = dot(a[:half], b[half:])
  39. commits.append((L, R))
  40. challenge = Scalar.random_element()
  41. challenges.append(challenge)
  42. a = [a[i] + challenge^-1 * a[half + i] for i in range(half)]
  43. G = [G[i] + int(challenge) * G[half + i] for i in range(half)]
  44. assert len(a) == len(G) == half
  45. if k == 0:
  46. print("Last round")
  47. assert len(a[-1]) == 1
  48. assert len(G[-1]) == 1