OSDN Git Service

add xprv_to_expanded_private_key
authorChengcheng Zhang <943420582@qq.com>
Fri, 21 Dec 2018 08:27:01 +0000 (16:27 +0800)
committerChengcheng Zhang <943420582@qq.com>
Fri, 21 Dec 2018 08:27:01 +0000 (16:27 +0800)
app/api/__init__.py
app/api/resources.py
app/model/key.py

index 2a40249..5f7d0d0 100644 (file)
@@ -8,6 +8,7 @@ from app.api.resources import Create_Entropy
 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)
@@ -18,4 +19,5 @@ api.add_resource(Verify, '/verify')
 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
index e35de87..d507e0b 100644 (file)
@@ -7,6 +7,7 @@ from app.model.key import create_entropy
 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)
@@ -16,6 +17,7 @@ parser.add_argument('signature_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):
 
@@ -69,4 +71,12 @@ class Seed_To_Root_Xprv(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
index 071f06e..91bf004 100644 (file)
@@ -118,4 +118,20 @@ def seed_to_root_xprv(seed_str):
 # 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
+