Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

from_public_key_recovery function using wrong parameter #108

Closed
kcorlidy opened this issue Jul 17, 2019 · 2 comments
Closed

from_public_key_recovery function using wrong parameter #108

kcorlidy opened this issue Jul 17, 2019 · 2 comments
Labels
bug unintended behaviour in ecdsa code
Milestone

Comments

@kcorlidy
Copy link
Contributor

pubkey = "fe27389aada80332ec2478814eb3c81de9d1109bc3c21d23853a43bd16ed176057371f3ce271d1ef423ef6fa56f97925a07036158bf90bb87c6c24f248932554"

msg = "3045022100c3c38c977a3c11214f76eb59616a69838dbc14fc0d666e16c0d65989f7f9245b022037861ec5d4599caf17d80da102a89616a545cfca1932253bc2a539a0c9cb66e8"
msg = bytes.fromhex(msg)
raw_msg = "9302bda273a887cb40c13e02a50b4071a31fd3aae3ae04021b0b843dd61ad18e"
raw_msg = bytes.fromhex(raw_msg)

# right data
_r = 0x00c3c38c977a3c11214f76eb59616a69838dbc14fc0d666e16c0d65989f7f9245b
_s = 0x37861ec5d4599caf17d80da102a89616a545cfca1932253bc2a539a0c9cb66e8
signature = msg
data = raw_msg
curve = ecdsa.curves.SECP256k1

print("correct", _r, _s)
generator = curve.generator
r, s = ecdsa.util.sigdecode_der(signature, generator.order())
print(r, s)

pubkey = ecdsa.VerifyingKey.from_public_key_recovery(
		signature=signature, data=data, curve=curve, sigdecode=ecdsa.util.sigdecode_der)
print(hexlify(pubkey[0].to_string()), hexlify(pubkey[1].to_string()))

Then i got error

correct 88546510979682037774707173221481493851486333744139811890585270440885638210651 25114176564622922097833533925221099216470038098832442934481636541806701930216

88546510979682037774707173221481493851486333744139811890585270440885638210651 25114176564622922097833533925221099216470038098832442934481636541806701930216
Traceback (most recent call last):
  File "C:\Users\hasee\Desktop\test2.py", line 85, in <module>
    signature=signature, data=data, curve=curve, sigdecode=ecdsa.util.sigdecode_der)
  File "D:\anaconda3\envs\py37\lib\site-packages\ecdsa\keys.py", line 89, in from_public_key_recovery
    return klass.from_public_key_recovery_with_digest(signature, digest, curve, hashfunc=sha1, sigdecode=sigdecode_string)
  File "D:\anaconda3\envs\py37\lib\site-packages\ecdsa\keys.py", line 97, in from_public_key_recovery_with_digest
    r, s = sigdecode(signature, generator.order())
  File "D:\anaconda3\envs\py37\lib\site-packages\ecdsa\util.py", line 238, in sigdecode_string
    assert len(signature) == 2 * l, (len(signature), 2 * l)
AssertionError: (71, 64)

So i view #102 and code, then found the reason
https://github.com/warner/python-ecdsa/blob/master/src/ecdsa/keys.py#L89
The code should be return klass.from_public_key_recovery_with_digest(signature, digest, curve, hashfunc=sha1, sigdecode=sigdecode)

After changing the code, i got the correct public key

correct is 88546510979682037774707173221481493851486333744139811890585270440885638210651 25114176564622922097833533925221099216470038098832442934481636541806701930216
88546510979682037774707173221481493851486333744139811890585270440885638210651 25114176564622922097833533925221099216470038098832442934481636541806701930216
b'fe27389aada80332ec2478814eb3c81de9d1109bc3c21d23853a43bd16ed176057371f3ce271d1ef423ef6fa56f97925a07036158bf90bb87c6c24f248932554' b'9eb524f1401c38df84374fa68047d5cbdabe5ac710406012fc162a588347e8856fa4850ef58394a91cb8c413ccf6b5e2fbc97755c1cbf833020e97e2cfec062a'
@tomato42
Copy link
Member

sigdecode is the default signature decoding method, why do you think that the default is wrong? why it shouldn't be sigdecode_string?

@tomato42
Copy link
Member

no, scratch that, I though that the issue was with default value of the parameter

yes, it's a bug

kcorlidy added a commit to kcorlidy/python-ecdsa that referenced this issue Jul 19, 2019
fixed the issue that keys.py#Line89 using the wrong parameter
tomato42 added a commit that referenced this issue Jul 19, 2019
@tomato42 tomato42 added the bug unintended behaviour in ecdsa code label Oct 13, 2019
@tomato42 tomato42 added this to the v0.14 milestone Oct 13, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug unintended behaviour in ecdsa code
Projects
None yet
Development

No branches or pull requests

2 participants