def _ecdh_hash(shared_sec: bytes) -> bytes: """ Generates ECDH hash for amount masking for Bulletproof2 """ data = bytearray(38) data[0:6] = b"amount" data[6:] = shared_sec return crypto.cn_fast_hash(data)
def generate_monero_keys(seed): """ Generates spend key / view key from the seed in the same manner as Monero code does. account.cpp: crypto::secret_key account_base::generate(const crypto::secret_key& recovery_key, bool recover, bool two_random). """ spend_sec, spend_pub = generate_keys(crypto.decodeint(seed)) hash = crypto.cn_fast_hash(crypto.encodeint(spend_sec)) view_sec, view_pub = generate_keys(crypto.decodeint(hash)) return spend_sec, spend_pub, view_sec, view_pub
def test_cn_fast_hash(self): inp = unhexlify( b"259ef2aba8feb473cf39058a0fe30b9ff6d245b42b6826687ebd6b63128aff6405" ) res = crypto.cn_fast_hash(inp) self.assertEqual( res, unhexlify( b"86db87b83fb1246efca5f3b0db09ce3fa4d605b0d10e6507cac253dd31a3ec16" ), )
def _encrypt_payment_id(payment_id, public_key, secret_key): """ Encrypts payment_id hex. Used in the transaction extra. Only recipient is able to decrypt. """ derivation_p = crypto.generate_key_derivation(public_key, secret_key) derivation = bytearray(33) derivation = crypto.encodepoint_into(derivation, derivation_p) derivation[32] = 0x8D # ENCRYPTED_PAYMENT_ID_TAIL hash = crypto.cn_fast_hash(derivation) pm_copy = bytearray(payment_id) return crypto.xor8(pm_copy, hash)
def _encrypt_payment_id(payment_id, public_key, secret_key): """ Encrypts payment_id hex. Used in the transaction extra. Only recipient is able to decrypt. """ derivation_p = crypto.generate_key_derivation(public_key, secret_key) derivation = bytearray(33) derivation = crypto.encodepoint_into(derivation, derivation_p) derivation[32] = 0x8B hash = crypto.cn_fast_hash(derivation) pm_copy = bytearray(payment_id) for i in range(8): pm_copy[i] ^= hash[i] return pm_copy
def get_creds(keychain, address_n=None, network_type=None): from apps.monero.xmr import crypto, monero from apps.monero.xmr.credentials import AccountCreds use_slip0010 = 0 not in address_n # If path contains 0 it is not SLIP-0010 if use_slip0010: curve = "ed25519" else: curve = "secp256k1" node = keychain.derive(address_n, curve) if use_slip0010: key_seed = node.private_key() else: key_seed = crypto.cn_fast_hash(node.private_key()) spend_sec, _, view_sec, _ = monero.generate_monero_keys(key_seed) creds = AccountCreds.new_wallet(view_sec, spend_sec, network_type) return creds