def test_mul(): with pytest.raises(TypeError): a = FieldElement(number=2, prime=31) b = FieldElement(number=2, prime=32) a * b a = FieldElement(24, 31) b = FieldElement(19, 31) assert a * b == FieldElement(22, 31)
def test_div(): with pytest.raises(TypeError): a = FieldElement(number=2, prime=31) b = FieldElement(number=2, prime=32) a / b a = FieldElement(3, 31) b = FieldElement(24, 31) assert a / b == FieldElement(4, 31)
def test_ne(): with pytest.raises(NotImplementedError): FieldElement(number=2, prime=31) == 0 a = FieldElement(2, 31) b = FieldElement(2, 31) c = FieldElement(15, 31) assert a == b assert a != c assert not (a != b)
def test_add(): # tests the following additions on curve y^2=x^3-7 over F_223: prime = 223 a = FieldElement(0, prime) b = FieldElement(7, prime) additions = ( # (x1, y1, x2, y2, x3, y3) (192, 105, 17, 56, 170, 142), (47, 71, 117, 141, 60, 139), (143, 98, 76, 66, 47, 71), ) for x1, y1, x2, y2, x3, y3 in additions: p1 = Point(x=FieldElement(x1, prime), y=FieldElement(y1, prime), a=a, b=b) p2 = Point(x=FieldElement(x2, prime), y=FieldElement(y2, prime), a=a, b=b) p3 = Point(x=FieldElement(x3, prime), y=FieldElement(y3, prime), a=a, b=b) assert p1 + p2 == p3
def test_pow(): a = FieldElement(17, 31) assert a ** 3 == FieldElement(15, 31) a = FieldElement(5, 31) assert a ** 5 == FieldElement(25, 31) a = FieldElement(17, 31) assert a ** -3 == FieldElement(29, 31) a = FieldElement(4, 31) assert a ** -4 == FieldElement(4, 31)
def test_sub(): with pytest.raises(TypeError): a = FieldElement(number=2, prime=31) b = FieldElement(number=2, prime=32) a - b a = FieldElement(29, 31) b = FieldElement(4, 31) assert a - b == FieldElement(25, 31) a = FieldElement(15, 31) b = FieldElement(30, 31) assert a - b == FieldElement(16, 31)
def test_add(): with pytest.raises(TypeError): a = FieldElement(number=2, prime=31) b = FieldElement(number=2, prime=32) a + b a = FieldElement(2, 31) b = FieldElement(15, 31) assert a + b == FieldElement(17, 31) a = FieldElement(17, 31) b = FieldElement(21, 31) assert a + b == FieldElement(7, 31)
def test_rmul(): prime = 223 a = FieldElement(0, prime) b = FieldElement(7, prime) multiplications = ( # scalar, x1, y1, x2, y2 (2, 192, 105, 49, 71), (2, 143, 98, 64, 168), (2, 47, 71, 36, 111), (4, 47, 71, 194, 51), (8, 47, 71, 116, 55), (21, 47, 71, None, None), ) for scalar, x1, y1, x2, y2 in multiplications: x1_el = FieldElement(x1, prime) y1_el = FieldElement(y1, prime) x2_el = x2 and FieldElement(x2, prime) y2_el = y2 and FieldElement(y2, prime) p = Point(x1_el, y1_el, a, b) assert scalar * p == Point(x2_el, y2_el, a, b)
def test_on_curve(): prime = 223 a = FieldElement(0, prime) b = FieldElement(7, prime) valid_points = ((192, 105), (17, 56), (1, 193)) invalid_points = ((200, 119), (42, 99)) for x_raw, y_raw in valid_points: x = FieldElement(x_raw, prime) y = FieldElement(y_raw, prime) Point(x, y, a, b) for x_raw, y_raw in invalid_points: x = FieldElement(x_raw, prime) y = FieldElement(y_raw, prime) with pytest.raises(ValueError): Point(x, y, a, b)
def test_rmul(): assert 5 * FieldElement(number=18, prime=31) == FieldElement(number=28, prime=31) assert -4 * FieldElement(number=11, prime=31) == FieldElement(number=18, prime=31)
def test_number_range(): with pytest.raises(ValueError): FieldElement(number=7, prime=3)