Example #1
0
    def test_add1(self):
        # tests the following additions on curve y^2=x^3-7 over F_223:
        # (192,105) + (17,56)
        # (47,71) + (117,141)
        # (143,98) + (76,66)
        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),
        )
        # iterate over the additions
        # Initialize points this way:
        # x1 = FieldElement(x1_raw, prime)
        # y1 = FieldElement(y1_raw, prime)
        # p1 = Point(x1, y1, a, b)
        # x2 = FieldElement(x2_raw, prime)
        # y2 = FieldElement(y2_raw, prime)
        # p2 = Point(x2, y2, a, b)
        # x3 = FieldElement(x3_raw, prime)
        # y3 = FieldElement(y3_raw, prime)
        # p3 = Point(x3, y3, a, b)
        # check that p1 + p2 == p3
        raise NotImplementedError
Example #2
0
 def test_ne(self):
     a = FieldElement(2, 31)
     b = FieldElement(2, 31)
     c = FieldElement(15, 31)
     self.assertEqual(a, b)
     self.assertTrue(a != c)
     self.assertFalse(a != b)
 def test_add_FE(self):
     a = FieldElement(5, 7)
     b = FieldElement(4, 7)
     c = FieldElement(2, 11)
     self.assertEqual(a + b, FieldElement(2, 7))
     with self.assertRaises(RuntimeError):
         b + c
Example #4
0
 def test_exercise_1(self):
     prime = 223
     a = FieldElement(0, prime)
     b = FieldElement(7, prime)
     points = ((192, 105), (17, 56), (200, 119), (1, 193), (42, 99))
     expected = [True, True, False, True, False]
     for x_raw, y_raw in points:
         x = FieldElement(x_raw, prime)
         y = FieldElement(y_raw, prime)
         if expected.pop(0):
             self.assertTrue(Point(x, y, a, b))
         else:
             with self.assertRaises(ValueError):
                 Point(x, y, a, b)
Example #5
0
 def test_example_2(self):
     prime = 137
     a = FieldElement(0, prime)
     b = FieldElement(7, prime)
     p1 = Point(FieldElement(73, prime), FieldElement(128, prime), a, b)
     p2 = Point(FieldElement(46, prime), FieldElement(22, prime), a, b)
     p3 = p1 + p2
     self.assertEqual(p3.x.num, 99)
     self.assertEqual(p3.y.num, 49)
    def test_Point_scalar_multiply(self):
        prime = 223
        a = FieldElement(0, prime)
        b = FieldElement(7, prime)
        x = FieldElement(47, prime)
        y = FieldElement(71, prime)
        p = Point(x, y, a, b)

        x6 = FieldElement(139, prime)
        y6 = FieldElement(137, prime)
        p6 = Point(x6, y6, a, b)
        result = 6 * p
        self.assertEqual(result, p6)

        result = 21 * p
        self.assertEqual(result.x, None)
        self.assertEqual(result.y, None)
Example #7
0
    def test_rmul(self):
        # tests the following scalar multiplications
        # 2*(192,105)
        # 2*(143,98)
        # 2*(47,71)
        # 4*(47,71)
        # 8*(47,71)
        # 21*(47,71)
        prime = 223
        a = FieldElement(0, prime)
        b = FieldElement(7, prime)

        multiplications = (
            # (coefficient, 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),
        )

        # iterate over the multiplications
        for s, x1_raw, y1_raw, x2_raw, y2_raw in multiplications:
            # Initialize points this way:
            # x = FieldElement(192, prime)
            # y = FieldElement(105, prime)
            # p = Point(x, y, a, b)
            x1 = FieldElement(x1_raw, prime)
            y1 = FieldElement(y1_raw, prime)
            p1 = Point(x1, y1, a, b)
            # initialize the second point based on whether it's the point at infinity
            if x2_raw is None:
                p2 = Point(None, None, a, b)
            else:
                x2 = FieldElement(x2_raw, prime)
                y2 = FieldElement(y2_raw, prime)
                p2 = Point(x2, y2, a, b)

            # check that the product is equal to the expected point
        self.assertEqual(s * p1, p2)
    def test_on_curve(self):
        prime = 223
        a = FieldElement(0, prime)
        b = FieldElement(7, prime)

        valid_points = ((192, 105), (17, 56), (1, 193))
        invalid_points = ((200, 119), (42, 99))

        # iterate over valid points
        for x_raw, y_raw in valid_points:
            x = FieldElement(x_raw, prime)
            y = FieldElement(y_raw, prime)
            # Creating the point should not result in an error
            Point(x, y, a, b)

        # iterate over invalid points
        for x_raw, y_raw in invalid_points:
            x = FieldElement(x_raw, prime)
            y = FieldElement(y_raw, prime)
            # check that creating the point results in a ValueError
            with self.assertRaises(ValueError):
                Point(x, y, a, b)