Add ping/pong message handling to wsssh C implementation

- Implement explicit ping/pong frame parsing and response in wsssh.c
- Add send_pong_frame function to handle WebSocket ping frames
- Maintain WebSocket protocol compliance for connection keep-alive
- Python implementations handle ping/pong automatically via websockets library
parent 7c247fe7
......@@ -58,6 +58,49 @@ tunnel_t *active_tunnel = NULL;
pthread_mutex_t tunnel_mutex;
int send_websocket_frame(SSL *ssl, const char *data);
int send_pong_frame(SSL *ssl, const char *ping_payload, int payload_len);
int send_pong_frame(SSL *ssl, const char *ping_payload, int payload_len) {
char frame[BUFFER_SIZE];
frame[0] = 0x8A; // FIN + pong opcode
int header_len = 2;
if (payload_len <= 125) {
frame[1] = 0x80 | payload_len; // MASK + length
} else if (payload_len <= 65535) {
frame[1] = 0x80 | 126; // MASK + extended length
frame[2] = (payload_len >> 8) & 0xFF;
frame[3] = payload_len & 0xFF;
header_len = 4;
} else {
frame[1] = 0x80 | 127; // MASK + extended length
frame[2] = 0;
frame[3] = 0;
frame[4] = 0;
frame[5] = 0;
frame[6] = (payload_len >> 24) & 0xFF;
frame[7] = (payload_len >> 16) & 0xFF;
frame[8] = (payload_len >> 8) & 0xFF;
frame[9] = payload_len & 0xFF;
header_len = 10;
}
// Add mask key
char mask_key[4];
for (int i = 0; i < 4; i++) {
mask_key[i] = rand() % 256;
frame[header_len + i] = mask_key[i];
}
header_len += 4;
// Mask payload
for (int i = 0; i < payload_len; i++) {
frame[header_len + i] = ping_payload[i] ^ mask_key[i % 4];
}
int frame_len = header_len + payload_len;
return SSL_write(ssl, frame, frame_len) > 0;
}
void print_trans_flag(void) {
// Transgender pride flag colors using ANSI escape codes
......@@ -1090,8 +1133,11 @@ int main(int argc, char *argv[]) {
break;
}
// Check if it's a close frame
if (bytes_read >= 2 && (buffer[0] & 0x8F) == 0x88) {
// Check frame type
unsigned char frame_type = buffer[0] & 0x8F;
// Handle close frame
if (frame_type == 0x88) {
if (config.debug) {
printf("[DEBUG] Received close frame from server\n");
fflush(stdout);
......@@ -1099,6 +1145,43 @@ int main(int argc, char *argv[]) {
break;
}
// Handle ping frame
if (frame_type == 0x89) {
if (config.debug) {
printf("[DEBUG] Received ping frame, sending pong\n");
fflush(stdout);
}
// Parse the ping frame to get payload
char *ping_payload;
int ping_payload_len;
if (parse_websocket_frame(buffer, bytes_read, &ping_payload, &ping_payload_len)) {
// Send pong with same payload
if (!send_pong_frame(active_tunnel->ssl, ping_payload, ping_payload_len)) {
if (config.debug) {
printf("[DEBUG] Failed to send pong frame\n");
fflush(stdout);
}
}
} else {
if (config.debug) {
printf("[DEBUG] Failed to parse ping frame\n");
fflush(stdout);
}
}
continue;
}
// Handle pong frame
if (frame_type == 0x8A) {
if (config.debug) {
printf("[DEBUG] Received pong frame\n");
fflush(stdout);
}
// Just acknowledge, no response needed
continue;
}
// Handle regular frames (text/binary)
char *payload;
int payload_len;
if (!parse_websocket_frame(buffer, bytes_read, &payload, &payload_len)) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment