Процедура connect_server вызывается из dispatch_call после успешной отработки check_finger_print для того, чтобы найти абонента, с которым необходимо установить канал защищенной связи. После успешного обнаружения такого абонента connect_server обеспечивает процедуру согласования общего для двух абонентов сеансового ключа (пересылка объектов key_data и hash_data).
Важно подчеркнуть, что занимаясь пересылкой между абонентами ключевых объектов безопасности key_data и hash_data, центральный сервер Extra Systems Cypher Net (как это легко видеть в приводимом ниже коде) никоим образом не вмешивается в этот процесс. Для сервера эти данные - полная абракадабра, смысла которой он не понимает, а знает только их размер (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 |
|