about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/ellipticcurve/curve.py
diff options
context:
space:
mode:
authorS. Solomon Darnell2025-03-28 21:52:21 -0500
committerS. Solomon Darnell2025-03-28 21:52:21 -0500
commit4a52a71956a8d46fcb7294ac71734504bb09bcc2 (patch)
treeee3dc5af3b6313e921cd920906356f5d4febc4ed /.venv/lib/python3.12/site-packages/ellipticcurve/curve.py
parentcc961e04ba734dd72309fb548a2f97d67d578813 (diff)
downloadgn-ai-4a52a71956a8d46fcb7294ac71734504bb09bcc2.tar.gz
two version of R2R are here HEAD master
Diffstat (limited to '.venv/lib/python3.12/site-packages/ellipticcurve/curve.py')
-rw-r--r--.venv/lib/python3.12/site-packages/ellipticcurve/curve.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/ellipticcurve/curve.py b/.venv/lib/python3.12/site-packages/ellipticcurve/curve.py
new file mode 100644
index 00000000..df3e119e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/ellipticcurve/curve.py
@@ -0,0 +1,90 @@
+#
+# Elliptic Curve Equation
+#
+# y^2 = x^3 + A*x + B (mod P)
+#
+from .math import Math
+from .point import Point
+
+
+class CurveFp:
+
+    def __init__(self, A, B, P, N, Gx, Gy, name, oid, nistName=None):
+        self.A = A
+        self.B = B
+        self.P = P
+        self.N = N
+        self.G = Point(Gx, Gy)
+        self.name = name
+        self.nistName = nistName
+        self.oid = oid  # ASN.1 Object Identifier
+
+    def contains(self, p):
+        """
+        Verify if the point `p` is on the curve
+
+        :param p: Point p = Point(x, y)
+        :return: boolean
+        """
+        if not 0 <= p.x <= self.P - 1:
+            return False
+        if not 0 <= p.y <= self.P - 1:
+            return False
+        if (p.y**2 - (p.x**3 + self.A * p.x + self.B)) % self.P != 0:
+            return False
+        return True
+
+    def length(self):
+        return (1 + len("%x" % self.N)) // 2
+
+    def y(self, x, isEven):
+        ySquared = (pow(x, 3, self.P) + self.A * x + self.B) % self.P
+        y = Math.modularSquareRoot(ySquared, self.P)
+        if isEven != (y % 2 == 0):
+            y = self.P - y
+        return y
+
+
+_curvesByOid = {tuple(curve.oid): curve for curve in []}
+
+
+def add(curve):
+    _curvesByOid[tuple(curve.oid)] = curve
+
+
+def getByOid(oid):
+    if oid not in _curvesByOid:
+        raise Exception("Unknown curve with oid {oid}; The following are registered: {names}".format(
+            oid=".".join([str(number) for number in oid]),
+            names=", ".join([curve.name for curve in _curvesByOid.values()]),
+        ))
+    return _curvesByOid[oid]
+
+
+secp256k1 = CurveFp(
+    name="secp256k1",
+    A=0x0000000000000000000000000000000000000000000000000000000000000000,
+    B=0x0000000000000000000000000000000000000000000000000000000000000007,
+    P=0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f,
+    N=0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141,
+    Gx=0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,
+    Gy=0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8,
+    oid=[1, 3, 132, 0, 10]
+)
+
+prime256v1 = CurveFp(
+    name="prime256v1",
+    nistName="P-256",
+    A=0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc,
+    B=0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b,
+    P=0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff,
+    N=0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551,
+    Gx=0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296,
+    Gy=0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5,
+    oid=[1, 2, 840, 10045, 3, 1, 7],
+)
+
+p256 = prime256v1
+
+add(secp256k1)
+add(prime256v1)