El procedimiento connect_server se llama desde dispatch_call después de la ejecución exitosa de check_finger_print para encontrar el suscriptor con el que es necesario establecer un canal de comunicación seguro. Después de detectar con éxito dicho suscriptor, connect_server proporciona un procedimiento para acordar una clave de sesión común para dos suscriptores (enviando objetos key_data y hash_data). Es importante enfatizar que mientras se transfieren objetos clave de seguridad key_data y hash_data entre suscriptores, el servidor central Cypher Net de Extra Systems (como se puede ver fácilmente en el código siguiente) no interfiere de ninguna manera con este proceso. Para el servidor, estos datos son una completa tontería, cuyo significado no comprende, solo conoce su tamaño (PACKED_VALUE_LENTH y HASH_SIZE).
int connect_server(THREADDATA *thread_item) { int i, found, my_socket, his_socket, socket_buffer_size; char socket_buffer[MAX_SOCKET_BUFFER_SIZE]; found = 0; thread_item->buffer_to_send = NULL; while (!found) { for (i = 0; (i < THREAD_POOL_SIZE) && (!found); i++) { found = ((thread_pool[i].client_id == thread_item->server_id) && (thread_pool[i].server_id == thread_item->client_id) && (thread_pool[i].client_mode != thread_item->client_mode)); if (found) thread_item->server_thread = i; } if (!found) es_sleep(100); } my_socket = thread_item->thread_socket; his_socket = thread_pool[thread_item->server_thread].thread_socket; if (socket_read_buffer(my_socket, socket_buffer, thread_item->prolog_size) != thread_item->prolog_size) return 0; if (socket_send_buffer(his_socket, socket_buffer, thread_item->prolog_size) != thread_item->prolog_size) return 0; return 1; }
Tenga en cuenta que el servidor no conoce de antemano el tamaño de la información intercambiada entre suscriptores durante el proceso de negociación de la clave de sesión. Esto se debe a que pueden utilizar diferentes tamaños de claves RSA, así como diferentes algoritmos de hash. Por lo tanto, el procedimiento del cliente get_common_key primero envía el tamaño del paquete (PACKED_VALUE_LENTH + HASH_SIZE) para que el servidor sepa qué información de tamaño (la variable socket_buffer_size) debe enviarse entre los suscriptores.
El contenido de esta página también está disponible en inglés, francés, alemán, portugués, ucraniano y ruso.
© Extra Systems, 2024 |