Extra Systems

CYPHERNET

процедура стикування абонентів connect_server


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