Giter VIP home page Giter VIP logo

Comments (7)

AntonKueltz avatar AntonKueltz commented on June 8, 2024

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.

SmartLayer avatar SmartLayer commented on June 8, 2024

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.

SmartLayer avatar SmartLayer commented on June 8, 2024

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.

SmartLayer avatar SmartLayer commented on June 8, 2024

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.

SmartLayer avatar SmartLayer commented on June 8, 2024

AntonKueltz, let me know if you accept Bitcoin / Ethereum donations. Thanks for your patch!

from fastecdsa.

AntonKueltz avatar AntonKueltz commented on June 8, 2024

No problem.

I actually don't have wallets / addresses for any cryptocurrencies, but I appreciate the offer. :)

from fastecdsa.

AntonKueltz avatar AntonKueltz commented on June 8, 2024

For reference, changes In release v1.6.2.

from fastecdsa.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.