async def _compute_sec_keys(state: State, tsx_data: MoneroTransactionData): """ Generate master key H( H(TsxData || tx_priv) || rand ) """ import protobuf from apps.monero.xmr.keccak_hasher import get_keccak_writer writer = get_keccak_writer() await protobuf.dump_message(writer, tsx_data) writer.write(crypto.encodeint(state.tx_priv)) master_key = crypto.keccak_2hash(writer.get_digest() + crypto.encodeint(crypto.random_scalar())) state.key_hmac = crypto.keccak_2hash(b"hmac" + master_key) state.key_enc = crypto.keccak_2hash(b"enc" + master_key)
def _build_key(secret, discriminator=None, index: int = None, out: bytes = None) -> bytes: """ Creates an unique-purpose key """ key_buff = BUILD_KEY_BUFFER # bytearray(32 + 12 + 4) # key + disc + index utils.ensure(len(secret) == 32, "Invalid key length") utils.ensure(len(discriminator) <= 12, "Disc too long") offset = 32 utils.memcpy(key_buff, 0, secret, 0, 32) for i in range(32, len(key_buff)): key_buff[i] = 0 if discriminator is not None: utils.memcpy(key_buff, offset, discriminator, 0, len(discriminator)) offset += len(discriminator) if index is not None: # dump_uvarint_b_into, saving import shifted = True while shifted: shifted = index >> 7 key_buff[offset] = (index & 0x7F) | (0x80 if shifted else 0x00) offset += 1 index = shifted return crypto.keccak_2hash(key_buff, out)
def _build_key(secret, discriminator=None, index: int = None, out: bytes = None) -> bytes: """ Creates an unique-purpose key """ key_buff = _BUILD_KEY_BUFFER utils.ensure(len(secret) == _SECRET_LENGTH, "Invalid key length") utils.ensure(len(discriminator) <= _DISCRIMINATOR_LENGTH, "Disc too long") offset = _SECRET_LENGTH utils.memcpy(key_buff, 0, secret, 0, _SECRET_LENGTH) for i in range(_SECRET_LENGTH, len(key_buff)): key_buff[i] = 0 utils.memcpy(key_buff, offset, discriminator, 0, len(discriminator)) offset += _DISCRIMINATOR_LENGTH # fixed domain separator size if index is not None: # dump_uvarint_b_into, saving import shifted = True while shifted: shifted = index >> 7 key_buff[offset] = (index & 0x7F) | (0x80 if shifted else 0x00) offset += 1 index = shifted return crypto.keccak_2hash(key_buff, out)
def compute_enc_key_host(view_key_private: Sc25519, tx_prefix_hash: bytes) -> Tuple[bytes, bytes]: from apps.monero.xmr import crypto salt = crypto.random_bytes(32) passwd = crypto.keccak_2hash( crypto.encodeint(view_key_private) + tx_prefix_hash) tx_key = crypto.compute_hmac(salt, passwd) return tx_key, salt
def _compute_tx_key(spend_key_private, tx_prefix_hash): salt = crypto.random_bytes(32) rand_mult_num = crypto.random_scalar() rand_mult = crypto.encodeint(rand_mult_num) rand_inp = crypto.sc_add(spend_key_private, rand_mult_num) passwd = crypto.keccak_2hash(crypto.encodeint(rand_inp) + tx_prefix_hash) tx_key = crypto.compute_hmac(salt, passwd) return tx_key, salt, rand_mult
def compute_tx_key( spend_key_private: Sc25519, tx_prefix_hash: bytes, salt: bytes, rand_mult_num: Sc25519, ) -> bytes: from apps.monero.xmr import crypto rand_inp = crypto.sc_add(spend_key_private, rand_mult_num) passwd = crypto.keccak_2hash(crypto.encodeint(rand_inp) + tx_prefix_hash) tx_key = crypto.compute_hmac(salt, passwd) return tx_key
def _build_key(secret, discriminator=None, index: int = None) -> bytes: """ Creates an unique-purpose key """ key_buff = bytearray(32 + 12 + 4) # key + disc + index offset = 32 utils.memcpy(key_buff, 0, secret, 0, len(secret)) if discriminator is not None: utils.memcpy(key_buff, offset, discriminator, 0, len(discriminator)) offset += len(discriminator) if index is not None: # dump_uvarint_b_into, saving import shifted = True while shifted: shifted = index >> 7 key_buff[offset] = (index & 0x7F) | (0x80 if shifted else 0x00) offset += 1 index = shifted return crypto.keccak_2hash(key_buff)