bltprf.sage 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. original_a, original_G = a, G
  32. # Iterate k times where n = 2^k
  33. for current_k in range(k, 0, -1):
  34. half = 2^(current_k - 1)
  35. assert half * 2 == len(a)
  36. L = dot(a[half:], G[:half])
  37. R = dot(a[:half], G[half:])
  38. #z_L = dot(a[half:], b[:half])
  39. #z_R = dot(a[:half], b[half:])
  40. commits.append((L, R))
  41. challenge = Scalar.random_element()
  42. challenges.append(challenge)
  43. a = [a[i] + challenge^-1 * a[half + i] for i in range(half)]
  44. G = [int(challenge^-1) * G[i] + int(challenge) * G[half + i] for i in range(half)]
  45. assert len(a) == len(G) == half
  46. # Last iteration
  47. if current_k == 1:
  48. assert len(a) == 1
  49. assert len(G) == 1
  50. final_a = a[0]
  51. final_G = G[0]
  52. assert len(challenges) == k
  53. def get_jth_bit(value, idx):
  54. digits = bin(value)[2:]
  55. # Add zero padding
  56. digits = digits.zfill(k)
  57. return True if digits[idx] == "1" else False
  58. # get scalar values
  59. counters = []
  60. for i in range(1, n + 1):
  61. s = Scalar(1)
  62. for j in range(0, k):
  63. if get_jth_bit(i - 1, j):
  64. b = 1
  65. else:
  66. b = -1
  67. s *= challenges[j]^b
  68. counters.append(s)
  69. assert len(counters) == len(original_G)
  70. assert dot(counters, original_G) == final_G