sysrand.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <!-- This file is generated by Nim. -->
  4. <html xmlns="https://www.w3.org/1999/xhtml" xml:lang="en" lang="en" data-theme="auto">
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  8. <title>std/sysrand</title>
  9. <!-- Google fonts -->
  10. <link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
  11. <link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
  12. <!-- Favicon -->
  13. <link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
  14. <link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
  15. <!-- CSS -->
  16. <link rel="stylesheet" type="text/css" href="nimdoc.out.css?v=2.3.1">
  17. <!-- JS -->
  18. <script type="text/javascript" src="dochack.js?v=2.3.1"></script>
  19. </head>
  20. <body>
  21. <div class="document" id="documentId">
  22. <div class="container">
  23. <h1 class="title">std/sysrand</h1>
  24. <div class="row">
  25. <div class="three columns">
  26. <div class="theme-select-wrapper">
  27. <label for="theme-select">Theme:&nbsp;</label>
  28. <select id="theme-select" onchange="setTheme(this.value)">
  29. <option value="auto">🌗 Match OS</option>
  30. <option value="dark">🌑 Dark</option>
  31. <option value="light">🌕 Light</option>
  32. </select>
  33. </div>
  34. <div id="global-links">
  35. <ul class="simple-boot">
  36. <li><a href="manual.html">Manual</a></li>
  37. <li><a href="lib.html">Standard library</a></li>
  38. <li> <a id="indexLink" href="theindex.html">Index</a></li>
  39. <li><a href="compiler/theindex.html">Compiler docs</a></li>
  40. <li><a href="https://nim-lang.github.io/fusion/theindex.html">Fusion docs</a></li>
  41. <li><a href="https://nim-lang.github.io/Nim/">devel</a>, <a href="https://nim-lang.org/documentation.html">stable</a></li>
  42. </ul>
  43. </div>
  44. <div id="searchInputDiv">
  45. Search: <input type="search" id="searchInput"
  46. oninput="search()" />
  47. </div>
  48. <ul class="simple simple-toc" id="toc-list">
  49. <li><a class="reference" id="see-also_toc" href="#see-also">See also</a></li>
  50. <li>
  51. <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
  52. </li>
  53. <li>
  54. <details open>
  55. <summary><a class="reference reference-toplevel" href="#12" id="62">Procs</a></summary>
  56. <ul class="simple simple-toc-section">
  57. <ul class="simple nested-toc-section">urandom
  58. <li><a class="reference" href="#urandom%2CopenArray%5Bbyte%5D" title="urandom(dest: var openArray[byte]): bool">urandom(dest: var openArray[byte]): bool</a></li>
  59. <li><a class="reference" href="#urandom%2CNatural" title="urandom(size: Natural): seq[byte]">urandom(size: Natural): seq[byte]</a></li>
  60. </ul>
  61. </ul>
  62. </details>
  63. </li>
  64. </ul>
  65. </div>
  66. <div class="nine columns" id="content">
  67. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/std/sysrand.nim#L1" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  68. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/std/sysrand.nim#L1" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  69. <div id="tocRoot"></div>
  70. <p class="module-desc"><div class="admonition admonition-warning"><span class="admonition-warning-text"><b>Warning:</b></span>
  71. This module was added in Nim 1.6. If you are using it for cryptographic purposes, keep in mind that so far this has not been audited by any security professionals, therefore may not be secure.</div>
  72. <p><tt class="docutils literal"><span class="pre"><span class="Identifier">std</span><span class="Operator">/</span><span class="Identifier">sysrand</span></span></tt> generates random numbers from a secure source provided by the operating system. It is a cryptographically secure pseudorandom number generator and should be unpredictable enough for cryptographic applications, though its exact quality depends on the OS implementation.</p>
  73. <table border="1" class="docutils"><tr><th>Targets</th><th>Implementation</th></tr>
  74. <tr><td>Windows</td><td><a class="reference external" href="https://docs.microsoft.com/en-us/windows/win32/api/bcrypt/nf-bcrypt-bcryptgenrandom">BCryptGenRandom</a></td></tr>
  75. <tr><td>Linux</td><td><a class="reference external" href="https://man7.org/linux/man-pages/man2/getrandom.2.html">getrandom</a></td></tr>
  76. <tr><td>MacOSX</td><td><a class="reference external" href="https://developer.apple.com/documentation/security/1399291-secrandomcopybytes?language=objc">SecRandomCopyBytes</a></td></tr>
  77. <tr><td>iOS</td><td><a class="reference external" href="https://developer.apple.com/documentation/security/1399291-secrandomcopybytes?language=objc">SecRandomCopyBytes</a></td></tr>
  78. <tr><td>OpenBSD</td><td><a class="reference external" href="https://man.openbsd.org/getentropy.2">getentropy openbsd</a></td></tr>
  79. <tr><td>FreeBSD</td><td><a class="reference external" href="https://www.freebsd.org/cgi/man.cgi?query=getrandom&amp;manpath=FreeBSD+12.0-stable">getrandom freebsd</a></td></tr>
  80. <tr><td>JS (Web Browser)</td><td><a class="reference external" href="https://www.w3.org/TR/WebCryptoAPI/#Crypto-method-getRandomValues">getRandomValues</a></td></tr>
  81. <tr><td>Node.js</td><td><a class="reference external" href="https://nodejs.org/api/crypto.html#crypto_crypto_randomfillsync_buffer_offset_size">randomFillSync</a></td></tr>
  82. <tr><td>Other Unix platforms</td><td><a class="reference external" href="https://en.wikipedia.org/wiki//dev/random">/dev/urandom</a></td></tr>
  83. </table><p>On a Linux target, a call to the <tt class="docutils literal"><span class="pre"><span class="Identifier">getrandom</span></span></tt> syscall can be avoided (e.g. for targets running kernel version &lt; 3.17) by passing a compile flag of <tt class="docutils literal"><span class="pre"><span class="Operator">-</span><span class="Identifier">d</span><span class="Punctuation">:</span><span class="Identifier">nimNoGetRandom</span></span></tt>. If this flag is passed, sysrand will use <tt class="docutils literal"><span class="pre"><span class="Operator">/</span><span class="Identifier">dev</span><span class="Operator">/</span><span class="Identifier">urandom</span></span></tt> as with any other POSIX compliant OS. </p>
  84. <p><strong class="examples_text">Example:</strong></p>
  85. <pre class="listing"><span class="Keyword">import</span> <span class="Identifier">std</span><span class="Operator">/</span><span class="Identifier">sysrand</span>
  86. <span class="Identifier">doAssert</span> <span class="Identifier">urandom</span><span class="Punctuation">(</span><span class="DecNumber">0</span><span class="Punctuation">)</span><span class="Operator">.</span><span class="Identifier">len</span> <span class="Operator">==</span> <span class="DecNumber">0</span>
  87. <span class="Identifier">doAssert</span> <span class="Identifier">urandom</span><span class="Punctuation">(</span><span class="DecNumber">113</span><span class="Punctuation">)</span><span class="Operator">.</span><span class="Identifier">len</span> <span class="Operator">==</span> <span class="DecNumber">113</span>
  88. <span class="Identifier">doAssert</span> <span class="Identifier">urandom</span><span class="Punctuation">(</span><span class="DecNumber">1234</span><span class="Punctuation">)</span> <span class="Operator">!=</span> <span class="Identifier">urandom</span><span class="Punctuation">(</span><span class="DecNumber">1234</span><span class="Punctuation">)</span> <span class="Comment"># unlikely to fail in practice</span></pre>
  89. <h1><a class="toc-backref" id="see-also" href="#see-also">See also</a></h1><ul class="simple"><li><a class="reference external" href="random.html">random module</a></li>
  90. </ul>
  91. </p>
  92. <div class="section" id="6">
  93. <h1><a class="toc-backref" href="#6">Imports</a></h1>
  94. <dl class="item">
  95. <a class="reference external" href="oserrors.html">oserrors</a>, <a class="reference external" href="posix.html">posix</a>, <a class="reference external" href="assertions.html">assertions</a>
  96. </dl>
  97. </div>
  98. <div class="section" id="12">
  99. <h1><a class="toc-backref" href="#12">Procs</a></h1>
  100. <dl class="item">
  101. <div id="urandom-procs-all">
  102. <div id="urandom,openArray[byte]">
  103. <dt><pre><span class="Keyword">proc</span> <a href="#urandom%2CopenArray%5Bbyte%5D"><span class="Identifier">urandom</span></a><span class="Other">(</span><span class="Identifier">dest</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="system.html#openArray"><span class="Identifier">openArray</span></a><span class="Other">[</span><a href="system.html#byte"><span class="Identifier">byte</span></a><span class="Other">]</span><span class="Other">)</span><span class="Other">:</span> <a href="system.html#bool"><span class="Identifier">bool</span></a> {.<span><span class="Other pragmadots">...</span></span><span class="pragmawrap"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span>
  104. <span class="Identifier">forbids</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span>.}</pre></dt>
  105. <dd>
  106. <p>Fills <tt class="docutils literal"><span class="pre"><span class="Identifier">dest</span></span></tt> with random bytes suitable for cryptographic use. If the call succeeds, returns <tt class="docutils literal"><span class="pre"><span class="Identifier">true</span></span></tt>.</p>
  107. <p>If <tt class="docutils literal"><span class="pre"><span class="Identifier">dest</span></span></tt> is empty, <tt class="docutils literal"><span class="pre"><span class="Identifier">urandom</span></span></tt> immediately returns success, without calling the underlying operating system API.</p>
  108. <div class="admonition admonition-warning"><span class="admonition-warning-text"><b>Warning:</b></span>
  109. The code hasn't been audited by cryptography experts and is provided as-is without guarantees. Use at your own risks. For production systems we advise you to request an external audit.</div>
  110. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/std/sysrand.nim#L296" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  111. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/std/sysrand.nim#L296" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  112. </dd>
  113. </div>
  114. <div id="urandom,Natural">
  115. <dt><pre><span class="Keyword">proc</span> <a href="#urandom%2CNatural"><span class="Identifier">urandom</span></a><span class="Other">(</span><span class="Identifier">size</span><span class="Other">:</span> <a href="system.html#Natural"><span class="Identifier">Natural</span></a><span class="Other">)</span><span class="Other">:</span> <a href="system.html#seq"><span class="Identifier">seq</span></a><span class="Other">[</span><a href="system.html#byte"><span class="Identifier">byte</span></a><span class="Other">]</span> {.<span class="Identifier">inline</span><span class="Other">,</span> <span><span class="Other pragmadots">...</span></span><span class="pragmawrap"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">OSError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span>
  116. <span class="Identifier">forbids</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span>.}</pre></dt>
  117. <dd>
  118. Returns random bytes suitable for cryptographic use.<div class="admonition admonition-warning"><span class="admonition-warning-text"><b>Warning:</b></span>
  119. The code hasn't been audited by cryptography experts and is provided as-is without guarantees. Use at your own risks. For production systems we advise you to request an external audit.</div>
  120. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/std/sysrand.nim#L317" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  121. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/std/sysrand.nim#L317" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  122. </dd>
  123. </div>
  124. </div>
  125. </dl>
  126. </div>
  127. </div>
  128. </div>
  129. <div class="twelve-columns footer">
  130. <span class="nim-sprite"></span>
  131. <br>
  132. <small style="color: var(--hint);">Made with Nim. Generated: 2025-02-03 14:57:27 UTC</small>
  133. </div>
  134. </div>
  135. </div>
  136. <script defer data-domain="nim-lang.org" src="https://plausible.io/js/plausible.js"></script>
  137. </body>
  138. </html>