Процедура connect_server вызывается из dispatch_call после успешной отработки check_finger_print для того, чтобы найти абонента, с которым необходимо установить канал защищенной связи. После успешного обнаружения такого абонента connect_server обеспечивает процедуру согласования общего для двух абонентов сеансового ключа (пересылка объектов key_data и hash_data).
Важно подчеркнуть, что занимаясь пересылкой между абонентами ключевых объектов безопасности key_data и hash_data, сервер (как это легко видеть в приводимом ниже коде) никоим образом не вмешивается в этот процесс. Для сервера эти данные - полная абракадабра, смысла которой он не понимает, а знает только их размер (PACKED_VALUE_LENTH и 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; }
Обратите внимание, что сервер заранее не знает размера информации, которой обмениваются абоненты в процессе согласования сеансового ключа. Это связано с тем, что они могут использовать ключи RSA различного размера, а также различные алгоритмы хэширования. Поэтому клиентская процедура get_common_key первым делом высылает размер пакета (PACKED_VALUE_LENTH + HASH_SIZE), чтобы сервер знал, какого именно размера информацию (переменная socket_buffer_size) следует переслать между абонентами.
© Extra Systems, 2024 |