MCPcopy Create free account
hub / github.com/ElementsProject/elements / ECKey

Class ECKey

test/functional/test_framework/key.py:340–404  ·  view source on GitHub ↗

A secp256k1 private key

Source from the content-addressed store, hash-verified

338 return hmac.new(k, v, 'sha256').digest()
339
340class ECKey():
341 """A secp256k1 private key"""
342
343 def __init__(self):
344 self.valid = False
345
346 def set(self, secret, compressed):
347 """Construct a private key object with given 32-byte secret and compressed flag."""
348 assert(len(secret) == 32)
349 secret = int.from_bytes(secret, 'big')
350 self.valid = (secret > 0 and secret < SECP256K1_ORDER)
351 if self.valid:
352 self.secret = secret
353 self.compressed = compressed
354
355 def generate(self, compressed=True):
356 """Generate a random private key (compressed or uncompressed)."""
357 self.set(generate_privkey(), compressed)
358
359 def get_bytes(self):
360 """Retrieve the 32-byte representation of this key."""
361 assert(self.valid)
362 return self.secret.to_bytes(32, 'big')
363
364 @property
365 def is_valid(self):
366 return self.valid
367
368 @property
369 def is_compressed(self):
370 return self.compressed
371
372 def get_pubkey(self):
373 """Compute an ECPubKey object for this secret key."""
374 assert(self.valid)
375 ret = ECPubKey()
376 p = SECP256K1.mul([(SECP256K1_G, self.secret)])
377 ret.p = p
378 ret.valid = True
379 ret.compressed = self.compressed
380 return ret
381
382 def sign_ecdsa(self, msg, low_s=True, rfc6979=False):
383 """Construct a DER-encoded ECDSA signature with this key.
384
385 See https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm for the
386 ECDSA signer algorithm."""
387 assert(self.valid)
388 z = int.from_bytes(msg, 'big')
389 # Note: no RFC6979 by default, but a simple random nonce (some tests rely on distinct transactions for the same operation)
390 if rfc6979:
391 k = int.from_bytes(rfc6979_nonce(self.secret.to_bytes(32, 'big') + msg), 'big')
392 else:
393 k = random.randrange(1, SECP256K1_ORDER)
394 R = SECP256K1.affine(SECP256K1.mul([(SECP256K1_G, k)]))
395 r = R[0] % SECP256K1_ORDER
396 s = (modinv(k, SECP256K1_ORDER) * (z + self.secret * r)) % SECP256K1_ORDER
397 if low_s and s > SECP256K1_ORDER_HALF:

Callers 15

test_external_inputsMethod · 0.90
run_testMethod · 0.90
test_double_spendMethod · 0.90
run_testMethod · 0.90
run_testMethod · 0.90
run_testMethod · 0.90
run_testMethod · 0.90
get_keysMethod · 0.90

Calls

no outgoing calls

Tested by 4

test_external_inputsMethod · 0.72
test_double_spendMethod · 0.72