diff options
Diffstat (limited to '.venv/lib/python3.12/site-packages/ellipticcurve/privateKey.py')
-rw-r--r-- | .venv/lib/python3.12/site-packages/ellipticcurve/privateKey.py | 72 |
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----- +""" |