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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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 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)
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)
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)
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))
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)
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)
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)
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_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)
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)
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)
from ecc import Point p1=Point(2,5,5,7) p2=Point(-1,-1,5,7) print(p1+p2)
''' #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)