share.sage 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import random
  2. load('../mpc/curve.sage')
  3. load('../mpc/ec_share.sage')
  4. def open_2pc(party0_share, party1_share):
  5. return party0_share + party1_share
  6. def verify_2pc_mac_check(party0_mac, party1_mac):
  7. assert party0_mac+party1_mac == 0
  8. global_key = random.randint(0, p)
  9. class AuthenticatedShare(object):
  10. """
  11. additive share
  12. """
  13. def __init__(self, share, source, party_id, mac=None, modifier=None):
  14. self.share = share
  15. self.mac = global_key * self.share if mac==None else mac
  16. self.public_modifier = 0 if modifier == None else modifier # carry out extra addition/subtraction by public scalars until opening
  17. self.party_id = party_id
  18. self.source = source
  19. def __repr__(self):
  20. return "share: %s, mac: %s"%(self.share, self.mac)
  21. # SPDZ mac authentication
  22. def authenticated_open(self, peer_authenticated_share):
  23. opened_share = open_2pc(self.share, peer_authenticated_share.share)
  24. mac_key = random.randint(0,global_key)
  25. mac_share = mac_key * (opened_share + self.public_modifier) - self.mac
  26. peer_mac_key = global_key - mac_key
  27. peer_mac_share = peer_mac_key * (opened_share + peer_authenticated_share.public_modifier) - peer_authenticated_share.mac
  28. assert (mac_share + peer_mac_share) == 0
  29. return opened_share
  30. def sub_scalar(self, scalar, party_id):
  31. 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)
  32. def add_scalar(self, scalar, party_id):
  33. 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)
  34. def mul_scalar(self, scalar):
  35. return AuthenticatedShare(self.share * scalar, self.mac * scalar, self.public_modifier * scalar)
  36. def mul_point(self, point):
  37. return ECAuthenticatedShare(self.share * point, self.mac * point, self.public_modifier * point)
  38. def __add__(self, rhs):
  39. '''
  40. add additive shares
  41. '''
  42. return AuthenticatedShare(self.share + rhs.share, self.mac + rhs.mac, self.public_modifier + rhs.public_modifier)
  43. def __sub__(self, rhs):
  44. '''
  45. sub additive shares
  46. '''
  47. return AuthenticatedShare(self.share - rhs.share, self.mac - rhs.mac, self.public_modifier - rhs.public_modifier)
  48. '''
  49. class MultiplicationAuthenticatedShares(object):
  50. def __init__(self, alpha, beta, triplet, party_id):
  51. # authenticated shares
  52. self.alpha_as = alpha
  53. self.beta_as = beta
  54. self.a_as = triplet[0]
  55. self.b_as = triplet[1]
  56. self.c_as = triplet[2]
  57. self.party_id = party_id
  58. def __mul__(self, peer_share):
  59. masked_d_share = self.alpha_as - self.a_as
  60. peer_masked_d_share = peer_share.alpha_as - peer_share.a_as
  61. d = open_2pc(masked_d_share.share, peer_masked_d_share.share)
  62. masked_e_share = self.beta_as - self.b_as
  63. peer_masked_e_share = peer_share.beta_as - peer_share.b_as
  64. e = open_2pc(masked_e_share.share, peer_masked_e_share.share)
  65. return (self.b_as.mul_scalar(d) + self.a_as.mul_scalar(e) + self.c_as).add_scalar(d*e, self.party_id)
  66. '''
  67. class MultiplicationAuthenticatedShares(object):
  68. def __init__(self, alpha, beta, triplet, party_id):
  69. # authenticated shares
  70. self.alpha_as = alpha
  71. self.beta_as = beta
  72. self.a_as = triplet[0]
  73. self.b_as = triplet[1]
  74. self.c_as = triplet[2]
  75. self.party_id = party_id
  76. d1 = self.alpha_as - self.a_as
  77. e1 = self.beta_as - self.b_as
  78. print('[{}] beta: {}, b: {}'.format(self.party_id, self.beta_as, self.b_as))
  79. print('[{}] e: {}'.format(self.party_id, e1))
  80. self.d = d1
  81. self.e = e1
  82. def mul(self, d2, e2):
  83. d = open_2pc(self.d.share, d2.share)
  84. e = open_2pc(self.e.share, e2.share)
  85. if self.party_id==0:
  86. bd = self.b_as.mul_scalar(d)
  87. ae = self.a_as.mul_scalar(e)
  88. return (bd + ae + self.c_as).add_scalar(d*e, self.party_id)
  89. else:
  90. bd = self.b_as.mul_scalar(d)
  91. ae = self.a_as.mul_scalar(e)
  92. #return (bd + ae + self.c_as).add_scalar(d*e, self.party_id)
  93. return bd + ae + self.c_as