/** * When someone send us {@link PacketTypes#HELLO} typed {@link UDPAdapter.Packet}, * we should respond with {@link PacketTypes#WELCOME}. * @param sessionReader is {@link UDPAdapter.SessionReader} in which sending is. */ private void sendWelcome(SessionReader sessionReader) { try { report(logLabel, () -> "send welcome to " + sessionReader.remoteNodeInfo.getNumber(), VerboseLevel.BASE); byte[] data = sessionReader.localNonce; byte[] sign = new PrivateKey(ownPrivateKey.pack()).sign(data, HashType.SHA512); byte[] payload = Boss.dumpToArray(Arrays.asList(data, sign)); Packet packet = new Packet(getNextPacketId(), myNodeInfo.getNumber(), sessionReader.remoteNodeInfo.getNumber(), PacketTypes.WELCOME, payload); sendPacket(sessionReader.remoteNodeInfo, packet); sessionReader.removeHandshakePacketsFromRetransmitMap(); sessionReader.addPacketToRetransmitMap(packet.packetId, packet, sessionReader.localNonce); } catch (EncryptionError e) { callErrorCallbacks("(sendWelcome) EncryptionError: " + e); } }
/** * We have received {@link PacketTypes#KEY_REQ_PART2} packet. Waiting for part1 or continue if it has got already. * @param packet received {@link Packet} */ private void onReceiveKeyReqPart2(Packet packet) { report(logLabel, ()->"received key_req_part2 from " + packet.senderNodeId + " (packetId="+packet.packetId+")", VerboseLevel.BASE); SessionReader sessionReader = getOrCreateSessionReaderCandidate(packet.senderNodeId); if (sessionReader != null) { sessionReader.protectFromDuples(packet.packetId, ()->{ sessionReader.removeHandshakePacketsFromRetransmitMap(); sessionReader.handshake_keyReqPart2 = packet.payload; onReceiveKeyReq(sessionReader); }); } }
/** * We have received {@link PacketTypes#KEY_REQ_PART1} packet. Waiting for part2 or continue if it has got already. * @param packet received {@link Packet} */ private void onReceiveKeyReqPart1(Packet packet) { report(logLabel, ()->"received key_req_part1 from " + packet.senderNodeId + " (packetId="+packet.packetId+")", VerboseLevel.BASE); SessionReader sessionReader = getOrCreateSessionReaderCandidate(packet.senderNodeId); if (sessionReader != null) { sessionReader.protectFromDuples(packet.packetId, ()->{ sessionReader.removeHandshakePacketsFromRetransmitMap(); sessionReader.handshake_keyReqPart1 = packet.payload; onReceiveKeyReq(sessionReader); }); } }
/** * We have received {@link PacketTypes#SESSION_ACK} packet. * Need to stop retransmitting of any handshake packets. * @param packet received {@link Packet} */ private void onReceiveSessionAck(Packet packet) { report(logLabel, ()->"received session_ack from " + packet.senderNodeId, VerboseLevel.BASE); SessionReader sessionReader = getSessionReader(packet.senderNodeId); if (sessionReader != null) { sessionReader.removeHandshakePacketsFromRetransmitMap(); } } }