Key derivation: byte order fix for RFC1751

This commit is contained in:
mDuo13
2019-10-10 12:18:58 -07:00
parent 28f12b4f25
commit e36b90d1d3

View File

@@ -73,7 +73,7 @@ class Seed:
try:
decoded = RFC1751.english_to_key(in_string)
if len(decoded) == 16:
self.bytes = decoded
self.bytes = swap_byte_order(decoded)
return
else:
raise ValueError
@@ -114,7 +114,7 @@ class Seed:
Returns a string representation of this seed as an RFC-1751 encoded
passphrase.
"""
return RFC1751.key_to_english(self.bytes)
return RFC1751.key_to_english(swap_byte_order(self.bytes))
@property
def ed25519_private_key(self):
@@ -218,6 +218,18 @@ def compress_secp256k1_public(point):
prefix = b'\x02'
return prefix + point.x.to_bytes(32, byteorder="big", signed=False)
def swap_byte_order(buf):
"""
Swap the byte order of a bytes object.
The rippled implementation of RFC-1751 uses the reversed byte order as the
examples included in the RFC-1751 spec (which doesn't mention byte order).
"""
size = len(buf)
# doesn't actually matter if it's "really" big-endian
i = int.from_bytes(buf, byteorder="big", signed=False)
revbuf = i.to_bytes(size, byteorder="little", signed=False)
return revbuf
if __name__ == "__main__":
p = argparse.ArgumentParser()
p.add_argument("secret", help="The seed to derive a key from, in hex, XRPL base58, or RFC-1751; or the passphrase to derive a seed and key from.")