Reputation: 11
I want to implement the Ripple Warp Wallet in Python. I am able to successfully generate an address, but it does not match the the website output.
Here is my code:
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Hash import HMAC, SHA256
import binascii
import scrypt
from xrpl.core import keypairs
def hmac_sha256(secret, salt):
m = HMAC.new(secret, None, SHA256)
m.update(salt)
return m.digest()
def sxor(s1,s2):
return ''.join(chr((a) ^ (b)) for a,b in zip(s1,s2))
def generate_keypair(passphrase, salt=""):
# s1 = scrypt(key=(passphrase||0x1), salt=(salt||0x1), N=2^18, r=8, p=1, dkLen=32)
s1 = scrypt.hash(passphrase.encode() + b"\x01", salt.encode() + b"\x01", 1 << 18, 8, 1, 32)
print("S1: ",s1)
# s2 = pbkdf2(key=(passphrase||0x2), salt=(salt||0x2), c=2^16, dkLen=32, prf=HMAC_SHA256)
s2 = PBKDF2(password=passphrase.encode() + b"\x02",salt=salt.encode() + b"\x02",
dkLen=32, count=1 << 16, prf=hmac_sha256)
print("S2: ", s2)
return binascii.hexlify(sxor(s1,s2).encode())
def getXRPAddress(passphrase, salt):
# Use Warp Wallet algorithm to generate seed
rawSeed = generate_keypair(passphrase,salt)
# Generate Address with xrpl-py
seed = keypairs.generate_seed(entropy=rawSeed.decode())
public, private = keypairs.derive_keypair(seed)
pk = keypairs.derive_classic_address(public)
return pk
pk = getXRPAddress("helloworld",salt="")
print("Public Key:")
print(pk)
# returns: r4P69jspBpGvTcKQJf1XLRojZGWWjvop9c
# should be: r4LuZGjbLfrgNG59wcvNSeWF5EH5NiaiQZ
The script output is: r4P69jspBpGvTcKQJf1XLRojZGWWjvop9c
The website output is: r4LuZGjbLfrgNG59wcvNSeWF5EH5NiaiQZ
Do I have something wrong or what do I need to tweak to match the website output?
Upvotes: 1
Views: 401