O procedimento connect_server é chamado a partir de dispatch_call após a execução bem-sucedida de check_finger_print para encontrar o subscritor com o qual é necessário estabelecer um canal de comunicação seguro. Depois de detetar com sucesso tal subscritor, o connect_server fornece um procedimento para acordar uma chave de sessão comum a dois subscritores (enviando os objetos key_data e hash_data).
É importante salientar que durante a transferência dos principais objetos de segurança key_data e hash_data entre subscritores, o servidor central Extra Systems Cypher Net (como se pode facilmente verificar no código abaixo) não interfere de forma alguma neste processo. Para o servidor, estes dados são um completo disparate, cujo significado não compreende, mas apenas conhece o seu tamanho (PACKED_VALUE_LENTH e 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; }
Note que o servidor não sabe antecipadamente o tamanho da informação trocada entre os subscritores durante o processo de negociação da chave de sessão. Isto porque podem utilizar diferentes tamanhos de chaves RSA, bem como diferentes algoritmos de hash. Assim sendo, o procedimento cliente get_common_key envia primeiro o tamanho do pacote (PACKED_VALUE_LENTH + HASH_SIZE) para que o servidor saiba qual a informação de tamanho (a variável socket_buffer_size) que deve ser enviada entre os subscritores.
O conteúdo desta página está também disponível em inglês, francês, alemão, espanhol, ucraniano e russo.
© Extra Systems, 2024 |