diff --git a/content/_code-samples/key-derivation/key-derivation.py b/content/_code-samples/key-derivation/key-derivation.py index 2a9d0e4ef4..b2f7c8f879 100755 --- a/content/_code-samples/key-derivation/key-derivation.py +++ b/content/_code-samples/key-derivation/key-derivation.py @@ -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.")