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
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
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)))
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
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
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])
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
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