rand.3 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. .\" Automatically generated by Pod::Man 4.09 (Pod::Simple 3.35)
  2. .\"
  3. .\" Standard preamble:
  4. .\" ========================================================================
  5. .de Sp \" Vertical space (when we can't use .PP)
  6. .if t .sp .5v
  7. .if n .sp
  8. ..
  9. .de Vb \" Begin verbatim text
  10. .ft CW
  11. .nf
  12. .ne \\$1
  13. ..
  14. .de Ve \" End verbatim text
  15. .ft R
  16. .fi
  17. ..
  18. .\" Set up some character translations and predefined strings. \*(-- will
  19. .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
  20. .\" double quote, and \*(R" will give a right double quote. \*(C+ will
  21. .\" give a nicer C++. Capital omega is used to do unbreakable dashes and
  22. .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
  23. .\" nothing in troff, for use with C<>.
  24. .tr \(*W-
  25. .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
  26. .ie n \{\
  27. . ds -- \(*W-
  28. . ds PI pi
  29. . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
  30. . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
  31. . ds L" ""
  32. . ds R" ""
  33. . ds C` ""
  34. . ds C' ""
  35. 'br\}
  36. .el\{\
  37. . ds -- \|\(em\|
  38. . ds PI \(*p
  39. . ds L" ``
  40. . ds R" ''
  41. . ds C`
  42. . ds C'
  43. 'br\}
  44. .\"
  45. .\" Escape single quotes in literal strings from groff's Unicode transform.
  46. .ie \n(.g .ds Aq \(aq
  47. .el .ds Aq '
  48. .\"
  49. .\" If the F register is >0, we'll generate index entries on stderr for
  50. .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
  51. .\" entries marked with X<> in POD. Of course, you'll have to process the
  52. .\" output yourself in some meaningful fashion.
  53. .\"
  54. .\" Avoid warning from groff about undefined register 'F'.
  55. .de IX
  56. ..
  57. .if !\nF .nr F 0
  58. .if \nF>0 \{\
  59. . de IX
  60. . tm Index:\\$1\t\\n%\t"\\$2"
  61. ..
  62. . if !\nF==2 \{\
  63. . nr % 0
  64. . nr F 2
  65. . \}
  66. .\}
  67. .\"
  68. .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
  69. .\" Fear. Run. Save yourself. No user-serviceable parts.
  70. . \" fudge factors for nroff and troff
  71. .if n \{\
  72. . ds #H 0
  73. . ds #V .8m
  74. . ds #F .3m
  75. . ds #[ \f1
  76. . ds #] \fP
  77. .\}
  78. .if t \{\
  79. . ds #H ((1u-(\\\\n(.fu%2u))*.13m)
  80. . ds #V .6m
  81. . ds #F 0
  82. . ds #[ \&
  83. . ds #] \&
  84. .\}
  85. . \" simple accents for nroff and troff
  86. .if n \{\
  87. . ds ' \&
  88. . ds ` \&
  89. . ds ^ \&
  90. . ds , \&
  91. . ds ~ ~
  92. . ds /
  93. .\}
  94. .if t \{\
  95. . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
  96. . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
  97. . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
  98. . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
  99. . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
  100. . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
  101. .\}
  102. . \" troff and (daisy-wheel) nroff accents
  103. .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
  104. .ds 8 \h'\*(#H'\(*b\h'-\*(#H'
  105. .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
  106. .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
  107. .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
  108. .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
  109. .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
  110. .ds ae a\h'-(\w'a'u*4/10)'e
  111. .ds Ae A\h'-(\w'A'u*4/10)'E
  112. . \" corrections for vroff
  113. .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
  114. .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
  115. . \" for low resolution devices (crt and lpr)
  116. .if \n(.H>23 .if \n(.V>19 \
  117. \{\
  118. . ds : e
  119. . ds 8 ss
  120. . ds o a
  121. . ds d- d\h'-1'\(ga
  122. . ds D- D\h'-1'\(hy
  123. . ds th \o'bp'
  124. . ds Th \o'LP'
  125. . ds ae ae
  126. . ds Ae AE
  127. .\}
  128. .rm #[ #] #H #V #F C
  129. .\" ========================================================================
  130. .\"
  131. .IX Title "rand 3"
  132. .TH rand 3 "2019-09-12" "1.0.2g" "OpenSSL"
  133. .\" For nroff, turn off justification. Always turn off hyphenation; it makes
  134. .\" way too many mistakes in technical documents.
  135. .if n .ad l
  136. .nh
  137. .SH "NAME"
  138. rand \- pseudo\-random number generator
  139. .SH "SYNOPSIS"
  140. .IX Header "SYNOPSIS"
  141. .Vb 1
  142. \& #include <openssl/rand.h>
  143. \&
  144. \& int RAND_set_rand_engine(ENGINE *engine);
  145. \&
  146. \& int RAND_bytes(unsigned char *buf, int num);
  147. \& int RAND_pseudo_bytes(unsigned char *buf, int num);
  148. \&
  149. \& void RAND_seed(const void *buf, int num);
  150. \& void RAND_add(const void *buf, int num, int entropy);
  151. \& int RAND_status(void);
  152. \&
  153. \& int RAND_load_file(const char *file, long max_bytes);
  154. \& int RAND_write_file(const char *file);
  155. \& const char *RAND_file_name(char *file, size_t num);
  156. \&
  157. \& int RAND_egd(const char *path);
  158. \&
  159. \& void RAND_set_rand_method(const RAND_METHOD *meth);
  160. \& const RAND_METHOD *RAND_get_rand_method(void);
  161. \& RAND_METHOD *RAND_SSLeay(void);
  162. \&
  163. \& void RAND_cleanup(void);
  164. \&
  165. \& /* For Win32 only */
  166. \& void RAND_screen(void);
  167. \& int RAND_event(UINT, WPARAM, LPARAM);
  168. .Ve
  169. .SH "DESCRIPTION"
  170. .IX Header "DESCRIPTION"
  171. Since the introduction of the \s-1ENGINE API,\s0 the recommended way of controlling
  172. default implementations is by using the \s-1ENGINE API\s0 functions. The default
  173. \&\fB\s-1RAND_METHOD\s0\fR, as set by \fIRAND_set_rand_method()\fR and returned by
  174. \&\fIRAND_get_rand_method()\fR, is only used if no \s-1ENGINE\s0 has been set as the default
  175. \&\*(L"rand\*(R" implementation. Hence, these two functions are no longer the recommended
  176. way to control defaults.
  177. .PP
  178. If an alternative \fB\s-1RAND_METHOD\s0\fR implementation is being used (either set
  179. directly or as provided by an \s-1ENGINE\s0 module), then it is entirely responsible
  180. for the generation and management of a cryptographically secure \s-1PRNG\s0 stream. The
  181. mechanisms described below relate solely to the software \s-1PRNG\s0 implementation
  182. built in to OpenSSL and used by default.
  183. .PP
  184. These functions implement a cryptographically secure pseudo-random
  185. number generator (\s-1PRNG\s0). It is used by other library functions for
  186. example to generate random keys, and applications can use it when they
  187. need randomness.
  188. .PP
  189. A cryptographic \s-1PRNG\s0 must be seeded with unpredictable data such as
  190. mouse movements or keys pressed at random by the user. This is
  191. described in \fIRAND_add\fR\|(3). Its state can be saved in a seed file
  192. (see \fIRAND_load_file\fR\|(3)) to avoid having to go through the
  193. seeding process whenever the application is started.
  194. .PP
  195. \&\fIRAND_bytes\fR\|(3) describes how to obtain random data from the
  196. \&\s-1PRNG.\s0
  197. .SH "INTERNALS"
  198. .IX Header "INTERNALS"
  199. The \fIRAND_SSLeay()\fR method implements a \s-1PRNG\s0 based on a cryptographic
  200. hash function.
  201. .PP
  202. The following description of its design is based on the SSLeay
  203. documentation:
  204. .PP
  205. First up I will state the things I believe I need for a good \s-1RNG.\s0
  206. .IP "1." 4
  207. A good hashing algorithm to mix things up and to convert the \s-1RNG\s0 'state'
  208. to random numbers.
  209. .IP "2." 4
  210. An initial source of random 'state'.
  211. .IP "3." 4
  212. The state should be very large. If the \s-1RNG\s0 is being used to generate
  213. 4096 bit \s-1RSA\s0 keys, 2 2048 bit random strings are required (at a minimum).
  214. If your \s-1RNG\s0 state only has 128 bits, you are obviously limiting the
  215. search space to 128 bits, not 2048. I'm probably getting a little
  216. carried away on this last point but it does indicate that it may not be
  217. a bad idea to keep quite a lot of \s-1RNG\s0 state. It should be easier to
  218. break a cipher than guess the \s-1RNG\s0 seed data.
  219. .IP "4." 4
  220. Any \s-1RNG\s0 seed data should influence all subsequent random numbers
  221. generated. This implies that any random seed data entered will have
  222. an influence on all subsequent random numbers generated.
  223. .IP "5." 4
  224. When using data to seed the \s-1RNG\s0 state, the data used should not be
  225. extractable from the \s-1RNG\s0 state. I believe this should be a
  226. requirement because one possible source of 'secret' semi random
  227. data would be a private key or a password. This data must
  228. not be disclosed by either subsequent random numbers or a
  229. \&'core' dump left by a program crash.
  230. .IP "6." 4
  231. Given the same initial 'state', 2 systems should deviate in their \s-1RNG\s0 state
  232. (and hence the random numbers generated) over time if at all possible.
  233. .IP "7." 4
  234. Given the random number output stream, it should not be possible to determine
  235. the \s-1RNG\s0 state or the next random number.
  236. .PP
  237. The algorithm is as follows.
  238. .PP
  239. There is global state made up of a 1023 byte buffer (the 'state'), a
  240. working hash value ('md'), and a counter ('count').
  241. .PP
  242. Whenever seed data is added, it is inserted into the 'state' as
  243. follows.
  244. .PP
  245. The input is chopped up into units of 20 bytes (or less for
  246. the last block). Each of these blocks is run through the hash
  247. function as follows: The data passed to the hash function
  248. is the current 'md', the same number of bytes from the 'state'
  249. (the location determined by in incremented looping index) as
  250. the current 'block', the new key data 'block', and 'count'
  251. (which is incremented after each use).
  252. The result of this is kept in 'md' and also xored into the
  253. \&'state' at the same locations that were used as input into the
  254. hash function. I
  255. believe this system addresses points 1 (hash function; currently
  256. \&\s-1SHA\-1\s0), 3 (the 'state'), 4 (via the 'md'), 5 (by the use of a hash
  257. function and xor).
  258. .PP
  259. When bytes are extracted from the \s-1RNG,\s0 the following process is used.
  260. For each group of 10 bytes (or less), we do the following:
  261. .PP
  262. Input into the hash function the local 'md' (which is initialized from
  263. the global 'md' before any bytes are generated), the bytes that are to
  264. be overwritten by the random bytes, and bytes from the 'state'
  265. (incrementing looping index). From this digest output (which is kept
  266. in 'md'), the top (up to) 10 bytes are returned to the caller and the
  267. bottom 10 bytes are xored into the 'state'.
  268. .PP
  269. Finally, after we have finished 'num' random bytes for the caller,
  270. \&'count' (which is incremented) and the local and global 'md' are fed
  271. into the hash function and the results are kept in the global 'md'.
  272. .PP
  273. I believe the above addressed points 1 (use of \s-1SHA\-1\s0), 6 (by hashing
  274. into the 'state' the 'old' data from the caller that is about to be
  275. overwritten) and 7 (by not using the 10 bytes given to the caller to
  276. update the 'state', but they are used to update 'md').
  277. .PP
  278. So of the points raised, only 2 is not addressed (but see
  279. \&\fIRAND_add\fR\|(3)).
  280. .SH "SEE ALSO"
  281. .IX Header "SEE ALSO"
  282. \&\fIBN_rand\fR\|(3), \fIRAND_add\fR\|(3),
  283. \&\fIRAND_load_file\fR\|(3), \fIRAND_egd\fR\|(3),
  284. \&\fIRAND_bytes\fR\|(3),
  285. \&\fIRAND_set_rand_method\fR\|(3),
  286. \&\fIRAND_cleanup\fR\|(3)