% !TEX root = ../thesis.tex

\chapter{Typy generátorov náhodných čísel}\label{1}
Pod~pojmom generovanie náhodných čísel vzniká predstava jednoduchého procesu ako~napríklad hod kockou. V~sfére počítačov sa~pri tomto deji používajú špeciálne nástroje -- \textit{generátory} \cite{gen} (ďalej \acrshort{rng}\footnote{Z ang. \textit{Random Number Generator}.}). Výstupnými hodnotami sú postupnosti bitov. Ich~neskoršia grafická reprezentácia v~počítači môže byť číselná alebo vo forme znakov \acrshort{ascii}\footnote{Z ang. \textit{American Standard Code for Information Interchange}.} tabuľky, prislúchajúcich vygenerovaným postupnostiam. Dôsledkom toho sa čitateľ môže v problematike \acrshort{rng} často stretnúť s~pojmom -- \textit {generátor náhodných bitov} (ďalej \acrshort{rbg}\footnote{Z ang. \textit{Random Bits Generator}.}). V~oblasti informačnej bezpečnosti je ich~použitie skutočne rozsiahle. Radíme ich preto do množiny tzv.~\textit{kryptografických primitív}. V~kryptografii tento pojem zahŕňa algoritmy, bloky a nástroje, ktoré tvoria základ pre správne fungovanie kryptografických funkcií, respektíve systémov.
Podľa dokumentu Národného Inštitútu pre~Štandardy a~Technológie (ďalej \acrshort{nist}), ich~delíme podľa spôsobu tvorby výstupných hodnôt na \cite{book}:
\begin{itemize}
	\item deterministické -- \textit{ang. deterministic \acrshort{rng}} (\acrshort{drng}),
	\item ne-deterministické -- \textit{ang. non-deterministic \acrshort{rng}} (\acrshort{ndrng}).
\end{itemize}
 V~tejto práci použijeme spomenuté delenie za hierarchicky najvyššie a~ďalej opísané v~nasledujúcich podkapitolách.

\section{Ne-Deterministické \acrshort{rng}}
Proces generovania náhodných čísel prebieha pri~tomto type generátora na~najnižších úrovniach počítača -- \textbf{hardvéri}. Výstup týchto zariadení je~závislý od~jedného alebo viacerých fyzikálnych dejov, ktoré musia byť štatisticky nepredvídateľné. Celkovo môžeme tieto javy rozdeliť na fyzikálne procesy:
\begin{itemize}
	\item s kvantovou náhodnosťou,
	\item bez kvantovej náhodnosti.
\end{itemize}
Dôvodom použitia oblasti kvantovej fyziky je ideálna vlastnosť pre~generovanie -- aktuálna nemožnosť, resp. neschopnosť predikcie týchto procesov.
Za~spomenutie tiež stojí, že rýchlosť generovania čísel je v~tomto prípade pomalšia ako pri~deterministických generátoroch. Aj dôsledkom toho sa stretávame s~menším zastúpením týchto generátorov v~bežnej prevádzke. Veľmi dobrým príkladom použitia je vojenské odvetvie. Najmä pri~šifrovaní a následnej preprave veľmi dôležitých, resp. citlivých správ prostredníctvom počítačových sieti. Na~označenie takýchto generátorov sa používajú označenia -- \acrshort{trng}\footnote{Z ang. \textit{True Random Number Generator}.} a \acrshort{hrng}\footnote{Z ang. \textit{Hardware Random Number Generator}.}.
\subsection{Fyzikálne procesy s kvantovou náhodnosťou}
Základným zdrojom náhodnosti sú v~tomto prípade mechanizmy kvantovej fyziky na atómovej a subatómovej úrovni. Príkladom takýchto dejov môže byť:  
\begin{itemize}
	\item rozpad jadra rádioaktívnych prvkov,
	\item výstrelový šum  -- z ang. \textit{Shot/Poisson noise} \cite{foton},
	\item prechod fotónov cez polo-priesvitné zrkadlo \cite{foton}, \cite{idq},
	\item a iné.
\end{itemize} 
Na overenie skutočnej náhodnosti dát sa v tomto prípade používajú  tzv.~\textbf{Bellove testy} \cite{belltests}. Za~spomenutie určite stojí aj tzv.~\textbf{Geigerovo počítadlo} (z~ang.\textit{ Geiger counter}). Tento prístroj sa požíva na~zisťovanie ionizujúceho žiarenia atómov. Pri~pripojení k~počítaču môže slúžiť tiež ako zdroj náhodných dát.

\subsection{Fyzikálne procesy bez kvantovej náhodnosti}
Základ týchto dejov tvoria tepelné procesy. Detekcia je v~tomto prípade jednoduchšia ako pri~kvantových javoch. Uvedené deje sú náchylnejšie na útok, pri~ktorom sa napríklad zníži prevádzková teplota daného systému na~nižšiu, ako pri~ktorej je zariadenie na tvorbu náhodných dát, schopné pracovať správne.
Príkladom tepelných dejov je \textbf{tepelný šum}, ktorý vytvára rezistor. Ten~je zosilnený tak, aby poskytoval náhodný zdroj napätia. Okrem spomenutého sa používa aj \textbf{atmosferický} \cite{atmonoise} a~\textbf{lavínový šum} (z ang. \textit{Avalanche noise}) \cite{an}.
Pomerne jednoduché a~nepredvídateľné deje sú tiež:
\begin{itemize}
	\item\textbf{posun hodín}\footnote{Z~ang. \textit{Clock~drift}.} \cite{clockdrift},
	\item\textbf{nestabilita hodín}\footnote{Z ang. \textit{Clock jitter}.} \cite{clockjitter}.
\end{itemize}

\section{Deterministické \acrshort{rng}}
DRNG\footnote{Z ang. \textit{Deterministic Random Number Generator}.}, resp. DRBG\footnote{Z ang. \textit{Deterministic Random Bit Generator}.}, je taký generátor náhodných čísel/bitov, ktorý potrebuje na vygenerovanie výstupu prístup k~zdroju náhodnosti, minimálne pri~spustení -- \textit{inicializácií}. Následne generátor aplikuje pripravený algoritmus. Výstupom je postupnosť bitov, vytvorená na~základe tajnej počiatočnej hodnoty (z ang. \textit{seed}). Tento pojem charakterizujeme ako reťazec bitov, ktorý sa používa pri~inicializácií kryptografických nástrojov. 

Z~vyššie uvedeného vyplýva, že tento typ generátorov vytvára \textbf{pseudonáhodné}, teda nie celkom náhodne dáta. Kvôli tomu sa takéto generátory často označujú ako \acrshort{prng} (z ang. \textit{Pseudo-Random Number Generator}) \cite{drbg}. V~uvedenom dokumente sa obdobne nachádzajú odporúčania a štandardizačný opis použitých mechanizmov, stavov a~funkcií pre~deterministické generátory. 
Ďalším, ale~nie menej podstatným faktom ostáva, že~celý proces generovania dát je~podmienený počiatočnou hodnotou \textbf{seed}. Tento údaj predstavuje najzraniteľnejšie miesto týchto generátorov. Ak útočník získa túto bitovú postupnosť, tak na~základe predpísaného postupu dokáže presne zreprodukovať rovnakú výslednú postupnosť bitov. 

\subsection{Pseudo-náhodné a kryptografický bezpečné \acrshort{rng}}
V~súčasnosti existuje veľa voľne dostupných internetových zdrojov kde sú~zverejnené zoznamy pseudo-náhodných generátorov spoločne s~kladmi i~zápormi konkrétneho typu. Preto v~tejto práci nebudeme pokračovať v~tomto smere. Vývoj v~oblasti výpočtovej techniky a technológií samotných, však v~priebehu poslednej dekády rapídne pokročil. Aj~dôsledkom toho je~nutnosť mať k~dispozícií generátory, ktorých kvalita výstupu nie~je~ľahko napadnuteľná, respektíve prelomiteľná. Na~základe tejto myšlienky a~dokumentu \cite{csrng}, následne delíme \acrshort{prng} na: 
\begin{itemize}
	\item bežné \acrshort{prng},
	\item kryptograficky bezpečné \acrshort{prng} -- \acrshort{csprng}\footnote{Z ang. \textit{Cryptographically Secure PRNG}.}.
\end{itemize}  
Hlavným cieľom \acrshort{csprng} je vytvoriť výstupné dáta, ktoré sú kvalitou takmer na~nerozoznanie od~\acrshort{trng}. Kryptograficky bezpečné generátory musia spĺňať 3~základne podmienky:
\begin{itemize}
	\item úspešné absolvovanie štatistických testov,
	\item úspešný The~next~bit test \cite{nextbit},
	\item odolnosť voči narušeniu stavu -- z ang. \textit{State compromise extensions}.
\end{itemize}
Pod~posledným pojmom sa rozumie prípad, v~ktorom útočník zistí ľubovoľný zo~stavov daného generátora. Napriek tejto znalosti nebude možné zistiť predchádzajúci ani budúci stav a teda zostaviť pôvodné dáta. V tejto súvislosti sa zvyknú používať aj termíny tzv. \uv{\textbf{\textit{Spätná/Do-predná bezpečnosť}}}, ktoré lepšie popisujú danú bezpečnostnú podmienku. 

\textbf{Spätná bezpečnosť}\footnote{Z~ang. \textit{Backward security}, tiež známa ako \textit{break-in recovery}.}, opisuje zabezpečenie pre prípad zistenia ľubovoľného stavu v určitom čase. Následne však nie je možné určiť akýkoľvek budúci výstup. Tento problému rieši dostatočne silný zdroj náhodnosti. Údaje v~jednotlivých stavoch sa~následne periodicky menia, resp. aktualizujú pomocou tejto náhodnosti. 

Druhý prípad, teda \textbf{do-predná bezpečnosť}\footnote{Z ang. \textit{Forward security}.}, na druhej strane hovorí o bezpečnosti pri zisťovaní stavu generátora smerom k zdrojovým dátam. Zjednodušene povedané, ak útočník zistí niektorý zo~stavov generátora, tak aj~napriek tejto znalosti nebude možné zistiť predchádzajúci stav a zároveň aj dáta. Tento prvok bezpečnosti sa dá ľahko zaručiť tým, že funkcia, ktorá posúva stav dopredu, bude jednosmerná. Príkladom sú hašovacie funkcie. 

Označenie \uv{kryptograficky bezpečný RNG} aj~napriek splneniu uvedených podmienok nie~je veľmi jednoduché získať. Dôsledkom toho v~praxi často trvá roky testovania, kým certifikačná organizácia označí algoritmus ako \acrshort{csprng}.

Uplatnenie kryptograficky bezpečných \acrshort{rng} je konkrétne v~oblasti kryptografickej bezpečnosti. Takéto generátory sa~uplatňujú napríklad pri~generovaní:
\begin{itemize}
	\item kľúčov pre~kryptografické algoritmy -- šifrovanie/dešifrovanie,
	\item inicializačných vektorov \cite{iv},
	\item maskovacích hodnôt \cite{masking},
	\item jednorázových čísel -- z ang. \textit{nonce} \cite{nonce},
	\item dodatočných vstupov -- z ang. \textit{salt} \cite{salt}.
\end{itemize} 
 Bezpečnosť kryptografického systému je hodnotená práve na základe veľkosti náhodne vygenerovaných kľúčov. 
 V~súčasnosti dizajn väčšiny \acrshort{csprng} vieme rozdeliť do~troch kategórií. Jednou z~nich je skupina generátorov založená na~kryptografických primitívoch. Konkrétne tieto pracujú na~princípe hašovacích funkcií, blokových a prúdových šifier, ktoré sú vysvetlené v~dokumente \cite[kap. 5]{levicky}. Ďalší typ návrhu je založený na~základe zložitých matematických problémov. Hádam najznámejším je tzv. Blum Blum Shub generátor -- \acrshort{bbs}, ktorý je predmetom opisu práce \cite{bbs}. Posledný dizajn charakterizujeme slovami -- \textbf{špeciálny návrh}. Do~tejto kategórie zahŕňame algoritmy, ktorých dizajn bol~vyvinutý, resp. navrhnutý špeciálne pre~splnenie vyššie spomenutých podmienok \acrshort{csprng}. Príkladom takýchto generátorov sú:
 \begin{itemize}
 	\item Fortuna -- používa ho macOS aj \acrshort{os} Linux -- \cite{fortuna},
 	\item Rivest šifra -- ozn. \acrshort{rc} -- \cite[kap. 3.1.1]{rc},
 	\item Pokročilý šifrovací štandard -- ozn. \acrshort{aes}\footnote{Z ang. \textit{Advanced Encryption Standard}.} -- \cite{fipsaes}.
 \end{itemize}
  
\section{Súhrnná klasifikácia generátorov}
Na~základe vyššie uvedených skutočností je evidentné, že v~tejto problematike dochádza v~počítačovej sfére k~častej zámene pomenovaní. Schéma číslo \ref{o:rng sumar} znázorňuje rozdelenia opísané v tejto kapitole. 

\begin{figure}[!ht]
    \centering
    \includegraphics[width=.9\textwidth]{figures/rng sumar}
    \caption{Schéma rozdelenia RNG\label{o:rng sumar}}
\end{figure}

V tejto práci sa zameriame na generátory, ktoré sú vhodné pre kryptografické účely. Presnejšie aplikujeme naše meracie a testovacie metódy na rozhrania operačného systému Windows, ktoré sprostredkujú tieto služby na počítači. Okrem nich opíšeme a otestujeme aj iné možnosti generovania náhodných dát, ktoré má používateľ na tejto platforme. 
Vyššie uvedené podmienky spĺňajú len \acrshort{csprng} a \acrshort{hrng}. 

Pri hardvérových generátoroch sa pri experimentoch zameriame iba na nekvantové. Dôvodom je, že dáta chceme vygenerovať sami, bez nutnosti použitia prostriedkov tretích strán. Schéma číslo \ref{rngapi} znázorňuje \acrshort{rng} a rozhrania, ktoré sú predmetom skúmania tejto práce. Posledné bloky znázorňujú konkrétne funkcie jednotlivých rozhraní, pričom ich opis je obsahom kapitoly \ref{rng}.
\begin{figure}[!ht]
	\centering
	\includegraphics[width=\textwidth]{figures/rngapi}
	\caption{Schéma rozhraní použitých v práci\label{rngapi}}
\end{figure}


\chapter{Operačný systém Windows}
Pred analýzou konkrétnej implementácie je nutná definícia niektorých pojmov. Prvým bude samotný \acrshort{os}. 

\textbf{Operačný systém} je~komplexný program -- softvér, ktorý spravuje hardvér počítača. Tvorí základ pre~aplikačné programy. Pracuje ako sprostredkovateľ medzi používateľom počítača a~jeho hardvérom. Inými slovami, prácu tohto systému by sme v~bežnej pracovnej sfére vedeli prirovnať k~činnosti riaditeľa, respektíve manažéra spoločnosti. Jeho~úlohou je~správne a efektívne prerozdelenie práce -- \textit{činnosti aplikácií}, medzi svojich zamestnancov -- \textit{súčasti hardvéru}, na~základe aktuálneho dopytu -- \textit{interakcií používateľa}. 

\begin{figure}[!ht]
	\centering
	\includegraphics[width=.4\textwidth]{figures/os.pdf}
	\caption{Úrovne počítača\label{o:os}}
\end{figure}

Aby sa zabezpečila správna funkcionalita, tak \acrshort{os} musí riešiť množstvo s~tým súvisiacich problémov. Ide napríklad o~\textbf{plánovanie úloh}\footnote{Z~ang. \textit{Task sheduling}.}, \textbf{správu pamäte zariadenia},  \textbf{monitorovanie hardvérového príslušenstva}, \textbf{spracovanie vstupov a~výstupov z/na~príslušné zariadenia} (klávesnica, myš, ...), a~iné. Dôležitým aspektom pri návrhu alebo voľbe \acrshort{os} je závislosť od~miesta jeho nasadenia. Niektoré operačné systémy sú~navrhnuté so zameraním na jednoduché používateľské použitie. Ide o~tzv. \textit{user-friendly}, teda používateľsky prívetivé systémy. Ich použitie je bežné a príkladom môže byť samotný OS Windows 10. Ďalšiu kategóriu tvoria systémy zamerané na poskytnutie čo najlepšej efektívnosti nejakej služby. Príkladom sú serverové zariadenia. Väčšinou je však nutná vyššia odbornosť pri práci s týmito OS. V~súčasnosti má už používateľ k dispozícii aj~vysoko efektívne, a~zároveň aj používateľsky prívetivé operačné systémy.
Viac pozornosti k~tejto problematike je~venované v~\cite{os1} a \cite{os2}.

Súčasťou každého dobrého operačného systému je implementácia kryptografických modulov a ich aplikačných rozhraní (ďalej \acrshort{api}). Ich súčasťou sú okrem iných aj funkcie, ktoré vykonávajú služby \acrshort{rng}. \textbf{Náhodné dáta} sú~dôležitou a~zároveň potrebnou súčasťou viacerých kryptografických algoritmov, respektíve systémov. Tie~sú použité \textbf{na~zabezpečenie} samotného \textbf{systému} a \textbf{sieťovej komunikácie} s inými zariadeniami. Bezpečnosť proti útokom je teda~priamo úmerná kvalite náhodných dát a správnej implementácii kryptografických algoritmov vo~vnútri týchto modulov. Okrem \acrshort{rng} sú ďalším príkladom obsahu kryptografických modulov tzv. hašovacie algoritmy, ktoré majú v~kryptografii taktiež široké uplatnenie. Najznámejšími a~v~súčasnosti najpoužívanejšími sú algoritmy z rodiny \acrshort{sha}\footnote{Z ang. \textit{Secure Hash algorithm}.}. Viac informácií k tejto problematike sa uvádza v~\cite{sha}. 

V~súvislosti s~generovaním náhodných dát je potrebné definovať pojem -- \textbf{náhodnosť}, respektíve \textbf{entropia}\footnote{Z~ang. \textit{Entropy}.}. Národný inštitút štandardov a~technológií NIST v~dokumente \cite{niststs} a~\cite{entropy2} definuje tento pojem. Následné vety budú parafrázou definícií v~uvedených publikáciách. \textbf{Entropia} je matematický pojem pre~náhodnú premennú \textit{X}. Jej~hodnota nám určuje množstvo vopred očakávaných informácií, poskytnutých zdrojom tejto premennej. Hodnota entropie je~vždy viazaná na~zdroj. Jej~znalosť je výsledkom pozorovania, respektíve analýzy zdroja tejto náhodnosti.  
Okrem uvedenej slovnej definície je definovaná aj matematická formulácia
dostupná na \cite{entropyvzorec}. Pre pochopenie súvislostí nám vystačí aj slovná definícia.

\section{História kryptografických \acrshort{api} v \acrshort{os} Windows}
Operačný systém Windows bol prvýkrát implementovaný 27. júla v~roku \textbf{1993}. Niesol označenie \uv{NT -- New Technology}. Od vzniku až po súčasnosť došlo k~viacerým viditeľných grafickým zmenám. Priebežným úpravám sa nevyhla ani architektúra systému. Dôležité z hľadiska obsahu práce sú roky \textbf{1996} a \textbf{2006}.
\subsection{\acrshort{cryptoapi}}\label{cryptoapi}       
V roku 1996 bola publikovaná novú verziu \acrshort{os} -- Windows NT 4.0, ktorej obsahom bolo tzv.~\textbf{rozhranie na~programovanie kryptografických aplikácií}\footnote{Z~ang. \textit{Cryptographic Application Programming Interface}.}. Pre~jeho názov sa zaužívala skratka \textbf{\acrshort{cryptoapi}}, resp.~\textbf{\acrshort{capi}}. Oficiálny návrh použitého riešenia v~rozhraní však spoločnosť Microsoft nezverejnila.

Základom kryptografického modulu sú tzv. \textit{kryptografické primitíva}. Tento pojem trochu rozšírime. Pomenovanie \textbf{kryptografické primitíva} označuje jednotlivé nízko-úrovňové algoritmy, ktoré sa \textbf{často používajú} v počítačovej bezpečnosti pri rôznych kryptografických protokoloch alebo aplikáciach. Realizujú ich dynamické knižnice (\verb|.dll| súbory). Tieto algoritmy úzko spolupracujú s tzv. \textbf{poskytovateľmi kryptografických služieb} (ďalej \acrshort{csp}).

\textbf{CSPs} predstavujú nezávislé softvérové knižnice, ktoré slúžia na kódovanie a~dekódovanie kryptografických algoritmov. Inými slovami implementujú kryptografické algoritmy a štandardy. Pred každým použitím musí byť zvolený CSP digitálne podpísaný spoločnosťou Microsoft, pričom tento podpis je overovaný pri každom načítaní daného poskytovateľa. Proces overovania digitálneho podpisu prebieha aj periodicky pri používaní CSP. Týmto spôsobom je vykonané \textbf{zabezpečenie systému} pred vírusmi a možnými útokmi na kryptografický modul. Viac informácií je dostupných v~\cite{csp}.   

Primitíva tvoria základ pre správne fungovanie ďalších funkcií alebo programov. V tejto súvislosti uvádzame pojem \textbf{kryptografické aplikácie}. Ten predstavuje označenie pre algoritmy, ktoré zabezpečujú bezpečný prenos a utajenie údajov. Uvedené programy realizujú dva základné úkony. Na základe toho rozdeľujeme aj funkcie opisovaného CAPI, na:
   \begin{itemize}
 	\item certifikačné, 
 	\item kryptografické.
 \end{itemize}  
Príkladom použitia certifikačných je proces autentizácie\footnote{Autentizácia -- proces overenie identity.} pomocou digitálneho certifikátu. V prípade druhého bodu je typické šifrovanie a dešifrovanie dát.
Vyššie uvedené rozdelenie funkcií rozhrania na základe ich využitia, je znázornené pomocou schémy číslo \ref{o:cryptoapi_arch}. Každá z~nich slúži na~nejakú operáciu. Vykonávanie jednotlivých operácií je zabezpečené postupným volaním základných algoritmov -- kryptografických primitív. 

\textbf{CryptGenRandom} je funkcia z kategórie primitív a slúži na generovanie kryptograficky bezpečných náhodných dát. Výstupy sú následne použité napríklad ako zdroj tajnej hodnoty -- seed. 

\begin{figure}[!ht]
	\centering
	\includegraphics[width=.6\textwidth]{figures/cryptoapi_arch}
	\caption{Schéma architektúry CryptoAPI v OS Windows NT 4.0 \label{o:cryptoapi_arch}}
\end{figure} 
 
Pomocou analýz boli v minulosti odhalené rôzne chyby a zraniteľné miesta \acrshort{capi} implementácie. \textbf{Nedostatky} boli zistené aj pri \acrshort{csprng}. CryptGenRandom používal na generovanie výstupu systémovú entropiu a hashovací algoritmus SHA-1´\footnote{Rozdiel oproti klasickému SHA-1 bol v zmenenom poradí inicializačných vektorov.} v kooperácii s RC4 šifrou (\cite{rc}). Spomenuté riešenie však neposkytovalo žiadnu spätnú ani do-prednú bezpečnosť, ktorá bola opísaná pri \acrshort{csprng}. Podrobný opis použitých metód, nástrojov, útokov a dosiahnutých výsledkov analýzy tohto generátora je dostupný v dokumente \cite{cryptgenrandom}.

\subsection{Kryptografické rozhranie novej generácie}  
Vzhľadom na problémy návrhu kryptografického rozhrania \acrshort{cryptoapi} bola \textbf{nutná} jeho \textbf{inovácia}. Ta~bola uverejnená v~roku \textbf{2006}, spoločne s~novou verziou \acrshort{os} -- Windows Vista. Rozhranie zmenilo názov na kryptografické \acrshort{api} novej generácie (ďalej \acrshort{cng}\footnote{Z ang.\textit{ \acrlong{cng}}.}). Dôležité je, že došlo k~rozšíreniu a~taktiež úprave pôvodného rozhrania. Dôsledkom toho sa zabezpečila aj spätná \textbf{kompatibilita} voči už nasadeným systémom. Schéma \ref{o:capi2} znázorňuje uvedenú skutočnosť.

Rozhranie \acrshort{cng} prinieslo množstvo nových funkcií, pričom ich konštrukcia bola vytvorená na~základe noriem definovaných v~dokumente FIPS 140-2\cite{fips1402}. Príkladmi sú:
\begin{itemize}
	\item nový spôsob konfigurácie rozhrania,
	\item nové kryptografické rozhranie pre jadro systému -- \textit{z ang. kernel-mode},
	\item oddelenie úložiska dát od operácií algoritmov,
	\item vylepšený proces izolácie od operácií s dlhodobým kľúčom,
	\item vylepšenie v oblasti uloženia, obnovenia, importu a exportu kľúčov,
	\item podpora kryptografie pomocou eliptických kriviek,
	\item podpora piatich režimov\footnote{	Elektronická kódovaná kniha (\acrshort{ecb}),  Zreťazené blokové šifrovanie (\acrshort{cbc}), Šifrovanie pomocou zašifrovaného textu \acrshort{cfb}, CBC čítačový režim (\acrshort{ccm}) a Galoisov čítačový řezim (\acrshort{gcm}).} v šifrovacom rozhraní, pri šifrovaní pomocou symetrických blokových šifier
	\item a iné.
\end{itemize}

\begin{figure}[!ht]
	\centering
	\includegraphics[width=.5\textwidth]{figures/addcngtowin}
	\caption{Schéma architektúry po inovácií\label{o:capi2}}
\end{figure} 

Zmeny nastali aj v~oblasti \acrshort{rng}. V~rozhraní je k~dispozícií možnosť zmeniť predvolený generátor náhodných čísel. Taktiež je~možné zameniť ho v~\acrshort{csp}. Avšak táto zmena nie je možná v~prípade hlavného poskytovateľa týchto služieb, ktorým je Microsoft Base \acrshort{csp}. Vďaka tomu je~tiež možné špecifikovať určitý typ generátorov k~určitému volaniu príslušnej funkcie. 

V~prípade \acrshort{cng} rozhrania bola uverejnená aj architektúra, ale len niektorých častí. Spoločnosť v oficiálnej dokumentácii k rozhraniu zverejnila návrh i použité algoritmy. Na ich základe je vytvorená schéma \ref{o:cng}.  
\begin{figure}[!ht]
	\centering
	\includegraphics[width=\textwidth]{figures/cngprimarch}
	\caption{Schéma architektúry CNG primitív\label{o:cng}}
\end{figure} 
\section{Aktuálny prístup k rozhraniu \acrshort{rng}}\label{access}
Postupom času dochádzalo k~úprave a vylepšeniam \acrshort{api}. Dokument \cite[kap. 2]{winvslinux}, opisuje prístup ku~generátoru náhodných čísel v \acrshort{cng} module\footnote{Prístup bol demonštrovaný v \acrshort{os} Windows 8.}. Základné mechanizmy systému boli lepšie vysvetlené práve v~skorších verziách. Nasledujúce myšlienky sú parafrázami vyššie uvedenej publikácie a dokumentu \cite{win10rng}. Publikácia \cite{win10rng} opisuje obdobne prístup k~\acrshort{rng}, avšak v~aktuálnom \acrshort{os} Windows 10.

Funkcie rozhrania sú prístupné v~dvoch režimoch:
\begin{itemize}
	\item režim jadra -- z~ang. \textit{kernel mode},
	\item používateľský režim --  z~ang. \textit{user mode}.
\end{itemize}
V~oboch režimoch je prístup k službám rozhrania identický. Rozdiel je v~spôsobe,  účeloch volania a~prerušeniach systému. Režim jadra je využívaný výhradne aplikáciami a komponentami jadra \acrshort{os}\footnote{Prístup používateľa k tomuto módu je možné realizovať implementáciou vlastného modulu.}. Na realizáciu tohto úkonu slúži rozhranie \textbf{SystemPRNG}, ktoré je súčasťou ovládača, resp. modulu -- \textbf{CNG.SYS}. V prípade používateľa je prístup k generátoru zložitejší. Je riešený pomocou rozhrania \textbf{ProcessPRNG}. To~je~súčasťou dynamicky pripojenej knižnice -- \textbf{bcryptprimitives.dll}. Tá následne získa prístup k~softvérovému \acrshort{rng} a~entropií pomocou SystemPRNG v module CNG.SYS. Schéma \ref{o:cng2} opisuje tento prístup už aj~s~primárne určenými funkciami a~rozhraniami, ktoré aplikácie volajú pri žiadosti o náhodné dáta.
\begin{figure}[!ht]
	\centering
	\includegraphics[width=.8\textwidth]{figures/schema prístupu generátora}
	\caption{Schéma prístupu kryptografických aplikácií k~náhodným číslam \label{o:cng2}}
\end{figure}

Používateľ má možnosť zvoliť iného \acrshort{csp}\footnote{Opísaný v \ref{cryptoapi}.} na~získanie prístupu k~softvérovému  \acrshort{rng}. Teda \acrshort{os} nie je~nevyhnutne odkázaný iba na~prednastavené riešenie a poskytuje užívateľovi väčšiu voľnosť pri~voľbe \acrshort{csp}.
\section{Infraštruktúra použitých PRNG} 
OS Windows používa na generovanie náhodných čísel viacero typov a~označení pre~jednotlivé \acrshort{prng}. V~tejto podkapitole je uvedená ich charakteristika. Informácie boli čerpané z \cite[str. 1]{win10rng}.

Ako prvý opíšeme tzv. \textbf{základný PRNG} \footnote{Z~ang. \textit{Basic PRNG}.}. Na~všetko generovanie náhodných čísel je použitý algoritmus AES-256 v~čítačovom režime, ktorý bol spomenutý v~prvej kapitole. Jeho konštrukcia je založená podľa normy SP800-90 \cite{book} a~generátor nesie označenie AES\_CTR\_DRBG. Zároveň patrí do~kategórie \acrshort{csprng}. Poskytuje ochranu na~úrovni 256-bitov. Na~inicializáciu tajnej počiatočnej hodnoty (ďalej ako seed) používa funkciu \verb|df()|. 

Ďalšie označenie, ktoré sa~používa v~systéme je~tzv. \textbf{buffer-ovaný PRNG} \footnote{Z~ang. \textit{Buffered PRNG}.}. Základný RNG nie je používaný priamo, ale prostredníctvom ochrannej vrstvy \footnote{Z~ang. \textit{Wrapping layer}.}. Tá~poskytuje generátoru niekoľko vlastností. Konkrétne: 
\begin{itemize}
	\item pridáva malý zásobník -- ďalej buffer, 
	\item uzatvára podporu viac-vlaknovosti (z~ang. \textit{multi-threading}), 
	\item poskytuje verziu seed-u. 
\end{itemize}
Ukladanie dát do~buffer-a sa realizuje priamo a~zlepšuje výkon najmä pri~generovaní menšieho množstva čísel. Jeho veľkosť je~128 bajtov. Plní sa vždy po použití uvedenej veľkosti dát. Predstavme si, že obsahuje napríklad 10 bajtov. Systém vyšle požiadavku na~väčší objem dát ako sa~nachádza v~buffer-i. V~tomto prípade sa použijú spomínané bajty uložené v~buffer-i a zvyšok sa~dodá po~doplnení zásobníka. Tento~úkon zabezpečí vyššie opísaný základný generátor. Po~použití bajtov dochádza k vynulovaniu príslušných pozícií. Aktualizácia tejto vyrovnávacej pamäte sa~uskutočňuje obdobne pri~každej aplikácii nového seed-u (ďalej ako \textbf{reseed}). Všetky údaje sa prepíšu. V~prípade, že požiadavka o~náhodné dáta prekračuje veľkosť 128 bajtov, tak~generovanie výstupov je uskutočnené priamo základným PRNG.
Prístup k~stavu buffer-ovaného PRNG je~zablokovaný. Tým~sa~zabezpečuje, že ostatné vlákna nemôžu čítať ani modifikovať rovnaké stavy v~rovnakom čase.

\textbf{Koreňový \acrshort{prng}}\footnote{Z ang. \textit{Root PRNG}.}. S~takto označeným generátorom sa stretávame pri~tvorbe a~ukladaní náhodnosti v~entropickom systéme\footnote{Charakterizovaný v podkapitole číslo \ref{es}.}. Je~súčasťou CNG.SYS modulu a~ide o~už~vyššie opísaný buffer-ovaný \acrshort{prng}. 

V~režime jadra je použitý opäť buffer-ovaný \acrshort{prng} s~daným stavom pre~logický procesor. To~znamená, že~ak máme 8 jadrový procesor s~podporou tzv.~\textbf{viacerých vlakien}\footnote{Z ang. \textit{Hyperthreading}.}, tak~máme k~dispozícií 16 logických procesorov.
V~prípade, že~aplikácia požiada o~náhodne dáta v~režime jadra, tak algoritmus skontroluje, ktorý z~procesorov je~aktívny a~overí stav generátora. Ak~bol generátor alokovaný v~tom-to procesore, tak~následne sa~použije na~generovanie náhodných dát. V~opačnom prípade dochádza k~návratu na~pôvodný procesor. Tento \acrshort{cpu} sa~následne pokúša o~alokovanie nového stavu PRNG. Dodanie seed-u zabezpečí zdrojový generátor. Ak~proces alokácie nebude úspešný, tak~o~službu generovania sa~postará zdrojový generátor. V~praxi však k~neúspešnej alokácii nedochádza a~náhodné dáta dodá PRNG z~\acrshort{cpu}. Anglické označenie vyššie opísaného PRNG v~OS Windows 10 je tzv. \textit{Kernel per-processor PRNG}.

Pre~používateľa sa~mení iba spôsob prístupu ku~generátoru. Každý proces vytvorený užívateľom, ktorý vytvorí požiadavku o~náhodné dáta, je spracovaný dynamickou knižnicou bcryptprimitives.dll. Tá vytvorí tzv. \textit{ProcessPRNG}. Ním žiada režim jadra o~generovanie náhodných bitov, prostredníctvom vyššie opísaného spôsobu. Tento celý proces dokáže zlyhať jedine v~prípade, že načítanie knižnice bcryptprimitives nebude úspešné. V~tomto prípade je~celý proces zrušený.
V~praxi sa na~bežiacom počítači tento postup opakuje pri~každom procese, ktorý vyžaduje náhodné dáta. 
 
Výsledný počet celkovo aktívnych stavov PRNG je možne vyjadriť ako súčin $(N+1) * (M+1)$. $N$ nám označuje množstvo jadier systému a $M$ počet spustených procesov, ktoré vyžadujú náhodné dáta. Takýto súčin nám vytvára celkom veľký výsledok aktívnych PRNG s príslušným stavom. To však už v súčasnosti nie je problém, pretože výkonné počítače obsahujú dostatok pamäte, aby to~bez~problémov zvládli. V~odbornej literatúre sa~definuje vyššie uvedený prístup jedného procesu k~generátoru pomocou anglického výrazu \textit{Process base PRNG}. Pohľad z~vyššej perspektívy definuje výraz \textit{Process per-processor PRNG}.       
\section{Entropický systém}\label{es}
Nasledujúci opis vychádza z~dokumentu \cite[str. 6]{win10rng}. Dodanie náhodnosti má za~úlohu špeciálny nástroj -- \textbf{Entropický systém}. V~\acrshort{os} Windows 10 pozostáva z~niekoľkých častí, resp. komponentov. Tvoria ho~konkrétne:

\begin{itemize}
	\item zdroje náhodnosti -- z~ang. \textit{Entropy sources},
	\item uložiská náhodnosti -- z~ang. \textit{Entropy pools}, slúžia ako úložisko dát zdrojov entropie, ktoré sa následne používajú ako~seed hodnota pre \acrshort{prng}.
	\item obnovovacia, resp. resetovacia logiky seed-u \footnote{Z~ang. \textit{Reseed logic}.}. Jej úlohou je rozhodovať ako a~kedy dôjde k~aktualizácii seed hodnoty v~zdrojovom \acrshort{prng} z~polí náhodnosti.
\end{itemize}
Proces reseed-u zdrojového generátora sa~opakuje periodicky pomocou časového plánovača. Spúšťa sa jednu sekundu po~inicializácii OS a~následne každým troj-násobkom predchádzajúcej hodnoty (3, 9, 27, ...). Koniec nastane po~dosiahnutí časového limitu. Ten je nastavený na jednu hodinu teda 3600 sekúnd. Plánovanie je nastavené tak,~aby k~reseed-u došlo iba v prípade, ak je CPU prebudený. Dôvodom sú~vysoké energetické nároky na prebudenie.

\subsection{Zdroje náhodnosti}
Ich~úlohou je~poskytovať náhodné dáta. Výstup je~následne uložený v~uložiskách entropie.

Súčasťou jadra rozhrania systému je~rozhranie na~vytváranie nových zdrojov entropie. \acrshort{api} vo~všeobecnosti podporuje dva typy zdrojov:
\begin{itemize}
	\item nízke -- z~ang. \textit{low pull},
	\item vysoké -- z~ang. \textit{high pull/push}.
\end{itemize} 
Rozdiely v~ich~spracovaní sú~minimálne. Nízke zdroje označujú nepodmienené udalosti ako je~napríklad pohyb myši. Tie~však môžu byť reprodukovateľné. Vysokokvalitné náhodné dáta zabezpečujú vysoké zdroje. V prípade potreby dokážu ihneď (okamžite) poskytnúť entropiu všetky z uvedených zdrojov. Rozdiel medzi typom \textbf{pull} a~\textbf{push} je v~tom, že~prvý spomenutý neobsahuje vlastnú logiku časovania na~obnovu entropie. Tieto zdroje sú dodatočne informované pri~každom použití zdrojovým \acrshort{rng}.

Prerozdelenie dát v rámci jednotlivých uložísk entropie sa~riadi pomocou tzv. z~ang. \textit{Round-Robin\footnote{\url{https://en.wikipedia.org/wiki/Round-robin\_scheduling}.}} plánovania. Pri vysokých zdrojoch sa~vždy prvých 32 bajtov ukladá do~prvého úložiska entropie a~zvyšné sa~uložia do~poľa, ktoré nasleduje podľa plánu. Viac informácii k zdrojom náhodnosti je dostupných v \cite[str. 8]{win10rng}.

\subsubsection{Použité zdroje náhodnosti v OS Windows 10 \cite[str. 8]{win10rng}}
 Windows 10 používa viacero zdrojov entropie za~účelom poskytnúť dostatočnú entropiu v~každej situácii. V odbornej literatúre sa uvádzajú tieto zdroje.
 \begin{itemize}
 	\item \textbf{Časovače prerušení} -- primárny zdroj. Každé prerušenie je~spracované pomocou \acrshort{tsc}\footnote{Z ang. \textit{Time Stamp Counter}.}. Je~to~počítadlo, ktoré beží v~procesore. V~x86 a~x64 architektúrach sa~na~získanie jeho hodnoty používa inštrukcia \acrshort{rdtsc} (\cite{rdtsc}, \cite{intelcycle}). V~rámci inštrukcie dochádza k~rotovaniu a~následnému xorovaniu hodnôt predtým než~sú~poskytnuté ďalej.
 	\item \textbf{Štart} -- pri štarte systému dochádza k~zhromažďovaniu TSC údajov pred~načítaním CNG modulu. Tento proces typicky sprevádza niekoľko stoviek prerušení. Po~inicializácii tohto ovládača sa~údaje použijú hneď ako seed pre~koreňový generátor. Teda polia entropie sú~v~toto kroku vynechané. Tento krok zabezpečuje, že~systém má~po~štarte k~dispozícii dostatok entropie. 
 	\item \textbf{\acrshort{tpm}}\cite{tpm} -- pri~štarte dodáva 40 bajtov. Po~registrácii zdroja poskytuje 64 bajtov pri~každom reseede. Ten~sa~opakuje raz za~40 minút.
 	\item \textbf{RDRAND/RDSEED} -- procesorové inštrukcie na tvorbu náhodných dát.
 	\item \textbf{Seed súbor} -- register v~podsystéme registrov. Zapisuje sa~pri~štarte a~vypnutí systému. Vytvára ho~OS a je použitý pri~ďalšom štarte systému (z~ang. \textit{boot}). Nová hodnota je~zapísaná pomocou výstupu systémového \acrshort{prng}. Jeho~veľkosť je~64 bajtov. Ak~však dôjde k~netradičnému vypnutiu OS, tak~zápis prebieha aj~počas behu. Štyri minúty po~obnovení systému dochádza každým trojnásobkom tohto času k~periodickému zápisu až~do~dosiahnutia limitu ôsmich hodín. Pri~vypnutí dochádza k~použitiu všetkej uloženej náhodnosti zdrojovým generátorom. Výstup je~uložený v~tomto súbore a~pri nasledujúcom štarte použitý pomocou winload modulu. 
 	\item \textbf{Externý zdroj} -- používateľ má~možnosť pridať k~zdrojom aj~vlastný. Použije sa pri~bootovaní systému pomocou winload modulu a~po~nasadení CNG.SYS ovládača sa~tento zdroj po~štarte odstraňuje.
 	\item \textbf{ACPI-OEM0} -- je to \acrshort{acpi}\footnote{Z ang.\textit{ Advanced Configuration and Power Interface}.} \cite{acpi} tabuľka s názvom \acrshort{oem}0\footnote{Z ang. \textit{Original Equipment Manufacturer}.}. Vytvára ju~hypervízor Hyper-V. Jej~obsahom je~64 bajtov náhodných dát.
 	\item \textbf{Firmvérové údaje}.
 	\item \textbf{\acrshort{uefi}}\cite{uefi} protokol.
 	\item \textbf{Čas spustenia}.
 	 
 \end{itemize}
 
\subsection{Úložiská entropie -- Entropy pools}
Každé pole, respektíve úložisko entropie je~implementované pomocou hašovacej funkcie SHA-512, ktorá patrí do~rodiny SHA2\cite{sha2}. To~znamená, že~všetky dáta tohto poľa sú~výstupom SHA funkcie. Ten~je~pridaný na~koniec daného poľa. Vstup hashovacej funkcie tvoria zdroje entropie.
Pri štarte systému existuje len jedno takéto úložisko. Po dosiahnutí limitu reseed-u sa zapne možnosť viacerých, resp. dodatočných úložísk entropie. A~povolí sa~vytvorenie ďalšieho poľa. Dizajn viacnásobného úložiska entropie systému opisuje príloha v~dokumente \cite{win10rng}. 
\subsection{Štart systému}
Pri~štarte systému dochádza k~prvotnému seedu. Uskutočňuje~ho modul Winload pred~štartom ovládača Ntoskml. Proces vytvorenia tajnej hodnoty je~opísaný v schéme \ref{o:osinit}. 
\begin{figure}[!ht]
	\centering
	\includegraphics[width=.7\textwidth]{figures/osinit}
	\caption{Schéma vytvorenia prvotného seed-u pri inicializácií systému\label{o:osinit}}
\end{figure}
  Výstup týchto dát je~použitý generátorom \textbf{AES-\acrshort{ctr}-DRBG} podľa normy SP 800-90\cite{book}. 48 bajtov výstupu je~použitých modulom CNG.SYS a~zvyšok je presmerovaný do~jadra na~budúce použitie. Spomenuté bajty sú~použité zdrojovým \acrshort{prng}. Následne sa~spúšťa vytváranie vlastnej entropie pomocou vyššie opísaných zdrojov. Informácie boli čerpané z \cite[str. 8]{win10rng}. 
\section{Zhrnutie bezpečnosti operačného systému}
Aktuálne platnú validáciu FIPS 140-3, OS Windows 10\footnote{Zoznam schválených produktov spoločnosti Microsoft je dostupný na stránke: \url{https://docs.microsoft.com/en-us/windows/security/threat-protection/fips-140-validation}.} spĺňa aj~napriek tomu, že~kryptografické rozhranie obsahuje, v~niektorých prípadoch aj~používa, neschválené, resp. neodporúčané algoritmy. Tie~sa v~dnešnej dobe naďalej nepovažujú za~kryptograficky bezpečné. \acrshort{os} však ponúka riešenie aj~pre užívateľov, ktorí vyžadujú použitie aktuálne platných štandardov. Ide o~tzv. \textbf{FIPS režim}. Ten je~dostupný v každej edícií Windows-u 10, okrem Home verzie. Postup, ako spustiť daný režim, je~dostupný na~stránke spoločne so~zoznamom systémov, ktoré sú schválené. 

