void filter_packet_ServerFinished(gnutls_transport_ptr_t fd, const unsigned char* buffer, size_t len) { if (match_ServerFinished(buffer, len) && state_packet_ServerFinished.count++ < 3) { drop("Server Finished"); } else { filter_run_next(fd, buffer, len); } }
void filter_packet_ServerChangeCipherSpec(gnutls_transport_ptr_t fd, const unsigned char* buffer, size_t len) { if (match_ServerChangeCipherSpec(buffer, len) && state_packet_ServerChangeCipherSpec.count++ < 3) { drop("Server Change Cipher Spec"); } else { filter_run_next(fd, buffer, len); } }
void filter_packet_ClientKeyExchange(gnutls_transport_ptr_t fd, const unsigned char* buffer, size_t len) { if (match_ClientKeyExchange(buffer, len) && state_packet_ClientKeyExchange.count++ < 3) { drop("Client Key Exchange"); } else { filter_run_next(fd, buffer, len); } }
void filter_permute_ServerFinished(gnutls_transport_ptr_t fd, const unsigned char* buffer, size_t len) { if (match_ServerChangeCipherSpec(buffer, len) || match_ServerFinished(buffer, len)) { filter_permute_state_run(&state_permute_ServerFinished, 2, fd, buffer, len); } else { filter_run_next(fd, buffer, len); } }
void filter_permute_ServerHello(gnutls_transport_ptr_t fd, const unsigned char* buffer, size_t len) { if (match_ServerHello(buffer, len) || match_ServerKeyExchange(buffer, len) || match_ServerHelloDone(buffer, len)) { filter_permute_state_run(&state_permute_ServerHello, 3, fd, buffer, len); } else { filter_run_next(fd, buffer, len); } }
static void filter_permute_state_run(filter_permute_state_t* state, int packetCount, gnutls_transport_ptr_t fd, const unsigned char* buffer, size_t len) { unsigned char* data = malloc(len); int packet = state->order[state->count]; memcpy(data, buffer, len); state->packets[packet].data = data; state->packets[packet].size = len; state->count++; if (state->count == packetCount) { for (packet = 0; packet < packetCount; packet++) { filter_run_next(fd, state->packets[packet].data, state->packets[packet].size); } filter_permute_state_free_buffer(state); state->count = 0; } }
static ssize_t writefn(gnutls_transport_ptr_t fd, const void* buffer, size_t len) { filter_run_next(fd, (const unsigned char*) buffer, len); return len; }