예제 #1
0
    def handle_ephemeral(self, source, message: qrllegacy_pb2.LegacyMessage):
        """
        Receives Ephemeral Message
        :param source:
        :param message:
        :return:
        """
        try:
            encrypted_ephemeral = EncryptedEphemeralMessage(message.ephData)
        except Exception as e:
            logger.error(
                'ephemeral_message rejected - unable to decode serialised data - closing connection'
            )
            logger.exception(e)
            source.loseConnection()
            return

        if not source.factory.master_mr.isRequested(
                encrypted_ephemeral.get_message_hash(), self):
            return

        if not encrypted_ephemeral.validate():
            return

        source.factory.broadcast_ephemeral_message(
            encrypted_ephemeral)  # FIXME(cyyber) : Fix broken link
예제 #2
0
파일: helper.py 프로젝트: som-dev/QRL
def create_ephemeral_channel(msg_id: bytes, ttl: int, ttr: int,
                             addr_from: bytes, kyber_pk: bytes,
                             kyber_sk: bytes, receiver_kyber_pk: bytes,
                             dilithium_pk: bytes, dilithium_sk: bytes,
                             prf512_seed: bytes, data: bytes, nonce: int):
    sender_kyber = Kyber(kyber_pk, kyber_sk)
    sender_kyber.kem_encode(receiver_kyber_pk)
    enc_aes256_symkey = bytes(sender_kyber.getCypherText())
    aes256_symkey = sender_kyber.getMyKey()
    aes = AES(bytes(aes256_symkey))
    sender_dilithium = Dilithium(dilithium_pk, dilithium_sk)

    ephemeral_data = EphemeralChannelPayload.create(addr_from, prf512_seed,
                                                    data)

    ephemeral_data.dilithium_sign(msg_id, ttl, ttr, enc_aes256_symkey, nonce,
                                  sender_dilithium)

    encrypted_ephemeral_message = EncryptedEphemeralMessage()

    encrypted_ephemeral_message._data.msg_id = msg_id
    encrypted_ephemeral_message._data.ttl = ttl
    encrypted_ephemeral_message._data.ttr = ttr
    encrypted_ephemeral_message._data.channel.enc_aes256_symkey = enc_aes256_symkey
    encrypted_ephemeral_message._data.nonce = nonce
    encrypted_ephemeral_message._data.payload = aes.encrypt(
        ephemeral_data.to_json().encode())

    return encrypted_ephemeral_message
예제 #3
0
파일: cli.py 프로젝트: grx7/QRL
def send_eph_message(ctx, msg_id, ttl, ttr, enc_aes256_symkey, nonce, payload):
    """
    Creates & Push Ephemeral Message
    :param ctx:
    :param msg_id:
    :param ttl:
    :param ttr:
    :param enc_aes256_symkey:
    :param nonce:
    :param payload:
    :return:
    """
    if not ctx.obj.remote:
        click.echo('This command is unsupported for local wallets')
        return

    if len(enc_aes256_symkey):
        enc_aes256_symkey = enc_aes256_symkey.encode()

    payload = payload.encode()

    encrypted_ephemeral_msg = EncryptedEphemeralMessage.create(
        _parse_hexblob(msg_id), ttl, ttr, nonce, payload, enc_aes256_symkey)

    try:
        stub = ctx.obj.get_stub_public_api()
        ephemeralMessageReq = qrl_pb2.PushEphemeralMessageReq(
            ephemeral_message=encrypted_ephemeral_msg.pbdata)
        ephemeralMessageResp = stub.PushEphemeralMessage(ephemeralMessageReq,
                                                         timeout=5)

        print(ephemeralMessageResp.error_code)
    except Exception as e:
        print("Error {}".format(str(e)))
예제 #4
0
def create_ephemeral_message(ttl: int,
                             ttr: int,
                             addr_from: bytes,
                             kyber_pk: bytes,
                             kyber_sk: bytes,
                             receiver_kyber_pk: bytes,
                             prf512_seed: bytes,
                             seq: int,
                             data: bytes,
                             nonce: int):
    sender_kyber = Kyber(kyber_pk, kyber_sk)
    sender_kyber.kem_encode(receiver_kyber_pk)

    aes256_symkey = sender_kyber.getMyKey()
    aes = AES(aes256_symkey)

    ephemeral_data = EphemeralMessagePayload.create(addr_from, data)

    encrypted_ephemeral_message = EncryptedEphemeralMessage()

    encrypted_ephemeral_message._data.msg_id = RNG.generate(prf512_seed, seq)
    encrypted_ephemeral_message._data.ttl = ttl
    encrypted_ephemeral_message._data.ttr = ttr
    encrypted_ephemeral_message._data.nonce = nonce
    encrypted_ephemeral_message._data.payload = aes.encrypt(ephemeral_data.to_json())

    return encrypted_ephemeral_message
예제 #5
0
파일: qrlnode.py 프로젝트: fanff/QRL
    def broadcast_ephemeral_message(self, encrypted_ephemeral: EncryptedEphemeralMessage) -> bool:
        if not encrypted_ephemeral.validate():
            return False

        self._p2pfactory.broadcast_ephemeral_message(encrypted_ephemeral)

        return True
예제 #6
0
    def broadcast_ephemeral_message(self, encrypted_ephemeral: EncryptedEphemeralMessage) -> bool:
        if not encrypted_ephemeral.validate():
            return False

        self._p2pfactory.broadcast_ephemeral_message(encrypted_ephemeral)

        return True
예제 #7
0
    def add(self, encrypted_ephemeral):
        self.update()
        target_hash = encrypted_ephemeral.get_message_hash()

        for raw_encrypted_ephemeral in self.encrypted_ephemeral_message_list:
            if EncryptedEphemeralMessage(raw_encrypted_ephemeral).get_message_hash() == target_hash:
                return
        self._data.encrypted_ephemeral_message_list.extend([encrypted_ephemeral.pbdata])
예제 #8
0
    def PushEphemeralMessage(self, request: qrl_pb2.PushEphemeralMessageReq,
                             context) -> qrl_pb2.PushTransactionResp:
        logger.debug("[PublicAPI] PushEphemeralMessageReq")
        submitted = False

        if config.user.accept_ephemeral:
            encrypted_ephemeral_message = EncryptedEphemeralMessage(
                request.ephemeral_message)
            submitted = self.qrlnode.broadcast_ephemeral_message(
                encrypted_ephemeral_message)

        answer = qrl_pb2.PushTransactionResp()
        answer.some_response = str(submitted)
        return answer
예제 #9
0
    def PushEphemeralMessage(self, request: qrl_pb2.PushEphemeralMessageReq,
                             context) -> qrl_pb2.PushTransactionResp:
        logger.debug("[PublicAPI] PushEphemeralMessageReq")
        submitted = False

        if config.user.accept_ephemeral:
            encrypted_ephemeral_message = EncryptedEphemeralMessage(
                request.ephemeral_message)
            submitted = self.qrlnode.broadcast_ephemeral_message(
                encrypted_ephemeral_message)

        answer = qrl_pb2.PushTransactionResp()
        answer.error_code = qrl_pb2.PushTransactionResp.ERROR
        if submitted:
            answer.error_code = qrl_pb2.PushTransactionResp.SUBMITTED

        return answer