Due profili vengono misurati sullo stesso gateway, uno con cifratura e uno senza, e quello cifrato non è più lento. A volte è più veloce, il che di solito produce una lunga discussione se il test sia stato eseguito correttamente. Il risultato è plausibile, perché il costo di un pacchetto non è il numero di parole crittografiche nella configurazione. È l’insieme delle operazioni che l’implementazione esegue, sull’hardware che ha, sulla disposizione dei buffer che ha scelto.

Il sintomo: il lento non è il profilo cifrato

Supponiamo che un test storico confronti un cifrario AEAD con una modalità «senza cifratura» che calcola comunque un codice di autenticazione separato per pacchetto. Il secondo profilo nasconde il contenuto del payload ma mantiene un hash per pacchetto, e su un processore senza accelerazione per quell’hash può costare più della costruzione integrata che doveva battere.

L’etichetta nella configurazione dice «cifratura», e l’etichetta è tutto ciò che guardano la maggior parte dei confronti. Il percorso del pacchetto dice qualcosa di diverso: un profilo esegue un’operazione combinata per cui la CPU ha istruzioni, e l’altro ne esegue una separata per cui non le ha. Leggere solo il file di configurazione non rivelerà mai quella differenza, perché entrambe le voci sembrano una sola riga. Solo la modalità negoziata e il percorso di codice che vi sta dietro spiegano il risultato.

Questa è tutta la spiegazione, e non richiede alcuna affermazione su quale primitiva sia universalmente più veloce. Entrambe possono essere veloci, entrambe possono essere lente, e l’ordine dipende dalla macchina e dal codice.

Contate le operazioni, non le etichette

Una costruzione AEAD, come la descrive l’RFC 5116, offre all’implementazione un’unica interfaccia che restituisce il testo cifrato e il tag insieme. AES-GCM ne è un esempio: cifratura in modalità contatore combinata con un autenticatore di Galois. L’interfaccia non rende gratuita l’integrità; rende la combinazione ben definita, ed è ciò che consente a un’implementazione di ottimizzare la coppia come un’unità.

Separate authentication path:
  payload -> independent HMAC -> framed packet

AEAD path:
  payload -> authenticated encryption with tag -> framed packet

Sono schizzi di elaborazione, non consigli di configurazione. Il primo non ha riservatezza ma spende comunque CPU per l’autenticazione, ed è esattamente per questo che «disattiva la cifratura» non è sinonimo di «disattiva il lavoro crittografico».

Il secondo può costare meno perché i processori forniscono istruzioni per entrambe le metà: i round AES e la moltiplicazione senza riporto usata dal campo di Galois. Le librerie elaborano anche buffer indipendenti in parallelo, il che tiene occupate quelle istruzioni invece di aspettare la memoria.

Che cosa abilita davvero la modalità negoziata

Con Community OpenVPN, un cifrario dati AEAD significa che l’opzione auth non contribuisce più con un proprio HMAC separato del canale dati. Il riferimento dell’opzione di cifratura descrive questo ambito, ed è il motivo per cui due configurazioni che sembrano uguali in un file di testo possono differire nel lavoro per pacchetto.

Leggete la modalità negoziata invece della lista dei desideri. Un elenco di cifrari consentiti e un nome di suite TLS non dicono quali operazioni girano sul payload, e una vecchia riga cipher può non descrivere ciò che ha scelto la connessione attuale.

openvpn --show-ciphers | head -20
sudo grep -E 'cipher|auth' /etc/openvpn/server.conf

Il primo comando elenca i cifrari supportati dal binario, che è un elenco di capacità e non il risultato negoziato. Il secondo mostra che cosa chiede davvero il server. Il log della connessione è il posto dove confermare la scelta finale, perché un client può ricadere su qualcosa che il server permette ma che nessuno aveva previsto.

Misurate il carico che effettivamente eseguite

Un microbenchmark crittografico misura una primitiva nelle sue condizioni. Un trasferimento VPN copia anche buffer, pianifica thread o interrupt, controlla policy e attraversa la rete. Queste parti spesso dominano, ed è per questo che una primitiva più veloce non produce sempre un tunnel più veloce.

openssl speed -evp aes-256-gcm
openssl speed -evp sha1

Quei due comandi vi danno un confronto locale approssimativo delle primitive sulla macchina davanti a voi, e sono onesti nel dire di essere microbenchmark. Non dicono nulla sul throughput del vostro tunnel, e non dovrebbero mai essere citati come tale.

Poi misurate il carico che conta, tenendo tutto il resto costante: stesso endpoint, stesse dimensioni di pacchetto, stesso trasporto, stessa politica di compressione. Se il cambio di profilo ha modificato anche il trasporto o la posizione di elaborazione, il risultato descrive quel pacchetto e non la crittografia.

Tenete presente anche l’obiettivo. Un percorso dati con capacità crittografica in eccesso può comunque essere limitato dalla latenza perché l’applicazione aspetta andate e ritorni, e i guadagni di capacità bruta non riparano un protocollo loquace. Misurate la configurazione supportata e approvata dalle policy nel suo insieme, e trattate «meno scatole deve essere più veloce» come l’ipotesi che è. La domanda utile non è se la cifratura costi qualcosa, ma se il costo compare nella misura che vi interessa davvero.

Articoli correlati