mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-22 23:48:12 +00:00
Added base58 decoder
This commit is contained in:
parent
b4ff6139ae
commit
56eb483f70
55
trezorlib/tools.py
Normal file
55
trezorlib/tools.py
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
__b58chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
|
||||||
|
__b58base = len(__b58chars)
|
||||||
|
|
||||||
|
|
||||||
|
def b58encode(v):
|
||||||
|
""" encode v, which is a string of bytes, to base58."""
|
||||||
|
|
||||||
|
long_value = 0L
|
||||||
|
for (i, c) in enumerate(v[::-1]):
|
||||||
|
long_value += (256 ** i) * ord(c)
|
||||||
|
|
||||||
|
result = ''
|
||||||
|
while long_value >= __b58base:
|
||||||
|
div, mod = divmod(long_value, __b58base)
|
||||||
|
result = __b58chars[mod] + result
|
||||||
|
long_value = div
|
||||||
|
result = __b58chars[long_value] + result
|
||||||
|
|
||||||
|
# Bitcoin does a little leading-zero-compression:
|
||||||
|
# leading 0-bytes in the input become leading-1s
|
||||||
|
nPad = 0
|
||||||
|
for c in v:
|
||||||
|
if c == '\0':
|
||||||
|
nPad += 1
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
return (__b58chars[0] * nPad) + result
|
||||||
|
|
||||||
|
|
||||||
|
def b58decode(v, length):
|
||||||
|
""" decode v into a string of len bytes."""
|
||||||
|
long_value = 0L
|
||||||
|
for (i, c) in enumerate(v[::-1]):
|
||||||
|
long_value += __b58chars.find(c) * (__b58base ** i)
|
||||||
|
|
||||||
|
result = ''
|
||||||
|
while long_value >= 256:
|
||||||
|
div, mod = divmod(long_value, 256)
|
||||||
|
result = chr(mod) + result
|
||||||
|
long_value = div
|
||||||
|
result = chr(long_value) + result
|
||||||
|
|
||||||
|
nPad = 0
|
||||||
|
for c in v:
|
||||||
|
if c == __b58chars[0]:
|
||||||
|
nPad += 1
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
result = chr(0) * nPad + result
|
||||||
|
if length is not None and len(result) != length:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return result
|
Loading…
Reference in New Issue
Block a user