share.sage 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. load('../mpc/ec_share.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 AuthenticatedShare(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 __repr__(self):
  16. return "share: %s, mac: %s"%(self.share, self.mac)
  17. # SPDZ mac authentication
  18. def authenticated_open(self, peer_authenticated_share):
  19. opened_share = open_2pc(self.share, peer_authenticated_share.share)
  20. mac_key = random.randint(0,global_key)
  21. mac_share = mac_key * (opened_share + self.public_modifier) - self.mac
  22. peer_mac_key = global_key - mac_key
  23. peer_mac_share = peer_mac_key * (opened_share + peer_authenticated_share.public_modifier) - peer_authenticated_share.mac
  24. assert (mac_share + peer_mac_share) == 0
  25. return opened_share
  26. def sub_scalar(self, scalar, party_id):
  27. return AuthenticatedShare(self.share - scalar, self.mac, self.public_modifier + scalar) if party_id == 0 else AuthenticatedShare(self.share , self.mac, self.public_modifier + scalar)
  28. def add_scalar(self, scalar, party_id):
  29. return AuthenticatedShare(self.share + scalar, self.mac , self.public_modifier - scalar) if party_id ==0 else AuthenticatedShare(self.share, self.mac, self.public_modifier - scalar)
  30. def mul_scalar(self, scalar):
  31. return AuthenticatedShare(self.share * scalar, self.mac * scalar, self.public_modifier * scalar)
  32. def mul_point(self, point):
  33. return ECAuthenticatedShare(self.share * point, self.mac * point, self.public_modifier * point)
  34. def __add__(self, rhs):
  35. '''
  36. add additive shares
  37. '''
  38. return AuthenticatedShare(self.share + rhs.share, self.mac + rhs.mac, self.public_modifier + rhs.public_modifier)
  39. def __sub__(self, rhs):
  40. '''
  41. sub additive shares
  42. '''
  43. return AuthenticatedShare(self.share - rhs.share, self.mac - rhs.mac, self.public_modifier - rhs.public_modifier)
  44. class MultiplicationAuthenticatedShares(object):
  45. def __init__(self, alpha, beta, triplet, party_id):
  46. # authenticated shares
  47. self.alpha_as = alpha
  48. self.beta_as = beta
  49. self.a_as = triplet[0]
  50. self.b_as = triplet[1]
  51. self.c_as = triplet[2]
  52. self.party_id = party_id
  53. def __mul__(self, peer_share):
  54. masked_d_share = self.alpha_as - self.a_as
  55. peer_masked_d_share = peer_share.alpha_as - peer_share.a_as
  56. d = open_2pc(masked_d_share.share, peer_masked_d_share.share)
  57. masked_e_share = self.beta_as - self.b_as
  58. peer_masked_e_share = peer_share.beta_as - peer_share.b_as
  59. e = open_2pc(masked_e_share.share, peer_masked_e_share.share)
  60. return (self.b_as.mul_scalar(d) + self.a_as.mul_scalar(e) + self.c_as).add_scalar(d*e, self.party_id)