This commit is contained in:
Marek Rohač 2021-05-24 23:19:47 +02:00
parent 9fe010bce5
commit 33446e287f
6 changed files with 60 additions and 37 deletions

View File

@ -1,6 +1,14 @@
% !TEX root = ../thesis.tex % !TEX root = ../thesis.tex
\chapter{Obsah CD Média} \chapter{Obsah CD Média}
Obsah tohto média je dostupný na gite:
\begin{itemize}
\item \url{https://git.kpi.fei.tuke.sk/marek.rohac/bc}
\item \url{https://git.kemt.fei.tuke.sk/mr171hg/BachelorWork}
\end{itemize}
https://git.kemt.fei.tuke.sk/mr171hg/BachelorWork
\bigskip \bigskip
{\small {\small

View File

@ -384,6 +384,20 @@ note = "[Online; Citované: 11.5.2021]"
url = {https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptgenrandom}, url = {https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptgenrandom},
note = "[Online; Citované: 15.5.2021]" note = "[Online; Citované: 15.5.2021]"
} }
@article{qpc,
title={QueryPerformanceCounter function (profileapi.h)},
publisher={Microsoft},
year={2020},
url = {https://docs.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter},
note = "[Online; Citované: 15.5.2021]"
}
@article{qpf,
title={QueryPerformanceFrequency function (profileapi.h)},
publisher={Microsoft},
year={2020},
url = {https://docs.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancefrequency},
note = "[Online; Citované: 15.5.2021]"
}
@article{crand, @article{crand,
title={ISO C Random Number Functions}, title={ISO C Random Number Functions},
publisher={GNU org.}, publisher={GNU org.},

View File

@ -16,14 +16,14 @@ Pred opisom problému je nutné vysvetliť pojem snímka obrazu. Virtuálne stro
\section{Experimentálne overenie uvedenej zraniteľnosti} \section{Experimentálne overenie uvedenej zraniteľnosti}
Realizáciu experimentu zabezpečí prenosný počítať A. Jeho konfigurácia je obsahom tabuľky \ref{pc}. Pri tomto experimente je použitá iná metodika práce ako v \cite{vm1}. Vykonanie jedného z pokusov zabezpečí CSPRNG API operačného systému Windows 10. Konkrétne funkcia BCryptGenRandom \cite{bcrypt}. Výstupy následne odhalia bezpečnostné riziko. Realizáciu experimentu zabezpečí prenosný počítať A. Jeho konfigurácia je obsahom tabuľky \ref{pc}. Pri tomto experimente je použitá iná metodika práce ako v \cite{vm1}. Vykonanie jedného z pokusov zabezpečí CSPRNG API operačného systému Windows 10. Konkrétne funkcia BCryptGenRandom \cite{bcrypt}. Výstupy následne odhalia bezpečnostné riziko.
Prvé kroky sú spojené s voľbou hypervízora. Voľne dostupný nástroj je VirtualBox \cite{vbox}\footnote{Dostupný na: https://www.virtualbox.org/wiki/Downloads}. V čase experimentu je verziu 6.0.24. Nasleduje voľba OS. Použili sa 64-bitový systém. Konkrétne Windows 10 Pro vo verzii 1909 (zostava 18363.592). Konfigurácia systému prebieha podľa video návodu \cite{vmkonfig}. Dodatočne došlo k úprave možnosti zdieľania súborov na obojsmernú a navýšeniu počtu priradených procesorov (ďalej CPU) na počet 4. Dôvodom je samotný OS, ktorý sa v prípade použitej konfigurácie zdal pomalý na prácu dvoch CPU. Tieto zmeny však neovplyvnia výsledok experimentu. Prvé kroky sú spojené s voľbou hypervízora. Voľne dostupný nástroj je VirtualBox \cite{vbox}\footnote{Dostupný na: \url{https://www.virtualbox.org/wiki/Downloads}}. V čase experimentu je verziu 6.0.24. Nasleduje voľba OS. Použili sa 64-bitový systém. Konkrétne Windows 10 Pro vo verzii 1909 (zostava 18363.592). Konfigurácia systému prebieha podľa video návodu \cite{vmkonfig}. Dodatočne došlo k úprave možnosti zdieľania súborov na obojsmernú a navýšeniu počtu priradených procesorov (ďalej CPU) na počet 4. Dôvodom je samotný OS, ktorý sa v prípade použitej konfigurácie zdal pomalý na prácu dvoch CPU. Tieto zmeny však neovplyvnia výsledok experimentu.
\subsection*{Prostredie Guest VM} \subsection*{Prostredie Guest VM}
Po úspešnej inštalácii obrazu a sprístupnení OS je nutná príprava prostredia. Po úspešnej inštalácii obrazu a sprístupnení OS je nutná príprava prostredia.
\subsubsection*{Vykonané inštalácie} \subsubsection*{Vykonané inštalácie}
\begin{itemize} \begin{itemize}
\item GCC prekladač -- Winlibs GCC, 10.2.0, 64-bitová verzia, pre potreby prekladu programov do strojového kódu.\footnote{Dostupný na url: https://winlibs.com/} \item GCC prekladač -- Winlibs GCC, 10.2.0, 64-bitová verzia, pre potreby prekladu programov do strojového kódu.\footnote{Dostupný na \url{ https://winlibs.com/}}
\item VirtualBox Extension Pack -- 6.0.24, zabezpečí ovládače pre VM, \item VirtualBox Extension Pack -- 6.0.24, zabezpečí ovládače pre VM,
\item Visual Studio Code -- prostredie na úpravu, kompiláciu, a aj spustenie programov pomocou príkazového riadka. \item Visual Studio Code -- prostredie na úpravu, kompiláciu, a aj spustenie programov pomocou príkazového riadka.
\end{itemize} \end{itemize}

View File

@ -248,8 +248,8 @@ V~tomto bode treba spomenúť určitú odchýlku experimentálnych meraní od sk
\section{Časové meranie rozhraní} \section{Časové meranie rozhraní}
Pri meraní dĺžky behu rozhrania sme implementovali Windows API: Pri meraní dĺžky behu rozhrania sme implementovali Windows API:
\begin{itemize} \begin{itemize}
\item \textbf{\textit{QueryPerformanceCounter()}}--\acrshort{qpc}\footnote{https://docs.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter}, \item \verb|QueryPerformanceCounter()| --\acrshort{qpc} \cite{qpc},
\item \textbf{\textit{QueryPerformanceFrequency()}} --\acrshort{qpf}\footnote{https://docs.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancefrequency}. \item \verb|QueryPerformanceFrequency()| --\acrshort{qpf} \cite{qpf}.
\end{itemize} \end{itemize}
Informácie o funkciách sú dostupné vo forme webovej dokumentácie \cite{measure}. Použitie týchto rozhraní pri meraní znázorňuje zdrojový kód \ref{qpc}. Uvedeným postupom dokážeme odmerať čas vykonania algoritmu s presnosťou nanosekúnd\footnote{API je možné implementovať s presnosťou piko-sekúnd. Viď \cite[Using QPC in native code]{measure}}. Presnosť metódy sa dá overiť jednoducho. Napríklad pomocou funkcie \verb|Sleep()|\footnote{Sleep(1000) reprezentuje jednu sekundu}. Stačí ju vložiť do priestoru merania. Informácie o funkciách sú dostupné vo forme webovej dokumentácie \cite{measure}. Použitie týchto rozhraní pri meraní znázorňuje zdrojový kód \ref{qpc}. Uvedeným postupom dokážeme odmerať čas vykonania algoritmu s presnosťou nanosekúnd\footnote{API je možné implementovať s presnosťou piko-sekúnd. Viď \cite[Using QPC in native code]{measure}}. Presnosť metódy sa dá overiť jednoducho. Napríklad pomocou funkcie \verb|Sleep()|\footnote{Sleep(1000) reprezentuje jednu sekundu}. Stačí ju vložiť do priestoru merania.
@ -284,7 +284,7 @@ int main(){
\end{minipage}\\ \end{minipage}\\
\subsubsection{Odporúčanie pri pretypovaní dát} \subsubsection{Odporúčanie pri pretypovaní dát}
V jazyku C môže pri pretypovaní dát dochádzať k zmene poradia vygenerovaných reťazcov. Dôvodom je zmena endianity\footnote{https://sk.wikipedia.org/wiki/Endianita}, respektíve uloženia dát v pamäti. S týmto problémom sme sa stretli pri zmene z \textbf{unsigned int} na \textbf{unsigned char}. Dáta v pamäti boli uložené metodikou malý endián, ale správne poradie vygenerovaných dát reprezentoval veľký endián. V~tomto prípade bolo nutné vykonať konverziu endianity. Použili sme na to funkcie znázornené pomocou zdrojového kódu \ref{endian}. V jazyku C môže pri pretypovaní dát dochádzať k zmene poradia vygenerovaných reťazcov. Dôvodom je zmena endianity\footnote{\url{https://sk.wikipedia.org/wiki/Endianita}}, respektíve uloženia dát v pamäti. S týmto problémom sme sa stretli pri zmene z \textbf{unsigned int} na \textbf{unsigned char}. Dáta v pamäti boli uložené metodikou malý endián, ale správne poradie vygenerovaných dát reprezentoval veľký endián. V~tomto prípade bolo nutné vykonať konverziu endianity. Použili sme na to funkcie znázornené pomocou zdrojového kódu \ref{endian}.
\noindent \noindent
\begin{minipage}{\linewidth} \begin{minipage}{\linewidth}
@ -310,7 +310,7 @@ int main (){
\section{Meranie počtu cyklov rozhraní} \section{Meranie počtu cyklov rozhraní}
Obdobne sme sa zamerali aj na~počet cyklov rozhraní. Tento údaj nám z pohľadu dlhodobého vývoja predstavuje kvalitnejšiu informáciu ako čas vykonania. Na základe týchto údajov vieme určiť napríklad či v priebehu času došlo k zefektívneniu algoritmov rozhrania\footnote{Zmenší sa počet cyklov, potrebných na vykonanie.}. Ďalším príkladom je určenie pomeru prerušení \acrshort{os} a mnoho iných. Obdobne sme sa zamerali aj na~počet cyklov rozhraní. Tento údaj nám z pohľadu dlhodobého vývoja predstavuje kvalitnejšiu informáciu ako čas vykonania. Na základe týchto údajov vieme určiť napríklad či v priebehu času došlo k zefektívneniu algoritmov rozhrania\footnote{Zmenší sa počet cyklov, potrebných na vykonanie.}. Ďalším príkladom je určenie pomeru prerušení \acrshort{os} a mnoho iných.
Meranie sme prvotne realizovali pomocou funkcie \textbf{\textit{cpucycles()}}\footnote{Funkcia prebraná z git archívu: https://github.com/newhopecrypto/newhope/tree/master/ref}. Zdrojový kód \ref{git}, ju definuje. Táto metóda však neposkytovala dostatočne kvalitné výsledky. Meranie sme prvotne realizovali pomocou funkcie \textbf{\textit{cpucycles()}}\footnote{Funkcia prebraná z git archívu: \url{https://github.com/newhopecrypto/newhope/tree/master/ref}}. Zdrojový kód \ref{git}, ju definuje. Táto metóda však neposkytovala dostatočne kvalitné výsledky.
\noindent \noindent
\begin{minipage}{\linewidth} \begin{minipage}{\linewidth}
@ -383,7 +383,7 @@ V~tejto kapitole uvedené rozdelenie viac charakterizujeme pomocou nasledujúcic
\section{Hardvérové rozhrania} \section{Hardvérové rozhrania}
Súčasťou moderných procesorov sú~aj~implementácie generátorov skutočne náhodných čísel. Ich~použitie je realizované pomocou procesorových inštrukcií \textbf{\textit{RDRAND a RDSEED}}. Súčasťou moderných procesorov sú~aj~implementácie generátorov skutočne náhodných čísel. Ich~použitie je realizované pomocou procesorových inštrukcií \textbf{\textit{RDRAND a RDSEED}}.
Práca s~inštrukciami si~vyžaduje znalosti nízko-úrovňových programovacích jazykov, akým je napríklad \textit{Asembler}\footnote{https://en.wikipedia.org/wiki/Assembly\_language}. Tie nie sú v~dnešnej dobe veľmi populárne. Aj~dôsledkom toho výrobcovia procesorov sprístupňujú programátorom tzv. \textbf{programovateľné rozhrania -- API}. Štandardne sú~napísané pomocou vysoko-úrovňových jazykov\footnote{Jazyk C, Java, C Sharp a iné}. Ich transformáciu do strojového kódu zabezpečuje prekladač. Práca s~inštrukciami si~vyžaduje znalosti nízko-úrovňových programovacích jazykov, akým je napríklad \textit{Asembler}\footnote{\url{https://en.wikipedia.org/wiki/Assembly\_language}}. Tie nie sú v~dnešnej dobe veľmi populárne. Aj~dôsledkom toho výrobcovia procesorov sprístupňujú programátorom tzv. \textbf{programovateľné rozhrania -- API}. Štandardne sú~napísané pomocou vysoko-úrovňových jazykov\footnote{Jazyk C, Java, C Sharp a iné}. Ich transformáciu do strojového kódu zabezpečuje prekladač.
V~tejto súvislosti spomenieme dvoch výrobcov procesorových čipov s~najväčším zastúpením na~trhu -- \textbf{AMD a Intel}. Obe firmy sprístupnili používateľom svoje API v~programovacom jazyku C. Najpodstatnejším rozdielom pri~používaní je~vzájomná kompatibilita. Intel rozhranie poskytuje podporu iba pre~vlastné procesory, zatiaľ čo spoločnosť AMD uverejnila sadu, ktorá má~podporu aj~iných výrobcov procesorových čipov. Podmienkou úspešného generovania však ostáva potrebná implementácia inštrukcií RDRAND a RDSEED. Z~tohto dôvodu sme pri generovaní náhodných dát, pomocou vyššie spomenutých príkazov, použili práve riešenie firmy AMD. V~tejto súvislosti spomenieme dvoch výrobcov procesorových čipov s~najväčším zastúpením na~trhu -- \textbf{AMD a Intel}. Obe firmy sprístupnili používateľom svoje API v~programovacom jazyku C. Najpodstatnejším rozdielom pri~používaní je~vzájomná kompatibilita. Intel rozhranie poskytuje podporu iba pre~vlastné procesory, zatiaľ čo spoločnosť AMD uverejnila sadu, ktorá má~podporu aj~iných výrobcov procesorových čipov. Podmienkou úspešného generovania však ostáva potrebná implementácia inštrukcií RDRAND a RDSEED. Z~tohto dôvodu sme pri generovaní náhodných dát, pomocou vyššie spomenutých príkazov, použili práve riešenie firmy AMD.
@ -402,7 +402,7 @@ Podrobný opis aplikovaných metód v generátore je dostupný v dokumentácii \
Podporu týchto inštrukcií doplnila spoločnosť AMD v roku 2015. Základom bola implementácia Intelu. Viac podrobností o riešení sa nachádza v online dokumente \cite{amdapi}. Podporu týchto inštrukcií doplnila spoločnosť AMD v roku 2015. Základom bola implementácia Intelu. Viac podrobností o riešení sa nachádza v online dokumente \cite{amdapi}.
\subsubsection{AMD Secure RNG API \cite[str. 1-7]{amdapi}} \subsubsection{AMD Secure RNG API \cite[str. 1-7]{amdapi}}
Voľné dostupné rozhranie\footnote{https://developer.amd.com/amd-aocl/rng-library/} v~programovacom jazyku C. Aktuálna verzia -- 3.0.6, obsahuje celkovo 14 funkcií. Z~toho dve na kontrolu implementácie inštrukcií a~12 na produkciu náhodných dát. Programátor má možnosť vygenerovať jedno 16/32/64-bitové číslo alebo ich pole. Obdobne je k~dispozícii možnosť zvoliť si požadovanú veľkosť výstupu v~bajtoch. Pri~našom testovaní sme implementovali práve túto možnosť. Zdrojový kód, \ref{amd}, uvádza deklarácie spomenutých implementovaných funkcií. Pomenovania sú jednoznačné. Argument N označuje počet opakovaní a~\textit{retry\_count} udáva počet pokusov v~prípade zlyhania. Voľné dostupné rozhranie\footnote{\url{https://developer.amd.com/amd-aocl/rng-library/}} v~programovacom jazyku C. Aktuálna verzia -- 3.0.6, obsahuje celkovo 14 funkcií. Z~toho dve na kontrolu implementácie inštrukcií a~12 na produkciu náhodných dát. Programátor má možnosť vygenerovať jedno 16/32/64-bitové číslo alebo ich pole. Obdobne je k~dispozícii možnosť zvoliť si požadovanú veľkosť výstupu v~bajtoch. Pri~našom testovaní sme implementovali práve túto možnosť. Zdrojový kód, \ref{amd}, uvádza deklarácie spomenutých implementovaných funkcií. Pomenovania sú jednoznačné. Argument N označuje počet opakovaní a~\textit{retry\_count} udáva počet pokusov v~prípade zlyhania.
Obsahom balíka je aj zdrojový kód \textbf{secrng\_test.c}. Ten realizuje príklad použitia každého AMD rozhrania. Obsahom balíka je aj zdrojový kód \textbf{secrng\_test.c}. Ten realizuje príklad použitia každého AMD rozhrania.
@ -721,16 +721,16 @@ Používateľ má v aktuálnom \acrshort{os} Windows\footnote{Windows 10 Home -
Vyššie uvedené realizujú generovanie náhodných čísel pomocou používateľského rozhrania -- \textbf{ProcessPrng}. V prípade kernel režimu je produkcia dát vykonaná primárne pomocou \textbf{SystemPrng} API. Tie boli spomenuté v \ref{access}. Vyššie uvedené realizujú generovanie náhodných čísel pomocou používateľského rozhrania -- \textbf{ProcessPrng}. V prípade kernel režimu je produkcia dát vykonaná primárne pomocou \textbf{SystemPrng} API. Tie boli spomenuté v \ref{access}.
Obsahom tejto podkapitoly je opis týchto funkcií. Ten bol vytvorený na základe webovej dokumentácie spoločnosti Microsoft. Obsahom tejto podkapitoly je opis týchto funkcií. Ten bol vytvorený na základe webovej dokumentácie spoločnosti Microsoft.
\subsection{RtlGenRandom} \label{rtl} \subsection{RtlGenRandom} \label{rtl}
Funkcia je deklarovaná v hlavičkovom súbore \textbf{ntsecapi.h}, ale nemá knižnicu, ktorá ju vykonáva. Slúži na generovanie pseudonáhodných čísel. Pomocou makra je definovaná ako \textbf{SystemFunction036} a až táto je realizovaná v dynamickej knižnici \textbf{Advapi32.dll}. Pri použití je teda potrebné načítať tento modul. V súčasnosti je tento krok automatizovaný. Generovanie je realizované použitím rozhrania \textbf{ProcessPrng}. Funkcia je deklarovaná v hlavičkovom súbore \textbf{ntsecapi.h}, ale nemá knižnicu, ktorá ju vykonáva. Slúži na generovanie pseudonáhodných čísel. Pomocou makra je definovaná ako \verb|SystemFunction036| a až táto je realizovaná v dynamickej knižnici \textbf{Advapi32.dll}. Pri použití je teda potrebné načítať tento modul. V súčasnosti je tento krok automatizovaný. Generovanie je realizované použitím rozhrania \textbf{ProcessPrng}.
Microsoft však odporúča namiesto používania tejto funkcie použitie CryptGenRandom. Microsoft však odporúča namiesto používania tejto funkcie použitie \verb|CryptGenRandom|.
\subsubsection{Špecifikácia \cite{rtlgenrandom}} \subsubsection{Špecifikácia \cite{rtlgenrandom}}
RtlGenRandom() potrebuje dva vstupné parametre. \verb|RtlGenRandom()| potrebuje dva vstupné parametre.
\begin{enumerate} \begin{enumerate}
\item \textbf{PVOID RandomBuffer} -- adresa premennej na uloženie náhodnosti. \item \verb|PVOID RandomBuffer| -- adresa premennej na uloženie náhodnosti.
\item \textbf{ULONG RandomBufferLength} -- veľkosť prvého parametra. \item \verb|ULONG RandomBufferLength| -- veľkosť prvého parametra.
\end{enumerate} \end{enumerate}
Funkcia je typu \textbf{\textit{boolean}}. Teda návratové hodnoty sú \textbf{TRUE/FALSE} pri úspechu, resp. neúspechu generovania. Funkcia je typu \verb|boolean|. Teda návratové hodnoty sú \verb|TRUE/FALSE| pri úspechu, resp. neúspechu generovania.
Príkladom použitia je zdrojový kód \ref{rtlgr}. Príkladom použitia je zdrojový kód \ref{rtlgr}.
\noindent \noindent
@ -900,11 +900,11 @@ Funkcia na generovanie kryptograficky bezpečných náhodných dát. Vznikla pri
\subsubsection{Špecifikácia \cite{crypt}} \subsubsection{Špecifikácia \cite{crypt}}
Pri inicializácii je potrebná trojica parametrov: Pri inicializácii je potrebná trojica parametrov:
\begin{enumerate} \begin{enumerate}
\item \textbf{HCRYPTPROV hProv}\footnote{Nutná inicializácia tejto premennej} -- popis \acrshort{csp}\footnote{Popísané v \ref{cryptoapi}}, vytvorený funkciou \textbf{CryptAcquireContext}, \item \verb|HCRYPTPROV hProv|\footnote{Nutná inicializácia tejto premennej} -- popis \acrshort{csp}\footnote{Popísané v \ref{cryptoapi}}, vytvorený funkciou \verb|CryptAcquireContext|,
\item \textbf{DWORD dwLen} -- veľkosť výstupu -- maximum ULONG\_MAX, \item \verb|DWORD dwLen| -- veľkosť výstupu -- maximum \verb|ULONG_MAX|,
\item \textbf{BYTE *pbBuffer} -- adresa úložiska, veľkosť musí byť najmenej dwLen. \item \verb|BYTE *pbBuffer| -- adresa úložiska, veľkosť musí byť najmenej \verb|dwLen|.
\end{enumerate} \end{enumerate}
CryptGenRandom je typu \textbf{BOOL}. Návratová hodnota je \textbf{TRUE}, resp. \textbf{FALSE}. V~prípade zlyhania je dôvod zapísaný do \acrshort{csp} premennej. CryptGenRandom je typu \verb|BOOL|. Návratová hodnota je \verb|TRUE|, resp. \verb|FALSE|. V~prípade zlyhania je dôvod zapísaný do \acrshort{csp} premennej.
\noindent \noindent
\begin{minipage}{\linewidth} \begin{minipage}{\linewidth}
@ -1072,23 +1072,23 @@ Výsledky experimentov funkcie CryptGenRandom znázorňuje tabuľka \ref{cryptex
\caption{Výsledky meraní funkcie CryptGenRandom }\label{cryptexp} \caption{Výsledky meraní funkcie CryptGenRandom }\label{cryptexp}
\end{table} \end{table}
\subsection{BCryptGenRandom} \subsection{BCryptGenRandom}
Implementácia služby generovania náhodných čísel v~druhej verzii kryptografického rozhrania. Ako jediná z uvedených je navrhnutá na použitie v používateľskom aj kernel režime. \textbf{Deklarácia} je uvedená v hlavičkovom súbore \textbf{bcrypt.h}. Funkcia je následne vykonaná pomocou \textbf{bcrypt.dll}. Knižnicu je potrebné pri kompilácií programu prilinkovať. Tento úkon realizujeme pomocou prepínača \textbf{ -lbcrypt}. Implementácia služby generovania náhodných čísel v~druhej verzii kryptografického rozhrania. Ako jediná z uvedených je navrhnutá na použitie v používateľskom aj kernel režime. \textbf{Deklarácia} je uvedená v hlavičkovom súbore \textbf{bcrypt.h}. Funkcia je následne vykonaná pomocou \textbf{bcrypt.dll}. Knižnicu je potrebné pri kompilácií programu prilinkovať. Tento úkon realizujeme pomocou prepínača \verb| -lbcrypt|.
\subsubsection{Špecifikácia \cite{bcrypt}} \subsubsection{Špecifikácia \cite{bcrypt}}
Na inicializáciu potrebujeme štvoricu parametrov: Na inicializáciu potrebujeme štvoricu parametrov:
\begin{enumerate} \begin{enumerate}
\item\textbf{BCRYPT\_ALG\_HANDLE hAlgorithm} -- popis algoritmu \acrshort{csp}. Vytvára sa použitím funkcie \textbf{ BCryptOpenAlgorithmProvider}. Tú však nie je nutné inicializovať. Pri použití makra \textbf{NULL} sa použije predvolený poskytovateľ\footnote{Microsoft Cryptographic Service Provider}, ktorý poskytuje služby generovania náhodných čísel. \item\verb|BCRYPT_ALG_HANDLE hAlgorithm| -- popis algoritmu \acrshort{csp}. Vytvára sa použitím funkcie \verb| BCryptOpenAlgorithmProvider|. Tú však nie je nutné inicializovať. Pri použití makra \verb|NULL}| sa použije predvolený poskytovateľ\footnote{Microsoft Cryptographic Service Provider}, ktorý poskytuje služby generovania náhodných čísel.
\item\textbf{PUCHAR pbBuffer} -- adresa úložiska dát. Veľkosť musí byť najmenej cbBuffer. \item\verb|PUCHAR pbBuffer| -- adresa úložiska dát. Veľkosť musí byť najmenej cbBuffer.
\item\textbf{ULONG cbBuffer} -- veľkosť vygenerovaných dát -- maximálne ULONG\_MAX. \item\verb|ULONG cbBuffer| -- veľkosť vygenerovaných dát -- maximálne \verb|ULONG_MAX|.
\item\textbf{ULONG dwFlags} -- značka na modifikovanie správania funkcie. \item\verb|ULONG dwFlags| -- značka na modifikovanie správania funkcie.
\end{enumerate} \end{enumerate}
Posledný z parametrov môže nadobúdať hodnoty: Posledný z parametrov môže nadobúdať hodnoty:
\begin{itemize} \begin{itemize}
\item nula -- je nutné inicializovať \acrshort{csp}, \item nula -- je nutné inicializovať \acrshort{csp},
\item BCRYPT\_RNG\_USE\_ENTROPY\_IN\_BUFFER\footnote{ Od verzie Windows 8 a vyššie je ignorovaný.} -- obsah dát v pbBuffer sa použije ako dodatočný zdroj entropie. \item \verb|BCRYPT_RNG_USE_ENTROPY_IN_BUFFER|\footnote{ Od verzie Windows 8 a vyššie je ignorovaný.} -- obsah dát v pbBuffer sa použije ako dodatočný zdroj entropie.
\item BCRYPT\_USE\_SYSTEM\_PREFERRED\_RNG\footnote{Windows Vista nepodporuje túto značku.} -- v prípade, že \acrshort{csp} je rovný NULL, volíme tento parameter. \item \verb|BCRYPT_USE_SYSTEM_PREFERRED_RNG|\footnote{Windows Vista nepodporuje túto značku.} -- v prípade, že \acrshort{csp} je rovný NULL, volíme tento parameter.
\end{itemize} \end{itemize}
BCryptGenRandom je typu \textbf{NTSTATUS}. Návratové hodnoty môžu byť \textbf{STATUS\_SUCCESS}, \textbf{STATUS\_INVALID\_HANDLE} a \textbf{STATUS\_INVALID\_PARA-METER} BCryptGenRandom je typu \verb|NTSTATUS|. Návratové hodnoty môžu byť \verb|STATUS_SUCCESS|, \verb|STATUS_INVALID_HANDLE| a \verb|STATUS_INVALID_PARA-METER|.
\noindent \noindent
\begin{minipage}{\linewidth} \begin{minipage}{\linewidth}
@ -1248,7 +1248,7 @@ Výsledky meraní funkcie sú znázornené pomocou tabuľky \ref{bcryptexp}
\section{Knižničné rozhrania} \section{Knižničné rozhrania}
Používateľ pracujúci na platforme Windows môže okrem softvérových riešení použiť aj implementácie rôznych knižníc. Uvedenou metódou môžeme vytvoriť aplikáciu, resp. službu, nezávislú od operačného systému. Tzv. \textbf{muti-platformové programy}. V~tejto kapitole demonštrujeme vyššie opísaný postup. Použijeme štandardné knižničné rozhrania jazyka C a celosvetovo známu kryptografickú knižnicu -- OpenSSL. Používateľ pracujúci na platforme Windows môže okrem softvérových riešení použiť aj implementácie rôznych knižníc. Uvedenou metódou môžeme vytvoriť aplikáciu, resp. službu, nezávislú od operačného systému. Tzv. \textbf{muti-platformové programy}. V~tejto kapitole demonštrujeme vyššie opísaný postup. Použijeme štandardné knižničné rozhrania jazyka C a celosvetovo známu kryptografickú knižnicu -- OpenSSL.
\subsection{rand() a srand()} \subsection{rand() a srand()}
Rand je zrejme najznámejšou funkciou na generovanie pseudonáhodných výstupov, s ktorou sa používateľ stretne. Vo väčšine prípadov je implementáciou lineárne kongruentného generátora. Jeho inicializačná hodnota sa mení pomocou srand(). Pri tejto metóde je teda nutnosťou kooperácia týchto funkcií. Ak by sme neurčili seed generátora, výstup by bol vždy rovnaký\footnote{Rovný srand(1)}. Rand je zrejme najznámejšou funkciou na generovanie pseudonáhodných výstupov, s ktorou sa používateľ stretne. Vo väčšine prípadov je implementáciou lineárne kongruentného generátora. Jeho inicializačná hodnota sa mení pomocou \verb|srand()|. Pri tejto metóde je teda nutnosťou kooperácia týchto funkcií. Ak by sme neurčili seed generátora, výstup by bol vždy rovnaký\footnote{Rovný srand(1)}.
Výstupom funkcie je hodnota z číselnej množiny prvkov 0 až 32767. Výstupom funkcie je hodnota z číselnej množiny prvkov 0 až 32767.
Použitie rozhrania na kryptografické účely sa \textbf{neodporúča}. Z toho dôvodu nevykonáme testovanie tohto rozhrania. Príkladom použitia je zdrojový kód \ref{srand}. Použitie rozhrania na kryptografické účely sa \textbf{neodporúča}. Z toho dôvodu nevykonáme testovanie tohto rozhrania. Príkladom použitia je zdrojový kód \ref{srand}.
@ -1277,11 +1277,11 @@ int main () {
Viac informácia čitateľ nájde v \cite{crand}. Viac informácia čitateľ nájde v \cite{crand}.
\subsection{rand\_s} \subsection{rand\_s}
Rand\_S\footnote{Kompatibilné iba s OS Windows} je vylepšením rozhrania rand. Výstupom sú pseudonáhodné dáta v~rozmedzí od 0 až UINT\_MAX\footnote{UINT\_MAX = ULONG\_MAX = 4294967295}. Funkcia používa operačný systém, aby vygenerovala kryptograficky bezpečné náhodné dáta. Nepotrebuje srand funkciu. \verb|Rand_S|\footnote{Kompatibilné iba s OS Windows} je vylepšením rozhrania rand. Výstupom sú pseudonáhodné dáta v~rozmedzí od 0 až \verb|UINT_MAX|\footnote{UINT\_MAX = ULONG\_MAX = 4294967295}. Funkcia používa operačný systém, aby vygenerovala kryptograficky bezpečné náhodné dáta. Nepotrebuje srand funkciu.
\subsubsection{Špecifikácia} \subsubsection{Špecifikácia}
Funkcia používa jeden vstupný parameter. Ním je adresa na uloženie náhodnosti. Premenná musí byť typu \textbf{unsigned int}. Funkcia používa jeden vstupný parameter. Ním je adresa na uloženie náhodnosti. Premenná musí byť typu \verb|unsigned int|.
Rand\_s je typu \textbf{errno\_t}. Návratové hodnoty sú nula pri úspechu alebo chybový kód pri zlyhaní. Príkladom použitia je zdrojový kód \ref{rands}. \verb|Rand_s| je typu \verb|errno_t|. Návratové hodnoty sú nula pri úspechu alebo chybový kód pri zlyhaní. Príkladom použitia je zdrojový kód \ref{rands}.
\noindent \noindent
@ -1309,19 +1309,19 @@ int main () {
\end{minipage}\\ \end{minipage}\\
Pred použitím je nutné definovať makro \textbf{\_CRT\_RAND\_S} pred linkovaním knižnice \text{stdlib.h}. Tým je zabezpečená deklarácia rand\_s. Pred použitím je nutné definovať makro \verb|_CRT_RAND_S| pred linkovaním knižnice \textbf{stdlib.h}. Tým je zabezpečená deklarácia \verb|rand_s|.
Pri hlbšom skúmaní funkcie sme zistili, že \textbf{používa rozhranie RtlGenRandom}. To je obsahom podkapitoly \ref{rtl}. Pri testovaní by teda generovanie trvalo dlhšie, pretože je nutné vykonať viacero krokov. Kvalita výstupných dát je rovnaká ako pri uvedenom rozhraní. Z týchto dôvodov sme v tejto práci neaplikovali testovacie metódy na rozhranie rand\_s. Pri hlbšom skúmaní funkcie sme zistili, že \textbf{používa rozhranie RtlGenRandom}. To je obsahom podkapitoly \ref{rtl}. Pri testovaní by teda generovanie trvalo dlhšie, pretože je nutné vykonať viacero krokov. Kvalita výstupných dát je rovnaká ako pri uvedenom rozhraní. Z týchto dôvodov sme v tejto práci neaplikovali testovacie metódy na rozhranie \verb|rand_s|.
\subsection{OpenSSL } \subsection{OpenSSL }
OpenSSL je široko použiteľná a modifikovateľná knižnica, určená pre kryptografické aplikácie. Jej obsahom sú kvalitné a udržiavané algoritmy. Obdobne obsahuje aj funkcie, ktorých úlohou je generovanie kryptograficky bezpečných náhodných dát. Podľa dokumentácie \cite{openssl} je ich implementácia skonštruovaná podľa odporúčania \cite{book}, teda knižnica \textbf{používa} na generovanie čísel \textbf{AES256-DRBG v počítadlovom režime}. Ekvivalentná bezpečnosť výstupov je teda na úrovni 256 bitov. OpenSSL je široko použiteľná a modifikovateľná knižnica, určená pre kryptografické aplikácie. Jej obsahom sú kvalitné a udržiavané algoritmy. Obdobne obsahuje aj funkcie, ktorých úlohou je generovanie kryptograficky bezpečných náhodných dát. Podľa dokumentácie \cite{openssl} je ich implementácia skonštruovaná podľa odporúčania \cite{book}, teda knižnica \textbf{používa} na generovanie čísel \textbf{AES256-DRBG v počítadlovom režime}. Ekvivalentná bezpečnosť výstupov je teda na úrovni 256 bitov.
\subsubsection{Špecifikácia \cite[kap. 5]{ossltechreport}} \subsubsection{Špecifikácia \cite[kap. 5]{ossltechreport}}
V tejto práci budeme pracovať s verziou 1.1.1k\footnote{Aktualizovaná 25.03.2021}. V tejto práci budeme pracovať s verziou 1.1.1k\footnote{Aktualizovaná 25.03.2021}.
Predvolený generátor sa inicializuje pri spustení a automaticky vykonáva reseed-ovanie. Pri tomto procese používa dôveryhodné zdroje daného operačného systému. V~prípade \acrshort{os} Windows nimi sú výstupy funkcie \textbf{BCryptGenRandom} a \textbf{CryptGenRandom}. Tie sú popísané v podkapitole \ref{winapi} Predvolený generátor sa inicializuje pri spustení a automaticky vykonáva reseed-ovanie. Pri tomto procese používa dôveryhodné zdroje daného operačného systému. V~prípade \acrshort{os} Windows nimi sú výstupy funkcie \verb|BCryptGenRandom| a \verb|CryptGenRandom|. Tie sú popísané v podkapitole \ref{winapi}
Prístup k \acrshort{csprng} sprostredkúva dvojica funkcií: Prístup k \acrshort{csprng} sprostredkúva dvojica funkcií:
\begin{itemize} \begin{itemize}
\item \textbf{int RAND\_bytes(unsigned char * buf, int num)}, \item \verb|int RAND\_bytes(unsigned char * buf, int num)|,
\item \textbf{int RAND\_priv\_bytes(unsigned char * buf, int num)}. \item \verb|int RAND\_priv\_bytes(unsigned char * buf, int num)|.
\end{itemize} \end{itemize}
Obidve sú deklarované v \textbf{rand.h} a poskytujú výstup z rovnakého \acrshort{csprng}. Druhá z uvedených funkcií používa unikátnu inštanciu generátora. Odporúča sa ju používať pri produkcii citlivých dát. Napríklad pri procese generovania kľúčov. Ukáž- ku jednoduchého použitia v jazyku C znázorňuje zdrojový kód \ref{openssl}. Viac informácií o metódach RNG rozhraní je možne nájsť v riporte \cite[kap. 5]{ossltechreport} Obidve sú deklarované v \textbf{rand.h} a poskytujú výstup z rovnakého \acrshort{csprng}. Druhá z uvedených funkcií používa unikátnu inštanciu generátora. Odporúča sa ju používať pri produkcii citlivých dát. Napríklad pri procese generovania kľúčov. Ukáž- ku jednoduchého použitia v jazyku C znázorňuje zdrojový kód \ref{openssl}. Viac informácií o metódach RNG rozhraní je možne nájsť v riporte \cite[kap. 5]{ossltechreport}
@ -1361,8 +1361,8 @@ int main(){
\subsubsection{Výsledky experimentálnych meraní} \subsubsection{Výsledky experimentálnych meraní}
Aj napriek faktu, že knižnica čerpá zdroj náhodnosti z rozhraní operačného systému Windows, sme sa rozhodli aplikovať naše testovacie metódy na funkcie v OpenSSL. Dôvodom je vysoká miera používania v bežnej prevádzke. Prehľad nameraných hodnôt pri časovom meraní znázorňujú tabuľky č.: Aj napriek faktu, že knižnica čerpá zdroj náhodnosti z rozhraní operačného systému Windows, sme sa rozhodli aplikovať naše testovacie metódy na funkcie v OpenSSL. Dôvodom je vysoká miera používania v bežnej prevádzke. Prehľad nameraných hodnôt pri časovom meraní znázorňujú tabuľky č.:
\begin{itemize} \begin{itemize}
\item \ref{ossltable1} -- funkcia RAND\_bytes, \item \ref{ossltable1} -- funkcia \verb|RAND\_bytes|,
\item \ref{ossltable2} -- funkcia RAND\_priv\_bytes. \item \ref{ossltable2} -- funkcia \verb|RAND\_priv\_bytes|.
\end{itemize} \end{itemize}
\begin{table}[!ht] \begin{table}[!ht]
\centering \centering

Binary file not shown.

View File

@ -23,6 +23,7 @@
\usepackage{booktabs} \usepackage{booktabs}
\usepackage{indentfirst} \usepackage{indentfirst}
\usepackage{dirtree} \usepackage{dirtree}
\usepackage{hyperref}
% for source code % for source code
% Listings settings % Listings settings
% See for details: https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings % See for details: https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings