linux/crypto/ansi_cprng.c
<<
> < href="../linux+v3.9.7/crypto/ansi_cprng.c"> > o/spa> ospa> class="lxr_search"> >="+search" method="post" onsubmit="return do_search(this);"> > > > Search ospa> class="lxr_prefs" < onclick="return ajax_prefs();"> > o/spa> > < < ="ajax+*" method="post" onsubmit="return false;"> oinput typ="vhidden" nam="vajax_lookup" id"vajax_lookup" alue="v"> > < <
<
< < < odiv id"vfile_contents"
< <1o/a>ospa> class="comment">/*o/spa>
 < <2o/a>ospa> class="comment"> * PRNG: Pseudo Random Number Generatoro/spa>
 < <3o/a>ospa> class="comment"> *       Based on NIST Recommended PRNG From ANSI X9.31 Appendix A.26< usingo/spa>
 < <4o/a>ospa> class="comment"> *       AES 128 ciphero/spa>
 < <5o/a>ospa> class="comment"> *o/spa>
 < <6o/a>ospa> class="comment"> *  (C) Neil Horma> <nhorma>@tuxdriver.com>o/spa>
 < <7o/a>ospa> class="comment"> *o/spa>
 < <8o/a>ospa> class="comment"> *  This program is free software; you ca> redistribute it and/or modify ito/spa>
 < <9o/a>ospa> class="comment"> *  under the terms of the GNU General Public License as published by theo/spa>
 < 0ospa> class="comment"> *  Free Software Foundaion>; either verson v2 of the License, or (at youro/spa>
 < 11o/a>ospa> class="comment"> *  any later verson .o/spa>
 < 12o/a>ospa> class="comment"> *o/spa>
 < 13o/a>ospa> class="comment"> *o/spa>
 < 14o/a>ospa> class="comment"> */o/spa>
 < 15o/a> < 16o/a>#include <crypto/internal/rng.ho/a>> < 17o/a>#include <linux/err.ho/a>> < 18o/a>#include <linux/init.ho/a>> < 19o/a>#include <linux/module.ho/a>> < 20o/a>#include <linux/moduleparam.ho/a>> < 21o/a>#include <linux/string.ho/a>> < 22o/a> < 23o/a>#include "internal.ho/a>" < 24o/a> < 25o/a>#defineDEFAULT_PRNG_KEYo/a> ospa> class="string">"0123456789abcdef"
 < 26o/a>#defineDEFAULT_PRNG_KSZo/a> 16 < 27o/a>#defineDEFAULT_BLK_SZo/a> 16 < 28o/a>#defineDEFAULT_V_SEEDo/a> ospa> class="string">"zaybxcwdveuftgsh"
 < 29o/a> < 3ospa> class="comment">/*o/spa>
 < 31o/a>ospa> class="comment"> * Flags for the prng_context flags fieldo/spa>
 < 32o/a>ospa> class="comment"> */o/spa>
 < 33o/a> < 34o/a>#definePRNG_FIXED_SIZEo/a> 0x1 < 35o/a>#definePRNG_NEED_RESETo/a> 0x2 < 36o/a> < 37o/a>ospa> class="comment">/*o/spa>
 < 38o/a>ospa> class="comment"> * Note: DT is our counter vlue=o/spa>
 < 39o/a>ospa> class="comment"> *       I is our intermediate vlue=o/spa>
 < 4ospa> class="comment"> *       V is our seed vectoro/spa>
 < 41o/a>ospa> class="comment"> * See http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdfo/spa>
 < 42o/a>ospa> class="comment"> * for implementaion> detailso/spa>
 < 43o/a>ospa> class="comment"> */o/spa>
 < 44o/a> < 45o/a> < 46o/a>structprng_contexto/a> { < 47o/a>       spinlock_to/a> oa href="+code=prng_lock" class="sref">prng_locko/a>; < 48o/a>       rand_datao/a>[oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>]; < 49o/a>       last_rand_datao/a>[oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>]; < 50o/a>       DTo/a>[oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>]; < 51o/a>       Io/a>[oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>]; < 52o/a>       Vo/a>[oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>]; < 53o/a>       u32o/a> oa href="+code=rand_data_vluid" class="sref">rand_data_vluido/a>; < 54o/a>       crypto_ciphero/a> *oa href="+code=tfm" class="sref">tfmo/a>; < 55o/a>       u32o/a> oa href="+code=flags" class="sref">flagso/a>; < 56o/a>}; < 57o/a> < 58o/a>static int oa href="+code=dbg" class="sref">dbgo/a>; < 59o/a> < 60o/a>static void oa href="+code=hexdump" class="sref">hexdumpo/a>(char *oa href="+code=note" class="sref">noteo/a>,bufo/a>,leno/a>) < 61o/a>{ < 62o/a>       dbgo/a>) { < 63o/a>       <       printko/a>(oa href="+code=KERN_CRIT" class="sref">KERN_CRITo/a> ospa> class="string">"%s"
,noteo/a>); < 64o/a>       <       print_hex_dumpo/a>(oa href="+code=KERN_CONT" class="sref">KERN_CONTo/a>, class="string">""
,DUMP_PREFIX_OFFSETo/a>, < 65o/a>       <       <<<<<<<<<<<<<<<<<16, 1, < 66o/a>       <       <<<<<<<<<<<<<<<<bufo/a>,leno/a>,falseo/a>); < 67o/a>       <} < 68o/a>} < 69o/a> < 70o/a>#definedbgprinto/a>(oa href="+code=format" class="sref">formato/a>,argso/a>...) do {\ < 71o/a>if (oa href="+code=dbg" class="sref">dbgo/a>)\ < 72o/a>       printko/a>(oa href="+code=format" class="sref">formato/a>,<##args);\ < 73o/a>} while (0) < 74o/a> < 75o/a>static void oa href="+code=xor_vectors" class="sref">xor_vectorso/a>(unsigned char *oa href="+code=in1" class="sref">in1o/a>,in2o/a>, < 76o/a>       <       <<<<<<<<outo/a>,sizeo/a>) < 77o/a>{ < 78o/a>       io/a>; < 79o/a> < 80o/a>       io/a> = 0; oa href="+code=i" class="sref">io/a> < oa href="+code=size" class="sref">sizeo/a>; oa href="+code=i" class="sref">io/a>++) < 81o/a>       <       outo/a>[oa href="+code=i" class="sref">io/a>] = oa href="+code=in1" class="sref">in1o/a>[oa href="+code=i" class="sref">io/a>] ^ oa href="+code=in2" class="sref">in2o/a>[oa href="+code=i" class="sref">io/a>]; < 82o/a> < 83o/a>} < 84o/a>ospa> class="comment">/*o/spa>
 < 85o/a>ospa> class="comment"> * Returns DEFAULT_BLK_SZ bytes of random data per callo/spa>
 < 86o/a>ospa> class="comment"> * returns 0 succeeded, <0
 < 87o/a>ospa> class="comment"> */o/spa>
 < 88o/a>static int oa href="+code=_get_more_prng_bytes" class="sref">_get_more_prng_byteso/a>(structprng_contexto/a> *oa href="+code=ctx" class="sref">ctxo/a>,cont_testo/a>) < 89o/a>{ < 90o/a>       io/a>; < 91o/a>       tmpo/a>[oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>]; < 92o/a>       outputo/a> = oa href="+code=NULL" class="sref">NULLo/a>; < 93o/a> < 94o/a> < 95o/a>       dbgprinto/a>(oa href="+code=KERN_CRIT" class="sref">KERN_CRITo/a> ospa> class="string">"Calling _get_more_prng_bytes
, < 96o/a>       <       ctxo/a>); < 97o/a> < 98o/a>       hexdumpo/a>(ospa> class="string">"Input DT: "
,ctxo/a>->oa href="+code=DT" class="sref">DTo/a>,DEFAULT_BLK_SZo/a>); < 99o/a>       hexdumpo/a>(ospa> class="string">"Input I: "
,ctxo/a>->oa href="+code=I" class="sref">Io/a>,DEFAULT_BLK_SZo/a>); <100o/a>       hexdumpo/a>(ospa> class="string">"Input V: "
,ctxo/a>->oa href="+code=V" class="sref">Vo/a>,DEFAULT_BLK_SZo/a>); <101o/a> <102o/a>        class="comment">/*o/spa>
 <103o/a>ospa> class="comment">         * This algorithm is a 3 stage state machineo/spa>
 <104o/a>ospa> class="comment">         */o/spa>
 <105o/a>       io/a> = 0; oa href="+code=i" class="sref">io/a> < 3; oa href="+code=i" class="sref">io/a>++) { <106o/a> <107o/a>       <       io/a>) { <108o/a>       <       <109o/a>       <       <        class="comment">/*o/spa>
 <10ospa> class="comment">                         * Start by encrypting the counter vlue=o/spa>
 <111o/a>ospa> class="comment">                         * This gives
 <112o/a>ospa> class="comment">                         */o/spa>
 <113o/a>       <       <       memcpyo/a>(oa href="+code=tmp" class="sref">tmpo/a>,ctxo/a>->oa href="+code=DT" class="sref">DTo/a>,DEFAULT_BLK_SZo/a>); <114o/a>       <       <       outputo/a> = oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=I" class="sref">Io/a>; <115o/a>       <       <<<<<<<<hexdumpo/a>(ospa> class="string">"tmp stage 0: "
,tmpo/a>,DEFAULT_BLK_SZo/a>); <116o/a>       <       <<<<<<<<<117o/a>       <       <118o/a> <119o/a>       <       <        class="comment">/*o/spa>
 <12ospa> class="comment">                         * Next xor I with our secret vector Vo/spa>
 <121o/a>ospa> class="comment">                         * encrypt that result to obtain ouro/spa>
 <122o/a>ospa> class="comment">                         * pseudo random data which we outputo/spa>
 <123o/a>ospa> class="comment">                         */o/spa>
 <124o/a>       <       <       xor_vectorso/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=I" class="sref">Io/a>,ctxo/a>->oa href="+code=V" class="sref">Vo/a>,tmpo/a>,DEFAULT_BLK_SZo/a>); <125o/a>       <       <<<<<<<<hexdumpo/a>(ospa> class="string">"tmp stage 1: "
,tmpo/a>,DEFAULT_BLK_SZo/a>); <126o/a>       <       <<<<<<<<outputo/a> = oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=rand_data" class="sref">rand_datao/a>; <127o/a>       <       <<<<<<<<<128o/a>       <       <129o/a>       <       <        class="comment">/*o/spa>
 <13ospa> class="comment">       <       <       < * First check that we didn't produce the sam=o/spa>
 <131o/a>ospa> class="comment">       <       <       < * random data that we did last time around through thiso/spa>
 <132o/a>ospa> class="comment">       <       <       < */o/spa>
 <133o/a>       <       <       memcmpo/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=rand_data" class="sref">rand_datao/a>,ctxo/a>->oa href="+code=last_rand_data" class="sref">last_rand_datao/a>, <134o/a>       <       <       <<<<<<<<<<<<<<<<DEFAULT_BLK_SZo/a>)) { <135o/a>       <       <<<<<<<<<<<<<<<<cont_testo/a>) { <136o/a>       <       <<<<<<<<<<<<<<<<<<<<<<<<pa>ico/a>(ospa> class="string">"cprng %p Failed repetiton> check!\n"
, <137o/a>       <       <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ctxo/a>); <138o/a>       <       <<<<<<<<<<<<<<<<<} <139o/a> <140o/a>       <       <<<<<<<<<<<<<<<<printko/a>(oa href="+code=KERN_ERR" class="sref">KERN_ERRo/a> <141o/a>       <       <       <<<<<<<<<<<<<<<< class="string">"ctx %p Failed repetiton> check!\n"
, <142o/a>       <       <<<<<<<<<<<<<<<<<<<<<<<<ctxo/a>); <143o/a> <144o/a>       <       <       <<<<<<<<ctxo/a>->oa href="+code=flags" class="sref">flagso/a> |= oa href="+code=PRNG_NEED_RESET" class="sref">PRNG_NEED_RESETo/a>; <145o/a>       <       <<<<<<<<<<<<<<<<EINVALo/a>; <146o/a>       <       <<<<<<<<<} <147o/a>       <       <<<<<<<<memcpyo/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=last_rand_data" class="sref">last_rand_datao/a>, oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=rand_data" class="sref">rand_datao/a>, <148o/a>       <       <<<<<<<<<<<<<<<<DEFAULT_BLK_SZo/a>); <149o/a> <150o/a>       <       <<<<<<<< class="comment">/*o/spa>
 <151o/a>ospa> class="comment">       <       <       < * Lastly xor the random data with Io/spa>
 <152o/a>ospa> class="comment">                         * and encrypt that to obtain a new secret vector Vo/spa>
 <153o/a>ospa> class="comment">                         */o/spa>
 <154o/a>       <       <       xor_vectorso/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=rand_data" class="sref">rand_datao/a>,ctxo/a>->oa href="+code=I" class="sref">Io/a>,tmpo/a>, <155o/a>       <       <<<<<<<<<<<<<<<<DEFAULT_BLK_SZo/a>); <156o/a>       <       <<<<<<<<outputo/a> = oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=V" class="sref">Vo/a>; <157o/a>       <       <<<<<<<<hexdumpo/a>(ospa> class="string">"tmp stage 2: "
,tmpo/a>,DEFAULT_BLK_SZo/a>); <158o/a>       <       <<<<<<<<<159o/a>       <       <} <160o/a> <161o/a> <162o/a>       <        class="comment">/* do the encryptin> */o/spa>
 <163o/a>       <       crypto_cipher_encrypt_oneo/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=tfm" class="sref">tfmo/a>,outputo/a>,tmpo/a>); <164o/a> <165o/a>       <} <166o/a> <167o/a>        class="comment">/*o/spa>
 <168o/a>ospa> class="comment">         * Now update our DT vlue=o/spa>
 <169o/a>ospa> class="comment">         */o/spa>
 <170o/a>       io/a> = oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a> - 1; oa href="+code=i" class="sref">io/a> >= 0; oa href="+code=i" class="sref">io/a>--) { <171o/a>       <       ctxo/a>->oa href="+code=DT" class="sref">DTo/a>[oa href="+code=i" class="sref">io/a>] += 1; <172o/a>       <       ctxo/a>->oa href="+code=DT" class="sref">DTo/a>[oa href="+code=i" class="sref">io/a>] != 0) <173o/a>       <       <       <174o/a>       <} <175o/a> <176o/a>       dbgprinto/a>(ospa> class="string">"Returning new block
,ctxo/a>); <177o/a>       ctxo/a>->oa href="+code=rand_data_vluid" class="sref">rand_data_vluido/a> = 0; <178o/a> <179o/a>       hexdumpo/a>(ospa> class="string">"Output DT: "
,ctxo/a>->oa href="+code=DT" class="sref">DTo/a>,DEFAULT_BLK_SZo/a>); <180o/a>       hexdumpo/a>(ospa> class="string">"Output I: "
,ctxo/a>->oa href="+code=I" class="sref">Io/a>,DEFAULT_BLK_SZo/a>); <181o/a>       hexdumpo/a>(ospa> class="string">"Output V: "
,ctxo/a>->oa href="+code=V" class="sref">Vo/a>,DEFAULT_BLK_SZo/a>); <182o/a>       hexdumpo/a>(ospa> class="string">"New Random Data: "
,ctxo/a>->oa href="+code=rand_data" class="sref">rand_datao/a>,DEFAULT_BLK_SZo/a>); <183o/a> <184o/a>       <185o/a>} <186o/a> <187o/a>ospa> class="comment">/* Our exported funcion>s */o/spa>
 <188o/a>static int oa href="+code=get_prng_bytes" class="sref">get_prng_byteso/a>(char *oa href="+code=buf" class="sref">bufo/a>,size_to/a> oa href="+code=nbytes" class="sref">nbyteso/a>,prng_contexto/a> *oa href="+code=ctx" class="sref">ctxo/a>, <189o/a>       <       <       <       do_cont_testo/a>) <190o/a>{ <191o/a>       ptro/a> = oa href="+code=buf" class="sref">bufo/a>; <192o/a>       byte_counto/a> = (unsigned int)oa href="+code=nbytes" class="sref">nbyteso/a>; <193o/a>       erro/a>; <194o/a> <195o/a> <196o/a>       spin_lock_bho/a>(&oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=prng_lock" class="sref">prng_locko/a>); <197o/a> <198o/a>       erro/a> = -oa href="+code=EINVAL" class="sref">EINVALo/a>; <199o/a>       ctxo/a>->oa href="+code=flags" class="sref">flagso/a> & oa href="+code=PRNG_NEED_RESET" class="sref">PRNG_NEED_RESETo/a>) <200o/a>       <       doneo/a>; <201o/a> <202o/a>        class="comment">/*o/spa>
 <203o/a>ospa> class="comment">         * If the FIXED_SIZE flag is on, only
 <204o/a>ospa> class="comment">         * pseudo random datao/spa>
 <205o/a>ospa> class="comment">         */o/spa>
 <206o/a>       erro/a> = -oa href="+code=EINVAL" class="sref">EINVALo/a>; <207o/a>       ctxo/a>->oa href="+code=flags" class="sref">flagso/a> & oa href="+code=PRNG_FIXED_SIZE" class="sref">PRNG_FIXED_SIZEo/a>) { <208o/a>       <       nbyteso/a> < oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>) <209o/a>       <       <       doneo/a>; <210o/a>       <       byte_counto/a> = oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>; <211o/a>       <} <212o/a> <213o/a>       erro/a> = oa href="+code=byte_count" class="sref">byte_counto/a>; <214o/a> <215o/a>       dbgprinto/a>(oa href="+code=KERN_CRIT" class="sref">KERN_CRITo/a> ospa> class="string">"getting %d random bytes
, <216o/a>       <       byte_counto/a>,ctxo/a>); <217o/a> <218o/a> <219o/a>oa href="+code=remainder" class="sref">remaindero/a>: <220o/a>       ctxo/a>->oa href="+code=rand_data_vluid" class="sref">rand_data_vluido/a> == oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>) { <221o/a>       <       _get_more_prng_byteso/a>(oa href="+code=ctx" class="sref">ctxo/a>, oa href="+code=do_cont_test" class="sref">do_cont_testo/a>) < 0) { <222o/a>       <       <<<<<<<<memseto/a>(oa href="+code=buf" class="sref">bufo/a>,<0,nbyteso/a>); <223o/a>       <       <       erro/a> = -oa href="+code=EINVAL" class="sref">EINVALo/a>; <224o/a>       <       <       doneo/a>; <225o/a>       <       <} <226o/a>       <} <227o/a> <228o/a>        class="comment">/*o/spa>
 <229o/a>ospa> class="comment">         * Copy any data less than an entire blocko/spa>
 <23ospa> class="comment">       < */o/spa>
 <231o/a>       byte_counto/a> < oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>) { <232o/a>oa href="+code=empty_rbuf" class="sref">empty_rbufo/a>: <233o/a>       <       ctxo/a>->oa href="+code=rand_data_vluid" class="sref">rand_data_vluido/a> < oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>; <234o/a>       <       <       ctxo/a>->oa href="+code=rand_data_vluid" class="sref">rand_data_vluido/a>++) { <235o/a>       <       <<<<<<<<<*oa href="+code=ptr" class="sref">ptro/a> = oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=rand_data" class="sref">rand_datao/a>[oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=rand_data_vluid" class="sref">rand_data_vluido/a>]; <236o/a>       <       <<<<<<<<ptro/a>++; <237o/a>       <       <<<<<<<<byte_counto/a>--; <238o/a>       <       <<<<<<<<byte_counto/a> == 0) <239o/a>       <       <       <       doneo/a>; <240o/a>       <       <} <241o/a>       <} <242o/a> <243o/a>        class="comment">/*o/spa>
 <244o/a>ospa> class="comment">         * Now copy whole blockso/spa>
 <245o/a>ospa> class="comment">         */o/spa>
 <246o/a>       byte_counto/a> >= oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>; oa href="+code=byte_count" class="sref">byte_counto/a> -= oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>) { <247o/a>       <       ctxo/a>->oa href="+code=rand_data_vluid" class="sref">rand_data_vluido/a> == oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>) { <248o/a>       <       <<<<<<<<_get_more_prng_byteso/a>(oa href="+code=ctx" class="sref">ctxo/a>, oa href="+code=do_cont_test" class="sref">do_cont_testo/a>) < 0) { <249o/a>       <       <       <       memseto/a>(oa href="+code=buf" class="sref">bufo/a>,<0,nbyteso/a>); <250o/a>       <       <<<<<<<<<       erro/a> = -oa href="+code=EINVAL" class="sref">EINVALo/a>; <251o/a>       <       <       <<<<<<<<doneo/a>; <252o/a>       <       <<<<<<<<<} <253o/a>       <       <} <254o/a>       <       ctxo/a>->oa href="+code=rand_data_vluid" class="sref">rand_data_vluido/a> > 0) <255o/a>       <       <<<<<<<<empty_rbufo/a>; <256o/a>       <       memcpyo/a>(oa href="+code=ptr" class="sref">ptro/a>,ctxo/a>->oa href="+code=rand_data" class="sref">rand_datao/a>,DEFAULT_BLK_SZo/a>); <257o/a>       <       ctxo/a>->oa href="+code=rand_data_vluid" class="sref">rand_data_vluido/a> += oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>; <258o/a>       <       ptro/a> += oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>; <259o/a>       <} <260o/a> <261o/a>        class="comment">/*o/spa>
 <262o/a>ospa> class="comment">         * Now go back and get any remaining partial blocko/spa>
 <263o/a>ospa> class="comment">         */o/spa>
 <264o/a>       byte_counto/a>) <265o/a>       <       remaindero/a>; <266o/a> <267o/a>oa href="+code=done" class="sref">doneo/a>: <268o/a>       spin_unlock_bho/a>(&oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=prng_lock" class="sref">prng_locko/a>); <269o/a>       dbgprinto/a>(oa href="+code=KERN_CRIT" class="sref">KERN_CRITo/a> ospa> class="string">"returning %d from get_prng_bytes in context %p\n"
, <270o/a>       <       erro/a>,ctxo/a>); <271o/a>       erro/a>; <272o/a>} <273o/a> <274o/a>static void oa href="+code=free_prng_context" class="sref">free_prng_contexto/a>(structprng_contexto/a> *oa href="+code=ctx" class="sref">ctxo/a>) <275o/a>{ <276o/a>       crypto_free_ciphero/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=tfm" class="sref">tfmo/a>); <277o/a>} <278o/a> <279o/a>static int oa href="+code=reset_prng_context" class="sref">reset_prng_contexto/a>(structprng_contexto/a> *oa href="+code=ctx" class="sref">ctxo/a>, <280o/a>       <       <<<<<<<<<      unsigned char *oa href="+code=key" class="sref">keyo/a>,size_to/a> oa href="+code=klen" class="sref">kleno/a>, <281o/a>       <       <       <<<<<<Vo/a>,DTo/a>) <282o/a>{ <283o/a>       reto/a>; <284o/a>       prng_keyo/a>; <285o/a> <286o/a>       spin_lock_bho/a>(&oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=prng_lock" class="sref">prng_locko/a>); <287o/a>       ctxo/a>->oa href="+code=flags" class="sref">flagso/a> |= oa href="+code=PRNG_NEED_RESET" class="sref">PRNG_NEED_RESETo/a>; <288o/a> <289o/a>       prng_keyo/a> = (oa href="+code=key" class="sref">keyo/a> != oa href="+code=NULL" class="sref">NULLo/a>) ? oa href="+code=key" class="sref">keyo/a> : (unsigned char *)oa href="+code=DEFAULT_PRNG_KEY" class="sref">DEFAULT_PRNG_KEYo/a>; <290o/a> <291o/a>       keyo/a>) <292o/a>       <       kleno/a> = oa href="+code=DEFAULT_PRNG_KSZ" class="sref">DEFAULT_PRNG_KSZo/a>; <293o/a> <294o/a>       Vo/a>) <295o/a>       <       memcpyo/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=V" class="sref">Vo/a>,Vo/a>,DEFAULT_BLK_SZo/a>); <296o/a>       <297o/a>       <       memcpyo/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=V" class="sref">Vo/a>,DEFAULT_V_SEEDo/a>,DEFAULT_BLK_SZo/a>); <298o/a> <299o/a>       DTo/a>) <300o/a>       <       memcpyo/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=DT" class="sref">DTo/a>,DTo/a>,DEFAULT_BLK_SZo/a>); <301o/a>       <302o/a>       <       memseto/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=DT" class="sref">DTo/a>,<0,DEFAULT_BLK_SZo/a>); <303o/a> <304o/a>       memseto/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=rand_data" class="sref">rand_datao/a>,<0,DEFAULT_BLK_SZo/a>); <305o/a>       memseto/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=last_rand_data" class="sref">last_rand_datao/a>, 0,DEFAULT_BLK_SZo/a>); <306o/a> <307o/a>       ctxo/a>->oa href="+code=rand_data_vluid" class="sref">rand_data_vluido/a> = oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>; <308o/a> <309o/a>       reto/a> = oa href="+code=crypto_cipher_setkey" class="sref">crypto_cipher_setkeyo/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=tfm" class="sref">tfmo/a>,prng_keyo/a>,kleno/a>); <310o/a>       reto/a>) { <311o/a>       <       dbgprinto/a>(oa href="+code=KERN_CRIT" class="sref">KERN_CRITo/a> ospa> class="string">"PRNG: setkey() failed flags=%x\n"
, <312o/a>       <       <<<<<<<<crypto_cipher_get_flagso/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=tfm" class="sref">tfmo/a>)); <313o/a>       <       outo/a>; <314o/a>       <} <315o/a> <316o/a>       reto/a> = 0; <317o/a>       ctxo/a>->oa href="+code=flags" class="sref">flagso/a> &= ~oa href="+code=PRNG_NEED_RESET" class="sref">PRNG_NEED_RESETo/a>; <318o/a>oa href="+code=out" class="sref">outo/a>: <319o/a>       spin_unlock_bho/a>(&oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=prng_lock" class="sref">prng_locko/a>); <320o/a>       reto/a>; <321o/a>} <322o/a> <323o/a>static int oa href="+code=cprng_init" class="sref">cprng_inito/a>(structcrypto_tfmo/a> *oa href="+code=tfm" class="sref">tfmo/a>) <324o/a>{ <325o/a>       prng_contexto/a> *oa href="+code=ctx" class="sref">ctxo/a> = oa href="+code=crypto_tfm_ctx" class="sref">crypto_tfm_ctxo/a>(oa href="+code=tfm" class="sref">tfmo/a>); <326o/a> <327o/a>       spin_lock_inito/a>(&oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=prng_lock" class="sref">prng_locko/a>); <328o/a>       ctxo/a>->oa href="+code=tfm" class="sref">tfmo/a> = oa href="+code=crypto_alloc_cipher" class="sref">crypto_alloc_ciphero/a>(ospa> class="string">"aes"
,<0,<0); <329o/a>       IS_ERRo/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=tfm" class="sref">tfmo/a>)) { <330o/a>       <       dbgprinto/a>(oa href="+code=KERN_CRIT" class="sref">KERN_CRITo/a> ospa> class="string">"Failed to alloc tfm
, <331o/a>       <       <       <<<<<<<<ctxo/a>); <332o/a>       <       PTR_ERRo/a>(oa href="+code=ctx" class="sref">ctxo/a>->oa href="+code=tfm" class="sref">tfmo/a>); <333o/a>       <} <334o/a> <335o/a>       reset_prng_contexto/a>(oa href="+code=ctx" class="sref">ctxo/a>,NULLo/a>,DEFAULT_PRNG_KSZo/a>,NULLo/a>,NULLo/a>) < 0) <336o/a>       <       EINVALo/a>; <337o/a> <338o/a>        class="comment">/*o/spa>
 <339o/a>ospa> class="comment">         * after allocaion>, we should always
 <34ospa> class="comment">       < * so they don't inadvertently use the insecure default vlue=so/spa>
 <341o/a>ospa> class="comment">       < * without specifying them intentiallyo/spa>
 <342o/a>ospa> class="comment">         */o/spa>
 <343o/a>       ctxo/a>->oa href="+code=flags" class="sref">flagso/a> |= oa href="+code=PRNG_NEED_RESET" class="sref">PRNG_NEED_RESETo/a>; <344o/a>       <345o/a>} <346o/a> <347o/a>static void oa href="+code=cprng_exit" class="sref">cprng_exito/a>(structcrypto_tfmo/a> *oa href="+code=tfm" class="sref">tfmo/a>) <348o/a>{ <349o/a>       free_prng_contexto/a>(oa href="+code=crypto_tfm_ctx" class="sref">crypto_tfm_ctxo/a>(oa href="+code=tfm" class="sref">tfmo/a>)); <350o/a>} <351o/a> <352o/a>static int oa href="+code=cprng_get_random" class="sref">cprng_get_randomo/a>(structcrypto_rngo/a> *oa href="+code=tfm" class="sref">tfmo/a>,u8o/a> *oa href="+code=rdata" class="sref">rdatao/a>, <353o/a>       <       <<<<<<<<<<<<dleno/a>) <354o/a>{ <355o/a>       prng_contexto/a> *oa href="+code=prng" class="sref">prngo/a> = oa href="+code=crypto_rng_ctx" class="sref">crypto_rng_ctxo/a>(oa href="+code=tfm" class="sref">tfmo/a>); <356o/a> <357o/a>       get_prng_byteso/a>(oa href="+code=rdata" class="sref">rdatao/a>, oa href="+code=dlen" class="sref">dleno/a>,prngo/a>,<0); <358o/a>} <359o/a> <36ospa> class="comment">/*o/spa>
 <361o/a>ospa> class="comment"> *  This is the cprng_registered reset method the seed vlue= iso/spa>
 <362o/a>ospa> class="comment"> * 
 <363o/a>ospa> class="comment"> * al, detectedo/spa>
 <364o/a>ospa> class="comment"> * 
 <365o/a>ospa> class="comment"> */o/spa>
 <366o/a>static int oa href="+code=cprng_reset" class="sref">cprng_reseto/a>(structcrypto_rngo/a> *oa href="+code=tfm" class="sref">tfmo/a>,u8o/a> *oa href="+code=seed" class="sref">seedo/a>,sleno/a>) <367o/a>{ <368o/a>       prng_contexto/a> *oa href="+code=prng" class="sref">prngo/a> = oa href="+code=crypto_rng_ctx" class="sref">crypto_rng_ctxo/a>(oa href="+code=tfm" class="sref">tfmo/a>); <369o/a>       u8o/a> *oa href="+code=key" class="sref">keyo/a> = oa href="+code=seed" class="sref">seedo/a> + oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>; <370o/a>       u8o/a> *oa href="+code=dt" class="sref">dto/a> = oa href="+code=NULL" class="sref">NULLo/a>; <371o/a> <372o/a>       sleno/a> < oa href="+code=DEFAULT_PRNG_KSZ" class="sref">DEFAULT_PRNG_KSZo/a> + oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>) <373o/a>       <       EINVALo/a>; <374o/a> <375o/a>       sleno/a> >= (2 * oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a> + oa href="+code=DEFAULT_PRNG_KSZ" class="sref">DEFAULT_PRNG_KSZo/a>)) <376o/a>       <       dto/a> = oa href="+code=key" class="sref">keyo/a> + oa href="+code=DEFAULT_PRNG_KSZ" class="sref">DEFAULT_PRNG_KSZo/a>; <377o/a> <378o/a>       reset_prng_contexto/a>(oa href="+code=prng" class="sref">prngo/a>,keyo/a>,DEFAULT_PRNG_KSZo/a>,seedo/a>,dto/a>); <379o/a> <380o/a>       prngo/a>->oa href="+code=flags" class="sref">flagso/a> & oa href="+code=PRNG_NEED_RESET" class="sref">PRNG_NEED_RESETo/a>) <381o/a>       <       EINVALo/a>; <382o/a>       <383o/a>} <384o/a> <385o/a>#ifdef oa href="+code=CONFIG_CRYPTO_FIPS" class="sref">CONFIG_CRYPTO_FIPSo/a> <386o/a>static int oa href="+code=fips_cprng_get_random" class="sref">fips_cprng_get_randomo/a>(structcrypto_rngo/a> *oa href="+code=tfm" class="sref">tfmo/a>,u8o/a> *oa href="+code=rdata" class="sref">rdatao/a>, <387o/a>       <       <<<<<<<<<<<<dleno/a>) <388o/a>{ <389o/a>       prng_contexto/a> *oa href="+code=prng" class="sref">prngo/a> = oa href="+code=crypto_rng_ctx" class="sref">crypto_rng_ctxo/a>(oa href="+code=tfm" class="sref">tfmo/a>); <390o/a> <391o/a>       get_prng_byteso/a>(oa href="+code=rdata" class="sref">rdatao/a>, oa href="+code=dlen" class="sref">dleno/a>,prngo/a>,<1); <392o/a>} <393o/a> <394o/a>static int oa href="+code=fips_cprng_reset" class="sref">fips_cprng_reseto/a>(structcrypto_rngo/a> *oa href="+code=tfm" class="sref">tfmo/a>,u8o/a> *oa href="+code=seed" class="sref">seedo/a>,sleno/a>) <395o/a>{ <396o/a>       u8o/a> oa href="+code=rdata" class="sref">rdatao/a>[oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>]; <397o/a>       u8o/a> *oa href="+code=key" class="sref">keyo/a> = oa href="+code=seed" class="sref">seedo/a> + oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>; <398o/a>       rco/a>; <399o/a> <400o/a>       prng_contexto/a> *oa href="+code=prng" class="sref">prngo/a> = oa href="+code=crypto_rng_ctx" class="sref">crypto_rng_ctxo/a>(oa href="+code=tfm" class="sref">tfmo/a>); <401o/a> <402o/a>       sleno/a> < oa href="+code=DEFAULT_PRNG_KSZ" class="sref">DEFAULT_PRNG_KSZo/a> + oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>) <403o/a>       <       EINVALo/a>; <404o/a> <405o/a>        class="comment">/* fips
 <406o/a>       memcmpo/a>(oa href="+code=seed" class="sref">seedo/a>,keyo/a>,DEFAULT_PRNG_KSZo/a>)) <407o/a>       <       EINVALo/a>; <408o/a> <409o/a>       rco/a> = oa href="+code=cprng_reset" class="sref">cprng_reseto/a>(oa href="+code=tfm" class="sref">tfmo/a>,seedo/a>,sleno/a>); <410o/a> <411o/a>       rco/a>) <412o/a>       <       outo/a>; <413o/a> <414o/a>        class="comment">/* this primes our continuity test */o/spa>
 <415o/a>       rco/a> = oa href="+code=get_prng_bytes" class="sref">get_prng_byteso/a>(oa href="+code=rdata" class="sref">rdatao/a>, oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>,prngo/a>,<0); <416o/a>       prngo/a>->oa href="+code=rand_data_vluid" class="sref">rand_data_vluido/a> = oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>; <417o/a> <418o/a>oa href="+code=out" class="sref">outo/a>: <419o/a>       rco/a>; <420o/a>} <421o/a>#endif <422o/a> <423o/a>static structcrypto_algo/a> oa href="+code=rng_algs" class="sref">rng_algso/a>[] = { { <424o/a>       <.oa href="+code=cra_nam=" class="sref">cra_nam=o/a>       <       = ospa> class="string">"stdrng"
, <425o/a>       <.oa href="+code=cra_driver_nam=" class="sref">cra_driver_nam=o/a>       <= ospa> class="string">"ansi_cprng"
, <426o/a>       <.oa href="+code=cra_priority" class="sref">cra_priorityo/a>       <   = 100, <427o/a>       <.oa href="+code=cra_flags" class="sref">cra_flagso/a>      <       = oa href="+code=CRYPTO_ALG_TYPE_RNG" class="sref">CRYPTO_ALG_TYPE_RNGo/a>, <428o/a>       <.oa href="+code=cra_ctxsize" class="sref">cra_ctxsizeo/a>      <     = sizeof(structprng_contexto/a>), <429o/a>       <.oa href="+code=cra_type" class="sref">cra_typeo/a>       <       = &oa href="+code=crypto_rng_type" class="sref">crypto_rng_typeo/a>, <430o/a>       <.oa href="+code=cra_module" class="sref">cra_moduleo/a>       <     = oa href="+code=THIS_MODULE" class="sref">THIS_MODULEo/a>, <431o/a>       <.oa href="+code=cra_init" class="sref">cra_inito/a>       <       = oa href="+code=cprng_init" class="sref">cprng_inito/a>, <432o/a>       <.oa href="+code=cra_exit" class="sref">cra_exito/a>       <       = oa href="+code=cprng_exit" class="sref">cprng_exito/a>, <433o/a>       <.oa href="+code=cra_u" class="sref">cra_uo/a>       <       <<<= { <434o/a>       <       <.oa href="+code=rng" class="sref">rngo/a> = { <435o/a>       <       <<<<<<<<<.oa href="+code=rng_make_random" class="sref">rng_make_randomo/a>       <= oa href="+code=cprng_get_random" class="sref">cprng_get_randomo/a>, <436o/a>       <       <<<<<<<<<.oa href="+code=rng_reset" class="sref">rng_reseto/a>      <       = oa href="+code=cprng_reset" class="sref">cprng_reseto/a>, <437o/a>       <       <<<<<<<<<.oa href="+code=seedsize" class="sref">seedsizeo/a> = oa href="+code=DEFAULT_PRNG_KSZ" class="sref">DEFAULT_PRNG_KSZo/a> + 2*oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>, <438o/a>       <<<<<<<<<} <439o/a>       <} <44#ifdef oa href="+code=CONFIG_CRYPTO_FIPS" class="sref">CONFIG_CRYPTO_FIPSo/a> <441o/a>}, { <442o/a>       <.oa href="+code=cra_nam=" class="sref">cra_nam=o/a>       <       = ospa> class="string">"fips(ansi_cprng)"
, <443o/a>       <.oa href="+code=cra_driver_nam=" class="sref">cra_driver_nam=o/a>       <= ospa> class="string">"fips_ansi_cprng"
, <444o/a>       <.oa href="+code=cra_priority" class="sref">cra_priorityo/a>       <   = 300, <445o/a>       <.oa href="+code=cra_flags" class="sref">cra_flagso/a>      <       = oa href="+code=CRYPTO_ALG_TYPE_RNG" class="sref">CRYPTO_ALG_TYPE_RNGo/a>, <446o/a>       <.oa href="+code=cra_ctxsize" class="sref">cra_ctxsizeo/a>      <     = sizeof(structprng_contexto/a>), <447o/a>       <.oa href="+code=cra_type" class="sref">cra_typeo/a>       <       = &oa href="+code=crypto_rng_type" class="sref">crypto_rng_typeo/a>, <448o/a>       <.oa href="+code=cra_module" class="sref">cra_moduleo/a>       <     = oa href="+code=THIS_MODULE" class="sref">THIS_MODULEo/a>, <449o/a>       <.oa href="+code=cra_init" class="sref">cra_inito/a>       <       = oa href="+code=cprng_init" class="sref">cprng_inito/a>, <450o/a>       <.oa href="+code=cra_exit" class="sref">cra_exito/a>       <       = oa href="+code=cprng_exit" class="sref">cprng_exito/a>, <451o/a>       <.oa href="+code=cra_u" class="sref">cra_uo/a>       <       <<<= { <452o/a>       <       <.oa href="+code=rng" class="sref">rngo/a> = { <453o/a>       <       <<<<<<<<<.oa href="+code=rng_make_random" class="sref">rng_make_randomo/a>       <= oa href="+code=fips_cprng_get_random" class="sref">fips_cprng_get_randomo/a>, <454o/a>       <       <<<<<<<<<.oa href="+code=rng_reset" class="sref">rng_reseto/a>      <       = oa href="+code=fips_cprng_reset" class="sref">fips_cprng_reseto/a>, <455o/a>       <       <<<<<<<<<.oa href="+code=seedsize" class="sref">seedsizeo/a> = oa href="+code=DEFAULT_PRNG_KSZ" class="sref">DEFAULT_PRNG_KSZo/a> + 2*oa href="+code=DEFAULT_BLK_SZ" class="sref">DEFAULT_BLK_SZo/a>, <456o/a>       <       <} <457o/a>       <} <458o/a>#endif <459o/a>} }; <460o/a> <461o/a>ospa> class="comment">/* Module initalizaion> */o/spa>
 <462o/a>static int oa href="+code=__init" class="sref">__inito/a> oa href="+code=prng_mod_init" class="sref">prng_mod_inito/a>(void) <463o/a>{ <464o/a>       crypto_register_algso/a>(oa href="+code=rng_algs" class="sref">rng_algso/a>,ARRAY_SIZEo/a>(oa href="+code=rng_algs" class="sref">rng_algso/a>)); <465o/a>} <466o/a> <467o/a>static void oa href="+code=__exit" class="sref">__exito/a> oa href="+code=prng_mod_fini" class="sref">prng_mod_finio/a>(void) <468o/a>{ <469o/a>       crypto_unregister_algso/a>(oa href="+code=rng_algs" class="sref">rng_algso/a>,ARRAY_SIZEo/a>(oa href="+code=rng_algs" class="sref">rng_algso/a>)); <470o/a>} <471o/a> <472o/a>oa href="+code=MODULE_LICENSE" class="sref">MODULE_LICENSEo/a>(ospa> class="string">"GPL"
); <473o/a>oa href="+code=MODULE_DESCRIPTION" class="sref">MODULE_DESCRIPTIONo/a>(ospa> class="string">"Software Pseudo Random Number Generator"
); <474o/a>oa href="+code=MODULE_AUTHOR" class="sref">MODULE_AUTHORo/a>(ospa> class="string">"Neil Horma> <nhorma>@tuxdriver.com>"
); <475o/a>oa href="+code=module_param" class="sref">module_paramo/a>(oa href="+code=dbg" class="sref">dbgo/a>,<476o/a>oa href="+code=MODULE_PARM_DESC" class="sref">MODULE_PARM_DESCo/a>(oa href="+code=dbg" class="sref">dbgo/a>, class="string">"Boolea> to enable debugging (0/1 == off/on)"
); <477o/a>oa href="+code=module_init" class="sref">module_inito/a>(oa href="+code=prng_mod_init" class="sref">prng_mod_inito/a>); <478o/a>oa href="+code=module_exit" class="sref">module_exito/a>(oa href="+code=prng_mod_fini" class="sref">prng_mod_finio/a>); <479o/a>oa href="+code=MODULE_ALIAS" class="sref">MODULE_ALIASo/a>(ospa> class="string">"stdrng"
); <480o/a>