Extra Systems

CYPHERNET

консольная система надежной коммерческой шифросвязи через сеть интернет

процедура connect_server


Процедура 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 Extra Web Top