mirror of
https://github.com/HelloZeroNet/ZeroNet.git
synced 2023-12-14 04:33:03 +01:00
98 lines
2.6 KiB
Python
98 lines
2.6 KiB
Python
import sys, re
|
|
import binascii
|
|
import os
|
|
import hashlib
|
|
|
|
|
|
if sys.version_info.major == 2:
|
|
string_types = (str, unicode)
|
|
string_or_bytes_types = string_types
|
|
int_types = (int, float, long)
|
|
|
|
# Base switching
|
|
code_strings = {
|
|
2: '01',
|
|
10: '0123456789',
|
|
16: '0123456789abcdef',
|
|
32: 'abcdefghijklmnopqrstuvwxyz234567',
|
|
58: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',
|
|
256: ''.join([chr(x) for x in range(256)])
|
|
}
|
|
|
|
def bin_dbl_sha256(s):
|
|
bytes_to_hash = from_string_to_bytes(s)
|
|
return hashlib.sha256(hashlib.sha256(bytes_to_hash).digest()).digest()
|
|
|
|
def lpad(msg, symbol, length):
|
|
if len(msg) >= length:
|
|
return msg
|
|
return symbol * (length - len(msg)) + msg
|
|
|
|
def get_code_string(base):
|
|
if base in code_strings:
|
|
return code_strings[base]
|
|
else:
|
|
raise ValueError("Invalid base!")
|
|
|
|
def changebase(string, frm, to, minlen=0):
|
|
if frm == to:
|
|
return lpad(string, get_code_string(frm)[0], minlen)
|
|
return encode(decode(string, frm), to, minlen)
|
|
|
|
def bin_to_b58check(inp, magicbyte=0):
|
|
if magicbyte == 0:
|
|
inp = '\x00' + inp
|
|
while magicbyte > 0:
|
|
inp = chr(int(magicbyte % 256)) + inp
|
|
magicbyte //= 256
|
|
leadingzbytes = len(re.match('^\x00*', inp).group(0))
|
|
checksum = bin_dbl_sha256(inp)[:4]
|
|
return '1' * leadingzbytes + changebase(inp+checksum, 256, 58)
|
|
|
|
def bytes_to_hex_string(b):
|
|
return b.encode('hex')
|
|
|
|
def safe_from_hex(s):
|
|
return s.decode('hex')
|
|
|
|
def from_int_representation_to_bytes(a):
|
|
return str(a)
|
|
|
|
def from_int_to_byte(a):
|
|
return chr(a)
|
|
|
|
def from_byte_to_int(a):
|
|
return ord(a)
|
|
|
|
def from_bytes_to_string(s):
|
|
return s
|
|
|
|
def from_string_to_bytes(a):
|
|
return a
|
|
|
|
def safe_hexlify(a):
|
|
return binascii.hexlify(a)
|
|
|
|
def encode(val, base, minlen=0):
|
|
base, minlen = int(base), int(minlen)
|
|
code_string = get_code_string(base)
|
|
result = ""
|
|
while val > 0:
|
|
result = code_string[val % base] + result
|
|
val //= base
|
|
return code_string[0] * max(minlen - len(result), 0) + result
|
|
|
|
def decode(string, base):
|
|
base = int(base)
|
|
code_string = get_code_string(base)
|
|
result = 0
|
|
if base == 16:
|
|
string = string.lower()
|
|
while len(string) > 0:
|
|
result *= base
|
|
result += code_string.find(string[0])
|
|
string = string[1:]
|
|
return result
|
|
|
|
def random_string(x):
|
|
return os.urandom(x)
|