ec_share.sage 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. def open_2pc(party0_share, party1_share):
  2. return party0_share + party1_share
  3. def verify_2pc_mac_check(party0_mac, party1_mac):
  4. assert party0_mac+party1_mac == 0
  5. global_key = random.randint(0, p)
  6. class ECAuthenticatedShare(object):
  7. """
  8. additive share
  9. """
  10. def __init__(self, share, mac=None, modifier=None):
  11. self.share = share
  12. self.mac = global_key * self.share if mac==None else mac
  13. self.public_modifier = 0 if modifier == None else modifier # carry out extra addition/subtraction by public scalars until opening
  14. def __repr__(self):
  15. return "share: %s, mac: %s"%(self.share, self.mac)
  16. # SPDZ mac authentication
  17. def authenticated_open(self, peer_authenticated_share):
  18. opened_share = open_2pc(self.share, peer_authenticated_share.share)
  19. mac_key = random.randint(0,global_key)
  20. mac_share = mac_key * (opened_share + self.public_modifier) - self.mac
  21. peer_mac_key = global_key - mac_key
  22. peer_mac_share = peer_mac_key * (opened_share + peer_authenticated_share.public_modifier) - peer_authenticated_share.mac
  23. assert (mac_share + peer_mac_share) == 0
  24. return opened_share
  25. def mul_scalar(self, scalar):
  26. return ECAuthenticatedShare(self.share * scalar, self.mac * scalar, self.public_modifier * scalar)
  27. def add_point(self, point, party_id):
  28. return ECAuthenticatedShare(self.share + point, self.mac , self.public_modifier - point) if party_id ==0 else ECAuthenticatedShare(self.share, self.mac, self.public_modifier - point)
  29. def __add__(self, rhs):
  30. '''
  31. add additive shares
  32. '''
  33. return ECAuthenticatedShare(self.share + rhs.share, self.mac + rhs.mac, self.public_modifier + rhs.public_modifier)
  34. def __sub__(self, rhs):
  35. '''
  36. sub additive shares
  37. '''
  38. return ECAuthenticatedShare(self.share - rhs.share, self.mac - rhs.mac, self.public_modifier - rhs.public_modifier)
  39. class ScalingECAuthenticatedShares(object):
  40. def __init__(self, alpha, beta, triplet, party_id):
  41. # authenticated shares
  42. self.alpha_as = alpha
  43. self.beta_as = beta
  44. self.a_as = triplet[0]
  45. self.b_as = triplet[1]
  46. self.c_as = triplet[2]
  47. self.party_id = party_id
  48. def __mul__(self, peer_share):
  49. generator = CurvePoint.generator()
  50. masked_e_share = self.beta_as - self.b_as
  51. peer_masked_e_share = peer_share.beta_as - peer_share.b_as
  52. e = open_2pc(masked_e_share.share, peer_masked_e_share.share)
  53. peer_masked_d_share = peer_share.alpha_as - peer_share.a_as.mul_point(generator)
  54. masked_d_share = self.alpha_as - self.a_as.mul_point(generator)
  55. d = open_2pc(masked_d_share.share, peer_masked_d_share.share)
  56. return (self.b_as.mul_point(d) + self.a_as.mul_point(generator).mul_scalar(e) + self.c_as.mul_point(generator)).add_point(d * e, self.party_id)
  57. class MSM(object):
  58. def __init__(self, points, scalars, source, party_id):
  59. '''
  60. naive multi scalar multiplicatin, between authenticatedpointsshares, and authenticatedscalarshares
  61. '''
  62. self.points = points
  63. self.scalars = scalars
  64. self.source = source
  65. self.party_id = party_id
  66. def msm(self):
  67. assert (len(self.points) == len(self.scalars))
  68. beaver = self.source
  69. point_scalars = []
  70. for point, scalar in zip(self.points, self.scalars):
  71. point_scalars += [ScalingECAuthenticatedShares(point, scalar, beaver.triplet(self.party_id), self.party_id)]
  72. return point_scalars
  73. def sum(self):
  74. return sum(self.msm())