def get_child_xprv(xprv_hexstr, path_list):
for i in range(len(path_list)):
selector_bytes = bytes.fromhex(path_list[i])
- xpub_hexstr = xprv_to_xpub(xprv_hexstr)['xpub']
+ xpub_hexstr = get_xpub(xprv_hexstr)
xpub_bytes = bytes.fromhex(xpub_hexstr)
xprv_bytes = bytes.fromhex(xprv_hexstr)
hc_bytes = hmac.HMAC(xpub_bytes[32:], b'N'+xpub_bytes[:32]+selector_bytes, digestmod=hashlib.sha512).digest()
# message_hexstr: 1246b84985e1ab5f83f4ec2bdf271114666fd3d9e24d12981a3c861b9ed523c6
# signature_hexstr: ab18f49b23d03295bc2a3f2a7d5bb53a2997bed733e1fc408b50ec834ae7e43f7da40fe5d9d50f6ef2d188e1d27f976aa2586cef1ba00dd098b5c9effa046306
def xprv_sign(xprv_hexstr, message_hexstr):
- xprv_hexstr = xprv_to_expanded_private_key(xprv_hexstr)['expanded_private_key']
+ xprv_hexstr = get_expanded_private_key(xprv_hexstr)
xprv_bytes = bytes.fromhex(xprv_hexstr)
message_bytes = bytes.fromhex(message_hexstr)
data_bytes = xprv_bytes[32:64] + message_bytes
scalar = decodeint(message_digest_reduced)
encoded_r = encodepoint(scalarmultbase(scalar))
- xpub_hexstr = xprv_to_xpub(xprv_hexstr)['xpub']
+ xpub_hexstr = get_xpub(xprv_hexstr)
xpub_bytes = bytes.fromhex(xpub_hexstr)
hram_digest_data = encoded_r + xpub_bytes[:32] + message_bytes
# signature_hexstr: ab18f49b23d03295bc2a3f2a7d5bb53a2997bed733e1fc408b50ec834ae7e43f7da40fe5d9d50f6ef2d188e1d27f976aa2586cef1ba00dd098b5c9effa046306
def xpub_verify(xpub_hexstr, message_hexstr, signature_hexstr):
result = False
- result = verify(xpub_to_public_key(xpub_hexstr)['public_key'], signature_hexstr, message_hexstr)['result']
+ result = verify(get_public_key(xpub_hexstr), signature_hexstr, message_hexstr)
return result
-def get_new_key(entropy_hexstr=None, mnemonic_hexstr=None):
+def get_new_key(entropy_hexstr=None, mnemonic_str=None):
if (entropy_hexstr is None) and (mnemonic_str is None):
entropy_hexstr = get_entropy()
mnemonic_str = get_mnemonic(entropy_hexstr)
if (entropy_hexstr is None) and (mnemonic_str is not None):
- pass
+ entropy_hexstr = ''
if entropy_hexstr is not None:
mnemonic_str = get_mnemonic(entropy_hexstr)
seed_hexstr = get_seed(mnemonic_str)
import qrcode
import pybase64
+import six
+import hmac
+import hashlib
+import sha3
from io import BytesIO
+from binascii import hexlify
+from binascii import unhexlify
+from .edwards25519 import *
+# from bytom.signatures import ed25519
# create_qrcode_base64 create qrcode, then encode it to base64
# type(s) is str
base64_str = pybase64.b64encode(buffered.getvalue()).decode("utf-8")
return {
"base64": base64_str
- }
\ No newline at end of file
+ }
+
+
+if six.PY3:
+ def byte2int(b):
+ return b
+ def int2byte(i):
+ return bytes(chr(i % 256), encoding="UTF-8")
+
+elif six.PY2:
+ def byte2int(b):
+ return ord(b)
+ def int2byte(i):
+ return chr(i % 256)
+
+L = 2 ** 252 + 27742317777372353535851937790883648493
+
+def sha3_digest_256(data):
+ s = sha3.sha3_256()
+ s.update(data)
+ return s.digest()
+
+def hmac_sha_512(data, key):
+ digest = hmac.new(key, msg=data, digestmod=hashlib.sha512).digest()
+ return digest
+
+def sha_512(data):
+ md = hashlib.sha512()
+ md.update(data)
+ return md.digest()
+
+def hex2int(hex):
+ ## converts a hex string to integer
+ unhex = unhexlify(hex)
+ s = 0
+ for i in range(len(unhex)):
+ s += 256 ** i * byte2int(unhex[i])
+ return s
+
+def int2hex(int):
+ ## converts an integer to a little endian encoded hex string
+ return hexlify(encodeint(int))
+
+def sc_reduce32(input):
+ ## convert hex string input to integer
+ int = hex2int(input)
+ ## reduce mod l
+ modulo = int % L
+ ## convert back to hex string for return value
+ return int2hex(modulo)
+
+def sc_muladd(a, b, c):
+ a_int = hex2int(a)
+ b_int = hex2int(b)
+ c_int = hex2int(c)
+
+ s = a_int * b_int + c_int
+ modulo = s % L
+ return int2hex(modulo)