reed_solomon.sage 1010 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. # Reed Solomon check in an elliptic curve context, used in scrape.sage
  2. t = 3 # Threshold
  3. n = 10 # Participants
  4. # Pallas
  5. p = 0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001
  6. q = 0x40000000000000000000000000000000224698fc0994a8dd8c46eb2100000001
  7. Fp = GF(p)
  8. Fq = GF(q)
  9. Ep = EllipticCurve(Fp, (0, 5))
  10. Ep.set_order(q)
  11. g = Ep.random_point()
  12. h = Ep.random_point()
  13. # Secret
  14. s = Fq.random_element()
  15. alpha = [s]
  16. for i in range(t-1):
  17. alpha.append(Fq.random_element())
  18. R.<ω> = PolynomialRing(Fq)
  19. poly = R(alpha)
  20. # Secret shares
  21. shares = [poly(i) for i in range(1, n+1)]
  22. # Share commitments
  23. commits = [g * share for share in shares]
  24. # Reed Solomon check
  25. RS.<σ> = PolynomialRing(Fq)
  26. σ_coeff = [Fq.random_element() for _ in range(n-t)]
  27. v_poly = RS(σ_coeff)
  28. assert v_poly.degree() == n-t-1
  29. v_p = Ep(0)
  30. for i in range(n):
  31. c_perp = v_poly(Fq(i))
  32. for j in range(n):
  33. if i != j:
  34. c_perp *= (Fq(i)-Fq(j)).inverse()
  35. v_p += commits[i] * c_perp
  36. assert v_p == Ep(0)