我正在使用pyelliptic,但我无法使用文件 ecc.py 中定义的方法raw_get_ecdh_key
。
这是我的示例代码:
>>> import pyelliptic
>>> pubkey1="0453eb8248f42b00d057bc1adc724c4c841ec75851d6cd86f56f9bae5223219c7d3c7aff832d2383dfec167327ef38e9bf066690a8f94c055b336a607cebc2dddf".decode('hex')
>>> pubkey2="04678b95e902b04817ba258ecd3dbb2150d83850848a3b8523c11d51b6a9f89b93ea82db74ba82ba44fadb050b35eae8b96f3738e88c7c117227303a528c8df985".decode('hex')
>>> pyelliptic.ECC.raw_get_ecdh_key(pubkey1, pubkey2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method raw_get_ecdh_key() must be called with ECC instance as first argument (got str instance instead)
我在这里搜索并发现了很多关于这个主题的问题。我了解到我需要拨打ECC()
而不是ECC
,但它不会更好:
>>> pyelliptic.ECC().raw_get_ecdh_key(pubkey1, pubkey2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/pyelliptic/ecc.py", line 324, in raw_get_ecdh_key
OpenSSL.EC_KEY_free(own_key)
UnboundLocalError: local variable 'own_key' referenced before assignment
我无法弄清楚什么是错的。我检查过,应该引用变量own_key
。
答案 0 :(得分:0)
这是pyetiptic中一个非常明显的错误 - 如果你看一下代码,own_key
被定义的部分(ecc.py第301行)被包装在巨大的try / finally块中。如果在301行之前引发(并且没有管理)异常(这显然是你发生的事情),那么执行流程将跳转到finally
块,该块试图引用own_key
这一点尚未定义。
您可以通过克隆git repo并编辑raw_get_ecdh_key
函数的代码进行修复,以便1.在 {/ 1>}之前,在函数的开头定义相关的局部变量阻止(将它们设置为try
)和2.在finally块中,这些变量在尝试使用它们来释放资源之前针对None
进行测试,即(未经测试):
None
然后运行单元测试(最终为此案例添加一些测试)并向作者提交拉取请求。
请注意,您已经应用了这个(未经测试的)修补程序, 应该还有另一个错误 - 最初发送到def raw_get_ecdh_key(self, pubkey_x, pubkey_y):
other_key = None
other_pub_key_x = None
other_pub_key_y = None
other_pub_key = None
own_key = None
own_priv_key = None
try:
# (snip code)
finally:
if other_key is not None:
OpenSSL.EC_KEY_free(other_key)
if other_pub_key_x is not None:
OpenSSL.BN_free(other_pub_key_x)
if other_pub_key_y is not None:
OpenSSL.BN_free(other_pub_key_y)
if other_pub_key is not None:
OpenSSL.EC_POINT_free(other_pub_key)
if own_key is not None:
OpenSSL.EC_KEY_free(own_key)
if own_priv_key is not None:
OpenSSL.BN_free(own_priv_key)
块的错误 - 但至少应该有关呼叫失败原因的更多信息。