mirror of
https://github.com/LBRYFoundation/LBRY-Vault.git
synced 2025-08-23 17:47:31 +00:00
ecc: ECPrivkey.sign clean-up
This commit is contained in:
parent
d03da4d1a2
commit
ac94d6d055
1 changed files with 33 additions and 30 deletions
61
lib/ecc.py
61
lib/ecc.py
|
@ -49,27 +49,32 @@ def generator():
|
||||||
return ECPubkey.from_point(generator_secp256k1)
|
return ECPubkey.from_point(generator_secp256k1)
|
||||||
|
|
||||||
|
|
||||||
def sig_string_from_der_sig(der_sig):
|
def sig_string_from_der_sig(der_sig, order=CURVE_ORDER):
|
||||||
r, s = ecdsa.util.sigdecode_der(der_sig, CURVE_ORDER)
|
r, s = ecdsa.util.sigdecode_der(der_sig, order)
|
||||||
return ecdsa.util.sigencode_string(r, s, CURVE_ORDER)
|
return ecdsa.util.sigencode_string(r, s, order)
|
||||||
|
|
||||||
|
|
||||||
def der_sig_from_sig_string(sig_string):
|
def der_sig_from_sig_string(sig_string, order=CURVE_ORDER):
|
||||||
r, s = ecdsa.util.sigdecode_string(sig_string, CURVE_ORDER)
|
r, s = ecdsa.util.sigdecode_string(sig_string, order)
|
||||||
return ecdsa.util.sigencode_der_canonize(r, s, CURVE_ORDER)
|
return ecdsa.util.sigencode_der_canonize(r, s, order)
|
||||||
|
|
||||||
|
|
||||||
def der_sig_from_r_and_s(r, s):
|
def der_sig_from_r_and_s(r, s, order=CURVE_ORDER):
|
||||||
return ecdsa.util.sigencode_der_canonize(r, s, CURVE_ORDER)
|
return ecdsa.util.sigencode_der_canonize(r, s, order)
|
||||||
|
|
||||||
|
|
||||||
def get_r_and_s_from_sig_string(sig_string):
|
def get_r_and_s_from_der_sig(der_sig, order=CURVE_ORDER):
|
||||||
r, s = ecdsa.util.sigdecode_string(sig_string, CURVE_ORDER)
|
r, s = ecdsa.util.sigdecode_der(der_sig, order)
|
||||||
return r, s
|
return r, s
|
||||||
|
|
||||||
|
|
||||||
def sig_string_from_r_and_s(r, s):
|
def get_r_and_s_from_sig_string(sig_string, order=CURVE_ORDER):
|
||||||
return ecdsa.util.sigencode_string_canonize(r, s, CURVE_ORDER)
|
r, s = ecdsa.util.sigdecode_string(sig_string, order)
|
||||||
|
return r, s
|
||||||
|
|
||||||
|
|
||||||
|
def sig_string_from_r_and_s(r, s, order=CURVE_ORDER):
|
||||||
|
return ecdsa.util.sigencode_string_canonize(r, s, order)
|
||||||
|
|
||||||
|
|
||||||
def point_to_ser(P, compressed=True) -> bytes:
|
def point_to_ser(P, compressed=True) -> bytes:
|
||||||
|
@ -338,24 +343,24 @@ class ECPrivkey(ECPubkey):
|
||||||
privkey_32bytes = number_to_string(scalar, CURVE_ORDER)
|
privkey_32bytes = number_to_string(scalar, CURVE_ORDER)
|
||||||
return privkey_32bytes
|
return privkey_32bytes
|
||||||
|
|
||||||
def sign_transaction(self, hashed_preimage):
|
def sign(self, data: bytes, sigencode=None, sigdecode=None) -> bytes:
|
||||||
|
if sigencode is None:
|
||||||
|
sigencode = sig_string_from_r_and_s
|
||||||
|
if sigdecode is None:
|
||||||
|
sigdecode = get_r_and_s_from_sig_string
|
||||||
private_key = _MySigningKey.from_secret_exponent(self.secret_scalar, curve=SECP256k1)
|
private_key = _MySigningKey.from_secret_exponent(self.secret_scalar, curve=SECP256k1)
|
||||||
sig = private_key.sign_digest_deterministic(hashed_preimage, hashfunc=hashlib.sha256,
|
sig = private_key.sign_digest_deterministic(data, hashfunc=hashlib.sha256, sigencode=sigencode)
|
||||||
sigencode=ecdsa.util.sigencode_der)
|
|
||||||
public_key = private_key.get_verifying_key()
|
public_key = private_key.get_verifying_key()
|
||||||
if not public_key.verify_digest(sig, hashed_preimage, sigdecode=ecdsa.util.sigdecode_der):
|
if not public_key.verify_digest(sig, data, sigdecode=sigdecode):
|
||||||
raise Exception('Sanity check verifying our own signature failed.')
|
raise Exception('Sanity check verifying our own signature failed.')
|
||||||
return sig
|
return sig
|
||||||
|
|
||||||
def sign_message(self, message, is_compressed):
|
def sign_transaction(self, hashed_preimage: bytes) -> bytes:
|
||||||
def sign_with_python_ecdsa(msg_hash):
|
return self.sign(hashed_preimage,
|
||||||
private_key = _MySigningKey.from_secret_exponent(self.secret_scalar, curve=SECP256k1)
|
sigencode=der_sig_from_r_and_s,
|
||||||
public_key = private_key.get_verifying_key()
|
sigdecode=get_r_and_s_from_der_sig)
|
||||||
signature = private_key.sign_digest_deterministic(msg_hash, hashfunc=hashlib.sha256, sigencode=ecdsa.util.sigencode_string)
|
|
||||||
if not public_key.verify_digest(signature, msg_hash, sigdecode=ecdsa.util.sigdecode_string):
|
|
||||||
raise Exception('Sanity check verifying our own signature failed.')
|
|
||||||
return signature
|
|
||||||
|
|
||||||
|
def sign_message(self, message: bytes, is_compressed: bool) -> bytes:
|
||||||
def bruteforce_recid(sig_string):
|
def bruteforce_recid(sig_string):
|
||||||
for recid in range(4):
|
for recid in range(4):
|
||||||
sig65 = construct_sig65(sig_string, recid, is_compressed)
|
sig65 = construct_sig65(sig_string, recid, is_compressed)
|
||||||
|
@ -369,13 +374,11 @@ class ECPrivkey(ECPubkey):
|
||||||
|
|
||||||
message = to_bytes(message, 'utf8')
|
message = to_bytes(message, 'utf8')
|
||||||
msg_hash = Hash(msg_magic(message))
|
msg_hash = Hash(msg_magic(message))
|
||||||
sig_string = sign_with_python_ecdsa(msg_hash)
|
sig_string = self.sign(msg_hash,
|
||||||
|
sigencode=sig_string_from_r_and_s,
|
||||||
|
sigdecode=get_r_and_s_from_sig_string)
|
||||||
sig65, recid = bruteforce_recid(sig_string)
|
sig65, recid = bruteforce_recid(sig_string)
|
||||||
try:
|
|
||||||
self.verify_message_for_address(sig65, message)
|
|
||||||
return sig65
|
return sig65
|
||||||
except Exception as e:
|
|
||||||
raise Exception("error: cannot sign message. self-verify sanity check failed")
|
|
||||||
|
|
||||||
def decrypt_message(self, encrypted, magic=b'BIE1'):
|
def decrypt_message(self, encrypted, magic=b'BIE1'):
|
||||||
encrypted = base64.b64decode(encrypted)
|
encrypted = base64.b64decode(encrypted)
|
||||||
|
|
Loading…
Add table
Reference in a new issue