@@ -26,17 +26,20 @@ def MKGh(Context, IKM):
26
26
I_R = I [32 :]
27
27
return (I_L , I_R )
28
28
29
- def CKDh (Context , sk_par , c_par , i ):
29
+ def CKDh (Context , sk_par , c_par , i , lead , tag ):
30
30
assert type (Context ) == HardenedOnlyContext
31
31
assert 0x80000000 <= i and i <= 0xFFFFFFFF
32
+ assert 0x00 <= lead and lead <= 0xFF
33
+ assert type (tag ) == bytes
32
34
33
- I = prf_expand (c_par , Context .CKDDomain + sk_par + i2leosp (32 , i ))
35
+ lead_enc = bytes ([] if lead == 0 and tag == b"" else [lead ])
36
+ I = prf_expand (c_par , Context .CKDDomain + sk_par + i2leosp (32 , i ) + lead_enc + tag )
34
37
I_L = I [:32 ]
35
38
I_R = I [32 :]
36
39
return (I_L , I_R )
37
40
38
41
class ArbitraryKey (object ):
39
- Arbitrary = HardenedOnlyContext (b'ZcashArbitraryKD' , b'\xAB ' )
42
+ Adhoc = HardenedOnlyContext (b'ZcashArbitraryKD' , b'\xAB ' )
40
43
41
44
def __init__ (self , IKM , path , sk , chaincode ):
42
45
self .IKM = IKM
@@ -53,11 +56,11 @@ def master(cls, ContextString, S):
53
56
assert 32 <= length_S <= 252
54
57
55
58
IKM = bytes ([length_ContextString ]) + ContextString + bytes ([length_S ]) + S
56
- (sk , chaincode ) = MKGh (cls .Arbitrary , IKM )
59
+ (sk , chaincode ) = MKGh (cls .Adhoc , IKM )
57
60
return cls (IKM , [], sk , chaincode )
58
61
59
62
def child (self , i ):
60
- (sk_i , c_i ) = CKDh (self .Arbitrary , self .sk , self .chaincode , i )
63
+ (sk_i , c_i ) = CKDh (self .Adhoc , self .sk , self .chaincode , i , 0 , b"" )
61
64
return self .__class__ (None , self .path + [i ], sk_i , c_i )
62
65
63
66
0 commit comments