From 642c5858f45034a059bb229d5f9cc68f1f0b54c4 Mon Sep 17 00:00:00 2001 From: Jonathan Warren Date: Fri, 6 Feb 2015 16:31:23 -0500 Subject: [PATCH] handle OpenSSL.EC_KEY_get0_group() exception --- src/highlevelcrypto.py | 48 ++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/src/highlevelcrypto.py b/src/highlevelcrypto.py index 54c010ce..f357735f 100644 --- a/src/highlevelcrypto.py +++ b/src/highlevelcrypto.py @@ -40,20 +40,36 @@ def verify(msg,sig,hexPubkey): # Does an EC point multiplication; turns a private key into a public key. def pointMult(secret): - 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) + while True: + try: + """ + 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