Esempio n. 1
0
    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
Esempio n. 2
0
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
Esempio n. 3
0
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)
Esempio n. 4
0
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
    )