I have checked related questions and did not find answer. I also tried to use "secp256k1", "bip-0032", "seedrecover" and did not succeed.
When my input is a private key in the format "'xprv'..." I get problems related to decoding issues, or length of the key (like in the module 'ecdsa' I get 'ecdsa.keys.MalformedPointError: Invalid length of private key, received 77, expected 32') and so on.
I am asking for simple python-3 code snippet to get the public key and address or a simple mathematical explanation so I can code it myself. I know that bip32 is related to deriving keys and addresses but I do not need the derived ones, but the ones which are corresponding to the given private key.
A code that work for other private keys and do not work here:
def get_public_from_private(private_key): # Checks if the input is in valid hexadecimal format, if it is not hexadecimal but it is base58, # it converts it to hexadecimal, otherwise it returns an error. if not utilities.is_hexadecimal(private_key): if utilities.is_base58check(private_key): private_key = Bitcoin().__convert_private_wif_to_hex(private_key) else: raise Exception('From Bitcoin::__get_public_from_private::Exception caught: ' + "the key format is " "not hexadecimal") # From that point, key is valid hexadecimal private key. private_key_bytes = codecs.decode(private_key, 'hex') # Get ECDSA public key key = ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1).verifying_key key_bytes = key.to_string() key_hex = codecs.encode(key_bytes, 'hex') # Add bitcoin byte bitcoin_byte = b'04' public_key = bitcoin_byte + key_hex return public_key.decode("utf-8")