{"id":1674,"date":"2021-06-08T15:07:06","date_gmt":"2021-06-08T13:07:06","guid":{"rendered":"https:\/\/moijari.com\/?p=1674"},"modified":"2023-02-22T13:13:19","modified_gmt":"2023-02-22T11:13:19","slug":"fort-satunnaisuutta-prosessoreiden-rdrand-ja-rdseed-toiminnoilla","status":"publish","type":"post","link":"https:\/\/moijari.com\/?p=1674","title":{"rendered":"Fort: Satunnaisuutta prosessoreiden rdrand ja rdseed toiminnoilla"},"content":{"rendered":"\n<p>Seuraavassa rutiinit rdrand ja rdseed toiminnolla haettavan satunnaisuuden k\u00e4ytt\u00e4miseen. Ensimm\u00e4iset rutiinit ovat molemmilla yhteisi\u00e4: rdrand:ia ja rdseed:i\u00e4 ei ole otettu oletuksena k\u00e4ytt\u00f6\u00f6n. Cpuid():ll\u00e4 haetaan prosessorin valmistajaa (vendor) ja tietoa siit\u00e4 onko k\u00e4yt\u00f6ss\u00e4 olevassa prosessorissa toteutettuna jompikumpi satunnaisbittigeneraattori. My\u00f6s is_cpu_vendor():ia k\u00e4ytet\u00e4\u00e4n prosessorin toimittajan nime\u00e4miseen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define aFORT_USE_RDRAND 2\n#define aFORT_USE_RDSEED 2\n\n#if defined FORT_USE_RDRAND || \\\n    defined FORT_USE_RDSEED\n\n\/\/ see: https:\/\/software.intel.com\/content\/www\/us\/en\/develop\/articles\/intel-digital-random-number-generator-drng-software-implementation-guide.html\n\nvoid _cpuid(unsigned int leaf, unsigned int subleaf,\n            unsigned int *a, unsigned int *b, unsigned int *c, unsigned int *d)\n{\n  asm volatile(\"cpuid\"\n\t       : \"=a\" (*a), \"=b\" (*b), \"=c\" (*c), \"=d\" (*d)\n               : \"a\" (leaf), \"c\" (subleaf) );\n}\n\nint _is_cpu_vendor(unsigned char *cpuvendor)\n{\n  int ok=0;\n  unsigned int a, b, c, d;\n\n  _cpuid(0, 0, &amp;a, &amp;b, &amp;c, &amp;d);\n\n  if(memcmp((char *)(&amp;b), cpuvendor,4)==0 &amp;&amp;\n     memcmp((char *)(&amp;d), cpuvendor+4,4)==0 &amp;&amp;\n     memcmp((char *)(&amp;c), cpuvendor+8,4)==0)\n    ok=1;\n\n  return(ok);\n}\n\n#endif<\/code><\/pre>\n\n\n\n<p>Seuraavassa kuvassa rdrand-toiminnon k\u00e4ytt\u00e4miseen tarvittavat rutiinit: has_rdrand tarkistaa onko k\u00e4ytett\u00e4v\u00e4ss\u00e4 prosessorissa rdrand-toiminto. rdrand_long() palauttaa long pituisen satunnaisbittijonon. rdrand_bytes() k\u00e4ytt\u00e4\u00e4 edellisi\u00e4 ja palauttaa varsinaisen bittijonon.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#ifdef FORT_USE_RDRAND\n\nint _has_rdrand()\n{\n  int ok=0;\n  unsigned int a, b, c, d;\n\n  _cpuid(1, 0, &amp;a, &amp;b, &amp;c, &amp;d);\n  if((c &amp; 0x40000000) == 0x40000000) {\n    ok=1;\n  }\n\n  return(ok);\n}\n\nint _rdrand_long(unsigned long *therand)\n{\n  unsigned char ret;\n\n  asm volatile(\"rdrand %0; setc %1\"\n               : \"=r\" (*therand), \"=qm\" (ret) );\n\n  return(int) ret;\n}\n\nint rdrand_bytes(int buflen, unsigned char *buf)\n{\n  int n, ret = 0;\n  unsigned long l;\n\n  if(_is_cpu_vendor(\"GenuineIntel\") &amp;&amp; _has_rdrand()) {\n    fprintf(stdout,\"Intel rdrand\");\n    ret=1;\n  } else if(_is_cpu_vendor(\"AuthenticAMD\") &amp;&amp; _has_rdrand()) {\n    fprintf(stdout,\"AMD rdrand\");\n    ret=1;\n  }\n\n  if(ret) {\n    while(buflen > 0) {\n      if((ret = _rdrand_long(&amp;l)) == 0) \/\/ 1 ok, 0 fail\n        break;\n      fprintf(stdout,\" %016lx\",l);\n      n = (buflen &lt; sizeof(l) ? buflen : sizeof(l));\n      memcpy(buf, (unsigned char *)&amp;l, n);\n      buf+=n;\n      buflen-=n;\n    }\n  }\n  return(ret);\n}\n\n#endif<\/code><\/pre>\n\n\n\n<p>Seuraavana vuorossa rdseed toiminnon k\u00e4ytt\u00e4miseen tarvittavat toiminnot: t\u00e4ss\u00e4 on samaan tapaan rdrand:in kanssa kolme toimintoa. has_rdseed() tarkistaa onko k\u00e4ytetyss\u00e4 prosessorissa ko toimintoa. rdseed_long() muodostaa yhden long:in pituisen satunnaisbittijonon. rdseed_bytes() muodostaa asiakkaan antamaan puskuriin halutun pituisen jonon satunnaisbittej\u00e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#ifdef FORT_USE_RDSEED\n\nint _has_rdseed()\n{\n  int ok=0;\n  unsigned int a, b, c, d;\n\n  _cpuid(7, 0, &amp;a, &amp;b, &amp;c, &amp;d);\n  if((b &amp; 0x40000) == 0x40000) {\n    ok=1;\n  }\n\n  return(ok);\n}\n\nint _rdseed_long(unsigned long *therand)\n{\n  unsigned char ret;\n\n  asm volatile(\"rdseed %0; setc %1\"\n               : \"=r\" (*therand), \"=qm\" (ret) );\n\n  return(int) ret;\n}\n\nint rdseed_bytes(int buflen, unsigned char *buf)\n{\n  int n, ret = 0;\n  unsigned long l;\n\n  if(_is_cpu_vendor(\"GenuineIntel\") &amp;&amp; _has_rdseed()) {\n    fprintf(stdout,\"Intel rdseed\");\n    ret=1;\n  } else if(_is_cpu_vendor(\"AuthenticAMD\") &amp;&amp; _has_rdseed()) {\n    fprintf(stdout,\"AMD rdseed\");\n    ret=1;\n  }\n\n  if(ret) {\n    while(buflen > 0) {\n      if((ret = _rdseed_long(&amp;l)) == 0) \/\/ 1 ok, 0 fail\n        break;\n      fprintf(stdout,\" %016lx\",l);\n      n = (buflen &lt; sizeof(l) ? buflen : sizeof(l));\n      memcpy(buf, (unsigned char *)&amp;l, n);\n      buf+=n;\n      buflen-=n;\n    }\n  }\n  return(ret);\n}\n\n#endif<\/code><\/pre>\n\n\n\n<p>Seuraavissa fort-init:in kappaleissa kutsutaan edellisi\u00e4 rutiineja ja p\u00e4ivitet\u00e4\u00e4n fort:in avainnusta.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  unsigned char hash&#91;HashLen];\n  HashCtx hashctx;\n  unsigned char temp&#91;64];\n\n#ifdef FORT_USE_RDRAND\n\n  memset(temp,0,sizeof(temp));\n  if(rdrand_bytes(sizeof(temp),temp)) {\n\n    HashInit(&amp;hashctx);\n    HashUpdate(&amp;hashctx, (unsigned char *) &amp;cvar,\n               sizeof(cvar));\n    HashUpdate(&amp;hashctx, temp, sizeof(temp));\n    HashFinal(hash, &amp;hashctx);\n\n    fprintf(stdout,\", sha256: \");\n    for(int c = 0;c &lt; HashLen; c++) {\n      fprintf(stdout,\"%02x\", hash&#91;c]);\n    }\n    fprintf(stdout,\"\\n\");\n    fflush(stdout);\n    fort_reseed(sizeof(hash), hash);\n    inccvar();\n  }\n\n#endif\n\n#ifdef FORT_USE_RDSEED\n\n  memset(temp,0,sizeof(temp));\n  if(rdseed_bytes(sizeof(temp),temp)) {\n\n    HashInit(&amp;hashctx);\n    HashUpdate(&amp;hashctx, (unsigned char *) &amp;cvar,\n               sizeof(cvar));\n    HashUpdate(&amp;hashctx, temp, sizeof(temp));\n    HashFinal(hash, &amp;hashctx);\n\n    fprintf(stdout,\", sha256: \");\n    for(int c = 0;c &lt; HashLen; c++) {\n      fprintf(stdout,\"%02x\", hash&#91;c]);\n    }\n    fprintf(stdout,\"\\n\");\n    fflush(stdout);\n    fort_reseed(sizeof(hash), hash);\n    inccvar();\n  }\n\n#endif<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Seuraavassa rutiinit rdrand ja rdseed toiminnolla haettavan satunnaisuuden k\u00e4ytt\u00e4miseen. Ensimm\u00e4iset rutiinit ovat molemmilla yhteisi\u00e4: rdrand:ia ja rdseed:i\u00e4 ei ole otettu oletuksena k\u00e4ytt\u00f6\u00f6n. Cpuid():ll\u00e4 haetaan prosessorin valmistajaa (vendor) ja tietoa siit\u00e4 onko k\u00e4yt\u00f6ss\u00e4 olevassa prosessorissa toteutettuna jompikumpi satunnaisbittigeneraattori. My\u00f6s is_cpu_vendor():ia k\u00e4ytet\u00e4\u00e4n prosessorin toimittajan nime\u00e4miseen. Seuraavassa kuvassa rdrand-toiminnon k\u00e4ytt\u00e4miseen tarvittavat rutiinit: has_rdrand tarkistaa onko k\u00e4ytett\u00e4v\u00e4ss\u00e4 prosessorissa rdrand-toiminto.&hellip; <a class=\"more-link\" href=\"https:\/\/moijari.com\/?p=1674\">Continue reading <span class=\"screen-reader-text\">Fort: Satunnaisuutta prosessoreiden rdrand ja rdseed toiminnoilla<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1,6],"tags":[],"_links":{"self":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/1674"}],"collection":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1674"}],"version-history":[{"count":8,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/1674\/revisions"}],"predecessor-version":[{"id":1684,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/1674\/revisions\/1684"}],"wp:attachment":[{"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1674"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1674"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1674"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}