def bits_to_target(bits): """ Calculate target from bits :param bits: HEX string, bytes string or integer representation of bits. :return: integer. """ if type(bits) == str: bits = bytes_from_hex(bits) if type(bits) == bytes: return int_from_bytes(bits[1:], 'big') * (2 ** (8 * (bits[0] - 3))) else: shift = bits >> 24 target = (bits & 0xffffff) * (1 << (8 * (shift - 3))) return target
def generate_entropy(strength=256, hex=True): """ Generate 128-256 bits entropy bytes string :param int strength: entropy bits strength, by default is 256 bit. :param boolean hex: return HEX encoded string result flag, by default True. :return: HEX encoded or bytes entropy string. """ if strength not in [128, 160, 192, 224, 256]: raise ValueError('strength should be one of the following [128, 160, 192, 224, 256]') a = random.SystemRandom().randint(0, ECDSA_SEC256K1_ORDER) i = int((time.time() % 0.01 ) * 100000) h = a.to_bytes(32, byteorder="big") # more entropy from system timer and sha256 derivation while i: h = hashlib.sha256(h).digest() i -= 1 if not i and int_from_bytes(h, byteorder="big") > ECDSA_SEC256K1_ORDER: i += 1 return h[:int(strength/8)] if not hex else h[:int(strength/8)].hex()