Merge pull request #778 from Atheros1/pointMult-exception
handle OpenSSL.EC_KEY_get0_group() exception
This commit is contained in:
commit
0833938ea3
|
@ -40,20 +40,36 @@ def verify(msg,sig,hexPubkey):
|
||||||
|
|
||||||
# Does an EC point multiplication; turns a private key into a public key.
|
# Does an EC point multiplication; turns a private key into a public key.
|
||||||
def pointMult(secret):
|
def pointMult(secret):
|
||||||
k = OpenSSL.EC_KEY_new_by_curve_name(OpenSSL.get_curve('secp256k1'))
|
while True:
|
||||||
priv_key = OpenSSL.BN_bin2bn(secret, 32, None)
|
try:
|
||||||
group = OpenSSL.EC_KEY_get0_group(k)
|
"""
|
||||||
pub_key = OpenSSL.EC_POINT_new(group)
|
Evidently, this type of error can occur very rarely:
|
||||||
|
|
||||||
|
File "highlevelcrypto.py", line 54, in pointMult
|
||||||
|
group = OpenSSL.EC_KEY_get0_group(k)
|
||||||
|
WindowsError: exception: access violation reading 0x0000000000000008
|
||||||
|
"""
|
||||||
|
k = OpenSSL.EC_KEY_new_by_curve_name(OpenSSL.get_curve('secp256k1'))
|
||||||
|
priv_key = OpenSSL.BN_bin2bn(secret, 32, None)
|
||||||
|
group = OpenSSL.EC_KEY_get0_group(k)
|
||||||
|
pub_key = OpenSSL.EC_POINT_new(group)
|
||||||
|
|
||||||
|
OpenSSL.EC_POINT_mul(group, pub_key, priv_key, None, None, None)
|
||||||
|
OpenSSL.EC_KEY_set_private_key(k, priv_key)
|
||||||
|
OpenSSL.EC_KEY_set_public_key(k, pub_key)
|
||||||
|
|
||||||
|
size = OpenSSL.i2o_ECPublicKey(k, None)
|
||||||
|
mb = OpenSSL.create_string_buffer(size)
|
||||||
|
OpenSSL.i2o_ECPublicKey(k, OpenSSL.byref(OpenSSL.pointer(mb)))
|
||||||
|
|
||||||
|
OpenSSL.EC_POINT_free(pub_key)
|
||||||
|
OpenSSL.BN_free(priv_key)
|
||||||
|
OpenSSL.EC_KEY_free(k)
|
||||||
|
return mb.raw
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
import traceback
|
||||||
|
import time
|
||||||
|
traceback.print_exc()
|
||||||
|
time.sleep(0.2)
|
||||||
|
|
||||||
OpenSSL.EC_POINT_mul(group, pub_key, priv_key, None, None, None)
|
|
||||||
OpenSSL.EC_KEY_set_private_key(k, priv_key)
|
|
||||||
OpenSSL.EC_KEY_set_public_key(k, pub_key)
|
|
||||||
|
|
||||||
size = OpenSSL.i2o_ECPublicKey(k, None)
|
|
||||||
mb = OpenSSL.create_string_buffer(size)
|
|
||||||
OpenSSL.i2o_ECPublicKey(k, OpenSSL.byref(OpenSSL.pointer(mb)))
|
|
||||||
|
|
||||||
OpenSSL.EC_POINT_free(pub_key)
|
|
||||||
OpenSSL.BN_free(priv_key)
|
|
||||||
OpenSSL.EC_KEY_free(k)
|
|
||||||
return mb.raw
|
|
||||||
|
|
Reference in New Issue
Block a user