Celá zpráva z auditu v r. 2020 je tady:
https://github.com/rustls/rustls/blob/master/audit/TLS-01-report.pdf
Jinak historie CVEček:
https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=rustls
https://rustsec.org/packages/rustls.html
Zdá se, že projekt má pár poměrně high-profile sponzorů (AWS, Google, německý Sovereign Tech Fund atp.) a už se to pár let vyvíjí. Jasně oboje per se neznamená, že je to automaticky bezpečné, ale na druhou stranu, kdyby to bylo nějak fundamentálně blbě, podle mě by do toho nešli.
Existuje vlastne i nejaka analyza, ktera by odpovedela na zrejmou otazku, proc je vlastne rychlejsi (a v pripade BoringSSL prakticky stabilne)?
Protoze na prvni pohled, bud je OSSL i BSSL psana opravdu hodne spatne, coz se mi po tech letech nezda i kdyz mozne to je, nebo tam muze byt nejaky podstatny rozdil (neco kolem side channel attacku?)
Tipoval bych dvě příčiny:
– Stáří projektu – zpětná kompatibilita (podpora starých alogirtmů, starých architektur) a stáří kódu (některé věci by třeba po odstranění podpory něčeho starého šlo přepsat lépe, ale nikdo to neudělá).
– „Přehnaná opatrnost“ – kontroly, které by se možná po detailní analýze kódu ukázaly jako zbytečné, ale v kódu psaném v C musí být, protože tu detailní analýzu nikdo neudělá. Případně to mohou být kontroly, které kód psaný v C dělá až za běhu, zatímco Rust je udělá už během kompilace.
Tj. za mne je to opačně – bylo by divné, kdyby projekt psaný na zelené louce a v modernějším (ale stejně zaměřeném) jazyce nebyl rychlejší.
Takova analyza by asi zabrala dost casu. Jednou jsem obetoval 2 mesice svyho zivota tim ze resil proc je kod v Java 2x rychlejsi nez ten samy v C/C++. Postupne jsem nachazel veci jako zbytecny kopirovani strigu, deep copy stromu, naivni implementace hash map... Vitezem bylo jedno makro kde bylo "if (b() && a=='x')" zatimco v Jave bylo vsude "if (a=='x' && b())".
OpenSSL je rozsahly projekt, hodne veci je optimalizovanych primo v asembleru tam by rozdil byt nemel. Ale jinak bych hledal problem u predavani hodnotou vs predavani referenci.
> OpenSSL je rozsahly projekt, hodne veci je optimalizovanych primo v asembleru tam by rozdil byt nemel.
A zrovna tady bych se ani moc nedivil. Udržovat nějaký starý kód v assembleru je dost náročné. Klidně se mohla změnit situace a najednou je ten assembler silně neoptimální, nebo tam překladač mohl napáchat nějaké nečekané divočiny.
A pokud ten výkon najednou není úplný průšvih, tak se to dá zjistit jen hodně těžko.
A nebo je to rychle proto, ze si v kodu nenesete ruzny podivny historicky balast, o jehoz bezpecnosti jde ve vysledku take vcelku uspesne pochybovat. Ostatne to i na OpenSSL je videt, ze se nektere chyby opravuji nazpet klidne az do verze 1.0.2 z roku 2015 (ktera ma uz jen enterprise/komercni podporu).
Jenze ten "balast" o kterym (typicky) nikdo nevi co vlastne dela tam vznika v prubehu let proto, ze se narazi na ty ruzne situace.
Kdyz ti hodim na monitor hlasku "Zadej cislo:" ... tak co tam zadas? Ja treba 0xefac. A to je presne ono. Moderni automatismus kterej dela vsechno sam.
U toho sifrovani narazis na presne totez. Treba klic nulovy nebo jeste lip zaporny dylky ...