예제 #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
예제 #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
예제 #4
0
 def test_example_4(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)
     want = (
         (None, None),
         (47, 71),
         (36, 111),
         (15, 137),
         (194, 51),
         (126, 96),
         (139, 137),
         (92, 47),
         (116, 55),
         (69, 86),
         (154, 150),
         (154, 73),
         (69, 137),
         (116, 168),
         (92, 176),
         (139, 86),
         (126, 127),
         (194, 172),
         (15, 86),
         (36, 112),
         (47, 152),
     )
     for s in range(1, 21):
         result = s * p
         self.assertEqual((result.x.num, result.y.num), want[s])
예제 #5
0
 def test_example_3(self):
     prime = 137
     a = FieldElement(0, prime)
     b = FieldElement(7, prime)
     p = Point(FieldElement(73, prime), FieldElement(128, prime), a, b)
     p2 = p + p
     self.assertEqual(p2.x.num, 103)
     self.assertEqual(p2.y.num, 76)
예제 #6
0
 def test_example_5(self):
     prime = 223
     a = FieldElement(0, prime)
     b = FieldElement(7, prime)
     x = FieldElement(15, prime)
     y = FieldElement(86, prime)
     p = Point(x, y, a, b)
     p2 = 7 * p
     self.assertEqual(p2.x, None)
예제 #7
0
 def test_example_1(self):
     a = FieldElement(num=0, prime=223)
     b = FieldElement(num=7, prime=223)
     x = FieldElement(num=192, prime=223)
     y = FieldElement(num=105, prime=223)
     p1 = Point(x, y, a, b)
     self.assertEqual(p1.x.num, 192)
     self.assertEqual(p1.y.num, 105)
     self.assertEqual(p1.x.prime, 223)
예제 #8
0
 def test_example_7(self):
     gx = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
     gy = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
     p = 2**256 - 2**32 - 977
     n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
     x = FieldElement(gx, p)
     y = FieldElement(gy, p)
     seven = FieldElement(7, p)
     zero = FieldElement(0, p)
     G = Point(x, y, zero, seven)
     p2 = n * G
     self.assertEqual(p2.x, None)
예제 #9
0
 def test_exercise_4(self):
     prime = 223
     a = FieldElement(0, prime)
     b = FieldElement(7, prime)
     x1 = FieldElement(num=192, prime=prime)
     y1 = FieldElement(num=105, prime=prime)
     p = Point(x1, y1, a, b)
     p2 = p + p
     self.assertEqual(p2.x.num, 49)
     self.assertEqual(p2.y.num, 71)
     self.assertEqual(p2.x.prime, prime)
     x1 = FieldElement(num=143, prime=prime)
     y1 = FieldElement(num=98, prime=prime)
     p = Point(x1, y1, a, b)
     p2 = p + p
     self.assertEqual(p2.x.num, 64)
     self.assertEqual(p2.y.num, 168)
     self.assertEqual(p2.x.prime, prime)
     x1 = FieldElement(num=47, prime=prime)
     y1 = FieldElement(num=71, prime=prime)
     p = Point(x1, y1, a, b)
     p2 = p + p
     self.assertEqual(p2.x.num, 36)
     self.assertEqual(p2.y.num, 111)
     self.assertEqual(p2.x.prime, prime)
     p2 = p + p + p + p
     self.assertEqual(p2.x.num, 194)
     self.assertEqual(p2.y.num, 51)
     self.assertEqual(p2.x.prime, prime)
     p2 = p + p + p + p + p + p + p + p
     self.assertEqual(p2.x.num, 116)
     self.assertEqual(p2.y.num, 55)
     self.assertEqual(p2.x.prime, prime)
     p2 = p + p + p + p + p + p + p + p + p + p + p + p + p + p + p + p + p + p + p + p + p
     self.assertEqual(p2.x, None)
예제 #10
0
 def test_example_4(self):
     expected = [(47, 71), (36, 111), (15, 137), (194, 51), (126, 96), (139, 137), (92, 47), (116, 55), (69, 86), (154, 150), (154, 73), (69, 137), (116, 168), (92, 176), (139, 86), (126, 127), (194, 172), (15, 86), (36, 112), (47, 152)]
     prime = 223
     a = FieldElement(0, prime)
     b = FieldElement(7, prime)
     g = Point(FieldElement(47, prime), FieldElement(71, prime), a, b)
     inf = Point(None, None, a, b)
     total = g
     count = 1
     while total != inf:
         self.assertEqual((total.x.num, total.y.num), expected.pop(0))
         total += g
         count += 1
     self.assertEqual(total, inf)
예제 #11
0
 def test_exercise_5(self):
     prime = 223
     a = FieldElement(0, prime)
     b = FieldElement(7, prime)
     x = FieldElement(15, prime)
     y = FieldElement(86, prime)
     p = Point(x, y, a, b)
     inf = Point(None, None, a, b)
     product = p
     count = 1
     while product != inf:
         product += p
         count += 1
     self.assertEqual(count, 7)
예제 #12
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)
예제 #13
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
     for x1_raw, y1_raw, x2_raw, y2_raw, x3_raw, y3_raw in additions:
         # Initialize points this way:
         # x = FieldElement(192, prime)
         # y = FieldElement(105, prime)
         # p1 = Point(x, y, a, b)
         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
         self.assertEqual(p1+p2, p3)
예제 #14
0
 def test_div(self):
     a = FieldElement(3, 31)
     b = FieldElement(24, 31)
     self.assertEqual(a/b, FieldElement(4, 31))
     a = FieldElement(17, 31)
     self.assertEqual(a**-3, FieldElement(29, 31))
     a = FieldElement(4, 31)
     b = FieldElement(11, 31)
     self.assertEqual(a**-4*b, FieldElement(13, 31))
예제 #15
0
 def test_exercise_3(self):
     prime = 223
     a = FieldElement(0, prime)
     b = FieldElement(7, prime)
     multiplications = ((2, 192, 105), (2, 143, 98), (2, 47, 71), (4, 47, 71), (8, 47, 71), (21, 47, 71))
     expected = [(49, 71), (64, 168), (36, 111), (194, 51), (116, 55), None]
     for n, x_raw, y_raw in multiplications:
         x = FieldElement(x_raw, prime)
         y = FieldElement(y_raw, prime)
         p = Point(x, y, a, b)
         product = Point(None, None, a, b)
         for _ in range(n):
             product = product + p
         if product.x is None:
             self.assertEqual(None, expected.pop(0))
         else:
             self.assertEqual((product.x.num, product.y.num), expected.pop(0))
예제 #16
0
 def test_add(self):
     a = FieldElement(2, 31)
     b = FieldElement(15, 31)
     self.assertEqual(a+b, FieldElement(17, 31))
     a = FieldElement(17, 31)
     b = FieldElement(21, 31)
     self.assertEqual(a+b, FieldElement(7, 31))
예제 #17
0
 def test_on_curve(self):
     # tests the following points whether they are on the curve or not
     # on curve y^2=x^3-7 over F_223:
     # (192,105) (17,56) (200,119) (1,193) (42,99)
     # the ones that aren't should raise a RuntimeError
     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:
         # Initialize points this way:
         # x = FieldElement(192, prime)
         # y = FieldElement(105, prime)
         # Point(x, y, a, b)
         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:
         # Initialize points this way:
         # x = FieldElement(192, prime)
         # y = FieldElement(105, prime)
         # Point(x, y, a, b)
         x = FieldElement(x_raw, prime)
         y = FieldElement(y_raw, prime)
         # check that creating the point results in a RuntimeError
         # with self.assertRaises(RuntimeError):
         #     Point(x, y, a, b)
         with self.assertRaises(RuntimeError):
             Point(x, y, a, b)
예제 #18
0
 def test_sub(self):
     a = FieldElement(29, 31)
     b = FieldElement(4, 31)
     self.assertEqual(a-b, FieldElement(25, 31))
     a = FieldElement(15, 31)
     b = FieldElement(30, 31)
     self.assertEqual(a-b, FieldElement(16, 31))
예제 #19
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)
예제 #20
0
def t_add(self):
    prime = 223
    a = FieldElement(0, prime)
    b = FieldElement(7, prime)
    additions = (
        (192, 105, 17, 56, 170, 142),
        (47, 71, 117, 141, 60, 139),
        (143, 98, 76, 66, 47, 71),
    )
    for x1_raw, y1_raw, x2_raw, y2_raw, x3_raw, y3_raw in additions:
        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)
        self.assertEqual(p1 + p2, p3)
예제 #21
0
 def test_example_3(self):
     prime = 223
     a = FieldElement(num=0, prime=prime)
     b = FieldElement(num=7, prime=prime)
     x1 = FieldElement(num=192, prime=prime)
     y1 = FieldElement(num=105, prime=prime)
     x2 = FieldElement(num=17, prime=prime)
     y2 = FieldElement(num=56, prime=prime)
     p1 = Point(x1, y1, a, b)
     p2 = Point(x2, y2, a, b)
     p3 = p1 + p2
     self.assertEqual(p3.x.num, 170)
     self.assertEqual(p3.y.num, 142)
     self.assertEqual(p3.x.prime, 223)
예제 #22
0
def t_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))
    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 self.assertRaises(ValueError):
            Point(x, y, a, b)
예제 #23
0
 def test_exercise_2(self):
     prime = 223
     a = FieldElement(0, prime)
     b = FieldElement(7, prime)
     additions = ((192, 105, 17, 56), (47, 71, 117, 141), (143, 98, 76, 66))
     expected = [(170, 142), (60, 139), (47, 71)]
     for x1_raw, y1_raw, x2_raw, y2_raw in additions:
         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)
         p3 = p1 + p2
         self.assertEqual((p3.x.num, p3.y.num), expected.pop(0))
    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)
예제 #25
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)
예제 #27
0
def t_rmul(self):
    prime = 223
    a = FieldElement(0, prime)
    b = FieldElement(7, prime)
    multiplications = (
        (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 s, x1_raw, y1_raw, x2_raw, y2_raw in multiplications:
        x1 = FieldElement(x1_raw, prime)
        y1 = FieldElement(y1_raw, prime)
        p1 = Point(x1, y1, a, b)
        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)
        self.assertEqual(s * p1, p2)
from ecc import FieldElement, Point
prime = 223

a = FieldElement(0, prime)
b = FieldElement(7, prime)

p1 = Point(FieldElement(170, prime), FieldElement(142, prime), a, b)
p2 = Point(FieldElement(60, prime), FieldElement(139, prime), a, b)
print(p1 + p2)

p1 = Point(FieldElement(47, prime), FieldElement(71, prime), a, b)
p2 = Point(FieldElement(17, prime), FieldElement(56, prime), a, b)
print(p1 + p2)

p1 = Point(FieldElement(143, prime), FieldElement(98, prime), a, b)
p2 = Point(FieldElement(76, prime), FieldElement(66, prime), a, b)
print(p1 + p2)
예제 #29
0
    def test_exercise_1(self):
        def on_curve(x, y):
            return y**2 == x**3 + a * x + b

        prime = 223
        a = FieldElement(0, prime)
        b = FieldElement(7, prime)
        self.assertEqual(
            on_curve(FieldElement(192, prime), FieldElement(105, prime)), True)
        self.assertEqual(
            on_curve(FieldElement(17, prime), FieldElement(56, prime)), True)
        self.assertEqual(
            on_curve(FieldElement(200, prime), FieldElement(119, prime)),
            False)
        self.assertEqual(
            on_curve(FieldElement(1, prime), FieldElement(193, prime)), True)
        self.assertEqual(
            on_curve(FieldElement(42, prime), FieldElement(99, prime)), False)
예제 #30
0
 def test_exercise_2(self):
     prime = 223
     a = FieldElement(0, prime)
     b = FieldElement(7, prime)
     p1 = Point(FieldElement(170, prime), FieldElement(142, prime), a, b)
     p2 = Point(FieldElement(60, prime), FieldElement(139, prime), a, b)
     p3 = p1 + p2
     self.assertEqual(p3.x.num, 220)
     self.assertEqual(p3.y.num, 181)
     self.assertEqual(p3.x.prime, prime)
     p1 = Point(FieldElement(47, prime), FieldElement(71, prime), a, b)
     p2 = Point(FieldElement(17, prime), FieldElement(56, prime), a, b)
     p3 = p1 + p2
     self.assertEqual(p3.x.num, 215)
     self.assertEqual(p3.y.num, 68)
     self.assertEqual(p3.x.prime, prime)
     p1 = Point(FieldElement(143, prime), FieldElement(98, prime), a, b)
     p2 = Point(FieldElement(76, prime), FieldElement(66, prime), a, b)
     p3 = p1 + p2
     self.assertEqual(p3.x.num, 47)
     self.assertEqual(p3.y.num, 71)
     self.assertEqual(p3.x.prime, prime)