Comments (7)
I've added the core logic for this in commits 3bcd6be and 601c76c. The method fastecdsa.keys.get_public_keys_from_sig
should do the trick -
def get_public_keys_from_sig(sig, msg, curve=P256, hashfunc=sha256):
"""Recover the public keys that can verify a signature / message pair.
Args:
| sig (long, long): A ECDSA signature.
| msg (str): The message corresponding to the signature.
| curve (fastecdsa.curve.Curve): The curve used to sign the message.
| hashfunc (_hashlib.HASH): The hash function used to compress the message.
Returns:
(fastecdsa.point.Point, fastecdsa.point.Point): The public keys that can verify the
signature for the message.
"""
Note that P224
and secp224k1
won't work yet because I haven't implemented modular square roots for curves where the p parameter is not congruent to 3 mod 4 (the 3 mod 4 case is a fast case that's quick to implement, the general case takes a bit more work).
from fastecdsa.
Thanks! It works, and one of the two keys are correct!
I wrote a small script to test its performance:
$ python3 compare_recover_and_verify.py
Signing 2016 times:
2016 signatures, using 3.365245819091797 seconds.
Recovering 2016 times:
2016 signatures, using 25.673808813095093 seconds.
Verifying 2016 times:
2016 signatures, using 1.52587890625e-05 seconds.
from fastecdsa.
By the way, I like the way you use (long, long) for a signature. I hate other libraries taking the longs, converting to bytes to return to the library user, only for a user like me to convert it back to longs for use.
from fastecdsa.
The test script I used:
from fastecdsa import keys, curve, ecdsa
from hashlib import sha256
from time import time
curve = curve.secp256k1
# generate a private key for curve P256
priv_key = keys.gen_private_key(curve)
# get the public key corresponding to the private key we just generated
pub_key = keys.get_public_key(priv_key, curve)
def single_test():
m = "a message to sign via ECDSA" # some message
r, s = ecdsa.sign(m, priv_key, curve=curve)
keys = keys.get_public_keys_from_sig((r,s), m, curve=curve)
print(pub_key)
print(keys[0])
print(keys[1])
def batch_test():
messages = [str(i) for i in range(0, 2016)]
print("Signing 2016 times:")
start = time()
signatures = [ecdsa.sign(m, priv_key, curve=curve) for m in messages]
print("2016 signatures, using {} seconds.".format(time()-start))
sigm = zip(signatures, messages)
print("Recovering 2016 times:")
start = time()
[keys.get_public_keys_from_sig(sig, m, curve=curve) for sig, m in sigm]
print("2016 signatures, using {} seconds.".format(time()-start))
start = time()
print("Verifying 2016 times:")
[ecdsa.verify(sig, m, pub_key, curve=curve) for sig, m in sigm]
print("2016 signatures, using {} seconds.".format(time()-start))
batch_test()
from fastecdsa.
AntonKueltz, let me know if you accept Bitcoin / Ethereum donations. Thanks for your patch!
from fastecdsa.
No problem.
I actually don't have wallets / addresses for any cryptocurrencies, but I appreciate the offer. :)
from fastecdsa.
For reference, changes In release v1.6.2.
from fastecdsa.
Related Issues (20)
- deep learning for fastecdsa HOT 3
- Point extend HOT 11
- Bug: multiplication of Point by negative const produces wrong results HOT 15
- [Question] - Different Signatures for same input HOT 2
- Scalar Inversion HOT 3
- Cannot install in macOS BigSur (M1 chip) HOT 23
- MacOS Monerray Apple Silicon Python 3.9 issue with install/import HOT 3
- tag 2.2.2 unsigned, PyPI upload missing a signature file HOT 2
- I can run this tutorial in termux HOT 1
- Python.h not found on WSL Ubuntu 20.04 installation HOT 1
- installation error on shared hosting HOT 1
- does not install with python3.9 HOT 6
- Is it possible for this to be used with Micropython? HOT 3
- Error while installing ecdsa HOT 1
- how do I calculate recover_id from signature HOT 1
- Import Issues on macOS Monterey, Python 3.9, M1 Max
- symbol not found in flat namespace '___gmpz_add' HOT 1
- getting y public key from compressed public key HOT 1
- unresolved external symbol __gmpz_set HOT 1
- symbol not found in flat namespace '___gmpz_add' Error in version 2.3.2 HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fastecdsa.