about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/ellipticcurve/privateKey.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/privateKey.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/privateKey.py')
-rw-r--r--.venv/lib/python3.12/site-packages/ellipticcurve/privateKey.py72
1 files changed, 72 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/ellipticcurve/privateKey.py b/.venv/lib/python3.12/site-packages/ellipticcurve/privateKey.py
new file mode 100644
index 00000000..df6fb4d9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/ellipticcurve/privateKey.py
@@ -0,0 +1,72 @@
+from .math import Math
+from .utils.integer import RandomInteger
+from .utils.pem import getPemContent, createPem
+from .utils.binary import hexFromByteString, byteStringFromHex, intFromHex, base64FromByteString, byteStringFromBase64
+from .utils.der import hexFromInt, parse, encodeConstructed, DerFieldType, encodePrimitive
+from .curve import secp256k1, getByOid
+from .publicKey import PublicKey
+
+
+class PrivateKey:
+
+    def __init__(self, curve=secp256k1, secret=None):
+        self.curve = curve
+        self.secret = secret or RandomInteger.between(1, curve.N - 1)
+
+    def publicKey(self):
+        curve = self.curve
+        publicPoint = Math.multiply(
+            p=curve.G,
+            n=self.secret,
+            N=curve.N,
+            A=curve.A,
+            P=curve.P,
+        )
+        return PublicKey(point=publicPoint, curve=curve)
+
+    def toString(self):
+        return hexFromInt(self.secret)
+
+    def toDer(self):
+        publicKeyString = self.publicKey().toString(encoded=True)
+        hexadecimal = encodeConstructed(
+            encodePrimitive(DerFieldType.integer, 1),
+            encodePrimitive(DerFieldType.octetString, hexFromInt(self.secret)),
+            encodePrimitive(DerFieldType.oidContainer, encodePrimitive(DerFieldType.object, self.curve.oid)),
+            encodePrimitive(DerFieldType.publicKeyPointContainer, encodePrimitive(DerFieldType.bitString, publicKeyString))
+        )
+        return byteStringFromHex(hexadecimal)
+
+    def toPem(self):
+        der = self.toDer()
+        return createPem(content=base64FromByteString(der), template=_pemTemplate)
+
+    @classmethod
+    def fromPem(cls, string):
+        privateKeyPem = getPemContent(pem=string, template=_pemTemplate)
+        return cls.fromDer(byteStringFromBase64(privateKeyPem))
+
+    @classmethod
+    def fromDer(cls, string):
+        hexadecimal = hexFromByteString(string)
+        privateKeyFlag, secretHex, curveData, publicKeyString = parse(hexadecimal)[0]
+        if privateKeyFlag != 1:
+            raise Exception("Private keys should start with a '1' flag, but a '{flag}' was found instead".format(
+                flag=privateKeyFlag
+            ))
+        curve = getByOid(curveData[0])
+        privateKey = cls.fromString(string=secretHex, curve=curve)
+        if privateKey.publicKey().toString(encoded=True) != publicKeyString[0]:
+            raise Exception("The public key described inside the private key file doesn't match the actual public key of the pair")
+        return privateKey
+
+    @classmethod
+    def fromString(cls, string, curve=secp256k1):
+        return PrivateKey(secret=intFromHex(string), curve=curve)
+
+
+_pemTemplate = """
+-----BEGIN EC PRIVATE KEY-----
+{content}
+-----END EC PRIVATE KEY-----
+"""