Skip to content

Instantly share code, notes, and snippets.

@kdmukai
Created November 8, 2024 20:01
Show Gist options
  • Save kdmukai/0cf06126cc957fed613249fcfe963a31 to your computer and use it in GitHub Desktop.
Save kdmukai/0cf06126cc957fed613249fcfe963a31 to your computer and use it in GitHub Desktop.
Testing `embit` secp256k1 python bindings, custom binary execution times
import time
from embit.util import secp256k1
import hashlib
from binascii import hexlify
def secp256k1_example():
"""Usage example for secp256k1 usermodule"""
# randomize context from time to time
# - it helps against sidechannel attacks
# secp256k1.context_randomize(os.urandom(32))
# some random secret key
secret = hashlib.sha256(b"secret key").digest()
print("Secret key:", hexlify(secret).decode())
# Makes sense to check if secret key is valid.
# It will be ok in most cases, only if secret > N it will be invalid
if not secp256k1.ec_seckey_verify(secret):
raise ValueError("Secret key is invalid")
# computing corresponding pubkey
pubkey = secp256k1.ec_pubkey_create(secret)
# serialize the pubkey in compressed format
sec = secp256k1.ec_pubkey_serialize(pubkey, secp256k1.EC_COMPRESSED)
print("Public key:", hexlify(sec).decode())
# this is how you parse the pubkey
pubkey = secp256k1.ec_pubkey_parse(sec)
# Signature generation:
# hash of the string "hello"
msg = hashlib.sha256(b"hello").digest()
t1 = time.time()
# signing
sig = secp256k1.ecdsa_sign(msg, secret)
print(f"secp256k1.ecdsa_sign: {1000*(time.time() - t1)}ms")
# serialization
der = secp256k1.ecdsa_signature_serialize_der(sig)
print("Signature:", hexlify(der).decode())
# verification
if secp256k1.ecdsa_verify(sig, msg, pubkey):
print("Signature is valid")
else:
printf("Invalid signature")
if __name__ == '__main__':
start = time.time()
secp256k1_example()
end = time.time()
print(f"{1000*(end - start)}ms")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment