OSDN Git Service

add seed_to_root_xprv
authorChengcheng Zhang <943420582@qq.com>
Thu, 20 Dec 2018 08:30:47 +0000 (16:30 +0800)
committerChengcheng Zhang <943420582@qq.com>
Thu, 20 Dec 2018 08:30:47 +0000 (16:30 +0800)
app/api/__init__.py
app/api/resources.py
app/model/key.py

index e59c75f..2a40249 100644 (file)
@@ -7,6 +7,7 @@ from app.api.resources import Verify
 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
 
 blueprint = Blueprint('api', __name__, url_prefix='/api/v1')
 api = Api(blueprint)
@@ -16,4 +17,5 @@ api.add_resource(Sign, '/sign')
 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')
\ No newline at end of file
+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
index 2973bec..6c65744 100644 (file)
@@ -6,6 +6,7 @@ from app.model.signature import verify
 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
 
 parser = reqparse.RequestParser()
 parser.add_argument('private_key', type=str)
@@ -14,6 +15,7 @@ parser.add_argument('public_key', type=str)
 parser.add_argument('signature', type=str)
 parser.add_argument('entropy_str', type=str)
 parser.add_argument('mnemonic_str', type=str)
+parser.add_argument('seed_str', type=str)
 
 class Hello(Resource):
 
@@ -59,4 +61,12 @@ class Mnemonic_To_Seed(Resource):
         args = parser.parse_args()
         mnemonic_str = args.get('mnemonic_str')
         seed_str = mnemonic_to_seed(mnemonic_str)
-        return seed_str
\ No newline at end of file
+        return seed_str
+
+class Seed_To_Root_Xprv(Resource):
+
+    def post(self):
+        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
index 119f195..b17fa42 100644 (file)
@@ -74,4 +74,31 @@ def mnemonic_to_seed(mnemonic_str):
     seed_str = pbkdf2.PBKDF2(password_str, salt_str, iterations=2048, digestmodule=hashlib.sha512, macmodule=hmac).hexread(64)
 
     return seed_str
-    
+
+# seed_to_root_xprv create rootxprv from seed
+# seed_str length is 512 bits.
+# root_xprv length is 512 bits.
+# You can verify or get more test data from: https://gist.github.com/zcc0721/0aa1b971f4bf93d8f67e25f57b8b97ee
+# test data 1:
+#   seed_str: afa3a86bbec2f40bb32833fc6324593824c4fc7821ed32eac1f762b5893e56745f66a6c6f2588b3d627680aa4e0e50efd25065097b3daa8c6a19d606838fe7d4
+#   root_xprv: 302a25c7c0a68a83fa043f594a2db8b44bc871fced553a8a33144b31bc7fb84887c9e75915bb6ba3fd0b9f94a60b7a5897ab9db6a48f888c2559132dba9152b0
+# test data 2:
+#   seed_str: b435f948bd3748ede8f9d6f59728d669939e79c6c885667a5c138e05bbabde1de0dcfcbe0c6112022fbbf0da522f4e224a9c2381016380688b51886248b3156f
+#   root_xprv: 6032adeb967ac5ccbf988cf8190817bf9040c8cfd9cdfe3d5e400effb2946946d478b61cc6be936f367ae769eb1dc65c473ee73cac2eb43cf6d5e7c62b7f0062
+# test data 3:
+#   seed_str: ecc2bbb6c0492873cdbc81edf56bd896d3b644047879840e357be735b7fa7b6f4af1be7b8d71cc649ac4ca3816f9ccaf11bf49f4effb845f3c19e16eaf8bfcda
+#   root_xprv: a01d6b741b0e74b8d0836ac22b675bbf8e108148ef018d1b000aef1a899a134bd316c0f59e7333520ae1a429504073b2773869e95aa95bb3a4fa0ec76744025c
+def seed_to_root_xprv(seed_str):
+    hc_str = hmac.HMAC(b'Root', bytes.fromhex(seed_str), digestmod=hashlib.sha512).hexdigest()
+    hc_0_int = int.from_bytes(bytes.fromhex(hc_str[0:2]), byteorder='big') & 248
+    hc_0_str = "%0.2x" % hc_0_int
+    new_hc_str = hc_0_str + hc_str[2:]
+    hc_31_int = int.from_bytes(bytes.fromhex(new_hc_str[62:64]), byteorder='big') & 31
+    hc_31_str = "%0.2x" % hc_31_int
+    new_hc_str = new_hc_str[:62] + hc_31_str + new_hc_str[64:]
+    hc_31_int = int.from_bytes(bytes.fromhex(new_hc_str[62:64]), byteorder='big') | 64
+    hc_31_str = "%0.2x" % hc_31_int
+    new_hc_str = new_hc_str[:62] + hc_31_str + new_hc_str[64:]
+    root_xprv_str = new_hc_str
+
+    return root_xprv_str
\ No newline at end of file