Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/ellipticcurve/curve.py: 50%
40 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1#
2# Elliptic Curve Equation
3#
4# y^2 = x^3 + A*x + B (mod P)
5#
6from .math import Math
7from .point import Point
10class CurveFp:
12 def __init__(self, A, B, P, N, Gx, Gy, name, oid, nistName=None):
13 self.A = A
14 self.B = B
15 self.P = P
16 self.N = N
17 self.G = Point(Gx, Gy)
18 self.name = name
19 self.nistName = nistName
20 self.oid = oid # ASN.1 Object Identifier
22 def contains(self, p):
23 """
24 Verify if the point `p` is on the curve
26 :param p: Point p = Point(x, y)
27 :return: boolean
28 """
29 if not 0 <= p.x <= self.P - 1:
30 return False
31 if not 0 <= p.y <= self.P - 1:
32 return False
33 if (p.y**2 - (p.x**3 + self.A * p.x + self.B)) % self.P != 0:
34 return False
35 return True
37 def length(self):
38 return (1 + len("%x" % self.N)) // 2
40 def y(self, x, isEven):
41 ySquared = (pow(x, 3, self.P) + self.A * x + self.B) % self.P
42 y = Math.modularSquareRoot(ySquared, self.P)
43 if isEven != (y % 2 == 0):
44 y = self.P - y
45 return y
48_curvesByOid = {tuple(curve.oid): curve for curve in []}
51def add(curve):
52 _curvesByOid[tuple(curve.oid)] = curve
55def getByOid(oid):
56 if oid not in _curvesByOid:
57 raise Exception("Unknown curve with oid {oid}; The following are registered: {names}".format(
58 oid=".".join([str(number) for number in oid]),
59 names=", ".join([curve.name for curve in _curvesByOid.values()]),
60 ))
61 return _curvesByOid[oid]
64secp256k1 = CurveFp(
65 name="secp256k1",
66 A=0x0000000000000000000000000000000000000000000000000000000000000000,
67 B=0x0000000000000000000000000000000000000000000000000000000000000007,
68 P=0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f,
69 N=0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141,
70 Gx=0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,
71 Gy=0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8,
72 oid=[1, 3, 132, 0, 10]
73)
75prime256v1 = CurveFp(
76 name="prime256v1",
77 nistName="P-256",
78 A=0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc,
79 B=0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b,
80 P=0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff,
81 N=0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551,
82 Gx=0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296,
83 Gy=0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5,
84 oid=[1, 2, 840, 10045, 3, 1, 7],
85)
87p256 = prime256v1
89add(secp256k1)
90add(prime256v1)