def _CKD_priv(k, c, s, is_prime): keypair = ecc.ECPrivkey(k) cK = keypair.get_public_key_bytes(compressed=True) data = bytes([0]) + k + s if is_prime else cK + s I = hmac.new(c, data, hashlib.sha512).digest() k_n = ecc.number_to_string( (ecc.string_to_number(I[0:32]) + ecc.string_to_number(k)) % ecc.CURVE_ORDER, ecc.CURVE_ORDER) c_n = I[32:] return k_n, c_n
def _CKD_priv(k, c, s, is_prime): try: keypair = ecc.ECPrivkey(k) except ecc.InvalidECPointException as e: raise BitcoinException( 'Impossible xprv (not within curve order)') from e cK = keypair.get_public_key_bytes(compressed=True) data = bytes([0]) + k + s if is_prime else cK + s I = hmac_oneshot(c, data, hashlib.sha512) I_left = ecc.string_to_number(I[0:32]) k_n = (I_left + ecc.string_to_number(k)) % ecc.CURVE_ORDER if I_left >= ecc.CURVE_ORDER or k_n == 0: raise ecc.InvalidECPointException() k_n = ecc.number_to_string(k_n, ecc.CURVE_ORDER) c_n = I[32:] return k_n, c_n
def get_sequence(self, mpk, for_change, n): return string_to_number( Hash(("%d:%d:" % (n, for_change)).encode('ascii') + bfh(mpk)))
def stretch_key(self, seed): x = seed for i in range(100000): x = hashlib.sha256(x + seed).digest() return string_to_number(x)