La procedura connect_server viene richiamata da dispatch_call dopo l'esecuzione riuscita di check_finger_print per trovare l'abbonato con il quale è necessario stabilire un canale di comunicazione sicuro. Dopo aver rilevato con successo tale abbonato, connect_server fornisce una procedura per concordare una chiave di sessione comune a due abbonati (invio di oggetti key_data e hash_data).
È importante sottolineare che durante il trasferimento degli oggetti chiave di sicurezza key_data e hash_data tra abbonati, il server centrale Extra Systems Cypher Net (come si può facilmente vedere nel codice seguente) non interferisce in alcun modo con questo processo. Per il server, questi dati sono una totale assurdità, di cui non capisce il significato, ma ne conosce solo la dimensione (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; }
Tieni presente che il server non conosce in anticipo la dimensione delle informazioni scambiate tra gli abbonati durante il processo di negoziazione della chiave di sessione. Questo perché possono utilizzare diverse dimensioni di chiavi RSA nonché diversi algoritmi di hashing. Pertanto, la procedura client get_common_key invia prima la dimensione del pacchetto (PACKED_VALUE_LENTH + HASH_SIZE) in modo che il server sappia quali informazioni sulla dimensione (la variabile socket_buffer_size) devono essere inviate tra gli abbonati.
Il contenuto di questa pagina è disponibile anche in inglese, francese, tedesco, portoghese, spagnolo, ucraino e russo.
© Extra Systems, 2024 |
|