# OpenSSL & liboqs & oqsprovider ## About Tento priečinok obsahuje detailný postup inštalácie potrebných knižníc na sprístupnenie PQ algoritmov v OpenSSL 3.2 a vzorové aplikácie klienta a serveru, ktoré využívajú PQ algoritmy pri štandardnej TCP/IP komunikácii s využitím protokolu TLS 1.3. ## Building Inštalované a testované na: | Platform | OS | compiler | cmake | ninja | |:-----------------:|:---------------------------:|:------------------------------------------------:|:-------:|:-------:| | Linux | Ubuntu 22.04.3 LTS
(GNU/Linux 5.15.133.1-microsoft-standard-WSL2 x86_64) | gcc version 11.4.0
(Ubuntu 11.4.0-1ubuntu1~22.04) | version 1.10.1 | version 3.22.1 | | Windows | Windows 10.0.22631 | gcc version 13.2.0 20240107
(MinGW-W64 x86_64-msvcrt-posix-seh) | version 1.11.1 | version 3.28.1 | ### :exclamation: **OpenSSL 3.2 je minimálna verzia OpenSSL, ktorá umožňuje využívať PQ algoritmy pri komunikácii** :exclamation: ### LINUX #### OpenSSL 3.2 ``` sudo apt install build-essential checkinstall -y git clone https://github.com/openssl/openssl.git https://github.com/openssl/openssl/releases/download/openssl-3.2.0/openssl-3.2.0.tar.gz tar -xvf openssl-3.2.0.tar.gz cd openssl-3.2.0 ./Configure make sudo make install export PATH="/usr/local:$PATH" export LD_LIBRARY_PATH="/usr/local/lib64:$PATH" cd /etc/ld.so.conf.d/ sudo touch openssl-3.2.0.conf echo "/usr/local/lib64" | sudo tee -a openssl-3.2.0.conf sudo ldconfig -v ``` #### LIBOQS ``` sudo apt install astyle cmake ninja-build libssl-dev python3-pytest python3-pytest-xdist unzip xsltproc doxygen graphviz python3-yaml valgrind -y git clone https://github.com/open-quantum-safe/liboqs.git cd liboqs/ mkdir build && cd build cmake -GNinja .. -DBUILD_SHARED_LIBS=ON -DOPENSSL_ROOT_DIR=/usr/local/lib64 -DOQS_ALGS_ENABLED=ALL ninja sudo ninja install cd /etc/ld.so.conf.d/ sudo touch liboqs.conf echo "/usr/local/lib" | sudo tee -a liboqs.conf sudo ldconfig -v ``` #### OQS PROVIDER ``` git clone https://github.com/open-quantum-safe/oqs-provider.git cd oqs-provider cmake -S . -B _build -DOPENSSL_ROOT_DIR=/usr/local/lib64 -Dliboqs_DIR=/usr/local -DBUILD_SHARED_LIBS=ON cmake --build _build sudo cmake --install _build ``` ``` cd /usr/local/ssl/ sudo nano openssl.cnf ``` - po inštalácii pridáme do konfiguračného súboru *openssl.cnf* modul, ktorý permanentne aktivuje OQS provider a jeho funkcie pri používani OpenSSL - `Note: Be sure to always activate the "default" provider` - v prípade potreby je možné konfiguračný súbor nahradiť súborom z tohto priečinku ``` [provider_sect] default = default_sect oqsprovider = oqsprovider_sect [oqsprovider_sect] activate = 1 ``` - overiť funkčnosť knižníc môžeme príkazom `openssl list -providers`, ktorý by nám mal vrátiť výsledok: ``` Providers: default name: OpenSSL Default Provider version: 3.2.0 status: active oqsprovider name: OpenSSL OQS Provider version: 0.5.4-dev status: active ``` ### WINDOWS #### WinLibs gcc - zo stránky [WinLibs GCC](https://winlibs.com) stiahneme .zip archív, rozbalíme ho a skopírujeme celú zložku na nami určené miesto - prejdeme do *Settings-System-Advanced system settings-Environment Variables-System variables-Path-Edit* a pridáme cestu k priečinku s prekladačom, napríklad: `C:\mingw64\bin\` - nastaviť cestu k prekladaču môžeme aj úpravou premennej v príkazovom riadku príkazom `SET PATH=\path\;%PATH%`, napríklad `SET PATH=C:\mingw64\bin\;%PATH%` - v priečinku /bin/ sa nachádza aplikácia *mingw32-make.exe*, z ktorej si urobíme kópiu a premenujeme ju na *make.exe* #### OpenSSL (FireDaemon OpenSSL) - v našom prípade sme využívali predkompilovanú verziu OpenSSL zo stránky [FireDaemon OpenSSL](https://kb.firedaemon.com/support/solutions/articles/4000121705) - stiahneme .zip archív, rozbalíme ho a všetky priečinky z priečinku *x64* spolu s priečinkom *ssl* skopírujeme na nami vybrané miesto - nastavíme cestu k aplikácii OpenSSL a konfiguračnému súboru prostredníctvom konzolových príkazov: ``` set OPENSSL_CONF=C:\openssl\ssl\openssl.cnf set PATH=C:\openssl\bin;%PATH% ``` - z priečinku */bin/* skopírujeme súbory *libssl.lib* a *libcrypto.lib* do */lib/* priečinku nášho prekladača, v našom prípade teda do `C:\mingw64\lib\` #### LIBOQS - stiahneme .zip súbor knižnice liboqs z oficiálneho GITu - [liboqs](https://github.com/open-quantum-safe/liboqs) - stiahnutý súbor rozbalíme na nami zvolené miesto - následne knižnicu nainštalujeme týmito príkazmi: ``` cd liboqs-main mkdir build cd build cmake -GNinja .. -DOQS_ALGS_ENABLED=ALL ninja ninja install ``` - po dokončení inštalácie skopírujeme vygenerované priečinky *include* a *lib* do zložky s našim gcc prekladačom, teda do *D:\mingw64\* Poznámka: podľa nastavení systému môžu byť potrebné na vykonanie príkazu `ninja install` administrátorské práva #### OQS-PROVIDER - stiahneme .zip súbor knižnice oqs-provider z oficiálneho GITu - [oqsprovider](https://github.com/open-quantum-safe/oqs-provider) - stiahnutý súbor rozbalíme na nami vybrané miesto - v súbore *CMakeLists.txt* pridáme na riadok 90 a 91 pred funkcie *enable_testing()* a *add_subdirectory(test)* symbol `#`, ktorým zakomentujeme a nezrealizujeme kompiláciu testov - pri kompilácii testu *oqs_test_tlssig.c* by nám vyskočila chyba, ktorá by spôsobila, že by celá kompilácia knižnice spadla ``` cmake -GNinja -DOPENSSL_ROOT_DIR=C:\openssl -S . -B _build cd _build ninja ninja install ``` Poznámka: chybu v teste *oqs_test_tlssig.c* môžeme opraviť aj doplnením podmienenej kompilácie pre MINGW64 kompilátor a úpravou problematickej definície funkcie *mkdir*, z ktorej odstránime druhý argument - nastavíme cestu k vygenerovanému .DLL súboru:
Powershell - `[Environment]::SetEnvironmentVariable("OPENSSL_MODULES", "C:\openssl\lib\ossl-modules\", "Machine")`
cmd - `setx OPENSSL_MODULES "C:\openssl\lib\ossl-modules\"` - po inštalácii všetkých knižníc pridáme do konfiguračného súboru *openssl.cnf* modul, ktorý permanentne aktivuje OQS provider a jeho funkcie pri používani OpenSSL - `Note: Be sure to always activate the "default" provider` - v prípade potreby je možné konfiguračný súbor nahradiť súborom z tohto priečinku ``` [provider_sect] default = default_sect oqsprovider = oqsprovider_sect [oqsprovider_sect] activate = 1 ``` - overiť funkčnosť knižníc môžeme príkazom `openssl list -providers`, ktorý by nám mal vrátiť výsledok: ``` Providers: default name: OpenSSL Default Provider version: 3.2.0 status: active oqsprovider name: OpenSSL OQS Provider version: 0.5.4-dev status: active ``` ## References [OpenSSL](https://github.com/openssl/openssl) [liboqs](https://github.com/open-quantum-safe/liboqs) [oqsprovider](https://github.com/open-quantum-safe/oqs-provider) [WinLibs GCC](https://winlibs.com) [FireDaemon OpenSSL](https://kb.firedaemon.com/support/solutions/articles/4000121705)