Penso di poter rispondere a questa domanda per il caso specifico di una libreria crittografica scritta in Go --- è facile, e non del tutto ipotetica, perché c'è già un Pacchetto TLS, crypto/tls
in Go che non dipende da nessuna libreria esterna.
Nonostante il tipico overflow del buffer, il Go idiomatico è molto più sicuro del tradizionale C, Go offre allo sviluppatore appassionato molte opzioni per aggirarlo, come imitare l'aritmetica del puntatore di C tramite Go unsafe.pointer
. Ci si chiede se si possa essere d'accordo a non usare il codice fragile in un software critico.
La crittografia, ovviamente, è esattamente il tipo di software che utilizza un codice così fragile, per buone ragioni. Dopo tutto, i confronti a tempo costante implementati nel pacchetto Go crypto.subtle
effettivamente richiedono e hanno, allo stesso modo, terribili avvertimenti sull'uso accurato come quelli di unsafe
. L'unica domanda rimanente, in realtà, è se qualche bug può ancora sopravvivere in un tale ambiente.
Per quanto ne so, Go implementa in effetti i confronti a tempo costante dei valori di hash correttamente. Non mi sono preoccupato nemmeno di guardare se gli hash complicati che coinvolgono gli S-box sono calcolati in un tempo costante --- nessuno si è preoccupato di inserirli in un pacchetto con nomi come subtle
e avvertimenti su come sia facile rompere le cose , quindi sono davvero dubbioso.
Quello che ho controllato è che la crittografia a curva ellittica è non implementata in modo costante in Go. Nessuno sembra nemmeno aver considerato il minimo tentativo - l'implementazione chiama molte funzioni integer di lunghezza arbitraria non progettate nemmeno per l'uso crittografico, e in effetti utilizzando algoritmi non-costanti. Quando questo tipo di canale temporale è stato mostrato di recente anche in OpenSSL
su un'architettura, è stato abbastanza buono per a carta che dimostra compromissione della chiave privata .
La stessa situazione continua esiste in Go, su tutte le architetture. E, beh, non sembra davvero che a nessuno importi questo tipo di dettagli come la criptazione realmente funzionante; l'attenzione è solo sulla leggibilità e velocità (beh, e lavorando nel modo in cui l'utente casuale e alcuni test di unità sono ingannati da esso, immagino). Dopo tutto, perché dovresti preoccuparti di scegliere un algoritmo adatto quando la lingua ti protegge già dalla maggior parte dei modi di introdurre buffer overflow e quando scegliere un algoritmo corretto rischia di rovinare l'affermazione di Google che TLS è diventato a buon mercato dal punto di vista computazionale? Sarcasmo a parte, rendere la lingua responsabile per la cattura dei nostri bug significa solo che tutti quegli errori che la lingua non può catturare per noi saranno ancora lì.
Infine, le librerie come OpenSSL
hanno i vantaggi che correzioni di bug tempestive sono una possibilità ragionevole. Anche se in linea di principio lo stesso vale per i pacchetti Go, una volta che qualcosa diventa parte del nucleo di Go, come il pacchetto TLS, viene influenzato dal programma di rilascio. Ovviamente ciò può interferire con l'implementazione tempestiva di correzioni di bug. Suppongo che Go-1.3, a causa di questa estate, non risolverà certamente il problema di temporizzazione di ECC anche se fosse riconosciuto come il problema critico, dato il blocco delle funzionalità.