Ejemplo n.º 1
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)
Ejemplo n.º 2
0
 def test_add0(self):
     a = Point(x=None, y=None, a=5, b=7)
     b = Point(x=2, y=5, a=5, b=7)
     c = Point(x=2, y=-5, a=5, b=7)
     self.assertEqual(a+b, b)
     self.assertEqual(b+a, b)
     self.assertEqual(b+c, a)
Ejemplo n.º 3
0
 def test_example_2(self):
     p1 = Point(-1, -1, 5, 7)
     p2 = Point(-1, 1, 5, 7)
     inf = Point(None, None, 5, 7)
     self.assertEqual(p1 + inf, p1)
     self.assertEqual(inf + p2, p2)
     self.assertEqual(p1 + p2, inf)
Ejemplo n.º 4
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)
Ejemplo n.º 5
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)
Ejemplo n.º 6
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_add_Point(self):
        # add a point to another point
        p1 = Point(2, 5, 5, 7)
        p2 = Point(-1, -1, 5, 7)
        p3 = Point(3, -7, 5, 7)
        self.assertEqual(p1 + p2, p3)

        # add a point to itself
        p4 = Point(-1.1100000000000003, 0.2870000000000008, 5, 7)
        self.assertEqual(p1 + p1, p4)
Ejemplo n.º 8
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)
Ejemplo n.º 9
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)
Ejemplo n.º 10
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)
Ejemplo n.º 11
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)
Ejemplo n.º 12
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))
Ejemplo n.º 13
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)
Ejemplo n.º 14
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])
    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)
Ejemplo n.º 16
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)
Ejemplo n.º 17
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))
Ejemplo n.º 18
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)
Ejemplo n.º 19
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)
Ejemplo n.º 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)
Ejemplo n.º 21
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)
Ejemplo n.º 22
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)
    def test_add_Point_over_FF(self):
        a = FieldElement(0, 223)
        b = FieldElement(7, 223)
        x1 = FieldElement(192, 223)
        y1 = FieldElement(105, 223)
        p1 = Point(x1, y1, a, b)

        x2 = FieldElement(17, 223)
        y2 = FieldElement(56, 223)
        p2 = Point(x2, y2, a, b)

        x3 = FieldElement(170, 223)
        y3 = FieldElement(142, 223)
        p3 = Point(x3, y3, a, b)
        self.assertEqual(p1 + p2, p3)

        x4 = FieldElement(60, 223)
        y4 = FieldElement(139, 223)
        p4 = Point(x4, y4, a, b)

        x5 = FieldElement(220, 223)
        y5 = FieldElement(181, 223)
        p5 = Point(x5, y5, a, b)
        self.assertEqual(p3 + p4, p5)

        x6 = FieldElement(49, 223)
        y6 = FieldElement(71, 223)
        p6 = Point(x6, y6, a, b)
        self.assertEqual(p1 + p1, p6)
    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)
Ejemplo n.º 25
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)
Ejemplo n.º 26
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)
from ecc import FieldElement, Point
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

print(count)
Ejemplo n.º 28
0
from ecc import Point

p1=Point(2,5,5,7)
p2=Point(-1,-1,5,7)

print(p1+p2)
Ejemplo n.º 29
0
'''
#code
>>> import ecc, helper
>>> from ecc import FieldElement, G, Point, S256Point
>>> from helper import encode_base58, hash160, hash256, little_endian_to_int

#endcode
#code
>>> # Verify curve Example
>>> prime = 137
>>> x, y = 73, 128
>>> print(y**2 % prime == (x**3 + 7) % prime)
True

#endcode
#exercise
Find out which points are valid on the curve \\( y^2 = x^3 + 7: F_{223} \\)
```
(192,105), (17,56), (200,119), (1,193), (42,99)
```
---
>>> prime = 223
>>> a = FieldElement(0, prime)
>>> b = FieldElement(7, prime)
>>> points = ((192,105), (17,56), (200,119), (1,193), (42,99))
>>> # iterate over points
>>> for x_raw, y_raw in points:  #/
...     # Initialize points this way:
...     # x = FieldElement(x_raw, prime)
...     # y = FieldElement(y_raw, prime)
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)