diff --git a/src/protocol/PacketDecoder.cpp b/src/protocol/PacketDecoder.cpp index 176690a..d14dc16 100644 --- a/src/protocol/PacketDecoder.cpp +++ b/src/protocol/PacketDecoder.cpp @@ -17,8 +17,8 @@ using namespace ts; using namespace ts::protocol; using namespace ts::connection; -PacketDecoder::PacketDecoder(ts::connection::CryptHandler *crypt_handler) - : crypt_handler_{crypt_handler} { +PacketDecoder::PacketDecoder(ts::connection::CryptHandler *crypt_handler, bool is_server) + : is_server{is_server}, crypt_handler_{crypt_handler} { memtrack::allocated(this); } @@ -163,7 +163,7 @@ PacketProcessResult PacketDecoder::decode_incoming_packet(std::string& error, Pa crypt_key = CryptHandler::kDefaultKey; crypt_nonce = CryptHandler::kDefaultNonce; } else { - if(!this->crypt_handler_->generate_key_nonce(true, packet_parser.type(), packet_parser.packet_id(), packet_parser.estimated_generation(), crypt_key, crypt_nonce)) { + if(!this->crypt_handler_->generate_key_nonce(this->is_server, packet_parser.type(), packet_parser.packet_id(), packet_parser.estimated_generation(), crypt_key, crypt_nonce)) { return PacketProcessResult::DECRYPT_KEY_GEN_FAILED; } } diff --git a/src/protocol/PacketDecoder.h b/src/protocol/PacketDecoder.h index a98647e..9c39ec1 100644 --- a/src/protocol/PacketDecoder.h +++ b/src/protocol/PacketDecoder.h @@ -48,6 +48,7 @@ namespace ts::protocol { SEQUENCE_LENGTH_TOO_LONG /* unrecoverable error */ }; + /* TODO: Implement for the client the command overflow recovery option! */ class PacketDecoder { using CommandFragment = command::CommandFragment; using ReassembledCommand = command::ReassembledCommand; @@ -60,7 +61,7 @@ namespace ts::protocol { typedef void(*callback_decoded_command_t)(void* /* cb argument */, ReassembledCommand*& /* command */); /* must move the command, else it gets freed*/ typedef void(*callback_send_acknowledge_t)(void* /* cb argument */, uint16_t /* packet id */, bool /* is command low */); - explicit PacketDecoder(connection::CryptHandler* /* crypt handler */); + explicit PacketDecoder(connection::CryptHandler* /* crypt handler */, bool /* is server */); ~PacketDecoder(); void reset(); @@ -76,6 +77,7 @@ namespace ts::protocol { callback_decoded_command_t callback_decoded_command{[](auto, auto&){}}; /* needs to be valid all the time! */ callback_send_acknowledge_t callback_send_acknowledge{[](auto, auto, auto){}}; /* needs to be valid all the time! */ private: + bool is_server; connection::CryptHandler* crypt_handler_{nullptr}; spin_mutex incoming_generation_estimator_lock{}; diff --git a/src/protocol/generation.cpp b/src/protocol/generation.cpp index 2ffd907..c7ffdb3 100644 --- a/src/protocol/generation.cpp +++ b/src/protocol/generation.cpp @@ -26,15 +26,20 @@ uint16_t GenerationEstimator::visit_packet(uint16_t packet_id) { return this->last_generation; } } else if(this->last_packet_id <= GenerationEstimator::overflow_area_end) { - if(packet_id >= GenerationEstimator::overflow_area_begin) /* old packet */ + if(packet_id >= GenerationEstimator::overflow_area_begin) {/* old packet */ return this->last_generation - 1; - if(packet_id > this->last_packet_id) + } + + if(packet_id > this->last_packet_id) { this->last_packet_id = packet_id; + } + return this->last_generation; } else { /* only update on newer packet id */ - if(packet_id > this->last_packet_id) + if(packet_id > this->last_packet_id) { this->last_packet_id = packet_id; + } return this->last_generation; } } \ No newline at end of file