Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@ryancdotorg
Created July 25, 2018 03:46
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryancdotorg/79a6ab14dd4c84849bc50ee950e43b40 to your computer and use it in GitHub Desktop.
Save ryancdotorg/79a6ab14dd4c84849bc50ee950e43b40 to your computer and use it in GitHub Desktop.
incomplete attempt to implement bitfi's key derivation algorithm
#!/usr/bin/env python
import sys
import hmac
import hashlib
import binascii
import scrypt
import pycoin
from pybitcointools import *
def mkd(password, salt):
return scrypt.hash(password, salt, N=32768, p=4, r=8, buflen=64)
def ci(s):
acc = ""
for c in s.upper():
acc += str(ord(c)-64)
# XXX overflow behaviour is... questionable
return int(acc)
def idx(s):
return ci(s) | 0x8000000
def b2long(b):
return long(binascii.hexlify(b), 16)
def masterkey(password, salt, coin):
k_par = mkd(password, salt)
c_par = hashlib.sha256(salt).digest()
# XXX k_par and c_par may need to be swapped
param = hmac.new(c_par, k_par, hashlib.sha512).digest()
msk = param[0:32]
mcc = param[32:64]
xprv = bip32_serialize((PRIVATE, 0, b'\x00'*4, 0, mcc, msk+b'\x01'))
print xprv
print bip32_serialize((PRIVATE, 0, b'\x00'*4, idx(coin), mcc, msk+b'\x01'))
return bip32_ckd(xprv, idx(coin))
p = sys.argv[1]
s = sys.argv[2]
c = sys.argv[3]
print masterkey(p, s, c)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment