def testWeilPairing(self): # this example was refered to Washington. e = elliptic.EC([0, 2], 7) P = [5, 1] Q = [0, 3] R = e.WeilPairing(3, P, Q) self.assertEqual(finitefield.FinitePrimeFieldElement(2, 7), R) # test case of extension field, characteristic 7 p = 7 r = 11 F = finitefield.FinitePrimeField(p) PX = uniutil.polynomial({0:3,1:3,2:2,3:1,4:4,5:1,6:1,10:1},F) Fx = finitefield.FiniteExtendedField(p,PX) E = elliptic.EC([F.one,-F.one],F) Ex = elliptic.EC([Fx.one,-Fx.one],Fx) P = [3,6] assert E.whetherOn(P) assert Ex.whetherOn(P) assert E.mul(11,P) == E.infpoint Qxcoord = Fx.createElement(6*7**9+7**8+7**6+6*7**3+6*7**2+7+6) Qycoord = Fx.createElement(3*7**9+6*7**8+4*7**7+2*7**6+5*7**4+5*7**3+7**2+7+3) Q = [Qxcoord,Qycoord] assert Ex.whetherOn(Q) assert Ex.mul(11,Q) == Ex.infpoint w = Ex.WeilPairing(11, P, Q) Wp = Fx.createElement(7**9 + 5*7**8 + 4*7**7 + 2*7**5 + 7**4 + 6*7**2) assert w == Wp
def testWeilPairingIsFunction(self): # e2 is isomorphic to Z/256 x Z/256 e2 = elliptic.EC([-1, 0], 65537) P1 = [ finitefield.FinitePrimeFieldElement(30840, 65537), finitefield.FinitePrimeFieldElement(53250, 65537) ] self.failIf(256 % e2.pointorder(P1)) P2 = [ finitefield.FinitePrimeFieldElement(10657, 65537), finitefield.FinitePrimeFieldElement(46245, 65537) ] self.failIf(256 % e2.pointorder(P2)) weil10 = set(e2.WeilPairing(256, P1, P2) for i in range(10)) # since Weil pairing is a function, the result is always same self.assertEqual(1, len(weil10)) # Weil pairing is a function E[m]xE[m] -> mu_m self.assertEqual(e2.basefield.one, weil10.pop()**256)
def testTatePairing_Extend(self): # this example was refered to Kim Nguyen. e = elliptic.EC([0, 4], 997) P = [0, 2] Q = [747, 776] R = e.TatePairing_Extend(3, P, P) W1 = e.TatePairing_Extend(3, P, Q) W2 = e.TatePairing_Extend(3, Q, P) self.assertEqual(e.basefield.one, R) self.assertEqual(finitefield.FinitePrimeFieldElement(304, 997), W1) self.assertEqual(W1, W2.inverse())
def toFinitePrimeFieldElement(self): """ get FinitePrimeField(2) element with bijective map. """ if self.boolean: return finitefield.FinitePrimeFieldElement(1, 2) return finitefield.FinitePrimeFieldElement(0, 2)