""" # tag::example1[] >>> from ecc import FieldElement, Point >>> 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) >>> print(p1) Point(192,105)_0_7 FieldElement(223) # end::example1[] # tag::example3[] >>> from ecc import FieldElement, Point >>> 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) >>> print(p1+p2) Point(170,142)_0_7 FieldElement(223) # end::example3[] # tag::example4[] >>> from ecc import FieldElement, Point >>> prime = 223 >>> a = FieldElement(0, prime) >>> b = FieldElement(7, prime) >>> x = FieldElement(47, prime) >>> y = FieldElement(71, prime) >>> p = Point(x, y, a, b) >>> for s in range(1,21): ... result = s*p ... print('{}*(47,71)=({},{})'.format(s,result.x.num,result.y.num)) 1*(47,71)=(47,71) 2*(47,71)=(36,111) 3*(47,71)=(15,137) 4*(47,71)=(194,51) 5*(47,71)=(126,96) 6*(47,71)=(139,137) 7*(47,71)=(92,47) 8*(47,71)=(116,55) 9*(47,71)=(69,86) 10*(47,71)=(154,150) 11*(47,71)=(154,73) 12*(47,71)=(69,137) 13*(47,71)=(116,168) 14*(47,71)=(92,176) 15*(47,71)=(139,86) 16*(47,71)=(126,127) 17*(47,71)=(194,172) 18*(47,71)=(15,86) 19*(47,71)=(36,112) 20*(47,71)=(47,152) # end::example4[] # tag::example5[] >>> 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) >>> print(7*p) Point(infinity) # end::example5[] # tag::example6[] >>> gx = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 >>> gy = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 >>> p = 2**256 - 2**32 - 977 >>> print(gy**2 % p == (gx**3 + 7) % p) True # end::example6[] # tag::example7[] >>> from ecc import FieldElement, Point >>> 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) >>> print(n*G) Point(infinity) # end::example7[] # tag::example8[] >>> from ecc import G, N >>> print(N*G) S256Point(infinity) # end::example8[] # tag::example9[] >>> from ecc import S256Point, G, N >>> z = 0xbc62d4b80d9e36da29c16c5d4d9f11731f36052c72401a76c23c0fb5a9b74423 >>> r = 0x37206a0610995c58074999cb9767b87af4c4978db68c06e8e6e81d282047a7c6 >>> s = 0x8ca63759c1157ebeaec0d03cecca119fc9a75bf8e6d0fa65c841c8e2738cdaec >>> px = 0x04519fac3d910ca7e7138f7013706f619fa8f033e6ec6e09370ea38cee6a7574 >>> py = 0x82b51eab8c27c66e26c858a079bcdf4f1ada34cec420cafc7eac1a42216fb6c4 >>> point = S256Point(px, py) >>> s_inv = pow(s, N-2, N) # <1> >>> u = z * s_inv % N # <2> >>> v = r * s_inv % N # <3> >>> print((u*G + v*point).x.num == r) # <4> True # end::example9[] # tag::example10[] >>> from ecc import S256Point, G, N >>> from helper import hash256 >>> e = int.from_bytes(hash256(b'my secret'), 'big') # <1> >>> z = int.from_bytes(hash256(b'my message'), 'big') # <2> >>> k = 1234567890 # <3> >>> r = (k*G).x.num # <4> >>> k_inv = pow(k, N-2, N) >>> s = (z+r*e) * k_inv % N # <5> >>> point = e*G # <6> >>> print(point) S256Point(028d003eab2e428d11983f3e97c3fa0addf3b42740df0d211795ffb3be2f6c52, \ 0ae987b9ec6ea159c78cb2a937ed89096fb218d9e7594f02b547526d8cd309e2) >>> print(hex(z)) 0x231c6f3d980a6b0fb7152f85cee7eb52bf92433d9919b9c5218cb08e79cce78 >>> print(hex(r)) 0x2b698a0f0a4041b77e63488ad48c23e8e8838dd1fb7520408b121697b782ef22 >>> print(hex(s)) 0xbb14e602ef9e3f872e25fad328466b34e6734b7a0fcd58b1eb635447ffae8cb9 # end::example10[] """