40 lines
976 B
Python
40 lines
976 B
Python
import hashlib
|
|
import struct
|
|
|
|
|
|
# Electrum, the heck?!
|
|
|
|
def bchr(i):
|
|
return struct.pack("B", i)
|
|
|
|
def encode(val, base, minlen=0):
|
|
base, minlen = int(base), int(minlen)
|
|
code_string = b"".join([bchr(x) for x in range(256)])
|
|
result = b""
|
|
while val > 0:
|
|
index = val % base
|
|
result = code_string[index:index + 1] + result
|
|
val //= base
|
|
return code_string[0:1] * max(minlen - len(result), 0) + result
|
|
|
|
def insane_int(x):
|
|
x = int(x)
|
|
if x < 253:
|
|
return bchr(x)
|
|
elif x < 65536:
|
|
return bchr(253) + encode(x, 256, 2)[::-1]
|
|
elif x < 4294967296:
|
|
return bchr(254) + encode(x, 256, 4)[::-1]
|
|
else:
|
|
return bchr(255) + encode(x, 256, 8)[::-1]
|
|
|
|
|
|
def magic(message):
|
|
return b"\x18Bitcoin Signed Message:\n" + insane_int(len(message)) + message
|
|
|
|
def format(message):
|
|
return hashlib.sha256(magic(message)).digest()
|
|
|
|
def dbl_format(message):
|
|
return hashlib.sha256(format(message)).digest()
|