Extra Systems

CYPHERNET

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

центральный сервер


Центральный сервер системы Extra Systems Cypher Net является точкой пересылки трафика между абонентами. Он принимает TCP-соединения от клиентов, получает от них файлы fingerprint (идентифицируя этим легальность абонентов), после чего обеспечивает согласование между ними сеансового ключа посредством процедуры пролога. (В случае хакерской атаки, если fingerprint оказался фальшивым, связь, разумеется, тотчас обрывается.)

typedef struct thread_data
{
	int thread_id;
	int thread_socket;
	PEERID client_id;
	PEERID server_id;
	int server_thread;
	char *buffer_to_send;
	int buf_size;
	int prolog_size;
	unsigned char client_mode;
} THREADDATA;

THREADDATA thread_pool[THREAD_POOL_SIZE];

void run_main_loop(int main_socket) {
	int new_socket, addr_size, i, pooled;
	struct sockaddr_in client_addr;
	while (1)
	{
		addr_size = sizeof(client_addr);
		new_socket = accept(main_socket, (struct sockaddr *) &client_addr, &addr_size);
		if (new_socket < 0) break;
		pooled = 0;
		while (!pooled) {
			for (i = 0; (i < THREAD_POOL_SIZE) && (!pooled); i++) {
				if (thread_pool[i].thread_id == 0) {
					thread_pool[i].thread_socket = new_socket;
					thread_pool[i].thread_id = esthread_create(dispatch_call, &thread_pool[i]);
					pooled = 1;
				}
			}
			if (!pooled) es_sleep(100);
		}
	}
}

int main(void)
{
	int my_socket;
	init_hash();
	init_hard_hash();
	load_rsa_keys("public_0", "private_0");
	sockets_startup();
	my_socket = create_server_socket(main_server_port);
	memset(thread_pool, 0, sizeof(thread_pool));
	run_main_loop(my_socket);
	sockets_cleanup();
	return 0;
}

Как видно из кода, сразу после запуска сервер через процедуру load_rsa_keys загружает из локального файла свой закрытый ключ, которым он будет через RSA расшифровывать поступающие к нему от абонентов файлы fingerprint (в процедуре check_finger_print). Затем запускается процедура run_main_loop, которая слушает порт и принимает TCP-соединения. Принятые сервером вызовы помещаются в очередь на обслуживание - статический массив thread_pool. Непосредственное обслуживание вызовов осуществляется процедурой dispatch_call, которая запускается для каждого вызова в отдельном потоке (в качестве параметра ей передается соответствующий данному соединению экземпляр структуры thread_data).


© Extra Systems, 2024 Extra Web Top