AntonKueltz / fastecdsa

Python library for fast elliptic curve crypto
https://pypi.python.org/pypi/fastecdsa
The Unlicense
264 stars 77 forks source link

Using curve P192 gives error when doing ecdsa verify #17

Closed gajinderpanesar closed 6 years ago

gajinderpanesar commented 6 years ago

Hello,

I am just getting to grips with fastecdsa but when I change the curve to use P192 and run through your simple example code I get the following:

Traceback (most recent call last): File "", line 1, in File "build/bdist.linux-x86_64/egg/fastecdsa/ecdsa.py", line 72, in verify raise EcdsaError('Invalid public key, point is not on curve {}'.format(curve.name)) fastecdsa.ecdsa.EcdsaError

Am I missing something in setup or am I doing something very stupid.

Thanks,

Gajinder Panesar

AntonKueltz commented 6 years ago

Could you please post the exact code you ran that gave this error (including values of any parameters)? Thanks.

AntonKueltz commented 6 years ago

For reference:


In [1]: from fastecdsa import curve, ecdsa, keys

In [2]: m = "a message to sign via ECDSA"  # some message

In [3]: private_key = keys.gen_private_key(curve.P192)

In [4]: public_key = keys.get_public_key(private_key, curve.P192)

In [5]: r, s = ecdsa.sign(m, private_key, curve=curve.P192)

In [6]: valid = ecdsa.verify((r, s), m, public_key, curve=curve.P192)

In [7]: valid
Out[7]: True

Remember, P256 is the curve used by default in this package, so if you want to use a different curve to sign / verify you have to pass in the curve as a keyword arg.

gajinderpanesar commented 6 years ago

Hello,

That is very strange. The following is a cut'n'paste of what I ran. I am probably being stupid somewhere but it looks the same to me. I ran it using the default SHA function and got the same error.

Thanks, Gajinder Panesar

from fastecdsa import curve, ecdsa, keys from hashlib import sha384 m = "a message to sign via ECDSA" # some message private_key = keys.gen_private_key(curve.P192) public_key = keys.get_public_key(private_key, curve.P192) r, s = ecdsa.sign(m, private_key, hashfunc=sha384) valid = ecdsa.verify((r, s), m, public_key, hashfunc=sha384) Traceback (most recent call last): File "", line 1, in File "build/bdist.linux-x86_64/egg/fastecdsa/ecdsa.py", line 72, in verify raise EcdsaError('Invalid public key, point is not on curve {}'.format(curve.name)) fastecdsa.ecdsa.EcdsaError

AntonKueltz commented 6 years ago

You need to specifiy the curve as P192 in sign and verify. You wrote:


r, s = ecdsa.sign(m, private_key, hashfunc=sha384)
valid = ecdsa.verify((r, s), m, public_key, hashfunc=sha384)

This needs to be:


r, s = ecdsa.sign(m, private_key, curve=curve.P192, hashfunc=sha384)
valid = ecdsa.verify((r, s), m, public_key, curve=curve.P192, hashfunc=sha384)

See below for correct usage of the whole code block you provided:


In [1]: from fastecdsa import curve, ecdsa, keys
   ...: from hashlib import sha384
   ...: m = "a message to sign via ECDSA" # some message
   ...: private_key = keys.gen_private_key(curve.P192)
   ...: public_key = keys.get_public_key(private_key, curve.P192)
   ...: r, s = ecdsa.sign(m, private_key, curve=curve.P192, hashfunc=sha384)
   ...: valid = ecdsa.verify((r, s), m, public_key, curve=curve.P192, hashfunc=sha384)
   ...: 

In [2]: valid
Out[2]: True
gajinderpanesar commented 6 years ago

Oh! Thanks for pointing out my stupidity. Appreciate it.