1
- #!/usr/bin/env python
1
+ #!/usr/bin/env python3
2
2
"""
3
3
*******************************************************************************
4
4
* Ledger Ethereum App
20
20
from __future__ import print_function
21
21
22
22
from ledgerblue .comm import getDongle
23
- from ledgerblue .commException import CommException
24
23
import argparse
25
24
import struct
26
25
import binascii
27
- import math
28
26
import rlp
29
27
30
28
31
-
32
29
def der_encode (value ):
33
30
value_bytes = value .to_bytes (max (1 , (value .bit_length () + 7 ) // 8 ), 'big' )
34
31
if value >= 0x80 :
35
32
value_bytes = (0x80 | len (value_bytes )).to_bytes (1 , 'big' ) + value_bytes
36
33
return value_bytes
37
34
35
+
38
36
def tlv_encode (tag , value ):
39
37
return der_encode (tag ) + der_encode (len (value )) + value
40
38
41
- def parse_bip32_path (path ):
39
+
40
+ def parse_bip32_path (path : str ):
42
41
if len (path ) == 0 :
43
42
return b""
44
43
result = b""
45
44
elements = path .split ('/' )
45
+ result += len (elements ).to_bytes (1 , "big" )
46
46
for pathElement in elements :
47
47
element = pathElement .split ('\' ' )
48
- result = result + der_encode (0x01 ) + der_encode (0x04 )
49
48
if len (element ) == 1 :
50
49
result = result + struct .pack (">I" , int (element [0 ]))
51
50
else :
@@ -54,23 +53,19 @@ def parse_bip32_path(path):
54
53
55
54
56
55
parser = argparse .ArgumentParser ()
57
- parser .add_argument ('--path' , help = "BIP 32 path to retrieve" )
56
+ parser .add_argument ('--path' , help = "BIP 32 path to retrieve" , default = "44'/60'/0'/0/0" )
58
57
parser .add_argument ('--chainid' , help = "Chain ID" , type = int , required = True )
59
58
parser .add_argument ('--nonce' , help = "Account Nonce" , type = int , required = True )
60
59
parser .add_argument ('--delegate' , help = "Delegate address" , type = str , required = True )
61
60
args = parser .parse_args ()
62
61
63
- if args .path == None :
64
- args .path = "44'/60'/0'/0/0"
65
-
66
62
tmp = tlv_encode (0x00 , struct .pack (">B" , 0x01 ))
67
- tmp += parse_bip32_path (args .path )
68
63
data = binascii .unhexlify (args .delegate [2 :])
69
- tmp += tlv_encode (0x02 , data )
70
- tmp += tlv_encode (0x03 , struct .pack (">Q" , args .chainid ))
71
- tmp += tlv_encode (0x04 , struct .pack (">Q" , args .nonce ))
64
+ tmp += tlv_encode (0x01 , data )
65
+ tmp += tlv_encode (0x02 , struct .pack (">Q" , args .chainid ))
66
+ tmp += tlv_encode (0x03 , struct .pack (">Q" , args .nonce ))
72
67
73
- tmp = struct .pack (">H" , len (tmp )) + tmp
68
+ tmp = parse_bip32_path ( args . path ) + struct .pack (">H" , len (tmp )) + tmp
74
69
75
70
apdu = bytearray .fromhex ("e0340100" )
76
71
apdu += struct .pack (">B" , len (tmp ))
@@ -80,12 +75,12 @@ def parse_bip32_path(path):
80
75
result = dongle .exchange (bytes (apdu ))
81
76
82
77
v = result [0 ]
83
- r = result [1 : 1 + 32 ]
84
- s = result [1 + 32 :]
78
+ r = result [1 : 1 + 32 ]
79
+ s = result [1 + 32 :]
85
80
86
81
print ("v = " + str (v ))
87
82
print ("r = " + binascii .hexlify (r ).decode ('utf-8' ))
88
83
print ("s = " + binascii .hexlify (s ).decode ('utf-8' ))
89
84
90
- rlpData = [ args .chainid , binascii .unhexlify (args .delegate [2 :]), args .nonce , v , r , s ]
85
+ rlpData = [args .chainid , binascii .unhexlify (args .delegate [2 :]), args .nonce , v , r , s ]
91
86
print (binascii .hexlify (rlp .encode (rlpData )).decode ('utf-8' ))
0 commit comments