diff --git a/monero/ed25519.py b/monero/ed25519.py index 6c9bbe8..4513426 100644 --- a/monero/ed25519.py +++ b/monero/ed25519.py @@ -1,7 +1,6 @@ import binascii -import six - import nacl.bindings +import six def bit(h, i): @@ -21,12 +20,13 @@ def decodeint(s): edwards_add = nacl.bindings.crypto_core_ed25519_add inv = nacl.bindings.crypto_core_ed25519_scalar_invert +scalar_add = nacl.bindings.crypto_core_ed25519_scalar_add scalarmult_B = nacl.bindings.crypto_scalarmult_ed25519_base_noclamp scalarmult = nacl.bindings.crypto_scalarmult_ed25519_noclamp def scalar_reduce(v): - return nacl.bindings.crypto_core_ed25519_scalar_reduce(v + 32 * b"\0") + return nacl.bindings.crypto_core_ed25519_scalar_reduce(v + (64 - len(v)) * b"\0") def public_from_secret_hex(hk): diff --git a/monero/transaction/__init__.py b/monero/transaction/__init__.py index 3671b2c..fe5f780 100644 --- a/monero/transaction/__init__.py +++ b/monero/transaction/__init__.py @@ -142,11 +142,14 @@ class Transaction(object): def _scan_pubkeys(svk, psk, stealth_address, amount, encamount): for keyidx, tx_key in enumerate(self.pubkeys): + # precompute + svk_2 = ed25519.scalar_add(svk, svk) + svk_4 = ed25519.scalar_add(svk_2, svk_2) + svk_8 = ed25519.scalar_add(svk_4, svk_4) + # hsdata = b"".join( [ - ed25519.scalarmult( - ed25519.encodeint(ed25519.decodeint(svk) * 8), tx_key - ), + ed25519.scalarmult(svk_8, tx_key), varint.encode(idx), ] )