Pred samotným generovaním dát je nutné zvoliť meracie a testovacie metódy. V~tejto kapitole ich popíšeme. Znázornené demo príklady zdrojových kódov sú obsahom prílohy A, spoločne s makefile-om.
Implementáciu rozhraní sme realizovali v programovacom jazyku C. Preklad do strojového kódu zabezpečil prekladač \acrshort{gcc} vo verzii 10.2.0 (04. 03. 2021). \textbf{Overenie kvality dát} vykonáme pomocou NIST štatistickej testovacej sady (ďalej NIST STS), opísanej v podkapitole \ref{nist}.
\item čas vykonania 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}. Získa sa ako pomer súčtu všetkých vykonaných cyklov a počtu opakovaní volania testovanej funkcie. Pri výsledkoch uvádzame ANC iba z hodnôt meraní $T_A$.
Uvedené experimenty boli aplikované na~troch zariadeniach. Špecifikáciu 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}.
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 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~spúšťanie rozhraní v~používateľskom režime. Pripomenieme však, že rozhrania v~oboch režimoch poskytujú \textbf{identické služby}.
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 rozlíšením 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{\textbf{\textit{Sleep(1000)}} reprezentuje jednu sekundu.}. Stačí ju vložiť do 18. riadku v zdrojovom kóde \ref{qpc}.
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} vo funkcii \verb|rand_s|. 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}.
\section{Meranie počtu cyklov jednotlivých funkcií}
Obdobne sme sa zamerali aj na~počet cyklov jednotlivých funkcií. 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 \verb|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 presné 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,
Pri používaní \acrshort{rng} môže dôjsť k jeho vnútorným zmenám. Na~overenie kvality generátorov náhodných čísel sa~používajú statické testy náhodnosti. Väčšina z~nich preveruje jednu alebo hneď niekoľko štatistických vlastností. Cieľom je~odhaliť anomáliu bitov v~danej postupnosti dát. Pre používateľa sú~k~dispozícií vo~for-me jednotlivých testov alebo štatistických testovacích sád. Takáto zbierka predstavuje implementáciu viacerých štatistických testov, 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. Ďalšie príklady testovacích sád sú napríklad \textbf{ENT}\cite{ent}, \textbf{TestU01}\cite{testu01} a mnohé iné.
Je však nutné uvedomiť si, ž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 generovanie náhodných dát môžu byť pripravené tak, aby boli úspešné pri vykonávaní 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 sada Dieharder}
Sád Diehard vznikla v~roku 2003 a~je aj~naďalej udržiavaná. Slúži na testovanie dát z \acrshort{rng}s. Používateľ môže pomocou sady generovať dáta a následne ich otestovať. Okrem toho je možné testovať aj vlastný súbor s náhodnými dátami.
Výstupom sady je výpis vo forme tabuľky s výsledkami použitých štatistických testov.
Aktuálna verzia -- 3.31.1 (03. 06. 2020), 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{\url{https://sites.google.com/site/astudyofentropy/background-information/the-tests/dieharder-test-descriptions}.}$^{,}$\footnote{\url{https://en.wikipedia.org/wiki/Diehard\_tests}.}.
Inštalácia sady je jednoduchá najmä v prostredí OS Linux. Realizuje ju príkaz: \\\verb|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 sada 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{\url{https://csrc.nist.gov/CSRC/media/Projects/Random-Bit-Generation/documents/sts-2\_1\_2.zip}.}(09. 07. 2014). 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 postupnosti. Ú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 testovania celej postupnosti 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 postupností pri generovaní. Odporúča sa aplikovať na postupnosť s minimálnou dĺžkou 100 bitov
\item\textbf{Test najdlhšej postupnosti 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 najväčšia vygenerovaná postupnosť je v súlade s najdlhšou sériou, aká sa očakáva, resp povoľuje v náhodnej postupnosti bitov\footnote{Povolený počet jednotiek závisí od veľkosti testovanej postupnosti.}. 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.}
Zameraný na poradie disjunktných\footnote{Disjunktné množiny sú také, ktoré nemajú žiaden spoločný prvok.} submatíc celej testovanej postupnosti. 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 postupnosti 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{\url{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 postupnosti. 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ý generuje 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á postupnosť 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 postupnosti. Tá by mala byť rovnomerná\footnote{Rovnomernosť, resp. uniformita, náhodnej postupnosti 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 postupnosti 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 je následne porovnaný s ekvivalentom pre náhodnú postupnosť. Vyžaduje sa zvoliť $m$ také, pre ktoré platí $m<[log_2 n]-5$. Veľkosť vstupnej postupnosti 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á postupnosť 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 vychádzajú z dokumentu \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 Postupnosť 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 $\langle0.001,0.01\rangle$
Na vyhodnotenie uvedených predpokladov dochádza pri~každom teste k~porovnaniu \textbf{výslednej štatistickej hodnoty}$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. \textit{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 táto hodnota predstavuje výsledok testu, ktorý pochádza na~99\% z~nenáhodnej postupnosti 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ú hodnotu} -- $P\text{-VALUE}$. Viď tabuľku \ref{far}.
\caption{Príklad skráteného výpisu sady NIST STS po otestovaní náhodných dát}\label{far}
\end{table}
Pri testovaní sú vstupné hodnoty testovaných postupnosti rozdelené na 10 približne rovnakých častí ($C1\text{--}C10$). Následne dochádza k výpočtu jednotlivých $p\text{-}values$ v každej z týchto častí. Tieto čiastkové $p\text{-}values$ sú vypočítané podľa daného štatistického testu a jeho výsledkov. Výsledná hodnota $P\text{-VALUE}$ je vypočítaná pomocou uvedených čiastkových hodnôt ($p\text{-}values$), dosadených do~vzťahov a~funkcií v~\cite[kap. 4.2.2]{niststs}. Pri úspešnom testovaní platí pre výslednú hodnotu $P\text{-VALUE}$ vzťah \eqref{p-value}. \\
V tabuľke \ref{far} sa nachádza taktiež stĺpec \textit{PROPORTION}. Ten znázorňuje pomer úspešných a všetkých vykonaných testov pri testovaní sadou NIST.
\subsection{Doba vykonávania testovacej sady}
Obsahom tejto podkapitoly sú informácie súvisiace s dobou vykonávania sady NIST STS. Testovanie sme uskutočnili na konfigurácii A\footnote{Vid. tabuľku \ref{pc} v kapitole \ref{merania}.}.
Na meranie dĺžky času vykonávania sme modifikovali zdrojové kódy sady NIST STS. Použili sme Windows rozhranie na meranie času -- \textbf{QueryPerformanceCounter()}. Taktiež sme zisťovali počet cyklov jednotlivých testov vzhľadom na~veľkosti vstupov $m_1\text{ a } m_2$. K~tomu nám dopomohli inštrukcie \textbf{RDTSC} a~\textbf{RDTS-CP}. Opis použitých metód je obsahom kapitoly \ref{merania}. Takto upravená testovacia sada je súčasťou prílohy A.
Experimentálne výsledky sú znázornené v~tabuľke \ref{ststimes}. Výsledná doba vykonania daného testu zavisí od~veľkosti testovanej postupnosti. Pre celkový čas platí \eqref{totaltime}. Ak~by sme 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
$m$ -- veľkosť vstupnej testovacej postupnosti,
$t_i$ -- doba aplikovania všetkých testov na m-bitovú postupnosť,
$n$ -- počet testovaných prúdov s veľkosťou m,
$T$ -- výsledný čas celého testovania.\\
Potom
\begin{equation}\label{totaltime}
T = \sum_{i=1}^{n}t_i .
\end{equation}
Pri meraní času v tabuľke \ref{ststimes} sme zvolili $n =1$ pre obidve náhodné postupností ($m_1, m_2$).
\begin{table}[!ht]
\centering
\begin{tabular}{ c|c|c|c|c }
\multicolumn{5}{c}{\bfseries Veľkosť vstupnej testovanej postupnosti }\\
\multirow{2}*{\bfseries Test č.}&\multicolumn{2}{c}{$m_1=\text{}$\bfseries 122kB $\approx$ 1 000 000 b }&\multicolumn{2}{c}{$m_2=\text{}$\bfseries 1,165GB $\approx$ 10 000 000 000 b }\\
\caption{Meranie testovania sady pomocou konfigurácie A }\label{ststimes}
\end{table}
\subsubsection{Informácie ku spusteniu sady NIST STS}
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,92 MB.}.
Na základe faktov súvisiacich s výpočtom $P\text{-VALUE}$ je potrebné pre správne vyhodnotenie otestovať viacero postupností. Pri určení veľkostí vstupnej postupnosti preto odporúčame zvoliť $m =1000000$ bitov ($\approx$ 122kB) a počet prúdov stanoviť na číslo deliteľné 10. Dôvodom je rozdelenie testovaných postupností práve na 10 rovnakých častí. Parametre jednotlivých testov nemeníme. Týmto postupom zamedzíme chýbam pri inicializácii sady a vykonané testy poskytnú presnejšie výsledky.
V~tejto kapitole uvedené rozdelenie viac charakterizujeme pomocou nasledujúcich podkapitol. Súčasťou každej opísanej funkcie sú aj tabuľky s výsledkami experimentálnych meraní jednotlivých funkcií. Merania boli uskutočnené pomocou metód opísaných v kapitole \ref{merania}. Obdobne sme použili aj opísané označenia. Konkrétne:
\begin{itemize}
\item počet opakovaní volania testovanej funkcie -- $\acrshort{ni}$,
\item veľkosť buffer-a -- $\acrshort{bs}$,
\item celková veľkosť vygenerovaných dát -- $V_D$,
\item priemerný počet cyklov pri vykonávaní testovanej funkcie -- \textit{\acrshort{anc}},
\item čas vykonávania (bez ukladania dát) -- $T_A$,
\item čas vykonávania (s ukladaním dát) -- $T_B$,
\item priepustnosť dát procesu $T_A$ -- $P_A$,
\item priepustnosť dát procesu $T_B$ -- $P_B$.
\end{itemize}
Posledný riadok každej konfigurácie v tabuľkách, bol meraný pri maximálnej možnej veľkosti buffer-a, ktorú funkcia dokáže poskytnúť.
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í \verb|RDRAND| a \verb|RDSEED|.
Práca s~inštrukciami 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{\acrshort{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á \textbf{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í \verb|RDRAND| a \verb|RDSEED|. Z~tohto dôvodu sme použili pri generovaní náhodných dát, pomocou vyššie spomenutých inštrukcií, práve riešenie firmy AMD.
V súvislosti s inštrukčnými sadami, implementovanými na dnešných mikroprocesoroch, uvádzame dokument \cite{instruction}. Jeho obsahom sú špecifikácie inštrukcií, používaných na rôznych typoch procesorov. Dokument je pravidelne aktualizovaný a udržiavaný.
Inštrukcie vytvorila spoločnosť Intel. Ich vznik sa datuje do roku \textbf{2012}. Samotní autori (\cite{inteldrng}), odôvodnili implementáciu \acrshort{trng} v procesorových čipoch ako nutný bezpečnostný prvok, ktorý dokáže v~akejkoľvek situácii dodať kvalitné a 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{\acrshort{mac} -- z ang. \textit{Message Authentication Code}.}$^,$\footnote{Prebraté z: \cite[kap. 3.1]{inteldrng}.}.
Intel procesory používajú ako hardvérový zdroj entropie tepelný šum procesora pri~rýchlosti 3 GHz. Nepotrebujú žiaden externý zdroj napájania, pretože používajú rovnaký zdroj ako jadro, na ktorom generovanie prebieha.
Podrobný opis aplikovaných metód v generátore je dostupný v dokumentácii \cite{inteldrng}.
Podporu týchto inštrukcií doplnila aj spoločnosť AMD v roku 2015. Do svojich procesorov implementovali kryptografické ko-procesory. Architektúra je znázornená pomocou schémy \ref{amdrd}. Zdrojom entropie sú tzv. \textbf{kruhové oscilátory}\footnote{Z ang. \textit{Ring Oscillators}.}, ktoré počas behu ko-procesora neustále dodávajú náhodné dáta. Uvedené AMD ko-procesory používajú aj tzv. \acrshort{fifo} buffer \cite{fifo} na~zabezpečenie podpory rýchleho čítanie 32-bitových hodnôt\footnote{Z~ang. \textit{Bursts}.}. Viac podrobností o riešení sa nachádza v~\cite{amdapi}.
Voľné dostupné rozhranie\footnote{\url{https://developer.amd.com/amd-aocl/rng-library/}.} v~programovacom jazyku C. Aktuálna verzia je 3.0.6 (15. 03. 2021), obsahuje celkovo 14 funkcií. Z~toho dve na kontrolu implementácie inštrukcií a~12 na vytváranie náhodných dát. Programátor má možnosť vygenerovať jedno 16/32/64-bitové číslo alebo ich dátovú štruktúru. Obdobne je k~dispozícii možnosť zvoliť si požadovanú veľkosť vygenerovaných dát v~bajtoch. Pri~našom testovaní sme implementovali možnosť generovania náhodných dát pomocou polí v jazyku C. 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.
Jednotlivé označenia stĺpcov sú charakterizované v úvode tejto kapitoly (\ref{rng}). Zdrojový kód \verb|amdSPRNG.c| implementuje testované funkcie a je obsahom prílohy A.
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}.
Vyššie uvedené realizujú generovanie náhodných čísel pomocou používateľského rozhrania -- \verb|ProcessPrng|. V prípade kernel režimu je vytváranie náhodných dát vykonané primárne pomocou \verb|SystemPrng| API. Tie boli spomenuté v \ref{access}.
Obsahom tejto podkapitoly je opis týchto funkcií. Ten bol vytvorený na základe dokumentácií spoločnosti Microsoft \cite{rtlgenrandom}, \cite{crypt}, \cite{bcrypt}.
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.} -- opis \acrshort{csp}\footnote{Opísané v \ref{cryptoapi}.}, vytvorený funkciou \verb|CryptAcquireContext|,
\item\verb|DWORD dwLen| -- veľkosť výstupu (max. \verb|ULONG_MAX|),
Funkcia \verb|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 \verb|hProv|.
\subsubsection{Výsledky experimentálnych meraní funkcie CryptGenRandom}
Výsledky experimentov funkcie \verb|CryptGenRandom| znázorňuje tabuľka \ref{cryptexp}. Zdrojové kódy \verb|winAPIprng.c| a ukážka \ref{crypt} implementujú túto funkciu a sú obsahom prílohy A.
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| -- opis 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|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 tento prepínač.} -- v prípade, že \acrshort{csp} je rovný NULL, volíme tento parameter.
Funkcia \verb|BCryptGenRandom| je typu \verb|NTSTATUS|. Návratové hodnoty môžu byť \verb|STATUS_SUCCESS|, \verb|STATUS_INVALID_HANDLE| a \verb|STATUS_INVALID_PARAMETER|.
\subsubsection{Výsledky experimentálnych meraní funkcie BCryptGenRandom}
Výsledky meraní funkcie sú znázornené pomocou tabuľky \ref{bcryptexp}. Programy použité pri experimentoch sú obsahom prílohy A, spoločne so zdrojovým kódom \ref{bcrypt} a implementáciou Windows rozhraní (\verb|winAPIprng.c|).
\section{Rozhrania na generovanie náhodných čísel v jazyku C a knižnici OpenSSL}
Používateľ pracujúci na platforme Windows môže okrem softvérových riešení OS 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\footnote{Funkcie \textbf{\textit{rand, srand}} a \textbf{\textit{rand\_s}}.} a celosvetovo známu kryptografickú knižnicu -- OpenSSL\footnote{Funkcie \textbf{\textit{RAND\_bytes}} a \textbf{\textit{RAND\_priv\_bytes}}.}\cite{osslweb}.
Zdrojové kódy v tejto podkapitoly sú obsahom prílohy A.
Funkcia \verb|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 funkcie \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ý \textbf{\textit{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}.
Funkcia \verb|rand_s|\footnote{Kompatibilné iba s OS Windows.} je vylepšením rozhrania \verb|rand|. Výstupom sú \textbf{pseudonáhodné} dáta v~rozmedzí od 0 až \verb|UINT_MAX|\footnote{\textbf{\textit{UINT\_MAX}} = \textbf{\textit{ULONG\_MAX}} = 4 294 967 295.}. Minimálna a zároveň aj maximálna veľkosť generovaných dát pri jednom volaní funkcie je 32 bitov (\verb|u_int|). Funkcia používa operačný systém, aby vygenerovala kryptograficky bezpečné náhodné dáta. Nepotrebuje \verb|srand()| funkciu.
\verb|Rand_s| je typu \verb|errno_t|. Návratové hodnoty sú \textbf{nula} pri úspechu alebo chybový kód pri zlyhaní. Príkladom použitia je zdrojový kód \ref{rands}, ktorý je obsahom priečinku \textit{DemoExamples} v Prílohe A. Obdobne je funkcia implementovaná v \verb|winAPIprng.c|.
Pri skúmaní dokumentácie sme zistili, že \textbf{používa rozhranie}\verb|RtlGenRandom|, konkrétne makro \verb|SystemFunction036|. Uvedená funkcia je obsahom podkapitoly \ref{rtl}.
\subsubsection{Výsledky experimentálnych meraní funkcie rand\_s}
Výsledky dosiahnuté pri meraní tejto funkcie sú znázornené pomocou tabuľky \ref{rnds}. Programy spoločne s výsledkami, na základe ktorých táto tabuľka vznikla, sú obsahom prílohy A.
\caption{Výsledky meraní funkcie rand\_s }\label{rnds}
\end{table}
\subsection{Kryptografická knižnica OpenSSL}
OpenSSL \cite{osslweb} 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 čítačovom režime}. Ekvivalentná bezpečnosť výstupov je teda na úrovni 256 bitov.
\subsubsection{Špecifikácia RNG funkcií v knižnici OpenSSL\cite[kap. 5]{ossltechreport}}
V tejto práci budeme pracovať s OpenSSL verzia 1.1.1k (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 \verb|BCryptGenRandom| a \verb|CryptGenRandom|. Tie sú opí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 tvorbe 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}
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 č.: