from app.api.resources import Entropy_To_Mnemonic
from app.api.resources import Mnemonic_To_Seed
from app.api.resources import Seed_To_Root_Xprv
+from app.api.resources import Xprv_To_Expanded_Private_Key
blueprint = Blueprint('api', __name__, url_prefix='/api/v1')
api = Api(blueprint)
api.add_resource(Create_Entropy, '/create_entropy')
api.add_resource(Entropy_To_Mnemonic, '/entropy_to_mnemonic')
api.add_resource(Mnemonic_To_Seed, '/mnemonic_to_seed')
-api.add_resource(Seed_To_Root_Xprv, '/seed_to_root_xprv')
\ No newline at end of file
+api.add_resource(Seed_To_Root_Xprv, '/seed_to_root_xprv')
+api.add_resource(Xprv_To_Expanded_Private_Key, '/xprv_to_expanded_private_key')
\ No newline at end of file
from app.model.key import entropy_to_mnemonic
from app.model.key import mnemonic_to_seed
from app.model.key import seed_to_root_xprv
+from app.model.key import xprv_to_expanded_private_key
parser = reqparse.RequestParser()
parser.add_argument('private_key_str', type=str)
parser.add_argument('entropy_str', type=str)
parser.add_argument('mnemonic_str', type=str)
parser.add_argument('seed_str', type=str)
+parser.add_argument('xprv_str', type=str)
class Hello(Resource):
args = parser.parse_args()
seed_str = args.get('seed_str')
root_xprv_str = seed_to_root_xprv(seed_str)
- return root_xprv_str
\ No newline at end of file
+ return root_xprv_str
+
+class Xprv_To_Expanded_Private_Key(Resource):
+
+ def post(self):
+ args = parser.parse_args()
+ xprv_str = args.get('xprv_str')
+ expanded_private_key_str = xprv_to_expanded_private_key(xprv_str)
+ return expanded_private_key_str
\ No newline at end of file
# xpub_str = public_key.decode() + xprv_str[64:]
# return xpub_str
-# def xprv_to_hardened_child(xprv_str):
+# xprv_to_expanded_private_key create expanded private key from xprv
+# You can verify or get more test data from: https://gist.github.com/zcc0721/ef0bf2e69f5e92b29d716981f2a8fe7d
+# test data 1:
+# xprv_str: 406c82307bf7978d17f3ecfeea7705370e9faef2027affa86c8027c6e11a8a50e231e65bd97048850ae6c39d0f46b63ae70aa24f5aac7877727c430c2201e6d6
+# root_xprv: 406c82307bf7978d17f3ecfeea7705370e9faef2027affa86c8027c6e11a8a50d828bf44b1a109c2bbb4c72685858e2f2ab8b405beef1e4ecc12d1ed8511e8eb
+# test data 2:
+# xprv_str: 6032adeb967ac5ccbf988cf8190817bf9040c8cfd9cdfe3d5e400effb2946946d478b61cc6be936f367ae769eb1dc65c473ee73cac2eb43cf6d5e7c62b7f0062
+# root_xprv: 6032adeb967ac5ccbf988cf8190817bf9040c8cfd9cdfe3d5e400effb2946946ddbb71e7a76595c6bc24937d76085d24315713764cbdf1364ab9091953009cd8
+# test data 3:
+# xprv_str: 509a095ad862322641b8d66e84561aae1d4816045167e2c4dfadf464928e114300c0a162d41c0cdf196d61f4492f546e50bfff253b9d5d930d1bb89197cd333d
+# root_xprv: 509a095ad862322641b8d66e84561aae1d4816045167e2c4dfadf464928e11432787f5e10f9598f80fb41e4a648b609463c06e625641366f3279658b2b0f5268
+def xprv_to_expanded_private_key(xprv_str):
+ hc_str = hmac.HMAC(b'Expand', bytes.fromhex(xprv_str), digestmod=hashlib.sha512).hexdigest()
+ expanded_private_key_str = xprv_str[:64] + hc_str[64:]
+
+ return expanded_private_key_str
+