Pri používaní \acrshort{rng} môže dôjsť k jeho vnútorným zmenám. Na~statické overenie kvality generátorov náhodných čísel sa~používajú testy náhodnosti. Väčšina z~nich preveruje jednu alebo hneď niekoľko štatistických vlastností. Cieľom je~odhaliť periódu, respektíve nadväznosť bitov v~danej sekvencií dát. Pre používateľa sú~k~dispozícií vo~forme jednotlivých testov alebo štatistických testovacích sád. Takáto zbierka predstavuje viacero implementácií skúšok zoskupených dokopy, pripravených na~jednoduché použitie, modifikáciu a~vyhodnotenie. Najznámejšími~sú:
\begin{itemize}
\item\textbf{Dieharder}\cite{dieharder},
\item\textbf{NIST STS}\cite{niststs} -- z~ang. \textit{The NIST Statistical Test Suit}.
\end{itemize}
Okrem vyššie uvedených je však možné vyhľadať, vytvoriť, a aj upraviť, respektíve optimalizovať rôzne implementácie štatistických testov. Dôkazom toho je aj vznik modifikovanej NIST testovacej sady -- \cite{fasterniststs}. Podľa vyjadrení autorov uvedeného projektu sa im podarilo zefektívniť rýchlosť testovania o vyše 50 percent v porovnaní s originálom.
Je však nutné si uvedomiť, že úspešné absolvovanie ľubovoľného počtu štatistických testov nezabezpečuje kryptografickú bezpečnosť daného generátora. Dôvodom je, že niektoré z nástrojov na produkciu náhodných dát môžu byť pripravené tak, aby boli úspešné pri exekúcii týchto testov. Avšak platí, že ak má byť \acrshort{rng} označený za \acrshort{csprng}, tak musí úspešne zvládnuť testovanie štatistickými testami.
\section{Testovacia zbierka Dieharder}
Prvá zo spomenutých sád vznikla v~roku 2003 a~je aj~naďalej udržiavaná. Slúži na testovanie konkrétnych \acrshort{rng}s. Teda ak by sme uvažovali o~použití tejto testovacej zbierky, tak pre správnosť postupu by bolo nutné aplikovať testovanie na \acrshort{aes}-e v~režime, ktorý používa operačný systém Windows na produkciu náhodných dát. Z vyššie uvedených dôvodov charakterizujeme túto sadu veľmi stručne.
Aktuálna verzia -- 3.31.1, pozostáva~z~:
\begin{itemize}
\item 17 Diehard,
\item 3 NIST STS,
\item 10 testov, autora tejto zbierky -- \textit{Róberta G. Brown-a}.
\end{itemize}
Podrobnejší opis týchto testov je~dostupný online\footnote{https://sites.google.com/site/astudyofentropy/background-information/the-tests/dieharder-test-descriptions}$^{,}$\footnote{https://en.wikipedia.org/wiki/Diehard\_tests}.
Inštalácia sady je jednoduchá najmä v prostredí OS Linux. Realizuje ju príkaz: \textbf{sudo apt-get install -y dieharder}\footnote{Príkaz pre distribúciu Ubuntu.}. V~prostredí systému Windows je potrebná zložitejšia konfigurácia.
Tento balíček bol vytvorený inštitúciou NIST. Pozostáva z 15 testov. Slúžia na overenie kvality výstupných dát z hardvérových, a aj softvérových generátorov náhodných čísel. V~súčasnosti sa práve táto zbierka používa aj pri testovaní \acrshort{csprng}. Na rozdiel od spomenutej kolekcie \textit{Dieharder} táto zbierka vyšla s podrobnou dokumentáciou \cite{niststs}. Uvádzame stručný opis metód a použitých testov.
\subsection{Obsah sady a opis implementovaných testov}
Sada je pre používateľa dostupná vo forme archívu -- \uv{\textbf{sts-2.1.2.zip}}\footnote{Dostupné online: https://csrc.nist.gov/CSRC/media/Projects/Random-Bit-Generation/do-cuments/sts-2\_1\_2.zip}. Jeho obsahom sú implementácie štatistických testov v~jazyku C. \textbf{Makefile} na jednoduché vytvorenie spustiteľného programu a príklady vstupných dát z rôznych typov generátorov. Následné spustenie je opísané v \cite[kap. 5.6]{niststs} a pomocou ukážky \ref{sts}.
\subsubsection*{Opis testov štatistickej sady:}
\begin{enumerate}
\item\textbf{Frekvenčný test -- \textit{The Frequency/Monobit Test}\cite[kap. 2.1]{niststs}}
Výsledok je určený pomerom jednotkových a nulových bitov v danej testovanej sekvencii. Úspešný je vtedy, ak sa obsah jednotiek v našich dátach blíži k $\frac{1}{2}$ z celkového počtu. Odporúčaná dĺžka testovanej postupnosti je minimálne 100 bitov. Úspešné zvládnutie tohto testu je nutnou podmienkou pre ďalšie pokračovanie testovania.
\item\textbf{Blokový frekvenčný test -- \textit{Frequency Test within a Block}\cite[kap. 2.2]{niststs}}
Podobný prvému zo spomenutej sady. Namiesto celej testovacej sekvencie dát dochádza k frekvenčnému testu M-bitových blokov. Úspešný je vtedy, keď sa výsledný pomer rovná $\frac{M}{2}$, pričom M je počet bitov jedného bloku. Obdobne aj v tomto prípade sa odporúča testovať minimálne 100 bitovú postupnosť.
Zameraný na celkový počet po sebe idúcich neprerušených a rovnakých bitov -- tzv. \textbf{behov}. Cieľom tohto testu je overiť rôznorodosť striedajúcich sa sekvencií pri generovaní. Odporúča sa aplikovať na sekvencie s dĺžkou minimálne 100 bitov
\item\textbf{Test najdlhšej sekvencie jednotiek v bloku -- \textit{Test for the longest Run of Ones in a Block}\cite[k. 2.4]{niststs}}
Zameraný na najdlhší beh v M-bitových blokoch. Má za úlohu overiť, či vygenerovaná najväčšia sekvencia je v súlade s najdlhšou sériou, aká sa očakáva, resp povoľuje v náhodnej sekvencii bitov\footnote{Povolený počet jednotiek závisí od veľkosti testovanej sekvencie}. Odporúča sa aplikovať test na minimálne 128 bitov náhodnej postupnosti. \footnote{V tomto prípade sa dovoľuje maximálne 8, po sebe idúcich, jednotkových bitov.}
\item\textbf{Test série binárnych matic -- \textit{Binary Matrix Rank Test}\cite[kap. 2.5]{niststs}}
Zameraný na poradie disjunktných\footnote{Disjunktné množiny sú také, ktoré nemajú žiaden spoločný prvok} submatíc celej testovacej sekvencie. Overuje lineárne závislosti medzi podreťazcami s pevnými veľkosťami. Tento test je obdobne súčasťou sady Dieharder. Pre správne fungovanie je minimálna dĺžka sekvencie stanovená na 38 912 bitov.
Zameraný na výšky vrcholov -- \textbf{amplitúd}, jednotlivých bitov testovanej postupnosti v diskrétnej Fourierovej transformácii\footnote{https://cs.wikipedia.org/wiki/Fourierova\_transformace}. Cieľom je detekcia periodických znakov, ktorá by naznačovala odchýlku od predpokladu náhodnosti. Zisťujú sa prahové hodnoty\footnote{Prahová hodnota -- krajná, resp. hraničná hodnota. Získava sa prahovaním. Viac informácií o tejto metóde je dostupných v dokumente \cite[k. 1.3]{prahovanie}}
95\% znakov a zvyšných 5\% testovanej sekvencie. Následne sa overuje, či nedochádza k významnej odlišnosti medzi týmito hodnotami. 1 000 bitov sa odporúča ako minimálna veľkosť postupnosti.
\item\textbf{Test neprekrývajúcich sa vzorov -- \textit{Non-overlapping Template Matching Test}\cite[kap. 2.7]{niststs}}
Zameraný na počet vopred určených bitov v testovanom reťazci -- tzv. okne. Cieľom je detegovať generátor, ktorý produkuje veľa neperiodického vzoru. Test používa m-bitové okno na vyhľadanie konkrétneho m-bitového vzoru. Ak ho nenájde, nastane posun okna o jednu bitovú pozíciu. Ak sa nájde, okno sa resetuje na bity po nájdenom vzore a vyhľadávanie pokračuje. Nemá odporúčanú dĺžku vstupnej postupnosti. Parametre pre tento test sa vypočítajú na základe požiadavky.
\item\textbf{Test prekrývajúcich sa vzorov -- \textit{Overlapping Template Matching Test}\cite[kap. 2.8]{niststs}}
Pracuje na rovnakom princípe ako 7. test. Rozdiel je len pri zhode vzoru s oknom. V tomto prípade sa okno posúva o jeden bit a následne pokračuje prehľadávanie.
\item\textbf{Mauerov \uv{univerzálny štatistický} test -- \textit{Maurer's \uv{Universal Statistical} Test}\cite[kap. 2.9]{niststs}}
Zameraný na počet bitov medzi zhodnými vzormi. Overuje, či je možné danú postupnosť komprimovať bez straty informácií. Ak je možná veľká kompresia, tak daná sekvencia sa nepovažuje za náhodnú. Vstupná postupnosť môže mať variabilnú dĺžku. Odporúča sa aplikovať na minimálne 1 000 000-bitovú postupnosť.
Zameraný na dĺžku posuvného registra s lineárnou spätnou väzbou -- \acrshort{lfsr}\footnote{Výstup tohto registra je lineárne závislý od jeho počiatočného stavu a predchádzajúcich výstupov. Používa sa napríklad v PRNG a prúdových šifrách.}. Cieľom je zistiť, či je daná postupnosť dostatočne zložitá, aby sa mohla považovať za náhodnú. Platí, že dlhšie \acrshort{lfsr}s spĺňajú tento predpoklad.
Zameraný na frekvenciu všetkých možných prekrývajúcich sa m-bitových vzorov v celej testovanej postupnosti. Cieľom je zistiť, či počet výskytov je približne rovnaký, ako by mal byť v náhodnej sekvencii. Tá by mala byť rovnomerná\footnote{Rovnomernosť, resp. uniformita, náhodnej sekvencie znamená, že každý m-bitový vzor ma rovnakú pravdepodobnosť objaviť sa, ako ktorýkoľvek iný.}. Vyžaduje sa zvoliť m také, pre ktoré platí $m<[log_2 n]-2$. Veľkosť vstupnej sekvenciu v bitoch reprezentuje premenná $n$.
\item\textbf{Približný test Entropie -- \textit{Approximate Entropy Test}\cite[kap. 2.12]{niststs}}
Podobný ako Test Sérií. Zameraný na frekvenciu všetkých možných prekrývajúcich sa vzorov s dĺžkou m-bitov. Porovnanie sa aplikuje na frekvencie dvoch po sebe nasledujúcich blokov, ktoré sa prekrývajú. Výsledok sa následne porovná s ekvivalentom pre náhodnú sekvenciu. Vyžaduje sa zvoliť m také, pre ktoré platí $m<[log_2 n]-5$. Veľkosť vstupnej sekvenciu v bitoch reprezentuje premenná $n$.
Zameraný na maximálnu odchýlku od nuly pri kumulatívnom súčte všetkých bitov. Pri~tomto postupnom hromadnom sčítaní predstavujú jednotkové bity kladné jednotky. Nuly na druhej strane záporné. Cieľom testu je určiť, či takýto kumulatívny súčet testovaných dát zodpovedá náhodnej sekvencii. Test je úspešný, ak sa výsledok sčítania blíži k nule. Odporúča sa, aby každá testovaná sekvencia mala minimálnu dĺžku 100 bitov.
Zameraný na počet cyklov, ktoré majú presne K náhodných návštev v kumulatívnom súčte. Všetky cykly majú dĺžku zvolenú náhodne. Cieľom je zistiť či sa počet návštev odlišuje od hodnoty platnej pre náhodné dáta. Test pozostáva z 8 čiastočných testov. Každý otestuje jeden zo stavov: -~4, -~3, -~2, -~1, 1, 2, 3, 4. Úspešný je iba ak dáta uspejú vo všetkých čiastočných testoch. Odporúča sa testovať postupnosť s minimálnou dĺžkou 1 000 000 bitov.
Zameraný na celkový počet návštev jednotlivých stavov pri kumulatívnom súčte. Pozostáva z 18 testov. Postupne sa testujú stavy: -~9, -~8, ..., -~1, 1, ..., 8, 9. Odporúčaná minimálna veľkosť vstupu je rovnaká ako v 14. teste.
Nasledujúce vety vznikli parafrázou \cite[kap. 1.1.5]{niststs}. Testovanie pomocou sady je založené na overení dvoch predpokladov, tzv. \textbf{nulovej} a \textbf{alternatívnej} hypotézy. Prvá z uvedených, ozn. $H_0$, tvrdí, že testovaná postupnosť je náhodná. Druhú definujeme ako inverznú voči nulovej, teda výstup z RNG je nenáhodný. Len jeden z týchto predpokladov je prijatý v priebehu aplikácie sady. V~súvislosti s týmto postupom môže dôjsť k 2 typom chýb v priebehu testovania.
\begin{enumerate}
\item Sekvencia je náhodná, ale $H_0$ nebola akceptovaná.
\item Postupnosť nie je náhodná, avšak nulová hypotéza je prijatá.
\end{enumerate}
Pravdepodobnosť, že dôjde k~prvému zo~spomenutých dejov definuje pojem -- \textbf{hladina významnosti}, označíme $\alpha$. Jej~veľkosť závisí od~konkrétneho štatistického testu. Typicky sa volí z~intervalu $[0.001;0.01]$
Na vyhodnotenie uvedených predpokladov dochádza pri~každom teste k~porovnaniu \textbf{výslednej štatistickej} -- $S$,\footnote{Hodnota získaná aplikovaním daného testu na~naše dáta} a~\textbf{kritickej} hodnoty, ďalej \acrshort{cv}\footnote{Z~ang. Critical Value}. Každý z~testov má definované štatistické hodnoty, na~základe ktorých môžeme prijať alebo odmietnuť $H_0$. \acrshort{cv} je hodnota získaná štatistickým rozdelením hodnôt. Platí, že predstavuje výsledok testu, ktorý pochádza na~99\% z~nenáhodnej sekvencie testovaných dát. Inými slovami, predstavuje hodnotu, pri~ktorej už neakceptujeme $H_0$ ako pravdivé. Program vytvorí výpis s~medzi-výpočtami pre každý test a~zároveň aj finálny výsledok testu. Používateľ si však môže všimnúť tzv. \textbf{pravdepodobnostné hodnoty} -- \textbf{\textit{$p-values$}}. Získa ich výpočtom pravdepodobnosti z~vyššie uvedeného porovnania. Ten reprezentuje pravdepodobnosť, vygenerovania lepšej náhodnej postupnosti dát ako by zvládol dokonalý RNG. Pri úspešnom teste platí \eqref{p-value}. \\
Na meranie dĺžky sme modifikovali zdrojové kódy uvedenej sady. Použité bolo Windows rozhranie na meranie času -- \textbf{QueryPerformanceCounter()}. Taktiež sme zistili počet cyklov jednotlivých testov vzhľadom na veľkosti vstupov. K tomu nám dopomohli inštrukcie \textbf{RDTSC} a \textbf{RDTSCP}. Opis použitých metód je obsahom kapitoly \ref{merania}.
Experimentálne výsledky sú znázornené v~tabuľke \ref{ststimes}. Výsledná doba vykonania daného testu je závislá na~veľkosti sekvencie. Pre celkový čas platí \eqref{totaltime}. Ak~by sme si vyhradili procesor iba pre nás, tak potom jednotlivé časy $t_i$ by boli konštantné. Dôvodom je deterministický charakter procesu. Tento úkon však nie je v používateľskom režime možný. Uvedený vzťah ráta s týmto faktom.\\
\\Nech
$n$ -- veľkosť vstupnej testovacej postupnosti,
$t_i$ -- doba aplikovania všetkých testov na n-bitovú sekvenciu,
$m$ -- počet testovaných prúdov s veľkosťou n,
$T$ -- výsledný čas celého testovania.\\
Potom
\begin{equation}\label{totaltime}
T = \sum_{i=1}^{m}t_i .
\end{equation}
\begin{table}[!ht]
\centering
\begin{tabular}{ c|c|c|c|c }
\multicolumn{5}{c}{\bfseries Veľkosť vstupnej testovanej sekvencie }\\
\multirow{2}*{\bfseries Test č.}&\multicolumn{2}{c}{\bfseries 122kB $\approx$ 1 000 000 b }&\multicolumn{2}{c}{\bfseries 1,165GB $\approx$ 10 000 000 000 b }\\
\caption{Meranie testovania sady pomocou konfigurácie A }\label{ststimes}
\end{table}
\subsubsection{Odporúčanie pri spustení}
Na spustenie sady je potrebná inicializácia. Používateľ ju realizuje vstupmi z príkazového riadku. Zdrojový kód \ref{sts}, znázorňuje tento úkon. Veľkosť otestovaných dát pomocou takejto konfigurácie je 11,92 MB\footnote{1 000 000 b $*$ 100 $=$ 100 000 000 b $\approx$ 11,92MB}.
Pre optimálne fungovanie všetkých testov je ideálnejšie použiť veľkosť vstupnej sekvencie rovnú 1 000 000 bitov teda približne 122kB. Následne pri väčšom objeme testovaných dát zvolíme vyšší počet prúdov. Týmto postupom zamedzíme vzniku chýb pri alokovaní potrebnej pamäte a vykonané testy poskytnú kvalitnejšie výsledky.
> ./assess.exe 1000000 // size of random sequence in bits
> 0 // apply tests on input file
> myRandomDataFile.bin // name of file with random numbers
> 1 // apply all tests
> 0 // no changes of default tests values
> 100 // number of bit streams
> 1 // choosen bin format of input file
\end{lstlisting}
\end{minipage}\\
\chapter{Metodika testovania dát a merania rozhraní}\label{merania}
Pred samotným generovaním dát bolo nutné zvoliť si~meracie a testovacie metódy. V~tejto kapitole si ich popíšeme.
Implementáciu rozhraní sme realizovali v programovacom jazyku C. Preklad do strojového kódu zabezpečí prekladač \acrshort{gcc} vo verzii 10.2.0. \textbf{Overenie kvality dát} vykonáme pomocou NIST STS, opísanej v podkapitole \ref{nist}.
Pri experimentálnych meraniach implementácií RNG rozhraní sme sa zamerali na tri údaje:
\begin{itemize}
\item čas exekúcie samotnej implementácie -- \textbf{$T_A$},
\item dobu vykonania, vrátane bežných úkonov\footnote{Ukladanie dát, overenie úspešnosti generovania, ...} -- \textbf{$T_B$}
\item priemerný počet cyklov API -- \acrshort{anc}\footnote{Predstavuje priemernú hodnotu. Získa sa ako pomer súčtu všetkých vykonaných cyklov a počtu opakovaní volania testovanej funkcie. Vypočítané iba v prípade $T_A$}
\end{itemize}
Pomocou týchto nameraných hodnôt sme vypočítali priepustnosť dát. Použili sme vzťah \eqref{priepustnost}.\\
Nech
$_X=\{A,B\}$,
$T_X$ -- čas zvoleného procesu,
$NI$ -- počet opakovaných volaní\footnote{Z ang. \textit{Number of iterations}},
$BS$ -- veľkosť zásobníka\footnote{Z ang. \textit{Buffer Size}},
$V_D = NI*BS$ -- celkový objem vygenerovaných dát,
$P_X$ -- priepustnosť procesu,\\
potom,
\begin{equation}\label{priepustnost}
P_X = \frac{V_D}{T_X}
\end{equation}
Uvedené experimenty boli aplikované na~troch zariadeniach. Špecifikáciu týchto prenosných počítačov znázorňuje tabuľka \ref{pc}. Všetky notebook-y sme počas testovania pripojili do elektrickej siete. Režim napájania sme zmenili na \uv{Vysoký výkon}.
\textbf{Označenia} hodnôt a~meracích nástrojov, ktoré vznikli v~tejto kapitole \textbf{sú použité pri~interpretácii výsledkov}.
V~tomto bode treba spomenúť určitú odchýlku experimentálnych meraní od skutočných hodnôt. Najväčším faktor, ktorý mohol spôsobiť chybu merania sú prerušenia operačného systému. \footnote{Viď. napríklad elapsedTime v \ref{qpc}}. Uvedenému procesu je možné sa vyhnúť jedine implementáciou modulu pre prácu v~režime jadra. Následne by sme si vyhradili procesor pre vlastné účely. Kladom módu by mohol byť aj menší počet inštrukcií potrebných na vykonanie funkcionality. S týmto postupom sa však používateľ často nestretáva. Uvedený fakt je dôvodom, prečo sme sa pri meraniach zamerali iba na~beh rozhraní v~používateľskom režime. Pripomeniem však, že rozhrania v~oboch režimoch poskytujú \textbf{identické služby}.
\section{Časové meranie rozhraní}
Pri meraní dĺžky behu rozhrania sme implementovali Windows API:
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.
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}.
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: \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.
Meranie počtu vykonaných cyklov sme, kvôli tomuto faktoru, uskutočnili podľa metód v~Intel dokumente \cite[kap.3.2.1]{intelrd}. Ukážkou aplikovaného riešenia je kód \ref{cycles}.
\noindent
\begin{minipage}{\linewidth}
%\section{Výpis kódu jazyka C}
\begin{lstlisting}[frame=single,
numbers=left,
caption={Meranie počtu cyklov Intel metódou},label=cycles,
Na produkciu náhodných dát má používateľ k dispozícii hneď niekoľko možností. V~rámci tejto práce si rozhrania rozdelíme do dvoch kategórií.
\begin{itemize}
\item Hardvérové \acrshort{api} -- závisí od technického vybavenia počítača.
\item Softvérové \acrshort{api} -- implementáciu služby \acrshort{rng} zabezpečuje \acrshort{os} alebo knižnice zvoleného jazyka.
\end{itemize}
V~tejto kapitole uvedené rozdelenie viac charakterizujeme pomocou nasledujúcich podkapitol.
\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}}.
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 súvislosti s inštrukčnými sadami, implementovanými na dnešných mikroprocesoroch, dávame čitateľovi do popredia dokument \cite{instruction}. Jeho obsahom sú všetky sady používané na rôznych typoch procesorov. Dokument je pravidelne aktualizovaný a udržiavaný.
\subsection{RDRAND a RDSEED}
Inštrukcie vytvorila spoločnosť Intel. Ich vznik sa datuje do roku \textbf{2012}. Samotní autori (\cite{inteldrng}), odôvodnili čipovú implementáciu \acrshort{trng} ako nutný bezpečnostný prvok, ktorý dokáže v~akejkoľvek situácii dodať skutočne náhodné dáta. Samozrejme nezávislé od deterministických procesov bežiaceho softvéru.
Inštrukcia RDSEED je implementáciou \acrshort{ndrng}. Na druhej strane RDRAND realizuje \acrshort{csprng}, ktorého zdrojom entropie je výstup RDSEED inštrukcie. Obidva uvedené typy \acrshort{rng} boli opísané v kapitole \ref{1} tejto práce. Proces generovania náhodných dát pomocou týchto príkazov je znázornený na~obrázku \ref{o:rdimplementacia}\footnote{Prebraté z: \cite[kap. 3.1]{inteldrng}}.
\caption{Implementácia procesorových inštrukcií RDRAND a RDSEED\label{o:rdimplementacia}}
\end{figure}
Podrobný opis aplikovaných metód v generátore je dostupný v dokumentácii \cite{intelcycle}.
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}}
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.
\caption{Výsledky meraní funkcie get\_rdseed\_bytes\_arr}\label{rdseed}
\end{table}
\section{Rozhrania operačného systému Windows}\label{winapi}
Používateľ má v aktuálnom \acrshort{os} Windows\footnote{Windows 10 Home - 64-bit, verzia 20H2, zostava OS -- 19042.964} prístup k trojici funkcií realizujúcich službu \acrshort{rng}\cite[str. 5]{win10rng}.
\begin{itemize}
\item\textbf{RtlGenRandom}\cite{rtlgenrandom}
\item\textbf{CryptGenRandom}\cite{crypt}
\item\textbf{BCryptGenRandom}\cite{bcrypt}
\end{itemize}
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.
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 \verb|CryptGenRandom|.
\caption{Výsledky meraní funkcie RtlGenRandom}\label{rtlexp}
\end{table}
\subsection{CryptGenRandom}
Funkcia na generovanie kryptograficky bezpečných náhodných dát. Vznikla pri prvom riešení kryptografického rozhrania -- CAPI. \textbf{Zastaraná}, ale zatiaľ podporovaná aj v súčasnom CNG. Microsoft však \textbf{neodporúča} jej používanie z dôvodu možného odstránenia v~budúcnosti. Jej deklarácia je obsahom hlavičkového súboru \textbf{wincrypt.h}. Realizuje ju dynamická knižnica \textbf{Advapi32.dll}. Následne je použitý modul \textbf{brcyptprimitives.dll}.
\item\verb|HCRYPTPROV hProv|\footnote{Nutná inicializácia tejto premennej} -- popis \acrshort{csp}\footnote{Popísané v \ref{cryptoapi}}, vytvorený funkciou \verb|CryptAcquireContext|,
\item\verb|DWORD dwLen| -- veľkosť výstupu -- maximum \verb|ULONG_MAX|,
\item\verb|BYTE *pbBuffer| -- adresa úložiska, veľkosť musí byť najmenej \verb|dwLen|.
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.
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|.
\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\verb|PUCHAR pbBuffer| -- adresa úložiska dát. Veľkosť musí byť najmenej cbBuffer.
\item\verb|ULONG cbBuffer| -- veľkosť vygenerovaných dát -- maximálne \verb|ULONG_MAX|.
\item\verb|ULONG dwFlags| -- značka na modifikovanie správania funkcie.
\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\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.
BCryptGenRandom je typu \verb|NTSTATUS|. Návratové hodnoty môžu byť \verb|STATUS_SUCCESS|, \verb|STATUS_INVALID_HANDLE| a \verb|STATUS_INVALID_PARA-METER|.
\caption{Výsledky meraní funkcie BCryptGenRandom }\label{bcryptexp}
\end{table}
\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.
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.
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}.
\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.
Funkcia používa jeden vstupný parameter. Ním je adresa na uloženie náhodnosti. Premenná musí byť typu \verb|unsigned int|.
\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}.
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|.
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.
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}
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}
\noindent
\begin{minipage}{\linewidth}
%\section{Výpis kódu jazyka C}
\begin{lstlisting}[frame=single,
numbers=left,
caption={Príklad použitia funkcií OpenSSL},label=openssl,
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 č.: