ec_share.sage 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. load('../mpc/curve.sage')
  2. def open_2pc(party0_share, party1_share):
  3. return party0_share + party1_share
  4. def verify_2pc_mac_check(party0_mac, party1_mac):
  5. assert party0_mac+party1_mac == 0
  6. global_key = random.randint(0, p)
  7. class ECAuthenticatedShare(object):
  8. """
  9. additive share
  10. """
  11. def __init__(self, share, mac=None, modifier=None):
  12. self.share = share
  13. self.mac = global_key * self.share if mac==None else mac
  14. self.public_modifier = 0 if modifier == None else modifier # carry out extra addition/subtraction by public scalars until opening
  15. def copy(self):
  16. return ECAuthenticatedShare(self.share, self.mac, self.public_modifier)
  17. def __repr__(self):
  18. return "share: %s, mac: %s"%(self.share, self.mac)
  19. # SPDZ mac authentication
  20. def authenticated_open(self, peer_authenticated_share):
  21. opened_share = open_2pc(self.share, peer_authenticated_share.share)
  22. mac_key = random.randint(0,global_key)
  23. mac_share = mac_key * (opened_share + self.public_modifier) - self.mac
  24. peer_mac_key = global_key - mac_key
  25. peer_mac_share = peer_mac_key * (opened_share + peer_authenticated_share.public_modifier) - peer_authenticated_share.mac
  26. # TODO (fix) authentication fails
  27. #assert (mac_share + peer_mac_share) == 0, 'mac: {}, peer mac: {}'.format(mac_share, peer_mac_share)
  28. return opened_share
  29. def mul_scalar(self, scalar):
  30. return ECAuthenticatedShare(self.share * scalar, self.mac * scalar, self.public_modifier * scalar)
  31. def __mul__(self, factor):
  32. return self.mul_scalar(factor)
  33. def add_point(self, point, party_id):
  34. 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)
  35. def __add__(self, rhs):
  36. '''
  37. add additive shares
  38. '''
  39. return ECAuthenticatedShare(self.share + rhs.share, self.mac + rhs.mac, self.public_modifier + rhs.public_modifier)
  40. def __sub__(self, rhs):
  41. '''
  42. sub additive shares
  43. '''
  44. return ECAuthenticatedShare(self.share - rhs.share, self.mac - rhs.mac, self.public_modifier - rhs.public_modifier)
  45. class ScalingECAuthenticatedShares(object):
  46. def __init__(self, alpha, beta, triplet, party_id, generator=None, e=None, d=None):
  47. # authenticated shares
  48. self.alpha_as = alpha
  49. self.beta_as = beta
  50. self.a_as = triplet[0]
  51. self.b_as = triplet[1]
  52. self.c_as = triplet[2]
  53. self.party_id = party_id
  54. #
  55. self.generator = generator if generator is not None else CurvePoint.generator()
  56. d1 = self.alpha_as - self.a_as.mul_point(self.generator)
  57. e1 = self.beta_as - self.b_as
  58. self.e = e if e is not None else e1
  59. self.d = d if d is not None else d1
  60. #print("sas pt: {}, scalar: {}".format(self.alpha_as, self.beta_as))
  61. def copy(self):
  62. return ScalingECAuthenticatedShares(self.alpha_as.copy(), self.beta_as.copy(), [self.a_as, self.b_as, self.c_as], self.party_id, self.generator, self.e, self.d)
  63. def mul(self, d2, e2):
  64. e = open_2pc(self.e.share, e2.share)
  65. d = open_2pc(self.d.share, d2.share)
  66. return (self.b_as.mul_point(d) + self.a_as.mul_point(self.generator).mul_scalar(e) + self.c_as.mul_point(self.generator)).add_point(d * e, self.party_id) if self.party_id ==0 else self.b_as.mul_point(d) + self.a_as.mul_point(self.generator).mul_scalar(e) + self.c_as.mul_point(self.generator)
  67. class MSM(object):
  68. def __init__(self, points, scalars, source, party_id, point_scalars=[]):
  69. '''
  70. naive multi scalar multiplicatin, between authenticatedpointsshares, and authenticatedscalarshares
  71. '''
  72. self.points = points
  73. self.scalars = scalars
  74. assert (len(self.points) == len(self.scalars)), 'len(p): {}, len(s): {}'.format(len(self.points), len(self.scalars))
  75. self.source = source
  76. self.party_id = party_id
  77. beaver = self.source
  78. #self.point_scalars = point_scalars
  79. #if len(self.point_scalars)==0:
  80. self.point_scalars = []
  81. for point, scalar in zip(self.points, self.scalars):
  82. self.point_scalars += [ScalingECAuthenticatedShares(point, scalar, beaver.triplet(self.party_id), self.party_id)]
  83. def copy(self):
  84. return MSM([i.copy() for i in self.points], [i.copy() for i in self.scalars], self.source, self.party_id, [i.copy() for i in self.point_scalars])
  85. def de(self):
  86. return [[ps.d, ps.e] for ps in self.point_scalars]
  87. def msm(self, de):
  88. self.point_scalars = [point.mul(de_i[0], de_i[1]) for de_i, point in zip(de, self.point_scalars)]
  89. zero_ec_share = ECAuthenticatedShare(0)
  90. for ps in self.point_scalars:
  91. zero_ec_share += ps
  92. return zero_ec_share