Fix mesh topology handling with fallback to normal decryption
When receiving packets on client links, try INIT decryption first. If it fails (e.g., for INIT_RESPONSE packets), fallback to normal decryption using the existing link's crypto context. This fixes mesh topology where both nodes send INIT simultaneously, while maintaining compatibility with standard client-server mode where client links receive INIT_RESPONSE packets. Changes: - If link==NULL OR link is client (is_server==0), try INIT decryption - On any INIT decryption error, if we have an existing link, goto normal_decrypt - Added normal_decrypt label before standard packet processing - This allows handling both incoming INIT (create server link) and incoming responses (use existing client link) correctly
This commit is contained in:
1 parent
1cc475e9b0
commit
27b02cef68
1 file changed
+31
-2
+31
-2
@@ -577,7 +577,16 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
|
||||
if (link==NULL || link->is_server==0) {// пробуем расшифровать, возможно это init
|
||||
// printf("[ETCP DEBUG] No existing link found, trying to decrypt as INIT packet\n");
|
||||
struct secure_channel sc;
|
||||
if (recv_len<=SC_PUBKEY_SIZE) { errorcode=1; DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "etcp_connections_read_callback: packet too small for init, size=%zd", recv_len); goto ec_fr; }
|
||||
if (recv_len<=SC_PUBKEY_SIZE) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "etcp_connections_read_callback: packet too small for init, size=%zd", recv_len);
|
||||
// If we have an existing link (client link), try normal decryption instead
|
||||
if (link != NULL) {
|
||||
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "INIT packet too small, trying normal decryption with existing link");
|
||||
goto normal_decrypt;
|
||||
}
|
||||
errorcode=1;
|
||||
goto ec_fr;
|
||||
}
|
||||
sc_init_ctx(&sc, &e_sock->instance->my_keys);
|
||||
// printf("[ETCP DEBUG] Extracting peer public key from position %ld, total packet size=%zd\n", recv_len-SC_PUBKEY_SIZE, recv_len);
|
||||
// printf("[ETCP DEBUG] Last 64 bytes of packet (PUBKEY): ");
|
||||
@@ -588,11 +597,21 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
|
||||
|
||||
if (sc_set_peer_public_key(&sc, &data[recv_len-SC_PUBKEY_SIZE], SC_PEER_PUBKEY_BIN)!=SC_OK) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_CRYPTO, "etcp_connections_read_callback: failed to set peer public key during init");
|
||||
// If we have an existing link (client link), try normal decryption instead
|
||||
if (link != NULL) {
|
||||
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "INIT peer key setup failed, trying normal decryption with existing link");
|
||||
goto normal_decrypt;
|
||||
}
|
||||
errorcode=2;
|
||||
goto ec_fr;
|
||||
}
|
||||
if (sc_decrypt(&sc, data, recv_len-SC_PUBKEY_SIZE, (uint8_t*)&pkt->timestamp, &pkt_len)) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_CRYPTO, "etcp_connections_read_callback: failed to decrypt init packet");
|
||||
// If we have an existing link (client link), try normal decryption instead
|
||||
if (link != NULL) {
|
||||
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "INIT decryption failed, trying normal decryption with existing link");
|
||||
goto normal_decrypt;
|
||||
}
|
||||
errorcode=3;
|
||||
goto ec_fr;
|
||||
}
|
||||
@@ -609,7 +628,16 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
|
||||
} *ack_hdr=(void*)&pkt->data[0];
|
||||
uint64_t peer_id;
|
||||
memcpy(&peer_id, &ack_hdr->id[0], 8);
|
||||
if (ack_hdr->code!=ETCP_INIT_REQUEST && ack_hdr->code!=ETCP_CHANNEL_INIT) { errorcode=4; DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "etcp_connections_read_callback: not an init packet, code=%02x", ack_hdr->code); goto ec_fr; }// не init
|
||||
if (ack_hdr->code!=ETCP_INIT_REQUEST && ack_hdr->code!=ETCP_CHANNEL_INIT) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "etcp_connections_read_callback: not an init packet, code=%02x", ack_hdr->code);
|
||||
// If we have an existing link (client link), try normal decryption instead
|
||||
if (link != NULL) {
|
||||
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "Packet is not INIT (code=%02x), trying normal decryption with existing link", ack_hdr->code);
|
||||
goto normal_decrypt;
|
||||
}
|
||||
errorcode=4;
|
||||
goto ec_fr;
|
||||
}// не init
|
||||
|
||||
struct ETCP_CONN* conn=e_sock->instance->connections;
|
||||
while (conn) {// ищем есть ли подключение к этому пиру
|
||||
@@ -688,6 +716,7 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
|
||||
return;
|
||||
}
|
||||
|
||||
normal_decrypt:
|
||||
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "Decrypt start");
|
||||
if (sc_decrypt(&link->etcp->crypto_ctx, data, recv_len, (uint8_t*)&pkt->timestamp, &pkt_len)) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_CRYPTO, "etcp_connections_read_callback: failed to decrypt packet from node %llu len=%d", (unsigned long long)link->etcp->instance->node_id, recv_len);
|
||||
|
||||
Reference in new issue
Block a user