def __init__(self, secret_exponent=None, public_pair=None, hash160=None, prefer_uncompressed=None, is_compressed=True, is_pay_to_script=False, netcode=None): """ secret_exponent: a long representing the secret exponent public_pair: a tuple of long integers on the ecdsa curve hash160: a hash160 value corresponding to a bitcoin address Include at most one of secret_exponent, public_pair or hash160. prefer_uncompressed: whether or not to produce text outputs as compressed or uncompressed. is_pay_to_script: whether or not this key is for a pay-to-script style transaction netcode: the code for the network (as defined in pycoin.networks) Include at most one of secret_exponent, public_pair or hash160. prefer_uncompressed, is_compressed (booleans) are optional. """ if netcode is None: netcode = get_current_netcode() if [secret_exponent, public_pair, hash160].count(None) != 2: raise ValueError("exactly one of secret_exponent, public_pair, hash160 must be passed.") if prefer_uncompressed is None: prefer_uncompressed = not is_compressed self._prefer_uncompressed = prefer_uncompressed self._secret_exponent = secret_exponent self._public_pair = public_pair self._hash160_uncompressed = None self._hash160_compressed = None if hash160: if is_compressed: self._hash160_compressed = hash160 else: self._hash160_uncompressed = hash160 self._netcode = netcode if self._public_pair is None and self._secret_exponent is not None: if self._secret_exponent < 1 \ or self._secret_exponent >= ecdsa.generator_secp256k1.order(): raise InvalidSecretExponentError() public_pair = ecdsa.public_pair_for_secret_exponent( ecdsa.generator_secp256k1, self._secret_exponent) self._public_pair = public_pair if self._public_pair is not None \ and (None in self._public_pair or not ecdsa.is_public_pair_valid(ecdsa.generator_secp256k1, self._public_pair)): raise InvalidPublicPairError()
def public_pair(self): """ Return a pair of integers representing the public key (or None). """ if self._public_pair is None and self.secret_exponent(): public_pair = ecdsa.public_pair_for_secret_exponent( ecdsa.generator_secp256k1, self._secret_exponent) if not ecdsa.is_public_pair_valid(ecdsa.generator_secp256k1, public_pair): raise InvalidKeyGeneratedError( "this key would produce an invalid public pair; please skip it") self._public_pair = public_pair return self._public_pair
def parse_as_public_pair(s): for c in ",/": if c in s: s0, s1 = s.split(c, 1) v0 = parse_as_number(s0) if v0: if s1 in ("even", "odd"): return public_pair_for_x(generator_secp256k1, v0, is_even=(s1 == 'even')) v1 = parse_as_number(s1) if v1: if not is_public_pair_valid(generator_secp256k1, (v0, v1)): sys.stderr.write("invalid (x, y) pair\n") sys.exit(1) return (v0, v1)
def public_pair(self): """ Return a pair of integers representing the public key (or None). """ if self._public_pair is None and self.secret_exponent(): public_pair = ecdsa.public_pair_for_secret_exponent( ecdsa.generator_secp256k1, self._secret_exponent) if not ecdsa.is_public_pair_valid(ecdsa.generator_secp256k1, public_pair): raise InvalidKeyGeneratedError( "this key would produce an invalid public pair; please skip it" ) self._public_pair = public_pair return self._public_pair
def parse_as_public_pair(s, generator): for c in ",/": if c in s: s0, s1 = s.split(c, 1) v0 = parse_as_number(s0) if v0: if s1 in ("even", "odd"): is_y_odd = (s1 == "odd") y = generator.y_values_for_x(v0)[is_y_odd] return generator.Point(v0, y) v1 = parse_as_number(s1) if v1: if not is_public_pair_valid(generator_secp256k1, (v0, v1)): sys.stderr.write("invalid (x, y) pair\n") sys.exit(1) return (v0, v1)
def parse_as_public_pair(s): try: if s[:2] in (["02", "03", "04"]): return encoding.sec_to_public_pair(encoding.h2b(s)) except (encoding.EncodingError, binascii.Error): pass for c in ",/": if c in s: s0, s1 = s.split(c, 1) v0 = parse_as_number(s0) if v0: if s1 in ("even", "odd"): return ecdsa.public_pair_for_x(ecdsa.generator_secp256k1, v0, is_even=(s1=='even')) v1 = parse_as_number(s1) if v1: if not ecdsa.is_public_pair_valid(ecdsa.generator_secp256k1, (v0, v1)): sys.stderr.write("invalid (x, y) pair\n") sys.exit(1) return (v0, v1)