def back_encrypt(self, authenticated=True): for i in range(5): priv_key = crypto.random_scalar() data = crypto.cn_fast_hash(crypto.encodeint( crypto.random_scalar())) * (i + 1) blob = chacha.encrypt_xmr(priv_key, data, authenticated=authenticated) plaintext = chacha.decrypt_xmr(priv_key, blob, authenticated=authenticated) self.assertEqual(data, plaintext) try: plaintext2 = chacha.decrypt_xmr( crypto.sc_add(priv_key, crypto.sc_init(1)), blob, authenticated=authenticated, ) if authenticated: self.fail("Signature error expected") else: self.assertNotEqual(data, plaintext2) except: if not authenticated: raise
async def load_unsigned_tx(priv_key, data): """ Loads unsigned transaction from the encrypted file :param priv_key: :param data: :return: """ magic_len = len(UNSIGNED_TX_PREFIX) magic = data[:magic_len - 1] version = int(data[magic_len - 1]) data = data[magic_len:] if magic != UNSIGNED_TX_PREFIX[:-1]: raise ValueError("Invalid file header") if version != 4: raise ValueError("Unsigned transaction v4 is supported only") tx_uns_ser = chacha.decrypt_xmr(priv_key, data, authenticated=True) reader = xmrserialize.MemoryReaderWriter(bytearray(tx_uns_ser)) ar = xmrboost.Archive(reader, False) msg = xmrtypes.UnsignedTxSet() await ar.root() await ar.message(msg) return msg
async def load_exported_outputs(priv_key, data): """ Loads exported outputs file :param data: :return: """ magic_len = len(OUTPUTS_PREFIX) magic = data[:magic_len - 1] version = int(data[magic_len - 1]) data = data[magic_len:] if magic != OUTPUTS_PREFIX[:-1]: raise ValueError("Invalid file header") if version != 3: raise ValueError("Exported outputs v3 is supported only") data_dec = chacha.decrypt_xmr(priv_key, data, authenticated=True) spend_pub = data_dec[:32] view_pub = data_dec[32:64] data_dec = data_dec[64:] reader = xmrserialize.MemoryReaderWriter(bytearray(data_dec)) ar = xmrboost.Archive(reader, False) await ar.root() exps = await ar.container(container_type=ExportedOutputs) return OutputsDump(m_spend_public_key=spend_pub, m_view_public_key=view_pub, tds=exps)
async def load_exported_outputs(priv_key, data): """ Loads exported outputs file :param data: :return: """ magic_len = len(OUTPUTS_PREFIX) magic = data[: magic_len - 1] version = int(data[magic_len - 1]) data = data[magic_len:] if magic != OUTPUTS_PREFIX[:-1]: raise ValueError("Invalid file header") if version not in [3, 4]: raise ValueError("Exported outputs v3, v4 are supported only") msg_to_parse = ExportedOutputsV4 if version == 4 else ExportedOutputs data_dec = chacha.decrypt_xmr(priv_key, data, authenticated=True) spend_pub = data_dec[:32] view_pub = data_dec[32:64] data_dec = data_dec[64:] reader = xmrserialize.MemoryReaderWriter(bytearray(data_dec)) ar = xmrboost.Archive(reader, False) await ar.root() if version == 3: exps = await ar.container(container_type=ExportedOutputs) elif version == 4: exps_root = await ar.tuple(elem_type=ExportedOutputsV4) exps = exps_root[1] if exps_root[0] != 0: raise ValueError('Offset has to be 0') return OutputsDump( m_spend_public_key=spend_pub, m_view_public_key=view_pub, tds=exps )