{"id":1756,"date":"2021-09-05T11:00:05","date_gmt":"2021-09-05T09:00:05","guid":{"rendered":"https:\/\/moijari.com\/?p=1756"},"modified":"2023-02-22T13:12:30","modified_gmt":"2023-02-22T11:12:30","slug":"using-make-little-rewrite-of-fort-0-51-added-fort-to-newressu-2-4","status":"publish","type":"post","link":"https:\/\/moijari.com\/?p=1756","title":{"rendered":"Using make, little rewrite of fort 0.51, added fort to newressu 2.4"},"content":{"rendered":"\n<p>En ole aiemmin kuvannut makefile tiedostoa, t\u00e4m\u00e4 on ensimm\u00e4inen. Makefile:n avulla voidaan automatisoida ohjelman k\u00e4\u00e4nn\u00f6kset kuvaamalla ne ns makefile tiedostoon. Seuraavassa makefile:ss\u00e4 m\u00e4\u00e4ritell\u00e4\u00e4n viisi tavoitetta: newressu, newressuw, newressum, fort ja sha256. Newressu on versio newressusta, jossa on mukana fort (sha256) ja ei ole web satunnaislukujen hakua. Newressuw on kuten edellinen, mutta mukana on my\u00f6s web satunnaislukujen haku. newressum on ns vanha versio, jossa ei ole fort:ia.<\/p>\n\n\n\n<p>N\u00e4iss\u00e4 tavoitteissa tarvittavat objektitiedostot on listattu objs loppuisissa listoissa kuten: newressuobjs, newressuwobjs jne&#8230;<\/p>\n\n\n\n<p>Joissakin kohteissa tarvitaan erilaisia #define m\u00e4\u00e4rityksi\u00e4, ja ne on eroteltu tiedoston nimen lis\u00e4jatkeella kuten newressu.mfs.o, jossa jatke on mfs ja tarvittavat #define m\u00e4\u00e4ritteet ovat MAIN, FORT ja SHA256. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CC =\t\tcc\nCFLAGS =\t-g -Wall -Wno-pointer-sign\nnewressuobjs =\tnewressu.mfs.o fort.o sha256.o intelrandom.o webrandom.o commandrandom.o\nnewressuwobjs =\tnewressu.mfs.o fort.w.o sha256.o intelrandom.o webrandom.o commandrandom.o\nnewressumobjs = newressu.m.o\nsha256objs =\tsha256.m.o\nfortobjs =\tfort.m.o sha256.o newressu.o intelrandom.o webrandom.o commandrandom.o\n\nall:\t\tnewressu newressuw newressum sha256 fort\n\nnewressu:\t$(newressuobjs)\n\t\tcc $(CFLAGS) $(newressuobjs) -o newressu -lssl\n\nnewressuw:\t$(newressuwobjs)\n\t\tcc $(CFLAGS) $(newressuwobjs) -o newressuw -lssl\n\nnewressum:\t$(newressumobjs)\n\t\tcc $(CFLAGS) $(newressumobjs) -o newressum\n\nsha256:\t\t$(sha256objs)\n\t\tcc $(CFLAGS) $(sha256objs) -o sha256\n\nfort:\t\t$(fortobjs)\n\t\tcc $(CFLAGS) $(fortobjs) -o fort -lssl\n\n%.mfs.o:\t%.c\n\t\t$(CC) $(CFLAGS) -DMAIN -DFORT -DSHA256 -c -o $@ $&lt;\n\n%.m.o:\t\t%.c\n\t\t$(CC) $(CFLAGS) -DMAIN -c -o $@ $&lt;\n\n%.w.o:\t\t%.c\n\t\t$(CC) $(CFLAGS) -DFORT_USE_WEB -c -o $@ $&lt;\n\n%.o:\t\t%.c\n\t\t$(CC) $(CFLAGS) -c -o $@ $&lt;\n\nclean:\n\t\trm -f *~ \\#*\\# *.o<\/code><\/pre>\n\n\n\n<p>Komennolla make clean all voidaan poistaa aiempi versio ja tehd\u00e4 kaikki k\u00e4\u00e4nn\u00f6kset uudestaan: Ensimm\u00e4inen rm rivi on ns clean tavoitteen rivi. Seuraavat 6 rivi\u00e4 k\u00e4\u00e4nt\u00e4v\u00e4t newressu:n sorsia muodostaen objekteja. Seitsem\u00e4s rivi linkkaa newressun objektit ajettavaksi tiedostoksi newressu. Loput rivit tekev\u00e4t saman newressuw:lle newressum:lle sha256:lle ja fort:lle.<\/p>\n\n\n\n<p>Jos muuttelet clean tavoitteen rm komentoa, kannattaa olla huolellinen, tai jopa tehd\u00e4 kopio hakemistosta tai levyst\u00e4. Pieni virhe rm komennossa voi aiheuttaa koko hakemiston tai pahimmassa tapauksessa levyn tyhjentymisen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ make clean all\nrm -f *~ \\#*\\# *.o\ncc -g -Wall -Wno-pointer-sign -DMAIN -DFORT -DSHA256 -c -o newressu.mfs.o newressu.c\ncc -g -Wall -Wno-pointer-sign -c -o fort.o fort.c\ncc -g -Wall -Wno-pointer-sign -c -o sha256.o sha256.c\ncc -g -Wall -Wno-pointer-sign -c -o intelrandom.o intelrandom.c\ncc -g -Wall -Wno-pointer-sign -c -o webrandom.o webrandom.c\ncc -g -Wall -Wno-pointer-sign -c -o commandrandom.o commandrandom.c\ncc -g -Wall -Wno-pointer-sign newressu.mfs.o fort.o sha256.o intelrandom.o webrandom.o commandrandom.o -o newressu -lssl\ncc -g -Wall -Wno-pointer-sign -DFORT_USE_WEB -c -o fort.w.o fort.c\ncc -g -Wall -Wno-pointer-sign newressu.mfs.o fort.w.o sha256.o intelrandom.o webrandom.o commandrandom.o -o newressuw -lssl\ncc -g -Wall -Wno-pointer-sign -DMAIN -c -o newressu.m.o newressu.c\ncc -g -Wall -Wno-pointer-sign newressu.m.o -o newressum\ncc -g -Wall -Wno-pointer-sign -DMAIN -c -o sha256.m.o sha256.c\ncc -g -Wall -Wno-pointer-sign sha256.m.o -o sha256\ncc -g -Wall -Wno-pointer-sign -DMAIN -c -o fort.m.o fort.c\ncc -g -Wall -Wno-pointer-sign -c -o newressu.o newressu.c\ncc -g -Wall -Wno-pointer-sign fort.m.o sha256.o newressu.o intelrandom.o webrandom.o commandrandom.o -o fort -lssl\n<\/code><\/pre>\n\n\n\n<p>Make k\u00e4\u00e4nt\u00e4\u00e4 vain ne tiedostot, jotka tarvitsevat k\u00e4\u00e4nn\u00f6st\u00e4. Seuraava kuva n\u00e4ytt\u00e4\u00e4 kun sha256.c tiedoston p\u00e4iv\u00e4ykset p\u00e4ivitet\u00e4\u00e4n touch komennolla, n\u00e4in se n\u00e4ytt\u00e4\u00e4 uudemmalta kuin sen kohdetiedosto sha256.o. T\u00e4ll\u00f6in se k\u00e4\u00e4nnet\u00e4\u00e4n ja n\u00e4in muodostetaan uusi sha256.o tiedosto. Seuraavaksi tehd\u00e4\u00e4n tiedoston sha256.o sis\u00e4lt\u00e4v\u00e4t linkkaukset uudestaan.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ touch sha256.c\n$ make\ncc -g -Wall -Wno-pointer-sign -c -o sha256.o sha256.c\ncc -g -Wall -Wno-pointer-sign newressu.mfs.o fort.o sha256.o intelrandom.o webrandom.o commandrandom.o -o newressu -lssl\ncc -g -Wall -Wno-pointer-sign newressu.mfs.o fort.w.o sha256.o intelrandom.o webrandom.o commandrandom.o -o newressuw -lssl\ncc -g -Wall -Wno-pointer-sign -DMAIN -c -o sha256.m.o sha256.c\ncc -g -Wall -Wno-pointer-sign sha256.m.o -o sha256\ncc -g -Wall -Wno-pointer-sign fort.m.o sha256.o newressu.o intelrandom.o webrandom.o commandrandom.o -o fort -lssl<\/code><\/pre>\n\n\n\n<p>Sitten fort:in varsinaisiin sorsamuutoksiin: aiemmin tapahtuman k\u00e4sittelyss\u00e4 oli enemm\u00e4n modeja, p\u00e4\u00e4ttelin kuitenkin ett\u00e4 tasapainoisen tuloksen saa, jos t\u00e4ytet\u00e4\u00e4n modella 1 per\u00e4kk\u00e4isi\u00e4 puskureita puskureiden alusta loppuun. Jos t\u00e4ytet\u00e4\u00e4n vain tyhj\u00e4t puskurit muihin puskureihin ei kerry paljon satunnaisuutta. Jos kuitenkin haluat, voit tietenkin kopioida haluamasi moden aiemmasta postista.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void fort_add_random_event(int *pool, int source, int mode, int len, unsigned char *buf)\n{\n  while(len&gt;1 &amp;&amp; buf&#91;len-1]==0)\n    len--;\n\n  HashUpdate(&amp;fort_pools&#91;*pool].pool, buf, len);\n  fort_pools&#91;*pool].length+=len; \/\/ (unsigned long)2097152*16384;\n\n#ifdef DEBUG10\n  if(event_id &lt; 65536) {\n    FILE *fp1;\n    if((fp1=fopen(fort_events_file, \"a\"))!=NULL) {\n      fprintf(fp1,\"id=%d\", event_id);\n      fprintf(fp1,\", source=%02d\", source);\n      fprintf(fp1,\", pool=%02d\", *pool);\n      fprintf(fp1,\", mode=%d\", mode);\n      fprintf(fp1,\", len=%d\", len);\n      fprintf(fp1,\", data=\");\n      for(int c=0;c&lt;len;c++)\n        fprintf(fp1,\"%02x\", buf&#91;c]);\n      fprintf(fp1,\"\\n\");\n      fflush(fp1);\n      fclose(fp1);\n      event_id++;\n    }\n  }\n#endif\n\n  switch(mode) {\n\n  case 1:\n    (*pool) = ((*pool)+1) % FORT_POOLS;\n    break;\n\n  case 3:\n    break; \/\/ caller decides next pool\n\n  }\n}<\/code><\/pre>\n\n\n\n<p>Reseed rutiinista on poistettu fort_pools raportti: nyt fort_pools raportti tulostetaan konsolille (stdout).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void fort_reseed(int len, unsigned char *buf)\n{\n  HashCtx hash;\n\n  FORT_INTERNAL_EVENTS_START(22)\n\n  hash_init(&amp;hash);\n  hash_update(&amp;hash, fort_key, sizeof(fort_key));\n  hash_update(&amp;hash, (unsigned char *)&amp;cvar,\n      sizeof(cvar));\n  hash_update(&amp;hash, buf, len);\n  hash_final(fort_key, &amp;hash);\n  inccvar();\n\n  memset(&amp;hash, 0, sizeof(hash));\n\n  if(fort_next_save != 0) {\n    IUTIME seconds;\n    seconds = getseconds();\n    \n    char timezone&#91;10];\n    strftime(timezone, sizeof(timezone), \"%Z\",\n             localtime((time_t *)&amp;seconds) );\n    if(strcmp(current_timezone,timezone)) {\n      fort_next_save=1;\n      strcpy(current_timezone,timezone);\n    }\n    \n    if(fort_next_save != 0 &amp;&amp;\n       seconds &gt;= fort_next_save) {\n      \n      IUTIME diff=\n        timegm(localtime((time_t *)&amp;seconds))-seconds;\n      \n      fort_next_save = seconds -\n        ((seconds+diff) %\n         FORT_SECONDS_BETWEEN_SAVES) +\n        FORT_SECONDS_BETWEEN_SAVES;\n      \n      fort_save();\n    }\n  }\n\n  FORT_INTERNAL_EVENTS_END(23)\n}<\/code><\/pre>\n\n\n\n<p>fort_random_datasta on poistettu koodi, joka haki &#8220;vajaaseen&#8221; puskuriin lis\u00e4bittej\u00e4 ressu:sta: Nyt koodi toimii siten, ett\u00e4 uudelleenavainnus tehd\u00e4\u00e4n jos edellisest\u00e4 avainnuksesta on kulunut 1\/10 sekuntia ja ensimm\u00e4iseen puskuriin on kertynyt FORT_MIN_POOL_SIZE merkki\u00e4.<\/p>\n\n\n\n<p>Aliohjelmaan on my\u00f6s lis\u00e4tty dump_pools_data kutsu, jolla tulostetaan t\u00e4m\u00e4nhetkinen puskureiden tilanne stdout:tiin (jos &#8211;fortverbose on p\u00e4\u00e4ll\u00e4). Aliohjelmaan on my\u00f6s lis\u00e4tty fort_mix kutsu, joka hakee satunnaisuutta verkosta tai paikallisista l\u00e4hteist\u00e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void fort_random_data(int len, unsigned char *buf)\n{\n  int c;\n  IUTIME tenths;\n  HashCtx hash;\n  unsigned char buffer&#91;HashLen];\n\n  FORT_INTERNAL_EVENTS_START(24)\n\n  if(fort_verbose)\n    dump_pools_data(stdout,\"reseed start\");\n    \n  tenths=gettenths();\n\n  if( (fort_next_reseed == 0) ||\n      (fort_next_reseed &lt;= tenths &amp;&amp;\n      fort_pools&#91;0].length &gt;=\n      FORT_MIN_POOL_SIZE) ) {\n\n    fort_mix();\n    \n    \/\/ next tenth of a second\n\n    fort_next_reseed = tenths + 1;\n    fort_reseed_count++;\n\n    hash_init(&amp;hash);\n    c=0;\n\n    while(c &lt; FORT_POOLS &amp;&amp; (fort_reseed_count\n        % (1&lt;&lt;c)) == 0) {\n\n      FORT_INTERNAL_EVENTS_START(25)\n\n      hash_final(buffer, &amp;fort_pools&#91;c].pool);\n      hash_update(&amp;hash, buffer, sizeof(buffer));\n      fort_pools&#91;c].length = 0;\n      HashInit(&amp;fort_pools&#91;c].pool);\n\n      \/\/ save earlier pool to new one\n\n      hash_update(&amp;fort_pools&#91;c].pool,\n        buffer, sizeof(buffer));\n      c++;\n\n      FORT_INTERNAL_EVENTS_END(26)\n    }\n    hash_update(&amp;hash, (unsigned char *)\n        &amp;cvar, sizeof(cvar));\n    hash_final(buffer, &amp;hash);\n    fort_reseed(sizeof(buffer), buffer);\n\n    \/\/ Forget hash context\n\n    memset(&amp;hash, 0, sizeof(hash));\n\n    \/\/ Forget reseed key\n\n    memset(buffer, 0, sizeof(buffer));\n    inccvar();\n\n    if(fort_verbose)\n      dump_pools_data(stdout,\"reseed end\");\n  }\n\n  fort_pseudo_random_data(len, buf);\n\n  FORT_INTERNAL_EVENTS_END(27)\n}<\/code><\/pre>\n\n\n\n<p>Lis\u00e4tty _xor loppuiset versiot kutsuista fort_pseudo_random_data ja fort_random_data.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void fort_pseudo_random_data_xor(int len, \n    unsigned char *buf)\n{\n  unsigned char tmp&#91;HashLen];\n  unsigned int n, blockbytes;\n#ifdef DEBUG18\n  int d=0;\n#endif\n\n  FORT_INTERNAL_EVENTS_START(18)\n\n  blockbytes = 0;\n\n  while(len != 0) {\n    FORT_INTERNAL_EVENTS_START(19)\n\n    fort_rekey(tmp);\n    n = (len&lt;HashLen) ? len : HashLen;\n\n#ifdef DEBUG18\n\n    if(fort_partial_line)\n      fprintf(stdout,\"\\n\");\n    fprintf(stdout,\"buf(%02x): \",d++);\n    for(int c=0;c&lt;n;c++)\n      fprintf(stdout,\" %02x\",buf&#91;c]);\n    fprintf(stdout,\"\\ntmp:     \");\n    for(int c=0;c&lt;n;c++)\n      fprintf(stdout,\" %02x\",tmp&#91;c]);\n    fprintf(stdout,\"\\nsum:     \");\n    for(int c=0;c&lt;n;c++)\n      fprintf(stdout,\" %02x\",buf&#91;c]^tmp&#91;c]);\n    fprintf(stdout,\"\\n\");\n\n#endif\n    \n    for(int c=0;c&lt;n;c++)\n      buf&#91;c]^=tmp&#91;c];\n\n    buf += n;\n    len -= n;\n    blockbytes += n;\n\n    \/\/ rekey every 1048576 bytes if data left\n\n    if(blockbytes &gt;= FORT_PSEUDO_LIMIT &amp;&amp;\n        len &gt; 0) {                                                                                                              \n      fort_rekey(fort_key);\n      blockbytes = 0;\n    }\n\n    FORT_INTERNAL_EVENTS_END(20)\n  }\n\n  fort_rekey(fort_key);\n\n  \/\/ Forget last bytes\n\n  memset(tmp, 0, sizeof(tmp));\n\n  FORT_INTERNAL_EVENTS_END(21)\n}\n\nvoid fort_random_data_xor(int len, unsigned char *buf)\n{\n  int c;\n  IUTIME tenths;\n  HashCtx hash;\n  unsigned char buffer&#91;HashLen];\n\n  FORT_INTERNAL_EVENTS_START(24)\n\n  if(fort_verbose)\n    dump_pools_data(stdout,\"reseed start\");\n        \n  tenths=gettenths();\n\n  if( (fort_next_reseed == 0) ||\n      (fort_next_reseed &lt;= tenths &amp;&amp;\n      fort_pools&#91;0].length &gt;=\n      FORT_MIN_POOL_SIZE) ) {\n\n    fort_mix();\n\n    \/\/ next tenth of a second\n\n    fort_next_reseed = tenths + 1;\n    fort_reseed_count++;\n\n    hash_init(&amp;hash);\n    c=0;\n\n    while(c &lt; FORT_POOLS &amp;&amp; (fort_reseed_count\n        % (1&lt;&lt;c)) == 0) {\n\n      FORT_INTERNAL_EVENTS_START(25)\n\n      hash_final(buffer, &amp;fort_pools&#91;c].pool);\n      hash_update(&amp;hash, buffer, sizeof(buffer));\n      fort_pools&#91;c].length = 0;\n      HashInit(&amp;fort_pools&#91;c].pool);\n\n      \/\/ save earlier pool to new one\n\n      hash_update(&amp;fort_pools&#91;c].pool,\n        buffer, sizeof(buffer));\n      c++;\n\n      FORT_INTERNAL_EVENTS_END(26)\n    }\n    hash_update(&amp;hash, (unsigned char *)\n        &amp;cvar, sizeof(cvar));\n    hash_final(buffer, &amp;hash);\n    fort_reseed(sizeof(buffer), buffer);\n\n    \/\/ Forget hash context\n\n    memset(&amp;hash, 0, sizeof(hash));\n\n    \/\/ Forget reseed key\n\n    memset(buffer, 0, sizeof(buffer));\n    inccvar();\n\n    if(fort_verbose)\n      dump_pools_data(stdout,\"random_data_xor end\");\n\n  }\n\n  fort_pseudo_random_data_xor(len, buf);\n\n  FORT_INTERNAL_EVENTS_END(27)\n}<\/code><\/pre>\n\n\n\n<p>Muutettu dump_pools rutiinia siten ett\u00e4 se tekee raportin stdout:iin:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void dump_pools_data(FILE *fp1, char *header)\n{\n  int c;\n  unsigned char readable&#91;10];\n\n  if(fort_partial_line) {\n    fprintf(fp1,\"\\n\");\n    fort_partial_line=0;\n  }\n  fprintf(fp1,\"%-27s\", header);\n  for(c=0;c&lt;FORT_POOLS;c++) {\n    if(c&gt;0 &amp;&amp; c%FORT_DUMP_POOLS_WIDTH==0)\n      fprintf(fp1,\"\\n%-27s\",\"\");\n    readable_length(readable,\n\t    fort_pools&#91;c].length);\n    fprintf(fp1,\"%*s\",\n\t    FORT_DUMP_POOLS_FIELD_WIDTH,\n\t    readable);\n  }\n  fprintf(fp1,\"\\n\");\n}\n\nvoid dump_pools(char *header)\n{\n  if(fort_verbose)\n    dump_pools_data(stdout,header);\n}<\/code><\/pre>\n\n\n\n<p>Lis\u00e4tty fort_mix rutiini, joka hakee satunnaisuutta webist\u00e4 tai\/ja paikallisista l\u00e4hteist\u00e4: Seuraavat m\u00e4\u00e4ritykset kertovat kuinka usein satunnaisuutta p\u00e4ivitet\u00e4\u00e4n. Paikalliset haetaan t\u00e4ss\u00e4 tunnin v\u00e4lein ja web satunnaisuus 12 tunnin v\u00e4lein. Jos satunnaisuutta haetaan web l\u00e4hteist\u00e4 sit\u00e4 haetaan aina sen j\u00e4lkeen my\u00f6s paikallisista l\u00e4hteist\u00e4.<\/p>\n\n\n\n<p>Satunnaisuuden haku web:ist\u00e4 on melko hidasta, ja n\u00e4in web haku onkin poistettu newressu perusversiosta. Jos haluat web:in satunnaisuuden mukaan k\u00e4yt\u00e4 newressuw komentoa.<\/p>\n\n\n\n<p>Paikallisissa komennoissa ei voi olla newressu:n &#8211;fort kytkint\u00e4, se j\u00e4\u00e4 rekursiivisena komentona &#8220;luuppiin&#8221;.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>static IUTIME fort_next_localmix = 0;\n#define FORT_SECONDS_BETWEEN_LOCALMIXES 60*60\nstatic IUTIME fort_next_webmix = 0;\n#define FORT_SECONDS_BETWEEN_WEBMIXES 12*3600\n\nvoid fort_mix()\n{\n  int webmix=0, localmix=0;\n  unsigned char temp&#91;64];\n\n  IUTIME seconds;\n\n  if(fort_verbose)\n    dump_pools_data(stdout,\"fort_mix\");\n  \n  seconds = getseconds();\n  \n  webmix=0;\n  localmix=0;\n\n  if(fort_next_webmix == 0 ||\n     fort_next_webmix &lt;= seconds) {\n    fort_next_webmix=seconds+FORT_SECONDS_BETWEEN_WEBMIXES;\n    webmix=1;\n    localmix=1;\n  }\n\n  if(fort_next_localmix == 0 ||\n     fort_next_localmix &lt;= seconds) {\n    fort_next_localmix=seconds+FORT_SECONDS_BETWEEN_LOCALMIXES;\n    localmix=1;\n  }\n\n  if(!webmix &amp;&amp; !localmix)\n    return;\n  \n  if(fort_verbose) {  \n    char timebuf&#91;128];\n    strftime(timebuf, sizeof(timebuf), TIMEFORMAT,\n\t     localtime((time_t *)&amp;seconds));\n    fprintf(stdout,\"Fort mix time:      %s\\n\",timebuf);\n    strftime(timebuf, sizeof(timebuf), TIMEFORMAT,\n\t     localtime((time_t *)&amp;fort_next_webmix));\n    fprintf(stdout,\"Next fort webmix:   %s\\n\",timebuf);\n    strftime(timebuf, sizeof(timebuf), TIMEFORMAT,\n\t     localtime((time_t *)&amp;fort_next_localmix));\n    fprintf(stdout,\"Next fort localmix: %s\\n\",timebuf);\n  }\n  \n  fort_internal_random_data_1(sizeof(temp), temp);\n  fort_reseed(sizeof(temp), temp);\n  \n  dump_pools(\"Randomness from ressu\");\n\n#if defined FORT_USE_WEB || \\\n  defined FORT_USE_RDRAND || \\\n  defined FORT_USE_RDSEED || \\\n  defined FORT_USE_NEWRESSU_COMMAND\n  unsigned char hash&#91;HashLen];\n#endif    \n  \n#ifdef FORT_USE_WEB\n  if(webmix) {\n    char *webpages&#91;] = {\n      \"https:\/\/moijari.com:5001\/\",\n      \"https:\/\/moijari.com:5005\/\",\n      \"https:\/\/moijari.com:5006\/\",\n    };\n\n    for(int c=0;c&lt;sizeof(webpages)\/sizeof(webpages&#91;0]);c++) {\n      unsigned char *p;\n      \n      unsigned char scheme&#91;32];\n      unsigned char host&#91;32];\n      unsigned char port&#91;10];\n      unsigned char rest&#91;128];\n      \n      p=webpages&#91;c];\n      parse_string(scheme,sizeof(scheme),&amp;p);\n      \n      if(check_string(\":\/\/\",p)) {\n\tp+=3;\n\tparse_string(host,sizeof(host),&amp;p);\n      } else {\n\tstrcpy(host,scheme);\n\tstrcpy(scheme,\"http\");\n      }\n      \n      if(check_string(\":\",p)) {\n\tp++;\n\tparse_string(port,sizeof(port),&amp;p);\n      } else {\n\tstrcpy(port,\"80\");\n      }\n      \n      if(*p!='\/') \n\tstrcpy(rest,\"\/\");\n      else\n\tstrcpy(rest,p);\n      \n      if(fort_verbose) {    \n\tfprintf(stdout,\"URL:%s \",webpages&#91;c]);\n\tfprintf(stdout,\"&#91;scheme:%s]\",scheme);\n\tfprintf(stdout,\"&#91;host:%s]\",host);\n\tfprintf(stdout,\"&#91;port:%s]\",port);\n\tfprintf(stdout,\"&#91;rest:%s]\",p);\n\tfflush(stdout);\n      }\n      \n      if(!strcmp(scheme,\"http\"))\n\tfort_hash_http_page(host, port, p, hash);\n      else if(!strcmp(scheme,\"https\"))\n\tfort_hash_https_page(host, port, p, hash);\n      \n      if(fort_verbose) {\n\tfprintf(stdout,\"\\n\");\n\tfflush(stdout);\n      }\n      fort_reseed(sizeof(hash), hash);\n    }\n  }\n#endif \/\/ #ifdef FORT_USE_WEB\n    \n  if(localmix) {    \n#ifdef FORT_USE_URANDOM\n    memset(temp, 0, sizeof(temp));\n    fort_readfile_xor(sizeof(temp), temp,\n\t\t      \"\/dev\/urandom\");\n    fort_reseed(sizeof(temp), temp);\n    \n    dump_pools(\"Randomness from urandom\");\n#endif\n  \n#ifdef FORT_USE_RANDOM\n    memset(temp, 0, sizeof(temp));\n    fort_readfile_xor(sizeof(temp), temp,\n\t\t      \"\/dev\/random\");\n    fort_reseed(sizeof(temp), temp);\n    \n    dump_pools(\"Randomness from random\");\n#endif\n\n#if defined FORT_USE_RDRAND || \\\n  defined FORT_USE_RDSEED\n    HashCtx hashctx;\n#endif\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\t\t sizeof(cvar));\n      HashUpdate(&amp;hashctx, temp, sizeof(temp));\n      HashFinal(hash, &amp;hashctx);\n      \n      if(fort_verbose) {\n\tfprintf(stdout,\", sha256: \");\n\tfor(int c = 0;c &lt; HashLen; c++) {\n\t  fprintf(stdout,\"%02x\", hash&#91;c]);\n\t}\n\tfprintf(stdout,\"\\n\");\n\tfflush(stdout);\n      }\n      \n      fort_reseed(sizeof(hash), hash);\n      inccvar();\n    }  \n    \n#endif \/\/ #ifdef FORT_USE_RDRAND\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\t\t sizeof(cvar));\n      HashUpdate(&amp;hashctx, temp, sizeof(temp));\n      HashFinal(hash, &amp;hashctx);\n      \n      if(fort_verbose) {\n\tfprintf(stdout,\", sha256: \");\n\tfor(int c = 0;c &lt; HashLen; c++) {\n\t  fprintf(stdout,\"%02x\", hash&#91;c]);\n\t}\n\tfprintf(stdout,\"\\n\");\n\tfflush(stdout);\n      }\n      \n      fort_reseed(sizeof(hash), hash);\n      inccvar();\n    }\n\n#endif \/\/ #ifdef FORT_USE_RDSEED\n\n#ifdef FORT_USE_NEWRESSU_COMMAND\n\n    char *commands&#91;] = {\n      \"\/bin\/newressu -2 -s16 -w8 -l16 --space --lineno\",\n      \"\/bin\/newressu -2 -s16 -w8 -l16 --space --lineno --bits1024\",\n      \"\/bin\/newressu -2 -s16 -w8 -l16 --space --lineno --bits2048\",\n      \"\/bin\/newressu -2 -s16 -w8 -l16 --space --lineno --fast\",\n      \"\/bin\/newressu -2 -s16 -w8 -l16 --space --lineno --single\",\n      \"\/bin\/newressu -2 -s16 -w8 -l16 --space --lineno --urandom\",\n    };\n    \n    for(int c=0;c&lt;sizeof(commands)\/sizeof(commands&#91;0]);c++) {\n      if(strstr(commands&#91;c], \"--fort\")) {\n\tfprintf(stderr,\"%s: fort_mix(): cannot call fort recursively \\\"%s\\\"\\n\",\n\t\tprocname,commands&#91;c]);\n      } else {\n\tfort_hash_command(commands&#91;c], hash);\n\tfort_reseed(sizeof(hash), hash);\n\tdump_pools(\"Rand. from newressu\");\n      }\n    }\n#endif \/\/ #ifdef FORT_USE_NEWRESSU_COMMAND\n  }\n}<\/code><\/pre>\n\n\n\n<p>Lyhennetty fort_init() rutiinia: siirretty paikalliset ja web satunnaislukurutiinit edelliseen fort_mix() aliohjelmaan.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void fort_init()\n{\n  int c;\n  unsigned char temp&#91;64];\n    \n  if(fort_verbose) {\n    fprintf(stdout,\"hash: %s\",\n\t    HashName);\n    fprintf(stdout,\", pools: %d*%ld\", FORT_POOLS,\n\t    sizeof(struct fort_pool));\n    fprintf(stdout,\", HashCtx: %ld\",\n\t    sizeof(HashCtx));\n    fprintf(stdout,\", hashsize: %d\",\n\t    HashLen);\n    fprintf(stdout,\"\\n\");\n  }\n  \n  unsigned int save_fort_internal_events;\n  save_fort_internal_events=fort_internal_events;\n  fort_internal_events=1;\n\n  fort_next_save = 0;\n  \n  clearcvar();\n\n  \/\/ first key to fort_key\n  \n  fort_internal_random_data_1(sizeof(fort_key), fort_key);\n  dump_pools(\"Generate fort key w ressu\");\n\n  \/\/ Initialize buffers\n\n  for(c=0; c&lt;FORT_POOLS; c++) {\n    fort_pools&#91;c].length = 0;\n    HashInit(&amp;fort_pools&#91;c].pool);\n  }\n\n  dump_pools(\"Initialize buffers\");\n\n#ifdef DEBUG10\n\n  FILE *fp1;\n  \n  \/\/ Empty events file\n\n  if((fp1 = fopen(fort_events_file, \"w\"))!=NULL)\n    fclose(fp1);\n  event_id = 0;\n\n  dump_pools(\"Emptying events\");\n\n#endif \/\/ #ifdef DEBUG10\n\n  \/\/ Mix fort key with web + local\n  \/\/ random numbers\n  \n  fort_mix();\n\n  for(c=0; c&lt;FORT_POOLS; c++) {\n    FORT_INTERNAL_EVENTS_START(31)\n    fort_internal_random_data_2(sizeof(temp), temp);\n    hash_update(&amp;fort_pools&#91;c].pool,\n      temp, sizeof(temp));\n    FORT_INTERNAL_EVENTS_END(32)\n  }\n  dump_pools(\"Initialize buffers 2\");\n\n#ifdef FORT_INTERNAL_EVENTS\n\n  if(fort_internal_events) {\n\n    \/\/ Create some internal events\n\n    for(c=0; c&lt;128; c++) {\n      FORT_INTERNAL_EVENTS_START(34)\n      fort_internal_random_data_3(sizeof(temp), temp);\n      FORT_INTERNAL_EVENTS_END(35)\n    }\n  }\n  dump_pools(\"Internal events\");\n\n#endif \/\/ #ifdef FORT_INTERNAL_EVENTS\n\n  fort_reseed_count = 0;\n  fort_next_reseed = 0;\n\n  \/\/ Reseed fort_key with new events\n\n  fort_internal_random_data_3(sizeof(temp), temp);\n  fort_reseed(sizeof(temp), temp);\n\n  dump_pools(\"Reseed\");\n\n  fort_restore();\n\n  dump_pools(\"Restore\");\n\n  \/\/ Forget temp\n\n  memset(temp,0,sizeof(temp));\n\n  fort_internal_events = save_fort_internal_events;\n\n  \/\/fort_reseed_count = 0;\n  \/\/fort_next_reseed = 0;\n\n  fort_next_save = 1;\n}<\/code><\/pre>\n\n\n\n<p>Newressu:un fortin k\u00e4ytt\u00f6\u00f6n liittyv\u00e4t uudet rivit:<\/p>\n\n\n\n<p>Fort kytkimen #define<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define INPUT_SINGLE 3\n#define INPUT_FORT 6\n#define INPUT_URANDOM 8<\/code><\/pre>\n\n\n\n<p>Fort muutokset ressu_genbyte rutiiniin:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int ressu_genbyte()\n{\n  static unsigned char gent&#91;GENT_SIZE];\n  static unsigned int gent_pos=0;\n  unsigned char ch;\n\n  if(input==INPUT_RESSU) { \/\/ ressu prod\n    ressu_genbytes(sizeof(ch), &amp;ch);\n  } else if(input==INPUT_DEBUG) { \/\/ ressu debug\n    ressu_genbytes_debug(sizeof(ch), &amp;ch);\n  } else {\n    if(gent_pos==0) {\n      if(input==INPUT_FAST) \/\/ ressu_fast\n\tressu_genbytes_fast(sizeof(gent),gent);\n      else if(input==INPUT_SINGLE) \/\/ ressu single\n\tressu_genbytes_single(sizeof(gent),gent);\n#ifdef FORT\n      else if(input==INPUT_FORT) \/\/ ressu fort\n\tfort_random_data_xor(sizeof(gent),gent);\n#endif\n      else if(input==INPUT_URANDOM) \/\/ urandom\n\treadfile_xor(sizeof(gent),gent,urandomfilename);\n#ifdef USE_RANDOM\n      else if(input==INPUT_RANDOM) \/\/ random\n\treadfile_xor(sizeof(gent),gent,randomfilename);\n#endif\n    } \/\/ if(gent_pos==0\n    ch=gent&#91;gent_pos];\n    gent_pos=(gent_pos+1)%sizeof(gent);\n  }\n  return(ch);\n}<\/code><\/pre>\n\n\n\n<p>Muutokset newressu:n parametreihin:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      } else if(!strcmp(\"--single\",argv&#91;c])) {\n\tinput=INPUT_SINGLE;\n\n#ifdef FORT\n      } else if(!strcmp(\"--fort\",argv&#91;c])) {\n\tinput=INPUT_FORT;\n\n      } else if(!strcmp(\"--fortverbose\",argv&#91;c])) {\n\tfort_verbose=!fort_verbose;\n\n#endif\n      } else if(!strcmp(\"--urandom\",argv&#91;c])) {\n\tinput=INPUT_URANDOM;<\/code><\/pre>\n\n\n\n<p>Fort k\u00e4ytt\u00f6\u00f6n tarvittavat rivit newressun sample rutiinissa:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\t  else if(input==INPUT_SINGLE) \/\/ ressu single\n\t    ressu_genbytes_single(sizeof(buffer),buffer);\n#ifdef FORT\n\t  else if(input==INPUT_FORT) \/\/ ressu fort\n\t    fort_random_data_xor(sizeof(buffer),buffer);\n#endif\n\t  else if(input==INPUT_URANDOM) \/\/ urandom\n\t    readfile_xor(sizeof(buffer),buffer,urandomfilename);\n<\/code><\/pre>\n\n\n\n<p>Fort:in tarvitsemat muutokset help() rutiinissa:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      { \"newressu --single\", \"use randomness from single round of ressu\" },\n#ifdef FORT\n      { \"newressu --fort\", \"use randomness from fort\" },\n#endif\n      { \"newressu --urandom\", \"use randomness from \/dev\/urandom\" },<\/code><\/pre>\n\n\n\n<p>Fort_init():in ajo newressun main rutiinin alussa: newressussa ei yleens\u00e4 lueta\/kirjoiteta satunnaisuustiedostoa, mutta fort sellaisen kirjoittaa. Muutetaan tiedoston nimi newressulle sopivammaksi newressufort.rnd:ksi.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#ifdef FORT\n  if(input==INPUT_FORT) {\n    strcpy(fort_random_file,\"newressufort.rnd\");\n    \/\/fort_verbose=0;\n    fort_init();\n  }\n#endif<\/code><\/pre>\n\n\n\n<p>Fort_save:n ajo newressu main():in lopussa:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#ifdef FORT\n  if(input==INPUT_FORT) {\n    fort_save();\n  }\n#endif<\/code><\/pre>\n\n\n\n<p>Lopuksi pikkumuutos ressun ytimeen, vaihdettu edelliset int muuttujat e ja byte char muuttujiin, koodi nopeutuu parin \u00e4ndin verran.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define RR8(byte,bits) ( ((byte) &gt;&gt; (bits)) | ((byte) &lt;&lt; (8 - (bits))) )\n#define RL8(byte,bits) ( ((byte) &gt;&gt; (8 - (bits))) | ((byte) &lt;&lt; (bits)) )\n\nvoid ressu_genbytes_single(int size, unsigned char *buffer)\n{\n  int c, d;\n  unsigned char e, byte;\n  static int f = 0, prevbyte = -1, count = 0;\n\n  for(c=0; c&lt;8; c++) {\n    for(d=0; d&lt;size; d++) {\n      e = buffer&#91;d];\n      e = RL8(e,1); \/\/ rotate byte left 1 bits\n      \/\/e = RL8(e,3); \/\/ rotate byte left 3 bits\n      \/\/e = RR8(e,1); \/\/ rotate byte right 1 bits\n      byte = ressu_clockbyte();\n      if(prevbyte==-1)\n\tprevbyte=byte;\n      buffer&#91;d] = e^byte;\n      if(prevbyte!=byte) {\n\tperiods&#91;count]++;\n\tclockbytes+=count;\n\tcount=0;\n\tprevbyte=byte;\n      }\n      count++;\n    }\n    for(d=0; d&lt;size; d++) {\n      f = (f + buffer&#91;d]) % size;\n      e = buffer&#91;d];\n      buffer&#91;d] = buffer&#91;f];\n      buffer&#91;f] = e;\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<p>Viel\u00e4 satunnaisbittej\u00e4 fort:illa:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ .\/newressu --fort\n00000 59818670444809425543162104354361562640340355844080837840544433641\n00001 86429255670425150916832717631514962701533107502652385464513081919\n00002 76979793152447531086342437196445054777513582519487476941378535629\n00003 40767991408879135401047593100792228272345030462623728007130573104\n00004 14157104978698455671252478532622021194214885537707758473380527610\n00005 57195382289148516698441240384630711158933262341475159938820939915\n00006 41857440959364726778308992867020790449123381830117395560384712047\n00007 65902370722617522378841616480412046354128476919104801535402728895\n00008 69621109409433594842482505526285668086461153173873973262446568296\n00009 38436993219274697910526589849396741791725743176705486096314555338<\/code><\/pre>\n\n\n\n<p>T\u00e4ss\u00e4 uuden version kaikki sorsat: ensin Makefile:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CC =\t\tcc\nCFLAGS =\t-g -Wall -Wno-pointer-sign\nnewressuobjs =\tnewressu.mfs.o fort.o sha256.o intelrandom.o webrandom.o commandrandom.o\nnewressuwobjs =\tnewressu.mfs.o fort.w.o sha256.o intelrandom.o webrandom.o commandrandom.o\nnewressumobjs = newressu.m.o\nsha256objs =\tsha256.m.o\nfortobjs =\tfort.m.o sha256.o newressu.o intelrandom.o webrandom.o commandrandom.o\n\nall:\t\tnewressu newressuw newressum sha256 fort\n\nnewressu:\t$(newressuobjs)\n\t\tcc $(CFLAGS) $(newressuobjs) -o newressu -lssl\n\nnewressuw:\t$(newressuwobjs)\n\t\tcc $(CFLAGS) $(newressuwobjs) -o newressuw -lssl\n\nnewressum:\t$(newressumobjs)\n\t\tcc $(CFLAGS) $(newressumobjs) -o newressum\n\nsha256:\t\t$(sha256objs)\n\t\tcc $(CFLAGS) $(sha256objs) -o sha256\n\nfort:\t\t$(fortobjs)\n\t\tcc $(CFLAGS) $(fortobjs) -o fort -lssl\n\n%.mfs.o:\t%.c\n\t\t$(CC) $(CFLAGS) -DMAIN -DFORT -DSHA256 -c -o $@ $&lt;\n\n%.m.o:\t\t%.c\n\t\t$(CC) $(CFLAGS) -DMAIN -c -o $@ $&lt;\n\n%.w.o:\t\t%.c\n\t\t$(CC) $(CFLAGS) -DFORT_USE_WEB -c -o $@ $&lt;\n\n%.o:\t\t%.c\n\t\t$(CC) $(CFLAGS) -c -o $@ $&lt;\n\nclean:\n\t\trm -f *~ \\#*\\# *.o<\/code><\/pre>\n\n\n\n<p>Sitten fort.c:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;string.h&gt;\n#include &lt;time.h&gt;\n#include &lt;ctype.h&gt;\n\n#include &lt;sys\/time.h&gt;\n#include &lt;errno.h&gt;\n\n#include &lt;openssl\/ssl.h&gt;\n\n#include \"sha256.h\"\n#include \"newressu.h\"\n#include \"intelrandom.h\"\n\nextern unsigned char *procname;\nstatic unsigned char *programname = \"fort version 0.51 \u00a9\";\nstatic unsigned char *copyright = \"Copyright (c) 2020-2021 Jari Kuivaniemi, Helsinki, Finland. Kaikki oikeudet pid\u00e4tet\u00e4\u00e4n!\";\n\n#define FORT_INTERNAL_EVENTS 2\n\n#define aDEBUG10 2\n#define aDEBUG18 2\n\n#define FORT_XOR_VERSION 2\n#define FORT_ORIGINAL_VERSION 2\n\n#include \"fort.h\"\n\nint fort_events = 1;\nint fort_verbose = 0;\n\n#define DEBUG 2\n#define FORT_MIN_POOL_SIZE 64\nstatic unsigned int fort_internal_events = 1;\nstatic unsigned int fort_internal_event_mode = 1;\nint fort_partial_line = 0;\n\n\/\/#define FORT_USE_WEB 2 \/\/ in Makefile\n#define FORT_USE_URANDOM 2\n#define aFORT_USE_RANDOM 2\n#define FORT_USE_NEWRESSU_COMMAND 2\n\nunsigned char fort_random_file&#91;128] = \"fort.rnd\";\n\n#ifdef DEBUG10\nstatic int event_id = 0;\nstatic char fort_events_file&#91;128] = \"fortevents.deb\";\n#endif\n\n#define FORT_64_POOLS 2\n\n#ifdef FORT_64_POOLS\n#define FORT_POOLS 64\ntypedef unsigned long FORT_COUNTER;\n#else\n#define FORT_POOLS 32\ntypedef unsigned int FORT_COUNTER;\n#endif\n\nvoid fort_mix();\n\nunsigned char cvar&#91;16];\n\nvoid inccvar()\n{\n  int c = 0;\n\n  \/* 16 bytes, LSB first *\/\n  while(++cvar&#91;c] == 0 &amp;&amp; c &lt; sizeof(cvar)-1)\n    c++;\n}\n\nvoid clearcvar()\n{\n  int c;\n\n  for(c=0; c &lt; sizeof(cvar); c++)\n    cvar&#91;c] = 0;\n}\n\nstatic IUTIME gettenths()\n{\n  struct timeval tv;\n\n  gettimeofday(&amp;tv, NULL);\n\n  return((IUTIME)tv.tv_sec*10 +\n      (int)tv.tv_usec\/100000);\n}\n\nstatic IUTIME getmicroseconds()\n{\n  struct timeval tv;\n\n  gettimeofday(&amp;tv, NULL);\n\n  return((IUTIME)tv.tv_sec*1000000 +\n      tv.tv_usec);\n}\n\nstatic IUTIME getseconds()\n{\n  struct timeval tv;\n\n  gettimeofday(&amp;tv, NULL);\n\n  return((IUTIME)tv.tv_sec);\n}\n\nstruct fort_pool {\n  unsigned long length;\n  HashCtx pool;\n};\nstatic struct fort_pool fort_pools&#91;FORT_POOLS];\n\nvoid fort_add_random_event(int *pool, int source, int mode, int len, unsigned char *buf)\n{\n  while(len&gt;1 &amp;&amp; buf&#91;len-1]==0)\n    len--;\n\n  HashUpdate(&amp;fort_pools&#91;*pool].pool, buf, len);\n  fort_pools&#91;*pool].length+=len; \/\/ (unsigned long)2097152*16384;\n\n#ifdef DEBUG10\n  if(event_id &lt; 65536) {\n    FILE *fp1;\n    if((fp1=fopen(fort_events_file, \"a\"))!=NULL) {\n      fprintf(fp1,\"id=%d\", event_id);\n      fprintf(fp1,\", source=%02d\", source);\n      fprintf(fp1,\", pool=%02d\", *pool);\n      fprintf(fp1,\", mode=%d\", mode);\n      fprintf(fp1,\", len=%d\", len);\n      fprintf(fp1,\", data=\");\n      for(int c=0;c&lt;len;c++)\n        fprintf(fp1,\"%02x\", buf&#91;c]);\n      fprintf(fp1,\"\\n\");\n      fflush(fp1);\n      fclose(fp1);\n      event_id++;\n    }\n  }\n#endif\n\n  switch(mode) {\n\n  case 1:\n    (*pool) = ((*pool)+1) % FORT_POOLS;\n    break;\n\n  case 3:\n    break; \/\/ caller decides next pool\n\n  }\n}\n\nvoid fort_add_random_event_timer_start(IUTIME *micros)\n{\n  *micros = getmicroseconds();\n}\n\nvoid fort_add_random_event_timer_do(int *pool, int source, int mode, IUTIME *micros)\n{\n  unsigned char temp&#91;2];\n  IUTIME t;\n\n  t = getmicroseconds()-*micros;\n  temp&#91;0] = t &amp; 0xff;\n  temp&#91;1] = (t&gt;&gt;8) &amp; 0xff;\n\n  fort_add_random_event(pool, source, mode,\n\t\t\tsizeof(temp), temp);\n}\n\nvoid fort_add_random_event_time(int *pool, int source, int mode)\n{\n  int len;\n  unsigned char temp&#91;2];\n  IUTIME t;\n  static int prev_second=-1;\n\n  t = getmicroseconds();\n  temp&#91;0] = t &amp; 0xff;\n  temp&#91;1] = (t&gt;&gt;8) &amp; 0xff;\n  len=2;\n\n  if(prev_second==temp&#91;1]) {\n    len--;\n  } else {\n    prev_second=temp&#91;1];\n  }\n\n  fort_add_random_event(pool, source, mode,\n\t       len, temp);\n}\n\nvoid fort_add_random_event_split(int *pool, int source, int mode, int len, unsigned char *buf, int size)\n{\n  int n;\n\n  while(len != 0) {\n    n = (size&lt;len)? size:len;\n    fort_add_random_event(pool, source,\n        mode, n, buf);\n    buf += n;\n    len -= n;\n  }\n}\n\nvoid hash_init(HashCtx *hash)\n{\n  FORT_INTERNAL_EVENTS_START(10)\n\n  HashInit(hash);\n\n  FORT_INTERNAL_EVENTS_END(11)\n}\n\nvoid hash_update(HashCtx *hash, unsigned char *data, int len)\n{\n  FORT_INTERNAL_EVENTS_START(12)\n\n  HashUpdate(hash, data, len);\n\n  FORT_INTERNAL_EVENTS_END(13)\n}\n\nvoid hash_final(unsigned char digest&#91;HashLen], HashCtx *hash)\n{\n  FORT_INTERNAL_EVENTS_START(14)\n\n  HashFinal(digest, hash);\n\n  FORT_INTERNAL_EVENTS_END(15)\n}\n\nstatic unsigned char fort_key&#91;HashLen];\n\nvoid fort_rekey(unsigned char *buf)\n{\n  HashCtx hash;\n\n  FORT_INTERNAL_EVENTS_START(16)\n\n  hash_init(&amp;hash);\n  hash_update(&amp;hash, fort_key, sizeof(fort_key));\n  hash_update(&amp;hash, (unsigned char *)&amp;cvar,\n    sizeof(cvar));\n  hash_final(buf, &amp;hash);\n  inccvar();\n\n  \/\/ Forget hash\n\n  memset(&amp;hash, 0, sizeof(hash));\n\n  FORT_INTERNAL_EVENTS_END(17)\n}\n\n#define FORT_PSEUDO_LIMIT 1048576\n\n#ifdef FORT_ORIGINAL_VERSION\n\nvoid fort_pseudo_random_data(int len, \n    unsigned char *buf)\n{\n  unsigned char tmp&#91;HashLen];\n  unsigned int n, blockbytes;\n#ifdef DEBUG18\n  int d=0;\n#endif\n\n  FORT_INTERNAL_EVENTS_START(18)\n\n  blockbytes = 0;\n\n  while(len != 0) {\n    FORT_INTERNAL_EVENTS_START(19)\n\n    fort_rekey(tmp);\n    n = (len&lt;HashLen) ? len : HashLen;\n\n#ifdef DEBUG18\n    \n    fprintf(stdout,\"\\nbuf(%02x): \",d++);\n    for(int c=0;c&lt;n;c++)\n      fprintf(stdout,\" %02x\",buf&#91;c]);\n    fprintf(stdout,\"\\ntmp:     \");\n    for(int c=0;c&lt;n;c++)\n      fprintf(stdout,\" %02x\",tmp&#91;c]);\n    fprintf(stdout,\"\\nsum:     \");\n    for(int c=0;c&lt;n;c++)\n      fprintf(stdout,\" %02x\",buf&#91;c]^tmp&#91;c]);\n\n#endif \/\/ #ifdef DEBUG18\n\n    memcpy(buf, tmp, n);\n\n    buf += n;\n    len -= n;\n    blockbytes += n;\n\n    \/\/ rekey every 1048576 bytes if data left\n\n    if(blockbytes &gt;= FORT_PSEUDO_LIMIT &amp;&amp;\n        len &gt; 0) {                                                                                                              \n      fort_rekey(fort_key);\n      blockbytes = 0;\n    }\n\n    FORT_INTERNAL_EVENTS_END(20)\n  }\n\n  fort_rekey(fort_key);\n\n  \/\/ Forget last bytes\n\n  memset(tmp, 0, sizeof(tmp));\n\n  FORT_INTERNAL_EVENTS_END(21)\n}\n\n#endif\n\n\/\/ use \n\/\/ $ .\/newressu --fort -x -w32 -s2 -l2000 --space | more\n\/\/ to debug...\n\n#ifdef FORT_XOR_VERSION\n\nvoid fort_pseudo_random_data_xor(int len, \n    unsigned char *buf)\n{\n  unsigned char tmp&#91;HashLen];\n  unsigned int n, blockbytes;\n#ifdef DEBUG18\n  int d=0;\n#endif\n\n  FORT_INTERNAL_EVENTS_START(18)\n\n  blockbytes = 0;\n\n  while(len != 0) {\n    FORT_INTERNAL_EVENTS_START(19)\n\n    fort_rekey(tmp);\n    n = (len&lt;HashLen) ? len : HashLen;\n\n#ifdef DEBUG18\n\n    if(fort_partial_line)\n      fprintf(stdout,\"\\n\");\n    fprintf(stdout,\"buf(%02x): \",d++);\n    for(int c=0;c&lt;n;c++)\n      fprintf(stdout,\" %02x\",buf&#91;c]);\n    fprintf(stdout,\"\\ntmp:     \");\n    for(int c=0;c&lt;n;c++)\n      fprintf(stdout,\" %02x\",tmp&#91;c]);\n    fprintf(stdout,\"\\nsum:     \");\n    for(int c=0;c&lt;n;c++)\n      fprintf(stdout,\" %02x\",buf&#91;c]^tmp&#91;c]);\n    fprintf(stdout,\"\\n\");\n\n#endif\n    \n    for(int c=0;c&lt;n;c++)\n      buf&#91;c]^=tmp&#91;c];\n\n    buf += n;\n    len -= n;\n    blockbytes += n;\n\n    \/\/ rekey every 1048576 bytes if data left\n\n    if(blockbytes &gt;= FORT_PSEUDO_LIMIT &amp;&amp;\n        len &gt; 0) {                                                                                                              \n      fort_rekey(fort_key);\n      blockbytes = 0;\n    }\n\n    FORT_INTERNAL_EVENTS_END(20)\n  }\n\n  fort_rekey(fort_key);\n\n  \/\/ Forget last bytes\n\n  memset(tmp, 0, sizeof(tmp));\n\n  FORT_INTERNAL_EVENTS_END(21)\n}\n\n#endif \/\/ #ifdef FORT_XOR_VERSION\n\n\/\/ choose one of\n\/\/     60 (1 minute)\n\/\/     300 (5 minutes)\n\/\/     600 (10 minutes)\n\/\/     900 (15 minutes)\n\/\/     1200 (20 minutes)\n\/\/     1800 (30 minutes)\n\/\/     3600 (hour)\n\/\/     7200 (2 hours)\n\/\/     10800 (3 hours)\n\/\/     14400 (4 hours)\n\/\/     21600 (6 hours)\n\/\/     28800 (8 hours)\n\/\/     43200 (12 hours)\n\/\/     86400 (24 hours)\n\/\/ to get readable report..\n\n#define FORT_SECONDS_BETWEEN_SAVES 10*60\nstatic IUTIME fort_next_save = 0;\n\n#define TIMEFORMAT \"%Z%Y%m%d%H%M%S\"\n\nvoid dump_pools(char *header);\nvoid fort_save();\n\nstatic char current_timezone&#91;10];\n\nvoid fort_reseed(int len, unsigned char *buf)\n{\n  HashCtx hash;\n\n  FORT_INTERNAL_EVENTS_START(22)\n\n  hash_init(&amp;hash);\n  hash_update(&amp;hash, fort_key, sizeof(fort_key));\n  hash_update(&amp;hash, (unsigned char *)&amp;cvar,\n      sizeof(cvar));\n  hash_update(&amp;hash, buf, len);\n  hash_final(fort_key, &amp;hash);\n  inccvar();\n\n  memset(&amp;hash, 0, sizeof(hash));\n\n  if(fort_next_save != 0) {\n    IUTIME seconds;\n    seconds = getseconds();\n    \n    char timezone&#91;10];\n    strftime(timezone, sizeof(timezone), \"%Z\",\n             localtime((time_t *)&amp;seconds) );\n    if(strcmp(current_timezone,timezone)) {\n      fort_next_save=1;\n      strcpy(current_timezone,timezone);\n    }\n    \n    if(fort_next_save != 0 &amp;&amp;\n       seconds &gt;= fort_next_save) {\n      \n      IUTIME diff=\n        timegm(localtime((time_t *)&amp;seconds))-seconds;\n      \n      fort_next_save = seconds -\n        ((seconds+diff) %\n         FORT_SECONDS_BETWEEN_SAVES) +\n        FORT_SECONDS_BETWEEN_SAVES;\n      \n      fort_save();\n    }\n  }\n\n  FORT_INTERNAL_EVENTS_END(23)\n}\n\nvoid dump_pools_data(FILE *fp1, char *header);\n\nstatic FORT_COUNTER fort_reseed_count = 0;\nstatic IUTIME fort_next_reseed = 0;\n\n#ifdef FORT_ORIGINAL_VERSION\n\nvoid fort_random_data(int len, unsigned char *buf)\n{\n  int c;\n  IUTIME tenths;\n  HashCtx hash;\n  unsigned char buffer&#91;HashLen];\n\n  FORT_INTERNAL_EVENTS_START(24)\n\n  if(fort_verbose)\n    dump_pools_data(stdout,\"reseed start\");\n    \n  tenths=gettenths();\n\n  if( (fort_next_reseed == 0) ||\n      (fort_next_reseed &lt;= tenths &amp;&amp;\n      fort_pools&#91;0].length &gt;=\n      FORT_MIN_POOL_SIZE) ) {\n\n    fort_mix();\n    \n    \/\/ next tenth of a second\n\n    fort_next_reseed = tenths + 1;\n    fort_reseed_count++;\n\n    hash_init(&amp;hash);\n    c=0;\n\n    while(c &lt; FORT_POOLS &amp;&amp; (fort_reseed_count\n        % (1&lt;&lt;c)) == 0) {\n\n      FORT_INTERNAL_EVENTS_START(25)\n\n      hash_final(buffer, &amp;fort_pools&#91;c].pool);\n      hash_update(&amp;hash, buffer, sizeof(buffer));\n      fort_pools&#91;c].length = 0;\n      HashInit(&amp;fort_pools&#91;c].pool);\n\n      \/\/ save earlier pool to new one\n\n      hash_update(&amp;fort_pools&#91;c].pool,\n        buffer, sizeof(buffer));\n      c++;\n\n      FORT_INTERNAL_EVENTS_END(26)\n    }\n    hash_update(&amp;hash, (unsigned char *)\n        &amp;cvar, sizeof(cvar));\n    hash_final(buffer, &amp;hash);\n    fort_reseed(sizeof(buffer), buffer);\n\n    \/\/ Forget hash context\n\n    memset(&amp;hash, 0, sizeof(hash));\n\n    \/\/ Forget reseed key\n\n    memset(buffer, 0, sizeof(buffer));\n    inccvar();\n\n    if(fort_verbose)\n      dump_pools_data(stdout,\"reseed end\");\n  }\n\n  fort_pseudo_random_data(len, buf);\n\n  FORT_INTERNAL_EVENTS_END(27)\n}\n\n#endif \/\/ #ifdef FORT_ORIGINAL_VERSION\n\n#ifdef FORT_XOR_VERSION\n\nvoid fort_random_data_xor(int len, unsigned char *buf)\n{\n  int c;\n  IUTIME tenths;\n  HashCtx hash;\n  unsigned char buffer&#91;HashLen];\n\n  FORT_INTERNAL_EVENTS_START(24)\n\n  if(fort_verbose)\n    dump_pools_data(stdout,\"reseed start\");\n        \n  tenths=gettenths();\n\n  if( (fort_next_reseed == 0) ||\n      (fort_next_reseed &lt;= tenths &amp;&amp;\n      fort_pools&#91;0].length &gt;=\n      FORT_MIN_POOL_SIZE) ) {\n\n    fort_mix();\n\n    \/\/ next tenth of a second\n\n    fort_next_reseed = tenths + 1;\n    fort_reseed_count++;\n\n    hash_init(&amp;hash);\n    c=0;\n\n    while(c &lt; FORT_POOLS &amp;&amp; (fort_reseed_count\n        % (1&lt;&lt;c)) == 0) {\n\n      FORT_INTERNAL_EVENTS_START(25)\n\n      hash_final(buffer, &amp;fort_pools&#91;c].pool);\n      hash_update(&amp;hash, buffer, sizeof(buffer));\n      fort_pools&#91;c].length = 0;\n      HashInit(&amp;fort_pools&#91;c].pool);\n\n      \/\/ save earlier pool to new one\n\n      hash_update(&amp;fort_pools&#91;c].pool,\n        buffer, sizeof(buffer));\n      c++;\n\n      FORT_INTERNAL_EVENTS_END(26)\n    }\n    hash_update(&amp;hash, (unsigned char *)\n        &amp;cvar, sizeof(cvar));\n    hash_final(buffer, &amp;hash);\n    fort_reseed(sizeof(buffer), buffer);\n\n    \/\/ Forget hash context\n\n    memset(&amp;hash, 0, sizeof(hash));\n\n    \/\/ Forget reseed key\n\n    memset(buffer, 0, sizeof(buffer));\n    inccvar();\n\n    if(fort_verbose)\n      dump_pools_data(stdout,\"random_data_xor end\");\n\n  }\n\n  fort_pseudo_random_data_xor(len, buf);\n\n  FORT_INTERNAL_EVENTS_END(27)\n}\n\n#endif \/\/ #ifdef FORT_XOR_VERSION\n\n#define FORTCNT 128\n\nstatic unsigned int fort_cnt = FORTCNT;\nstatic unsigned char fort_bytes&#91;FORTCNT];\nstatic int fort_byte = 999999999;\n\nint fort_random_data_byte()\n{\n  if(fort_byte &gt;= fort_cnt) {\n    fort_random_data(fort_cnt, fort_bytes);\n    fort_byte = 0;\n  }\n  return(fort_bytes&#91;fort_byte++]);\n}\n\nvoid fort_clear()\n{\n  memset(fort_bytes, 0, fort_cnt);\n  fort_byte = 999999998;\n}\n\nint fort_random_data_byte_limit(int limit)\n{\n  int c;\n\n  while((c = fort_random_data_byte())&gt;=\n      (256\/limit)*limit);\n\n  return(c % limit);\n}\n\nvoid fort_random_data_buffer(int size,\n    unsigned char *buffer)\n{\n  int c;\n\n  for(c=0; c&lt;size; c++)\n    buffer&#91;c] ^= fort_random_data_byte();\n}\n\n#define aFORT_DUMP_POOLS_BIN 2\n\n#ifdef FORT_DUMP_POOLS_BIN\n#define FORT_DUMP_POOLS_HIGH 1023\n#define FORT_DUMP_POOLS_DIVIDER 1024\n#define FORT_DUMP_POOLS_FIELD_WIDTH 6\n#else\n#define FORT_DUMP_POOLS_HIGH 999\n#define FORT_DUMP_POOLS_DIVIDER 1000\n#define FORT_DUMP_POOLS_FIELD_WIDTH 5\n#endif\n\n#define FORT_DUMP_POOLS_WIDTH 32\n\nstatic void readable_length(char *buf,\n    unsigned long length)\n{\n  int c, low;\n\n  \/\/ B = byte\n  \/\/ K = kilo   10^3   2^10\n  \/\/ M = mega   10^6   2^20\n  \/\/ G = giga   10^9   2^30\n  \/\/ T = tera   10^12  2^40\n  \/\/ P = peta   10^15  2^50\n  \/\/ E = exa    10^18  2^60\n  \/\/ Z = zetta  10^21  2^70\n  \/\/ Y = yotta  10^24  2^80\n\n  char units&#91;] = \"BKMGTPEZY\";\n\n  strcpy(buf,\"***\");\n  low=0;\n\n  for(c=0; length&gt;=low &amp;&amp;\n      c&lt;sizeof(units)-1; c++) {\n    if(length&gt;=low &amp;&amp;\n        length&lt;=FORT_DUMP_POOLS_HIGH) {\n      if(units&#91;c]!='B')\n        sprintf(buf,\"%ld%c\", length, units&#91;c]);\n      else\n        sprintf(buf,\"%ld\", length);\n      break;\n    }\n    length\/=FORT_DUMP_POOLS_DIVIDER;\n    low=1;\n  }\n}\n\nvoid dump_pools_data(FILE *fp1, char *header)\n{\n  int c;\n  unsigned char readable&#91;10];\n\n  if(fort_partial_line) {\n    fprintf(fp1,\"\\n\");\n    fort_partial_line=0;\n  }\n  fprintf(fp1,\"%-27s\", header);\n  for(c=0;c&lt;FORT_POOLS;c++) {\n    if(c&gt;0 &amp;&amp; c%FORT_DUMP_POOLS_WIDTH==0)\n      fprintf(fp1,\"\\n%-27s\",\"\");\n    readable_length(readable,\n\t    fort_pools&#91;c].length);\n    fprintf(fp1,\"%*s\",\n\t    FORT_DUMP_POOLS_FIELD_WIDTH,\n\t    readable);\n  }\n  fprintf(fp1,\"\\n\");\n}\n\nvoid dump_pools(char *header)\n{\n  if(fort_verbose)\n    dump_pools_data(stdout,header);\n}\n\n#define FORT_SAVE_SIZE 1024\n\nvoid fort_save()\n{\n  FILE *fp1;\n  unsigned char buffer&#91;FORT_SAVE_SIZE];\n\n  if((fp1 = fopen(fort_random_file, \"w\"))\n      != NULL) {\n    fort_pseudo_random_data(sizeof(buffer), buffer);\n    fwrite(buffer, 1, sizeof(buffer), fp1);\n    memset(buffer, 0, sizeof(buffer));\n    fclose(fp1);\n  }\n}\n\nvoid fort_restore()\n{\n  int d;\n  FILE *fp1;\n  unsigned char buffer&#91;FORT_SAVE_SIZE];\n\n  if((fp1 = fopen(fort_random_file, \"rb\"))\n      != NULL) {\n    d = fread(buffer, 1, sizeof(buffer), fp1);\n    fclose(fp1);\n  } else {\n    fort_pseudo_random_data(sizeof(buffer), buffer);\n    ressu_genbytes(sizeof(buffer), buffer);\n    d = sizeof(buffer);\n  }\n  fort_reseed(d, buffer);\n  memset(buffer, 0, sizeof(buffer));\n\n  fort_save();\n}\n\n#if defined FORT_USE_URANDOM || \\\n    defined FORT_USE_RANDOM\n\nstatic void fort_readfile_xor(int len,\n    unsigned char *buf,\n    unsigned char *filename)\n{\n  int c, n, n2;\n  unsigned char temp&#91;64];\n  FILE *fp1;\n\n  if((fp1 = fopen(filename, \"rb\"))\n      != NULL) {\n    while(len != 0) {\n      n = (len &lt; sizeof(temp)) ?\n          len : sizeof(temp);\n      n2=fread(temp, 1, n, fp1);\n      for(c = 0; c &lt; n2; c++)\n        buf&#91;c] ^= temp&#91;c];\n      len -= n2;\n      buf += n2;\n    }\n    fclose(fp1);\n  }\n}\n\n#endif\n\n#ifdef FORT_USE_WEB\n\nstatic void parse_string(unsigned char *string, int size, unsigned char **p2)\n{\n  int count;\n  unsigned char *p, *q;\n\n  p=*p2;\n  q=string;\n  count=0;\n\n  \/\/ uppercase &amp; lowercase letters, '.'\n  \/\/ or utf-8\n\n  while(isalnum(*p)||*p=='.'||*p&gt;0x80) {\n    if(++count&lt;size)\n      *q++=*p;\n    p++;\n  }\n  *q='\\0';\n  *p2=p;\n}\n\n#endif \/\/ #ifdef FORT_USE_WEB\n\n#ifdef FORT_USE_WEB\n\nstatic int check_string(unsigned char *string, unsigned char *p)\n{\n  int ok;\n\n  ok=0;\n  if(!strncmp(string,p,strlen(string))) {\n    ok=1;\n  }\n\n  return(ok);\n}\n\n#endif \/\/ #ifdef FORT_USE_WEB\n\nvoid fort_internal_random_data_1(int size, char *buf)\n{\n  ressu_genbytes(size, buf);\n#ifdef FORT_XOR_VERSION\n  fort_pseudo_random_data_xor(size, buf);\n#endif\n}\n\nvoid fort_internal_random_data_2(int size, char *buf)\n{\n#ifdef FORT_XOR_VERSION\n  fort_pseudo_random_data_xor(size, buf);\n#else\n  fort_pseudo_random_data(size, buf);\n#endif\n  ressu_genbytes(size, buf);\n}\n\nvoid fort_internal_random_data_3(int size, char *buf)\n{\n#ifdef FORT_XOR_VERSION\n  fort_random_data_xor(size, buf);\n#else\n  fort_random_data(size, buf);\n#endif\n}\n\nstatic IUTIME fort_next_localmix = 0;\n#define FORT_SECONDS_BETWEEN_LOCALMIXES 60*60\nstatic IUTIME fort_next_webmix = 0;\n#define FORT_SECONDS_BETWEEN_WEBMIXES 12*3600\n\nvoid fort_mix()\n{\n  int webmix=0, localmix=0;\n  unsigned char temp&#91;64];\n\n  IUTIME seconds;\n\n  if(fort_verbose)\n    dump_pools_data(stdout,\"fort_mix\");\n  \n  seconds = getseconds();\n  \n  webmix=0;\n  localmix=0;\n\n  if(fort_next_webmix == 0 ||\n     fort_next_webmix &lt;= seconds) {\n    fort_next_webmix=seconds+FORT_SECONDS_BETWEEN_WEBMIXES;\n    webmix=1;\n    localmix=1;\n  }\n\n  if(fort_next_localmix == 0 ||\n     fort_next_localmix &lt;= seconds) {\n    fort_next_localmix=seconds+FORT_SECONDS_BETWEEN_LOCALMIXES;\n    localmix=1;\n  }\n\n  if(!webmix &amp;&amp; !localmix)\n    return;\n  \n  if(fort_verbose) {  \n    char timebuf&#91;128];\n    strftime(timebuf, sizeof(timebuf), TIMEFORMAT,\n\t     localtime((time_t *)&amp;seconds));\n    fprintf(stdout,\"Fort mix time:      %s\\n\",timebuf);\n    strftime(timebuf, sizeof(timebuf), TIMEFORMAT,\n\t     localtime((time_t *)&amp;fort_next_webmix));\n    fprintf(stdout,\"Next fort webmix:   %s\\n\",timebuf);\n    strftime(timebuf, sizeof(timebuf), TIMEFORMAT,\n\t     localtime((time_t *)&amp;fort_next_localmix));\n    fprintf(stdout,\"Next fort localmix: %s\\n\",timebuf);\n  }\n  \n  fort_internal_random_data_1(sizeof(temp), temp);\n  fort_reseed(sizeof(temp), temp);\n  \n  dump_pools(\"Randomness from ressu\");\n\n#if defined FORT_USE_WEB || \\\n  defined FORT_USE_RDRAND || \\\n  defined FORT_USE_RDSEED || \\\n  defined FORT_USE_NEWRESSU_COMMAND\n  unsigned char hash&#91;HashLen];\n#endif    \n  \n#ifdef FORT_USE_WEB\n  if(webmix) {\n    char *webpages&#91;] = {\n      \"https:\/\/moijari.com:5001\/\",\n      \"https:\/\/moijari.com:5005\/\",\n      \"https:\/\/moijari.com:5006\/\",\n    };\n\n    for(int c=0;c&lt;sizeof(webpages)\/sizeof(webpages&#91;0]);c++) {\n      unsigned char *p;\n      \n      unsigned char scheme&#91;32];\n      unsigned char host&#91;32];\n      unsigned char port&#91;10];\n      unsigned char rest&#91;128];\n      \n      p=webpages&#91;c];\n      parse_string(scheme,sizeof(scheme),&amp;p);\n      \n      if(check_string(\":\/\/\",p)) {\n\tp+=3;\n\tparse_string(host,sizeof(host),&amp;p);\n      } else {\n\tstrcpy(host,scheme);\n\tstrcpy(scheme,\"http\");\n      }\n      \n      if(check_string(\":\",p)) {\n\tp++;\n\tparse_string(port,sizeof(port),&amp;p);\n      } else {\n\tstrcpy(port,\"80\");\n      }\n      \n      if(*p!='\/') \n\tstrcpy(rest,\"\/\");\n      else\n\tstrcpy(rest,p);\n      \n      if(fort_verbose) {    \n\tfprintf(stdout,\"URL:%s \",webpages&#91;c]);\n\tfprintf(stdout,\"&#91;scheme:%s]\",scheme);\n\tfprintf(stdout,\"&#91;host:%s]\",host);\n\tfprintf(stdout,\"&#91;port:%s]\",port);\n\tfprintf(stdout,\"&#91;rest:%s]\",p);\n\tfflush(stdout);\n      }\n      \n      if(!strcmp(scheme,\"http\"))\n\tfort_hash_http_page(host, port, p, hash);\n      else if(!strcmp(scheme,\"https\"))\n\tfort_hash_https_page(host, port, p, hash);\n      \n      if(fort_verbose) {\n\tfprintf(stdout,\"\\n\");\n\tfflush(stdout);\n      }\n      fort_reseed(sizeof(hash), hash);\n    }\n  }\n#endif \/\/ #ifdef FORT_USE_WEB\n    \n  if(localmix) {    \n#ifdef FORT_USE_URANDOM\n    memset(temp, 0, sizeof(temp));\n    fort_readfile_xor(sizeof(temp), temp,\n\t\t      \"\/dev\/urandom\");\n    fort_reseed(sizeof(temp), temp);\n    \n    dump_pools(\"Randomness from urandom\");\n#endif\n  \n#ifdef FORT_USE_RANDOM\n    memset(temp, 0, sizeof(temp));\n    fort_readfile_xor(sizeof(temp), temp,\n\t\t      \"\/dev\/random\");\n    fort_reseed(sizeof(temp), temp);\n    \n    dump_pools(\"Randomness from random\");\n#endif\n\n#if defined FORT_USE_RDRAND || \\\n  defined FORT_USE_RDSEED\n    HashCtx hashctx;\n#endif\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\t\t sizeof(cvar));\n      HashUpdate(&amp;hashctx, temp, sizeof(temp));\n      HashFinal(hash, &amp;hashctx);\n      \n      if(fort_verbose) {\n\tfprintf(stdout,\", sha256: \");\n\tfor(int c = 0;c &lt; HashLen; c++) {\n\t  fprintf(stdout,\"%02x\", hash&#91;c]);\n\t}\n\tfprintf(stdout,\"\\n\");\n\tfflush(stdout);\n      }\n      \n      fort_reseed(sizeof(hash), hash);\n      inccvar();\n    }  \n    \n#endif \/\/ #ifdef FORT_USE_RDRAND\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\t\t sizeof(cvar));\n      HashUpdate(&amp;hashctx, temp, sizeof(temp));\n      HashFinal(hash, &amp;hashctx);\n      \n      if(fort_verbose) {\n\tfprintf(stdout,\", sha256: \");\n\tfor(int c = 0;c &lt; HashLen; c++) {\n\t  fprintf(stdout,\"%02x\", hash&#91;c]);\n\t}\n\tfprintf(stdout,\"\\n\");\n\tfflush(stdout);\n      }\n      \n      fort_reseed(sizeof(hash), hash);\n      inccvar();\n    }\n\n#endif \/\/ #ifdef FORT_USE_RDSEED\n\n#ifdef FORT_USE_NEWRESSU_COMMAND\n\n    char *commands&#91;] = {\n      \"\/bin\/newressu -2 -s16 -w8 -l16 --space --lineno\",\n      \"\/bin\/newressu -2 -s16 -w8 -l16 --space --lineno --bits1024\",\n      \"\/bin\/newressu -2 -s16 -w8 -l16 --space --lineno --bits2048\",\n      \"\/bin\/newressu -2 -s16 -w8 -l16 --space --lineno --fast\",\n      \"\/bin\/newressu -2 -s16 -w8 -l16 --space --lineno --single\",\n      \"\/bin\/newressu -2 -s16 -w8 -l16 --space --lineno --urandom\",\n    };\n    \n    for(int c=0;c&lt;sizeof(commands)\/sizeof(commands&#91;0]);c++) {\n      if(strstr(commands&#91;c], \"--fort\")) {\n\tfprintf(stderr,\"%s: fort_mix(): cannot call fort recursively \\\"%s\\\"\\n\",\n\t\tprocname,commands&#91;c]);\n      } else {\n\tfort_hash_command(commands&#91;c], hash);\n\tfort_reseed(sizeof(hash), hash);\n\tdump_pools(\"Rand. from newressu\");\n      }\n    }\n#endif \/\/ #ifdef FORT_USE_NEWRESSU_COMMAND\n  }\n}\n\nvoid fort_init()\n{\n  int c;\n  unsigned char temp&#91;64];\n    \n  if(fort_verbose) {\n    fprintf(stdout,\"hash: %s\",\n\t    HashName);\n    fprintf(stdout,\", pools: %d*%ld\", FORT_POOLS,\n\t    sizeof(struct fort_pool));\n    fprintf(stdout,\", HashCtx: %ld\",\n\t    sizeof(HashCtx));\n    fprintf(stdout,\", hashsize: %d\",\n\t    HashLen);\n    fprintf(stdout,\"\\n\");\n  }\n  \n  unsigned int save_fort_internal_events;\n  save_fort_internal_events=fort_internal_events;\n  fort_internal_events=1;\n\n  fort_next_save = 0;\n  \n  clearcvar();\n\n  \/\/ first key to fort_key\n  \n  fort_internal_random_data_1(sizeof(fort_key), fort_key);\n  dump_pools(\"Generate fort key w ressu\");\n\n  \/\/ Initialize buffers\n\n  for(c=0; c&lt;FORT_POOLS; c++) {\n    fort_pools&#91;c].length = 0;\n    HashInit(&amp;fort_pools&#91;c].pool);\n  }\n\n  dump_pools(\"Initialize buffers\");\n\n#ifdef DEBUG10\n\n  FILE *fp1;\n  \n  \/\/ Empty events file\n\n  if((fp1 = fopen(fort_events_file, \"w\"))!=NULL)\n    fclose(fp1);\n  event_id = 0;\n\n  dump_pools(\"Emptying events\");\n\n#endif \/\/ #ifdef DEBUG10\n\n  \/\/ Mix fort key with web + local\n  \/\/ random numbers\n  \n  fort_mix();\n\n  for(c=0; c&lt;FORT_POOLS; c++) {\n    FORT_INTERNAL_EVENTS_START(31)\n    fort_internal_random_data_2(sizeof(temp), temp);\n    hash_update(&amp;fort_pools&#91;c].pool,\n      temp, sizeof(temp));\n    FORT_INTERNAL_EVENTS_END(32)\n  }\n  dump_pools(\"Initialize buffers 2\");\n\n#ifdef FORT_INTERNAL_EVENTS\n\n  if(fort_internal_events) {\n\n    \/\/ Create some internal events\n\n    for(c=0; c&lt;128; c++) {\n      FORT_INTERNAL_EVENTS_START(34)\n      fort_internal_random_data_3(sizeof(temp), temp);\n      FORT_INTERNAL_EVENTS_END(35)\n    }\n  }\n  dump_pools(\"Internal events\");\n\n#endif \/\/ #ifdef FORT_INTERNAL_EVENTS\n\n  fort_reseed_count = 0;\n  fort_next_reseed = 0;\n\n  \/\/ Reseed fort_key with new events\n\n  fort_internal_random_data_3(sizeof(temp), temp);\n  fort_reseed(sizeof(temp), temp);\n\n  dump_pools(\"Reseed\");\n\n  fort_restore();\n\n  dump_pools(\"Restore\");\n\n  \/\/ Forget temp\n\n  memset(temp,0,sizeof(temp));\n\n  fort_internal_events = save_fort_internal_events;\n\n  \/\/fort_reseed_count = 0;\n  \/\/fort_next_reseed = 0;\n\n  fort_next_save = 1;\n}\n\nvoid fort_version()\n{\n  fprintf(stderr,\"%s\",programname); \/\/ touch these outside MAIN\n  fprintf(stderr,\", %s\\n\",copyright);\n}\n\n#define aMAIN 2\n#ifdef MAIN\n\nunsigned char *procname;\n\nint main(int argc, char *argv&#91;])\n{\n  procname=argv&#91;0];\n  fort_version();\n  fort_init();\n  return(0);\n}\n\n#endif \/\/ #ifdef MAIN<\/code><\/pre>\n\n\n\n<p>Fort.h:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/* Perustuu Bruce Schneierin kirjassa esitt\u00e4m\u00e4\u00e4n fortuna j\u00e4rjestelm\u00e4\u00e4n.\n * Written by Jari Kuivaniemi\n *\/\ntypedef unsigned long long IUTIME;\n\nextern int fort_verbose;\nextern int fort_partial_line;\n\nextern unsigned char fort_random_file&#91;128];\nextern unsigned char fort_pools_file&#91;128];\n#ifdef DEBUG10\nstatic char fort_events_file&#91;128] = \"fortevents.deb\";\n#endif\nunsigned char cvar&#91;16];\nvoid inccvar();\nvoid clearcvar();\n\nvoid fort_add_random_event(int *pool, int source, int mode, int len, unsigned char *buf);\nvoid fort_add_random_event_timer_start(IUTIME *micros);\nvoid fort_add_random_event_timer_do(int *pool, int source, int mode, IUTIME *millis);\nvoid fort_add_random_event_split(int *pool, int source, int mode, int len, unsigned char *buf,int size);\nvoid fort_add_random_event_time(int *pool, int source, int mode);\nvoid fort_rekey(unsigned char *buf);\nvoid fort_pseudo_random_data(int len,unsigned char *buf);\nvoid fort_pseudo_random_data_xor(int len,unsigned char *buf);\nvoid fort_reseed(int len,unsigned char *buf);\nvoid fort_random_data(int len,unsigned char *buf);\nvoid fort_random_data_xor(int len,unsigned char *buf);\nint fort_random_data_byte();\nvoid fort_clear();\nint fort_random_data_byte_limit(int limit);\nvoid fort_random_data_buffer(int size, unsigned char *buffer);\nvoid fort_save();\nvoid fort_read_file();\nvoid fort_mix();\nvoid fort_init();\nvoid hash_init(HashCtx *hash);\nvoid hash_update(HashCtx *hash, unsigned char *data, int len);\nvoid hash_final(unsigned char digest&#91;HashLen], HashCtx *hash);\n\nvoid fort_hash_http_page(unsigned char *host,unsigned char *port, unsigned char *page, unsigned char *hash);\nvoid fort_hash_https_page(unsigned char *host,unsigned char *port, unsigned char *page, unsigned char *hash);\n\nvoid fort_hash_command(unsigned char *command, unsigned char *hash);\n\n#ifdef FORT_INTERNAL_EVENTS\n#define FORT_INTERNAL_EVENTS_START(source) \\\n  IUTIME micros;                           \\\n  static int \\\n    pool=0, pool2=0; \\\n  if(fort_internal_events) { \\\n    fort_add_random_event_time(&amp;pool, \\\n    source, fort_internal_event_mode); \\\n    fort_add_random_event_timer_start(&amp;micros); \\\n  }\n#else\n#define FORT_INTERNAL_EVENTS_START(source)\n#endif\n\n#ifdef FORT_INTERNAL_EVENTS\n#define FORT_INTERNAL_EVENTS_END(source) \\\n  if(fort_internal_events) \\\n    fort_add_random_event_timer_do(&amp;pool2, \\\n      source, fort_internal_event_mode, \\\n      &amp;micros);\n#else\n#define FORT_INTERNAL_EVENTS_END(source)\n#endif\n\n#ifdef FORT_EVENTS\n#define FORT_EVENTS_START(source) \\\n  IUTIME micros;                           \\\n  static int \\\n    pool=0, pool2=0; \\\n  if(fort_events) { \\\n    fort_add_random_event_time(&amp;pool, \\\n    source, fort_event_mode); \\\n    fort_add_random_event_timer_start(&amp;micros); \\\n  }\n#else\n#define FORT_EVENTS_START(source)\n#endif\n\n#ifdef FORT_EVENTS\n#define FORT_EVENTS_END(source) \\\n  if(fort_events) \\\n    fort_add_random_event_timer_do(&amp;pool2, \\\n      source, fort_event_mode, \\\n      &amp;micros);\n#else\n#define FORT_EVENTS_END(source)\n#endif<\/code><\/pre>\n\n\n\n<p>Intelrandom.c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h&gt;\n#include &lt;memory.h&gt;\n\n#include \"intelrandom.h\"\n\n#if defined FORT_USE_RDRAND ||\t\t\t\\\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\t    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\t       : \"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\n\n#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\t       : \"=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    if(fort_verbose)\n      fprintf(stdout,\"Intel rdrand\");\n    ret=1;\n  } else if(_is_cpu_vendor(\"AuthenticAMD\") &amp;&amp; _has_rdrand()) {\n    if(fort_verbose)\n      fprintf(stdout,\"AMD rdrand\");\n    ret=1;\n  }\n  \n  if(ret) {\n    while(buflen &gt; 0) {\n      if((ret = _rdrand_long(&amp;l)) == 0) \/\/ 1 ok, 0 fail\n\tbreak;\n      if(fort_verbose)\n\tfprintf(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 \/\/ #ifdef FORT_USE_RDRAND\n\n#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\t       : \"=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    if(fort_verbose)\n      fprintf(stdout,\"Intel rdseed\");\n    ret=1;\n  } else if(_is_cpu_vendor(\"AuthenticAMD\") &amp;&amp; _has_rdseed()) {\n    if(fort_verbose)\n      fprintf(stdout,\"AMD rdseed\");\n    ret=1;\n  }\n  \n  if(ret) {\n    while(buflen &gt; 0) {\n      if((ret = _rdseed_long(&amp;l)) == 0) \/\/ 1 ok, 0 fail\n\tbreak;\n      if(fort_verbose)\n\tfprintf(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 \/\/ #ifdef FORT_USE_RDSEED<\/code><\/pre>\n\n\n\n<p>Intelrandom.h<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define aFORT_USE_RDRAND 2\n#define aFORT_USE_RDSEED 2\n\nint rdrand_bytes(int buflen, unsigned char *buf);\nint rdseed_bytes(int buflen, unsigned char *buf);\n\nextern int intelrandom_verbose;<\/code><\/pre>\n\n\n\n<p>Webrandom.c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;memory.h&gt;\n#include &lt;errno.h&gt;\n\n#include &lt;openssl\/ssl.h&gt;\n\n#include &lt;sys\/types.h&gt;\n#include &lt;sys\/socket.h&gt;\n#include &lt;netdb.h&gt;\n#include &lt;sys\/types.h&gt;\n#include &lt;sys\/socket.h&gt;\n\n#include \"sha256.h\"\n#include \"fort.h\"\n\nextern unsigned char *procname;\nextern int fort_verbose;\n\n#include &lt;stdarg.h&gt;\n\nvoid dbs_printf(unsigned char **buf, size_t *buf_length, const unsigned char *format, ...)\n{\n  int count;\n  va_list args;;\n  \n  va_start(args, format);\n  count = vsnprintf(*buf, *buf_length, format, args) + 1;\n  va_end(args);\n  if(*buf_length &lt; count) {\n    *buf_length = count;\n    *buf = realloc(*buf, *buf_length);\n    va_start(args, format);\n    count = vsnprintf(*buf, *buf_length, format, args) + 1;\n    va_end(args);\n  }\n}\n\nint fort_connect(unsigned char *host, unsigned char *port)\n{\n  struct addrinfo hints, *res, *resp;\n  int s, status;\n  \n  memset(&amp;hints, 0, sizeof(hints));\n  hints.ai_family = AF_UNSPEC;\n  hints.ai_socktype = SOCK_STREAM;\n  hints.ai_flags = AI_PASSIVE;\n  \n  if((status = getaddrinfo(host, port, &amp;hints, &amp;res)) != 0) {\n    fprintf(stderr,\"\\n%s: getaddrinfo\", procname);\n    fprintf(stderr,\", status %d\", status);\n    fprintf(stderr,\", gai_strerror(): %s\", gai_strerror(status));\n    fprintf(stderr,\", errno %d\\n\", errno);\n    fflush(stderr);\n  }\n  \n  for(resp=res; resp!=NULL; resp = resp-&gt;ai_next) {\n    if((s = socket(resp-&gt;ai_family, resp-&gt;ai_socktype, resp-&gt;ai_protocol))&lt;0)\n      continue;\n    if(connect(s, resp-&gt;ai_addr, resp-&gt;ai_addrlen) == 0)\n      break;\n    close(s);\n  }\n\n  freeaddrinfo(res);\n\n  return(s);\n}\n\nvoid fort_hash_http_page(unsigned char *host,unsigned char *port, unsigned char *page, unsigned char *hash) \/\/ 202011 JariK\n{\n  int s,status,bytes,total;\n\n  if((s = fort_connect(host, port))&lt;0) {\n    fprintf(stderr,\"\\n%s: cannot fort_connect()\", procname);\n    fprintf(stderr,\", status: %d\", s);\n    fprintf(stderr,\", errno: %d\" , errno);\n    perror(\"fort_connect\");\n    fflush(stderr);\n  }\n\n  unsigned char *format =\n    \"GET %s HTTP\/1.0\\r\\n\"\n    \"Host: %s\\r\\n\";\n  static unsigned char *msg = NULL;\n  static size_t msg_length=0;\n\n  dbs_printf(&amp;msg, &amp;msg_length, format, page, host);\n  \n  if((status=write(s, msg, strlen(msg)))&lt;0) {\n    fprintf(stderr, \"\\n%s: write(), error: %d\\n\", procname, errno);\n    perror(\"write\");\n    fflush(stderr);\n  }\n\n  HashCtx ctx;\n  char buffer&#91;1024];\n\n  HashInit(&amp;ctx);\n  total=0;\n  while((bytes = read(s, buffer, sizeof(buffer)))&gt;0) {\n    \/\/write(1,buffer,bytes);\n    HashUpdate(&amp;ctx, buffer, bytes);\n    total+=bytes;\n  }\n\n  HashFinal(hash, &amp;ctx);\n\n  if(fort_verbose) {\n    fprintf(stdout,\"fort_hash_http_page:\");\n    fprintf(stdout,\" %d bytes read\", total);\n    fprintf(stdout,\", sha256: \");\n    for(int c = 0;c &lt; HashLen; c++) {\n      fprintf(stdout,\"%02x\", hash&#91;c]);\n    }\n  }\n\n  close(s);\n}\n\nvoid fort_hash_https_page(unsigned char *host,unsigned char *port, unsigned char *page, unsigned char *hash) \/\/ 202011 JariK\n{\n  int s, status, bytes, total;\n\n  SSL_METHOD *method=NULL;\n  SSL_CTX *ctx=NULL;\n  SSL *ssl;\n\n  SSL_library_init(); \/\/see: http:\/\/h30266.www3.hpe.com\/odl\/axpos\/opsys\/vmsos84\/BA554_90007\/ch04s03.html\n  OpenSSL_add_ssl_algorithms();\n  SSL_load_error_strings();\n\n  if((method = (SSL_METHOD *)    \n      SSLv23_client_method()) == NULL) {\n    fprintf(stderr,\"\\n%s: cannot SSLv3_server_method()\", procname);\n    fflush(stderr);\n  }\n\n  if((ctx=SSL_CTX_new(method)) == NULL) {\n    fprintf(stderr,\"\\n%s: cannot SSL_CTX_new()\", procname);\n    fflush(stderr);\n  }\n\n  if((ssl=SSL_new(ctx)) == NULL) {\n    fprintf(stderr,\"\\n%s: cannot SSL_new()\", procname);\n    fflush(stderr);\n  }\n\n  if((s = fort_connect(host, port))&lt;0) {\n    fprintf(stderr,\"\\n%s: cannot fort_connect()\", procname);\n    fprintf(stderr,\", status: %d\", s);\n    fprintf(stderr,\", errno: %d\" , errno);\n    perror(\"fort_connect\");\n    fflush(stderr);\n  }\n\n  SSL_set_fd(ssl,s);\n\n  if((status=SSL_connect(ssl))&lt;=0) {\n    fprintf(stderr,\"\\n%s: cannot SSL_connect()\", procname);\n    fprintf(stderr,\", status: %d\", status);\n    fprintf(stderr,\", errno: %d\" , errno);\n    fprintf(stderr,\", SSL_get_error(): %d\\n\", SSL_get_error(ssl,status));\n    perror(\"SSL_connect\");\n    fflush(stderr);\n  }\n\n  unsigned char *format =\n    \"GET %s HTTP\/1.0\\r\\n\"\n    \"Host: %s\\r\\n\";\n  static unsigned char *msg = NULL;\n  static size_t msg_length=0;\n\n  dbs_printf(&amp;msg, &amp;msg_length, format, page, host);\n\n  if((status=SSL_write(ssl, msg, strlen(msg)))&lt;0) {\n    fprintf(stderr,\"\\n%s: SSL_write()\", procname);\n    fprintf(stderr,\", status: %d\", status);\n    fprintf(stderr,\", errno: %d\", errno);\n    fprintf(stderr,\", SSL_get_error(): %d\", SSL_get_error(ssl,status));\n    perror(\"SSL_write\");\n    fflush(stderr);\n  }\n  fflush(stdout);\n  \n  HashCtx hashctx;\n  char buffer&#91;1024];\n\n  HashInit(&amp;hashctx);\n  total=0;\n  while((bytes=SSL_read(ssl, buffer, sizeof(buffer)))&gt;0) {\n    \/\/write(1,buffer,bytes);\n    HashUpdate(&amp;hashctx, buffer, bytes);\n    total+=bytes;\n  }\n  fflush(stdout);\n  if(bytes&lt;0) {\n    fprintf(stderr, \"\\n%s: SSL_read()\", procname);\n    fprintf(stderr, \", status: %d\", status);\n    fprintf(stderr, \", errno: %d\", errno);\n    fprintf(stderr,\", SSL_get_error(): %d\", SSL_get_error(ssl,status));\n    perror(\"SSL_read\");\n    fflush(stderr);\n  }\n\n  fflush(stdout);\n  \n  HashFinal(hash, &amp;hashctx);\n\n  if(fort_verbose) {\n    fprintf(stdout,\"fort_hash_https_page:\");\n    fprintf(stdout,\" %d bytes read\", total);\n    fprintf(stdout,\", sha256: \");\n    for(int c = 0;c &lt; HashLen; c++) {\n      fprintf(stdout,\"%02x\", hash&#91;c]);\n    }\n  }\n\n  SSL_shutdown(ssl);\n  SSL_free(ssl);\n  SSL_CTX_free(ctx);\n  close(s);\n}<\/code><\/pre>\n\n\n\n<p>Commandrandom.c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n\n#include \"sha256.h\"\n#include \"fort.h\"\n\nvoid fort_hash_command(unsigned char *command, unsigned char *hash)\n{\n  int c,length;\n  FILE *fp1;\n  unsigned char buffer&#91;1024];\n\n  HashCtx hashctx;\n\n  length=0;\n  if((fp1=popen(command, \"r\"))!=NULL) {\n    HashInit(&amp;hashctx);\n\n    HashUpdate(&amp;hashctx, (unsigned char *)&amp;cvar,sizeof(cvar));\n    inccvar();\n\n    if(fort_verbose) {\n      fprintf(stdout,\"fort_hash_command: %s\",command);\n      fflush(stdout);\n    }\n    \n    while((c=fread(buffer,1,sizeof(buffer),fp1))&gt;0) {\n      \/\/fwrite(buffer,1,c,stdout);\n      HashUpdate(&amp;hashctx, buffer, c);\n      length+=c;\n    }\n    pclose(fp1);\n\n    if(fort_verbose)\n      fprintf(stdout,\", %d bytes read\",length);\n\n    HashFinal(hash, &amp;hashctx);\n\n    if(fort_verbose) {\n      fprintf(stdout,\", sha256: \");\n      for(int c = 0;c &lt; HashLen; c++) {\n\tfprintf(stdout,\"%02x\", hash&#91;c]);\n      }\n    \n      fprintf(stdout,\"\\n\");\n      fflush(stdout);\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<p>sha256.c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/* Written from SHA256 documents by Jari Kuivaniemi, read \"http:\/\/en.wikipedia.org\/wiki\/SHA-2\" *\/\n#include &lt;stdio.h&gt;\n#include &lt;memory.h&gt;\n#include &lt;string.h&gt;\n\n#include \"sha256.h\"\n\nextern unsigned char *procname;\n\n\/\/#ifdef MAIN \/\/ in Makefile\n\nunsigned char *sha_name=\"SHA256 v1.0\";\n\nvoid SHA256Init(SHA256_CONTEXT *sha256)\n{\n  sha256-&gt;state&#91;0] = 0x6a09e667;\n  sha256-&gt;state&#91;1] = 0xbb67ae85;\n  sha256-&gt;state&#91;2] = 0x3c6ef372;\n  sha256-&gt;state&#91;3] = 0xa54ff53a;\n  sha256-&gt;state&#91;4] = 0x510e527f;\n  sha256-&gt;state&#91;5] = 0x9b05688c;\n  sha256-&gt;state&#91;6] = 0x1f83d9ab;\n  sha256-&gt;state&#91;7] = 0x5be0cd19;\n  \n  sha256-&gt;count = 0;\n}\n\nIUWORD k256&#91;64] = {\n  0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n  0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n  0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n  0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n  0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n  0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n  0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n  0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n};\n\n#define RR32(word,bits) ( ((word) &gt;&gt; (bits)) | ((word) &lt;&lt; (32 - (bits))) )\n#define RS32(word,bits) ( ((word) &gt;&gt; (bits)) )\n\nvoid SHA256Transform(IUWORD state&#91;8], IUBYTE buffer&#91;64])\n{\n  int i;\n  \n  IUWORD w&#91;64], s0;\n  IUWORD a, b, c, d, e, f, g, h;\n  IUWORD maj, t2, s1;\n  IUWORD ch, t1;\n  \n  for(i=0;i&lt;16;i++) {\n    w&#91;i] =\n      (IUWORD)buffer&#91;i*4+0] &lt;&lt; 24 |\n      (IUWORD)buffer&#91;i*4+1] &lt;&lt; 16 |\n      (IUWORD)buffer&#91;i*4+2] &lt;&lt; 8  |\n      (IUWORD)buffer&#91;i*4+3];\n  }\n  \n  for(i=16;i&lt;64;i++) {\n    s0 = (RR32(w&#91;i-15],7)) ^ (RR32(w&#91;i-15],18)) ^ (RS32(w&#91;i-15],3));\n    s1 = (RR32(w&#91;i-2],17)) ^ (RR32(w&#91;i-2],19)) ^ (RS32(w&#91;i-2],10));\n    w&#91;i] = w&#91;i-16] + s0 + w&#91;i-7] + s1;\n  }\n  \n  a = state&#91;0];\n  b = state&#91;1];\n  c = state&#91;2];\n  d = state&#91;3];\n  e = state&#91;4];\n  f = state&#91;5];\n  g = state&#91;6];\n  h = state&#91;7];\n  \n  for(i=0;i&lt;64;i++) {\n    s0 = (RR32(a,2)) ^ (RR32(a,13)) ^ (RR32(a,22));\n    maj = (a &amp; b) ^ (a &amp; c) ^ (b &amp; c);\n    t2 = s0 + maj;\n    s1 = (RR32(e,6)) ^ (RR32(e,11)) ^ (RR32(e,25));\n    ch = (e &amp; f) ^ ((~ e) &amp; g);\n    t1 = h + s1 + ch + k256&#91;i] + w&#91;i];\n    \n    h = g;\n    g = f;\n    f = e;\n    e = d + t1;\n    d = c;\n    c = b;\n    b = a;\n    a = t1 + t2;\n  }\n  \n  state&#91;0] = state&#91;0] + a;\n  state&#91;1] = state&#91;1] + b;\n  state&#91;2] = state&#91;2] + c;\n  state&#91;3] = state&#91;3] + d;\n  state&#91;4] = state&#91;4] + e;\n  state&#91;5] = state&#91;5] + f;\n  state&#91;6] = state&#91;6] + g;\n  state&#91;7] = state&#91;7] + h;\n}\n\nvoid SHA256Update(SHA256_CONTEXT *sha256, unsigned char *data, int len)\n{\n  int i,j;\n  \n  j = (int)sha256-&gt;count &amp; 63;\n  \n  sha256-&gt;count+=len;\n  \n  if((j+len)&gt;63) {\n    memcpy(&amp;sha256-&gt;buffer&#91;j],data,64-j); \/* last bytes of next block *\/\n    \n    SHA256Transform(sha256-&gt;state, sha256-&gt;buffer);\n    for (i = 64 - j ; i + 63 &lt; len; i += 64) {\n      SHA256Transform(sha256-&gt;state, &amp;data&#91;i]);\n    }\n    j = 0;\n  } else\n    i=0;\n  \n  memcpy(&amp;sha256-&gt;buffer&#91;j],&amp;data&#91;i],len-i);\n}\n\nvoid SHA256Final(unsigned char digest&#91;32], SHA256_CONTEXT *sha256)\n{\n  int i,j;\n  unsigned char filelenght&#91;8];\n  IULONG count;\n  \n  count=sha256-&gt;count &lt;&lt; 3;\n  SHA256Update(sha256,\"\\200\",1);\n  \n  while((sha256-&gt;count &amp; 63) != 56)\n    SHA256Update(sha256,\"\\0\",1);\n  \n  filelenght&#91;0]=(unsigned char)(count &gt;&gt; 56)&amp;0xff;\n  filelenght&#91;1]=(unsigned char)(count &gt;&gt; 48)&amp;0xff;\n  filelenght&#91;2]=(unsigned char)(count &gt;&gt; 40)&amp;0xff;\n  filelenght&#91;3]=(unsigned char)(count &gt;&gt; 32)&amp;0xff;\n  filelenght&#91;4]=(unsigned char)(count &gt;&gt; 24)&amp;0xff;\n  filelenght&#91;5]=(unsigned char)(count &gt;&gt; 16)&amp;0xff;\n  filelenght&#91;6]=(unsigned char)(count &gt;&gt; 8 )&amp;0xff;\n  filelenght&#91;7]=(unsigned char)(count&amp;0xff);\n  \n  SHA256Update(sha256,filelenght,sizeof(filelenght));\n  \n  for(i=0,j=0;i&lt;8;i++) {\n    digest&#91;j++]=(unsigned char) (sha256-&gt;state&#91;i] &gt;&gt; 24)&amp;0xff;\n    digest&#91;j++]=(unsigned char) (sha256-&gt;state&#91;i] &gt;&gt; 16)&amp;0xff;\n    digest&#91;j++]=(unsigned char) (sha256-&gt;state&#91;i] &gt;&gt; 8)&amp;0xff;\n    digest&#91;j++]=(unsigned char) (sha256-&gt;state&#91;i] )&amp;0xff;\n  }\n}\n\n#ifdef MAIN\n\nvoid printhex(char *name, unsigned char *digest, int len)\n{\n  int c;\n\n  fprintf(stdout,\"%s=\",name);\n  for(c=0;c&lt;len;c++) {\n    fprintf(stdout,\"%02x\",digest&#91;c]);\n  }\n  fflush(stdout);\n}\n\nint shahexdigit(int c)\n{\n  if(c&gt;='0' &amp;&amp; c&lt;='9') return(c-'0');\n  else if(c&gt;='a' &amp;&amp; c&lt;='f') return(c-'a'+10);\n  else if(c&gt;='A' &amp;&amp; c&lt;='F') return(c-'A'+10);\n  return(0);\n}\n\nvoid sha_test()\n{\n  int c,d,e,ok,allok;\n  SHA256_CONTEXT sha256;\n  unsigned char result&#91;32],*p;\n  \n  fprintf(stdout,\"%s\",sha_name);\n  fprintf(stdout,\", Context size: %ld\", sizeof(SHA256_CONTEXT));\n  fprintf(stdout,\", Hash size: 32\");\n  fprintf(stdout,\", IUBYTE size: %ld\", sizeof(IUBYTE));\n  fprintf(stdout,\", IUWORD size: %ld\", sizeof(IUWORD));\n  fprintf(stdout,\", IULONG size: %ld\", sizeof(IULONG));\n\n  struct test {\n    unsigned char *string;\n    int count;\n    unsigned char *result;\n  } tests&#91;] = {\n    { \"abc\",1,\"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad\" },\n    { \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\",1,\"248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1\" },\n    { \"a\",1000000,\"cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0\" },\n    { \"The quick brown fox jumps over the lazy dog\",1,\"d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592\" },\n  };\n\n  allok=1;\n  for(c=0;c&lt;sizeof(tests)\/sizeof(tests&#91;0]);c++) {\n    SHA256Init(&amp;sha256);\n    for(d=0;d&lt;tests&#91;c].count;d++)\n      SHA256Update(&amp;sha256,tests&#91;c].string,strlen(tests&#91;c].string));\n    SHA256Final(result,&amp;sha256);\n    p=tests&#91;c].result;\n    d=0;\n    ok=1;\n    while(*p!='\\0') {\n      if(*p!='\\0')\n\te=shahexdigit(*p++);\n      if(*p!='\\0')\n\te=e*16+shahexdigit(*p++);\n      if(e!=result&#91;d])\n\tok=0;\n      d++;\n    }\n    if(ok) {\n      fprintf(stdout,\"\\nsha256 test \");\n      fprintf(stdout,\"string: %s\",tests&#91;c].string);\n      fprintf(stdout,\", count: %d, \",tests&#91;c].count);\n      printhex(\"tmp32\",result,sizeof(result));\n      fprintf(stdout,\", result: %s\",tests&#91;c].result);\n      fprintf(stdout,\" ok!!!!\");\n      fflush(stdout);\n    } else {\n      fprintf(stdout,\"\\nsha256 test \");\n      fprintf(stdout,\"string: %s\",tests&#91;c].string);\n      fprintf(stdout,\", count: %d, \",tests&#91;c].count);\n      printhex(\"tmp32\",result,sizeof(result));\n      fprintf(stdout,\", result: %s\",tests&#91;c].result);\n      fprintf(stdout,\" failed!!!!\");\n      fflush(stdout);\n      allok=0;\n    }\n  }\n  if(allok) {\n    fprintf(stdout,\", sha256 tests ok!!!!\\n\");\n  } else {\n    fprintf(stdout,\", sha256 tests failed!!!!\\n\");\n  }\n  fflush(stdout);\n}\n\nint main(int argc, char *argv&#91;])\n{\n  sha_test();\n}\n\n#endif<\/code><\/pre>\n\n\n\n<p>sha256.h<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#ifndef SHA256_H\n#define SHA256_H\n\n#define HashName   \"SHA256\"\n#define HashInit   SHA256Init\n#define HashUpdate SHA256Update\n#define HashFinal  SHA256Final\n#define HashLen    32\n#define HashCtx    SHA256_CONTEXT\n\ntypedef unsigned char IUBYTE;\ntypedef unsigned int IUWORD;\ntypedef unsigned long long IULONG;\n\ntypedef struct {\n    IUWORD state&#91;8];\n    IULONG count;\n    IUBYTE buffer&#91;64];\n} SHA256_CONTEXT;\n\nvoid SHA256Init(SHA256_CONTEXT *sha256);\nvoid SHA256Update(SHA256_CONTEXT* sha256, unsigned char *data, int len);\nvoid SHA256Final(unsigned char digest&#91;32], SHA256_CONTEXT *sha256);\n\nvoid sha_test();\n\n#endif<\/code><\/pre>\n\n\n\n<p>Newressu.c:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;malloc.h&gt;\n#include &lt;string.h&gt;\n#include &lt;ctype.h&gt;\n#include &lt;math.h&gt;\n#include &lt;sys\/time.h&gt;\n#include &lt;time.h&gt;\n\n\/\/#define SHA256 2 \/\/ in Makefile\n\n#ifdef SHA256\n#include \"sha256.h\"\n#endif\n\n\/\/#define FORT 2 \/\/ in Makefile\n\n#ifdef FORT\n#include \"fort.h\"\n#endif\n\n\/\/#define MAIN 2 \/\/ in Makefile\n\n#include \"newressu.h\"\n#include \"intelrandom.h\"\n\nextern unsigned char *procname;\nstatic unsigned char *programname = \"Newressu version 2.4 \u00a9\";\nstatic unsigned char *copyright = \"Copyright (c) 2013-2021 Jari Kuivaniemi, Helsinki, Finland. Kaikki oikeudet pid\u00e4tet\u00e4\u00e4n!\";\n\nstatic unsigned long periods&#91;1024];\nstatic unsigned long genbytes=0;\nstatic unsigned long clockbytes=0;\n\n#define RESSUT_BYTES 1024\n#define RESSU_BITS_NEEDED 128\n#define RESSU_MIN_ROUNDS 2\n#define RESSU_MIN_CLOCKBYTES 16384+1024\n\n#define aWRITE_SAMPLE 2\n#define aUSE_RANDOM 2\n#define aDEBUG4 2\n#define DEBUG_SORTED 2\n\n#ifdef MAIN\nstatic unsigned char samplefilename&#91;128]=\"newressusample.rnd\";\n#endif\n#ifdef DEBUG4\nstatic unsigned char debugfilename&#91;128]=\"newressu.deb\";\n#endif\nstatic unsigned char urandomfilename&#91;128]=\"\/dev\/urandom\";\n#ifdef USE_RANDOM\nstatic unsigned char randomfilename&#91;128]=\"\/dev\/random\";\n#endif\n\nstatic int ressu_bits_needed = RESSU_BITS_NEEDED;\nstatic int ressut_bytes = RESSUT_BYTES;\n\nstatic int stats=0;\n\nstatic unsigned char ressu_clockbyte() \/* JariK 2013 *\/\n{\n  struct timeval tv;\n  gettimeofday(&amp;tv, NULL);\n  return(tv.tv_usec &amp; 0xff);\n}\n\n#define RR8(byte,bits) ( ((byte) &gt;&gt; (bits)) | ((byte) &lt;&lt; (8 - (bits))) )\n#define RL8(byte,bits) ( ((byte) &gt;&gt; (8 - (bits))) | ((byte) &lt;&lt; (bits)) )\n\nvoid ressu_genbytes_single(int size, unsigned char *buffer)\n{\n  int c, d;\n  unsigned char e, byte;\n  static int f = 0, prevbyte = -1, count = 0;\n\n  for(c=0; c&lt;8; c++) {\n    for(d=0; d&lt;size; d++) {\n      e = buffer&#91;d];\n      e = RL8(e,1); \/\/ rotate byte left 1 bits\n      \/\/e = RL8(e,3); \/\/ rotate byte left 3 bits\n      \/\/e = RR8(e,1); \/\/ rotate byte right 1 bits\n      byte = ressu_clockbyte();\n      if(prevbyte==-1)\n\tprevbyte=byte;\n      buffer&#91;d] = e^byte;\n      if(prevbyte!=byte) {\n\tperiods&#91;count]++;\n\tclockbytes+=count;\n\tcount=0;\n\tprevbyte=byte;\n      }\n      count++;\n    }\n    for(d=0; d&lt;size; d++) {\n      f = (f + buffer&#91;d]) % size;\n      e = buffer&#91;d];\n      buffer&#91;d] = buffer&#91;f];\n      buffer&#91;f] = e;\n    }\n  }\n}\n\n#ifdef OLD1\n\nvoid ressu_genbytes_single(int size, unsigned char *buffer)\n{\n  int c, d, e, byte;\n  static int f = 0, prevbyte = -1, count = 0;\n\n  for(c=0; c&lt;8; c++) {\n    for(d=0; d&lt;size; d++) {\n      e = buffer&#91;d];\n      e = ((e&amp;0x80)&gt;&gt;7) | ((e&amp;0x7f)&lt;&lt;1); \/\/ rotate left 1\n      \/\/e = ((e&amp;0xe0)&gt;&gt;5) | ((e&amp;0x1f)&lt;&lt;3); \/\/ rotate left 3\n      \/\/e = ((e&amp;0xfe)&gt;&gt;1) | ((e&amp;0x1)&lt;&lt;7);  \/\/ rotate right 1\n      byte = ressu_clockbyte();\n      if(prevbyte==-1)\n\tprevbyte=byte;\n      buffer&#91;d] = e^byte;\n      if(prevbyte!=byte) {\n\tperiods&#91;count]++;\n\tclockbytes+=count;\n\tcount=0;\n\tprevbyte=byte;\n      }\n      count++;\n    }\n    for(d=0; d&lt;size; d++) {\n      f = (f + buffer&#91;d]) % size;\n      e = buffer&#91;d];\n      buffer&#91;d] = buffer&#91;f];\n      buffer&#91;f] = e;\n    }\n  }\n}\n\n#endif\n\nvoid ressu_genbytes_fast(int size, unsigned char *buffer)\n{\n  int c;\n\n  clockbytes=0;\n  for(c=0; c&lt;RESSU_MIN_ROUNDS ||\n\tclockbytes &lt; RESSU_MIN_CLOCKBYTES;c++) {\n    ressu_genbytes_single(size,buffer);\n  }\n}\n\nvoid ressu_genbytes(int size, unsigned char *buffer) \/\/ 6.5.2021 JariK\n{\n  int c, d, e, f;\n  static int ressut_first=1,\n    ressut_pos = 0,\n    ressut_f = 0;\n  static unsigned char ressut&#91;RESSUT_BYTES];\n  unsigned long prevperiods&#91;1024];\n  \n  for(c=0; c&lt;size; c++) {\n    if(ressut_pos == 0) {\n      if(ressut_first) {\n\tmemset(ressut,0,ressut_bytes);\n\tressut_first=0;\n      }\n\n      clockbytes=0;\n      for(d=0;d&lt;1024;d++) {\n\tperiods&#91;d]=0;\n      }\n      \n      int rndbits=0;\n      int lim, lim1=0, lim2=0;\n      int lim1a, lim1b;\n      int high1, high2;\n      \n      for(d=0; rndbits&lt;ressu_bits_needed ||\n\t  d&lt;RESSU_MIN_ROUNDS ||\n\t  clockbytes &lt; RESSU_MIN_CLOCKBYTES; d++) {\n\n\t\/\/ save previous round\n\n        for(e=0;e&lt;1024;e++) {\n\t  prevperiods&#91;e]=periods&#91;e];\n\t}\n\n\tressu_genbytes_single(ressut_bytes,ressut);\n\n\t\/\/ find new lim1\n\t\n\tlim=lim1;\n\tf=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(prevperiods&#91;e]&gt;0 &amp;&amp; prevperiods&#91;e]==lim) {\n\t    if(f==-1 || (periods&#91;e]&gt;0 &amp;&amp; f&lt;periods&#91;e])) {\n\t      f=periods&#91;e];\n\t    }\n\t  }\n\t}\n\n\tif(f!=-1)\n\t  lim=f;\n\n\tlim1a=lim;\n\t\n\t\/\/ find highest amount of chains\n\t\n\thigh1=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(high1==-1 || high1&lt;periods&#91;e]) {\n\t    high1=periods&#91;e];\n\t  }\n\t}\n\n\t\/\/ and second highest\n\t\n\thigh2=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if( (high2==-1 &amp;&amp; periods&#91;e]&lt;high1) ||\n\t      (high2&lt;periods&#91;e] &amp;&amp; periods&#91;e]&lt;high1) ) {\n\t    high2=periods&#91;e];\n\t  }\n\t}\n\n\t\/\/ and average\n\n\tint psum=0;\n\tint pcnt=0;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]&gt;0) {\n\t    psum+=periods&#91;e];\n\t    pcnt++;\n\t  }\n\t}\n\n\tlim1b=(int)((double)psum\/pcnt);\n\t\n\t\/\/ find next smaller than average\n\n\tf=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if( (f==-1 &amp;&amp; periods&#91;e]&lt;lim1b) ||\n\t      (f&lt;periods&#91;e] &amp;&amp; periods&#91;e]&lt;lim1b) ) {\n\t    f=periods&#91;e];\n\t  }\n\t}\n\n\tif(f!=-1)\n\t  lim1b=f;\n\n\tif(lim==0 || lim&gt;lim1b)\n\t  lim=lim1b;\n\n\t\/\/ if lim greater that second highest,\n\t\/\/ set to second highest\n\n\tif(lim&gt;high2) {\n\t  lim=high2;\n\t}\n\t\t\n\tlim1=lim;\n\n\t\/\/ find next greater than lim\n\t\n\tf=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]&gt;lim &amp;&amp;\n\t     (f==-1 || periods&#91;e]&lt;f))\n\t    f=periods&#91;e];\n\t}\n\tif(f!=-1)\n\t  lim=f;\n\n\tlim2=lim;\n\n\t\/\/ calculate bits\n\t\t\n\trndbits=0;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]&gt;0 &amp;&amp; periods&#91;e]&lt;lim) {\n\t    rndbits+=periods&#91;e];\n\t  }\n\t}\n      } \/\/ for(d=0;\n      if(stats) {\n\tfprintf(stdout,\"rounds: %d\",d);\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]&gt;0)\n\t    fprintf(stdout,\" %d:%lu\",e,periods&#91;e]);\n\t}\n\n#ifdef DEBUG_SORTED\n\t\n\tfprintf(stdout,\", sorted:\");\n\tint g=0;\n\tfor(;;) {\n\t  f=-1;\n\t  for(e=0;e&lt;1024;e++) {\n\t    if( (f==-1 &amp;&amp; periods&#91;e]&gt;g) ||\n\t\t(periods&#91;e]&gt;g &amp;&amp; f&gt;periods&#91;e]) )\n\t      f=periods&#91;e];\n\t  }\n\t  if(f==-1)\n\t    break;\n\n\t  g=f;\n\t  fprintf(stdout,\" %d\",g);\n\t}\n\n#endif\n\tfprintf(stdout,\", high1:%d\",high1);\n\tfprintf(stdout,\", high2:%d\",high2);\n\tfprintf(stdout,\", lim1a:%d\",lim1a);\n\tfprintf(stdout,\", lim1b:%d\",lim1b);\n\tfprintf(stdout,\", lim1:%d\",lim1);\n\tfprintf(stdout,\", lim2:%d\",lim2);\n\tfprintf(stdout,\", div:%f\",(double)lim2\/lim1);\n\tfprintf(stdout,\", clockbytes:%ld\",clockbytes);\n\tfprintf(stdout,\", rndbits:%d\",rndbits);\n\tfprintf(stdout,\"\\n\");\n\tfflush(stdout);\n      }\n    } \/\/ if(ressut_pos == 0)\n    ressut_f = (ressut_f + ressut&#91;ressut_pos]) % ressut_bytes;\n    buffer&#91;c] ^= ressut&#91;ressut_f];\n    ressut_pos = (ressut_pos+1) % ressut_bytes;\n  } \/\/ for(c=0; c&lt;size; c++)\n\n  genbytes+=size;\n}\n\n#ifdef DEBUG4\nstatic unsigned char cc&#91;256*1048576]; \/\/ clock_chain\nstatic unsigned char *ccp;\nstatic int cc_bytes;\n#endif\n\nstatic unsigned char ressu_clockbyte_debug() \/* JariK 2013 *\/\n{\n  unsigned char c;\n  struct timeval tv;\n  gettimeofday(&amp;tv, NULL);\n  c=tv.tv_usec &amp; 0xff;\n#ifdef DEBUG4\n  if(cc_bytes&lt;sizeof(cc)) {\n    *ccp++ = c;\n    cc_bytes++;\n  }\n#endif\n  return(c);\n}\n\nvoid ressu_genbytes_single_debug(int size, unsigned char *buffer)\n{\n  int c, d;\n  unsigned char e, byte;\n  static int f = 0, prevbyte = -1, count = 0;\n\n  for(c=0; c&lt;8; c++) {\n    for(d=0; d&lt;size; d++) {\n      e = buffer&#91;d];\n      e = RL8(e,1); \/\/ rotate byte left 1 bits\n      \/\/e = RL8(e,3); \/\/ rotate byte left 3 bits\n      \/\/e = RR8(e,1); \/\/ rotate byte right 1 bits\n      byte = ressu_clockbyte_debug();\n      if(prevbyte==-1)\n\tprevbyte=byte;\n      buffer&#91;d] = e^byte;\n      if(prevbyte!=byte) {\n\tperiods&#91;count]++;\n\tclockbytes+=count;\n\tcount=0;\n\tprevbyte=byte;\n      }\n      count++;\n    }\n    for(d=0; d&lt;size; d++) {\n      f = (f + buffer&#91;d]) % size;\n      e = buffer&#91;d];\n      buffer&#91;d] = buffer&#91;f];\n      buffer&#91;f] = e;\n    }\n  }\n}\n\nvoid ressu_genbytes_debug(int size, unsigned char *buffer) \/\/ 6.5.2021 JariK\n{\n  int c, d, e, f;\n  static int ressut_first=1,\n    ressut_pos = 0,\n    ressut_f = 0;\n  static unsigned char ressut&#91;RESSUT_BYTES];\n  unsigned long prevperiods&#91;1024];\n  \n  for(c=0; c&lt;size; c++) {\n    if(ressut_pos == 0) {\n      if(ressut_first) {\n\tmemset(ressut,0,ressut_bytes);\n\tressut_first=0;\n      }\n\n      clockbytes=0;\n      for(d=0;d&lt;1024;d++)\n\tperiods&#91;d]=0;\n\n#ifdef DEBUG4\n      ccp=cc;\n      cc_bytes=0;\n\n      while(ressu_clockbyte_debug()!=0);\n      while(ressu_clockbyte_debug()==0);\n\n      ccp=cc;\n      cc_bytes=0;\n#endif\n\n      int rndbits=0;\n      int lim, lim1=0, lim2=0;\n      int lim1a, lim1b;\n      int high1, high2;\n\n      for(d=0; rndbits&lt;ressu_bits_needed ||\n\t  d&lt;RESSU_MIN_ROUNDS; d++) {\n\n\t\/\/ save previous round\n\n        for(e=0;e&lt;1024;e++) {\n\t  prevperiods&#91;e]=periods&#91;e];\n\t}\n\t\t\n\tressu_genbytes_single_debug(ressut_bytes,ressut);\n\n\t\/\/ find new lim1\n\t\n\tlim=lim1;\n\tf=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(prevperiods&#91;e]&gt;0 &amp;&amp; prevperiods&#91;e]==lim) {\n\t    if(f==-1 || (periods&#91;e]&gt;0 &amp;&amp; f&lt;periods&#91;e])) {\n\t      f=periods&#91;e];\n\t    }\n\t  }\n\t}\n\n\tif(f!=-1)\n\t  lim=f;\n\n\tlim1a=lim;\n\t\n\t\/\/ find highest amount of chains\n\n\thigh1=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(high1==-1 || high1&lt;periods&#91;e]) {\n\t      high1=periods&#91;e];\n\t  }\n\t}\n\n\t\/\/ and second highest\n\n\thigh2=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if( (high2==-1 &amp;&amp; periods&#91;e]&lt;high1) ||\n\t      (high2&lt;periods&#91;e] &amp;&amp; periods&#91;e]&lt;high1) ) {\n\t    high2=periods&#91;e];\n\t  }\n\t}\n\n\t\/\/ and average\n\n\tint psum=0;\n\tint pcnt=0;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]&gt;0) {\n\t    psum+=periods&#91;e];\n\t    pcnt++;\n\t  }\n\t}\n\n\tlim1b=(int)((double)psum\/pcnt);\n\t\n\t\/\/ find next smaller than average\n\n\tf=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if( (f==-1 &amp;&amp; periods&#91;e]&lt;lim1b) ||\n\t      (f&lt;periods&#91;e] &amp;&amp; periods&#91;e]&lt;lim1b) ) {\n\t    f=periods&#91;e];\n\t  }\n\t}\n\n\tif(f!=-1)\n\t  lim1b=f;\n\n\tif(lim==0 || lim&gt;lim1b)\n\t  lim=lim1b;\n\n\t\/\/ if lim greater that second highest,\n\t\/\/ set to second highest\n\n\tif(lim&gt;high2) {\n\t  lim=high2;\n\t}\n\t\n\tlim1=lim;\n\n\t\/\/ find next greater than lim\n\n\tf=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]&gt;lim &amp;&amp;\n\t     (f==-1 || periods&#91;e]&lt;f))\n\t    f=periods&#91;e];\n\t}\n\tif(f!=-1)\n\t  lim=f;\n\n\tlim2=lim;\n\n\t\/\/ calculate bits\n\t\n\trndbits=0;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]&gt;0 &amp;&amp; periods&#91;e]&lt;lim) {\n\t    rndbits+=periods&#91;e];\n\t  }\n\t}\n\t\n\tif(stats) {\n\t  fprintf(stdout,\" round: %d\",d);\n\t  for(e=0;e&lt;1024;e++) {\n\t    if(periods&#91;e]&gt;0)\n\t      fprintf(stdout,\" %d:%lu\",e,periods&#91;e]);\n\t  }\n\n#ifdef DEBUG_SORTED\n\n\t  fprintf(stdout,\", sorted:\");\n\t  int g=0;\n\t  for(;;) {\n\t    f=-1;\n\t    for(e=0;e&lt;1024;e++) {\n\t      if( (f==-1 &amp;&amp; periods&#91;e]&gt;g) ||\n\t\t  (periods&#91;e]&gt;g &amp;&amp; f&gt;periods&#91;e]) )\n\t\tf=periods&#91;e];\n\t    }\n\t    if(f==-1)\n\t      break;\n\t    \n\t    g=f;\n\t    fprintf(stdout,\" %d\",g);\n\t  }\n\n#endif\n\t  \n\t  fprintf(stdout,\" high1:%d\",high1);\n\t  fprintf(stdout,\" high2:%d\",high2);\n\t  fprintf(stdout,\" lim1a:%d\",lim1a);\n\t  fprintf(stdout,\" lim1b:%d\",lim1b);\n\t  fprintf(stdout,\" lim1:%d\",lim1);\n\t  fprintf(stdout,\" lim2:%d\",lim2);\n\t  fprintf(stdout,\" clockbytes:%ld\",clockbytes);\n\t  fprintf(stdout,\" rndbits:%d\",rndbits);\n\t  fprintf(stdout,\"\\n\");\n\t  fflush(stdout);\n\t}\n      } \/\/ for(d=0;\n      if(stats) {\n\tfprintf(stdout,\"rounds: %d\",d);\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]&gt;0)\n\t    fprintf(stdout,\" %d:%lu\",e,periods&#91;e]);\n\t}\n\n#ifdef DEBUG_SORTED\n\n\tfprintf(stdout,\", sorted:\");\n\tint g=0;\n\tfor(;;) {\n\t  f=-1;\n\t  for(e=0;e&lt;1024;e++) {\n\t    if( (f==-1 &amp;&amp; periods&#91;e]&gt;g) ||\n\t\t(periods&#91;e]&gt;g &amp;&amp; f&gt;periods&#91;e]) )\n\t      f=periods&#91;e];\n\t  }\n\t  if(f==-1)\n\t    break;\n\n\t  g=f;\n\t  fprintf(stdout,\" %d\",g);\n\t}\n\n#endif\n\t\n\tfprintf(stdout,\" high1:%d\",high1);\n\tfprintf(stdout,\" high2:%d\",high2);\n\tfprintf(stdout,\" lim1a:%d\",lim1a);\n\tfprintf(stdout,\" lim1b:%d\",lim1b);\n\tfprintf(stdout,\" lim1:%d\",lim1);\n\tfprintf(stdout,\" lim2:%d\",lim2);\n\tfprintf(stdout,\" clockbytes:%ld\",clockbytes);\n\tfprintf(stdout,\" rndbits:%d\",rndbits);\n\tfprintf(stdout,\"\\n\");\n\tfflush(stdout);\n      }\n      \n#ifdef DEBUG4\n      FILE *fp1;\n      if((fp1=fopen(debugfilename,\"a\"))!=NULL) {\n\t\/\/if(lim1==-1 || lim2==-1 || lim1==lim2) {\n\tfor(e=0;e&lt;32;e++)\n\t  fprintf(fp1,\"%02x\",ressut&#91;e]);\n\n\tfprintf(fp1,\", ressut_bytes: %d\",ressut_bytes);\n\tfprintf(fp1,\", ressu_bits_needed: %d\",ressu_bits_needed);\n\tfprintf(fp1,\", ressu_min_rounds: %d\",RESSU_MIN_ROUNDS);\n\n\tfprintf(fp1,\", clockbytes: %ld\",clockbytes);\n\t\n\tunsigned long total=0;\t\n\tfprintf(fp1,\", fluctuations:\");\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]!=0) {\n\t    fprintf(fp1,\" %d:%lu\",e,periods&#91;e]);\n\t    total+=(periods&#91;e]*e);\n\t  }\n\t}\n\tfprintf(fp1,\", total: %lu\",total);\n\tfprintf(fp1,\", high1: %d\",high1);\n\tfprintf(fp1,\", high2: %d\",high2);\n\tfprintf(fp1,\", limit1: %d\",lim1);\n\tfprintf(fp1,\", limit2: %d\",lim2);\n\tfprintf(fp1,\", limit: %d\",lim);\n\n\tfprintf(fp1,\", skipped:\");\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]&gt;=lim) {\n\t    fprintf(fp1,\" %d:%lu\",e,periods&#91;e]);\n\t  }\n\t}\n\t\n\tfprintf(fp1,\", counted:\");\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]&gt;0 &amp;&amp; periods&#91;e]&lt;lim) {\n\t    fprintf(fp1,\" %d:%lu\",e,periods&#91;e]);\n\t  }\n\t}\t\n\tfprintf(fp1,\", rndbits: %d\",rndbits);\n\tfprintf(fp1,\", rounds: %d\",d);\n\n\tint prevbyte=-1, count=0, count2=0;\n\tunsigned char byte, small=-1;\n\n\tfprintf(fp1,\", small chains:\");\n\tfor(e=0;e&lt;cc_bytes;e++) {\n\t  byte=cc&#91;e];\n\t  if(prevbyte==-1) {\n\t    prevbyte=byte;\n\t    count=1;\n\t  }\n\t  if(prevbyte!=byte) {\n\t    if(periods&#91;count]&gt;=lim) {\n\t      if(small==1 || small==-1)\n\t\tfprintf(fp1,\" *\");\n\t      small=0;\n\t    } else small=1;\n\t    if(small) {\n\t      fprintf(fp1,\" %d\",count);\n\t      count2++;\n\t    }\n\t    count=0;\n\t    prevbyte=byte;\n\t  }\n\t  count++;\n\t}\n\tif(small) {\n\t  fprintf(fp1,\" %d\",count);\n\t  count2++;\n\t}\n\tfprintf(fp1,\", count: %d\",count2);\n\n\tfprintf(fp1,\"\\n\");\n\tfflush(fp1);\n\t\/\/}\n\tfclose(fp1);\n      } \/\/ if((fp1=fopen\n#endif\n    } \/\/ if(ressut_pos == 0)\n    ressut_f = (ressut_f + ressut&#91;ressut_pos]) % ressut_bytes;\n    buffer&#91;c] ^= ressut&#91;ressut_f];\n    ressut_pos = (ressut_pos+1) % ressut_bytes;\n  } \/\/ for(c=0; c&lt;size; c++)\n\n  genbytes+=size;\n}\n\nstatic void readfile_xor(int len,\n    unsigned char *buf,\n    unsigned char *filename)\n{\n  int c, n, n2;\n  unsigned char temp&#91;64];\n  FILE *fp1;\n\n  if((fp1 = fopen(filename, \"rb\"))\n      != NULL) {\n    while(len != 0) {\n      n = (len &lt; sizeof(temp)) ?\n          len : sizeof(temp);\n      n2=fread(temp, 1, n, fp1);\n      for(c = 0; c &lt; n2; c++)\n        buf&#91;c] ^= temp&#91;c];\n      len -= n2;\n      buf += n2;\n    }\n    fclose(fp1);\n  }\n}\n\n#define INPUT_RESSU 0\n#define INPUT_DEBUG 1\n#define INPUT_FAST 2\n#define INPUT_SINGLE 3\n#define INPUT_FORT 6\n#define INPUT_URANDOM 8\n#define INPUT_RANDOM 9\n\nstatic int input=0;\n\n#define GENT_SIZE 1024\n\n#define aDEBUG9 2\n\nchar *randomgen&#91;] = { \"ressu\", \"debug\",\"fast\",\"single\",\"4\",\"5\",\"6\",\"7\",\"urandom\",\"random\" };\n\nint ressu_genbyte()\n{\n  static unsigned char gent&#91;GENT_SIZE];\n  static unsigned int gent_pos=0;\n  unsigned char ch;\n\n  if(input==INPUT_RESSU) { \/\/ ressu prod\n    ressu_genbytes(sizeof(ch), &amp;ch);\n  } else if(input==INPUT_DEBUG) { \/\/ ressu debug\n    ressu_genbytes_debug(sizeof(ch), &amp;ch);\n  } else {\n    if(gent_pos==0) {\n      if(input==INPUT_FAST) \/\/ ressu_fast\n\tressu_genbytes_fast(sizeof(gent),gent);\n      else if(input==INPUT_SINGLE) \/\/ ressu single\n\tressu_genbytes_single(sizeof(gent),gent);\n#ifdef FORT\n      else if(input==INPUT_FORT) \/\/ ressu fort\n\tfort_random_data_xor(sizeof(gent),gent);\n#endif\n      else if(input==INPUT_URANDOM) \/\/ urandom\n\treadfile_xor(sizeof(gent),gent,urandomfilename);\n#ifdef USE_RANDOM\n      else if(input==INPUT_RANDOM) \/\/ random\n\treadfile_xor(sizeof(gent),gent,randomfilename);\n#endif\n    } \/\/ if(gent_pos==0\n    ch=gent&#91;gent_pos];\n    gent_pos=(gent_pos+1)%sizeof(gent);\n  }\n  return(ch);\n}\n\nint ressu_genbyte_limit(int limit)\n{\n  int c;\n  while((c=ressu_genbyte()) &gt;= (256\/limit)*limit);\n  return(c%limit);\n}\n\nint ressu_genshort()\n{\n  return(ressu_genbyte() | ressu_genbyte()&lt;&lt;8);\n}\n\nint ressu_genshort_limit(int limit)\n{\n  int c;\n  while((c=ressu_genshort()) &gt;= (65536\/limit)*limit);\n  return(c%limit);\n}\n\nunsigned int ressu_genint()\n{\n  return(ressu_genshort() | ressu_genshort()&lt;&lt;16);\n}\n\nunsigned int ressu_genint_limit(unsigned long limit)\n{\n  unsigned int c;\n  while((c=ressu_genint()) &gt;= (((unsigned long)65536*65536)\/limit)*limit);\n  return(c%limit);\n}\n\nunsigned long ressu_genlong()\n{\n  return(((unsigned long)ressu_genint()) | ((unsigned long)ressu_genint())&lt;&lt;32);\n}\n\nunsigned long ressu_genlong_limit(unsigned long limit)\n{\n  unsigned long c;\n  while((c=ressu_genlong()) &gt;= (((unsigned long)0xffffffffffffffff)\/limit)*limit);\n  return(c%limit);\n}\n\nunsigned long ressu_gen_limit(unsigned long limit)\n{\n  if(limit&lt;=256)\n    return(ressu_genbyte_limit(limit));\n  else if(limit&lt;=65536)\n    return(ressu_genshort_limit(limit));\n  else if(limit&lt;=(unsigned long)65536*65536)\n    return(ressu_genint_limit(limit));\n  else if(limit&lt;=(unsigned long)0xffffffffffffffff)\n    return(ressu_genlong_limit(limit));\n  else\n    return(-1);\n}\n\nvoid newressu_version()\n{\n  fprintf(stderr,\"%s\",programname); \/\/ touch these outside MAIN\n  fprintf(stderr,\", %s\",copyright);\n}\n\n#ifdef MAIN\n\n#include &lt;stdarg.h&gt;\n\n#define aDEBUG31\n\nstatic int stat_line_chars=0;\nstatic int stat_line_edchars=0;\n\nunsigned char *procname=NULL;\n\nstatic void stat_line_begin()\n{\n#ifdef DEBUG31\n  fprintf(stderr,\"\\n\");\n#else\n  fprintf(stderr,\"\\r\");\n#endif  \n  stat_line_edchars=stat_line_chars;\n  stat_line_chars=0;\n}\n\n\nstatic void stat_line_printf(const unsigned char *format, ...)\n{\n  int count;\n  va_list args;\n  static unsigned char *stat_line_buf;\n  static size_t stat_line_buf_length;\n\n  va_start(args, format);\n  count = vsnprintf(stat_line_buf, stat_line_buf_length, format, args) + 1;\n  va_end(args);\n  if(stat_line_buf_length &lt; count) {\n    stat_line_buf_length=count;\n    stat_line_buf=realloc(stat_line_buf, stat_line_buf_length);\n    va_start(args, format);\n    count = vsnprintf(stat_line_buf, stat_line_buf_length, format, args) + 1;\n    va_end(args);\n  }\n  fprintf(stderr,\"%s\",stat_line_buf);\n  stat_line_chars+=strlen(stat_line_buf);\n}\n\n#define READABLE_NUMBER_BIN 2\n\n#ifdef READABLE_NUMBER_BIN\n#define READABLE_NUMBER_HIGH 1023\n#define READABLE_NUMBER_DIVIDER 1024\n#else\n#define READABLE_NUMBER_HIGH 999\n#define READABLE_NUMBER_DIVIDER 1000\n#endif\n\n#define READABLE_NUMBER_WIDTH 32\n\nstatic void stat_line_readable(unsigned long length)\n{\n  int c, low;\n  double length2;\n  unsigned char buf10&#91;10];\n  \/\/ B = byte\n  \/\/ K = kilo   10^3   2^10\n  \/\/ M = mega   10^6   2^20\n  \/\/ G = giga   10^9   2^30\n  \/\/ T = tera   10^12  2^40\n  \/\/ P = peta   10^15  2^50\n  \/\/ E = exa    10^18  2^60\n  \/\/ Z = zetta  10^21  2^70\n  \/\/ Y = yotta  10^24  2^80\n  char units&#91;] = \"BKMGTPEZY\";\n\n  strcpy(buf10,\"***\");\n  low=0;\n\n  for(c=0; length&gt;=low &amp;&amp;\n      c&lt;sizeof(units)-1; c++) {\n    if(length&gt;=low &amp;&amp;\n       length&lt;=READABLE_NUMBER_HIGH) {\n      if(units&#91;c]=='B')\n        sprintf(buf10,\"%ld\", length);\n      else if(units&#91;c]=='K')\n\tsprintf(buf10,\"%ld%cB\", length, units&#91;c]);\n      else if(length==length2)\n\tsprintf(buf10,\"%ld%cB\", length, units&#91;c]);\n      else\n\tsprintf(buf10,\"%.1f%cB\", length2, units&#91;c]);\n\t\n      break;\n    }\n    length2=(double)length\/READABLE_NUMBER_DIVIDER;\n    length\/=READABLE_NUMBER_DIVIDER;\n    low=1;\n  }\n  stat_line_printf(\"%s\",buf10);\n}\n\nvoid stat_line_end()\n{\n  int c,d;\n\n  \/\/ previous line longer than this one,\n  \/\/ overwrite with spaces and backspace to\n  \/\/ end\n  \n  if(stat_line_edchars&gt;stat_line_chars) {\n    d=stat_line_edchars-stat_line_chars;\n    for(c=0;c&lt;d;c++) {\n#ifdef DEBUG31\n      fprintf(stderr,\"*\");\n#else\n      fprintf(stderr,\" \");\n#endif\n    }\n    for(c=0;c&lt;d;c++)\n      fprintf(stderr,\"\\b\");\n  }\n  fflush(stderr);\n}\n\nint help=0;\n\nstatic int utf8len(unsigned char *buf)\n{\n  int len;\n  unsigned char *p;\n  \n  p=buf;\n  len=0;\n  while(*p!='\\0') {\n    if(*p&lt;0x80 || \/\/ ascii char\n       *p&gt;0xbf) \/\/ first utf8 byte\n      len++;\n    p++;\n  }\n  return(len);\n}\n\n#define aDEBUG38 2\n\nstatic void utf8getchar(int size, unsigned char *buf, int n, unsigned char *string)\n{\n  int d;\n  unsigned char *p,*q;\n  \n  d=0;\n  p=string;\n  q=buf;\n\n  \/\/ find first byte of character\n  \n  while(*p!='\\0') {\n    if(*p&lt;0x80 || \/\/ ascii char\n       *p&gt;0xbf) { \/\/ first utf8 char\n      if(d==n)\n\tbreak;\n      d++;\n    }\n    p++;\n  }\n\n  \/\/ copy first byte and rest\n  \/\/ of character\n  \n  if(*p!='\\0') {\n    *q++=*p; \/\/ copy first byte\n    if(*p&gt;0xbf) { \/\/ if first is utf8 char\n      p++;\n      for(;;) {\n\tif(*p&gt;0xbf || \/\/ first utf8 char\n\t   *p&lt;0x80 || \/\/ ascii char\n\t   *p=='\\0')  \/\/ end of file\n\t  break;\n\t*q++=*p++; \/\/ copy rest of the bytes\n      }\n    }\n  }\n  *q='\\0';\n\n#ifdef DEBUG38\n  fprintf(stdout,\"%s: utf8getchar:\",procname);\n  fprintf(stdout,\" string: %s\",string);\n  fprintf(stdout,\", n: %d\",n);\n  fprintf(stdout,\", character: %s\",buf);\n  fprintf(stdout,\"\\n\");\n#endif\n}\n\n#define aDEBUG45\n\nstatic void out_word(int size, unsigned char *buf, unsigned char *digits, unsigned long word2) \/\/ 8.5.2021 JariK\n{\n  int c, d, len, digitslen;\n  unsigned long word;\n  unsigned char string&#91;132], character&#91;32];\n\n  digitslen = utf8len(digits);\n  word=word2;\n  len=0;\n  string&#91;0]='\\0';\n\n  if(word==0 || digitslen&lt;2) {\n    \/\/ zero\n    utf8getchar(sizeof(character),character,0,digits);\n    if(len+strlen(character)&lt;sizeof(string)) {\n      strcat(string,character);\n      len+=strlen(character);\n    }\n  } else {\n    \/\/ non zero\n    while(word&gt;0) {\n      utf8getchar(sizeof(character),character,word%digitslen,digits);\n      if(len+strlen(character)&lt;sizeof(string)) {\n\tstrcat(string,character);\n\tlen+=strlen(character);\n      }\n      word\/=digitslen;\n    }\n  }\n\n  \/\/ reverse string\n  \n  *buf='\\0';\n  len=0;\n  d=utf8len(string);\n  for(c=d-1;c&gt;=0;c--) {\n    utf8getchar(sizeof(character),character,c,string);\n    if(len+strlen(character)&lt;size) {\n      strcat(buf,character);\n      len+=strlen(character);\n    }\n  }\n\n#ifdef DEBUG45\n  fprintf(stdout,\"]\\n%s: out_word: \",procname);\n  fprintf(stdout,\" reverse string: %s\",string);\n  fprintf(stdout,\", digits: %s\",digits);\n  fprintf(stdout,\", int: %lu\",word2);\n  fprintf(stdout,\"\\n&#91;\");\n#endif\n}\n\n#define aDEBUG58 2\n\nstatic void in_word(unsigned long *word, unsigned char *digits, unsigned char *buf)\n{\n  int c,d,e,f,ok;\n  unsigned char character&#91;32], character2&#91;32];\n\n  *word=0;\n  d=utf8len(buf);\n  f=utf8len(digits);\n\n  for(c=0;c&lt;d;c++) {\n    utf8getchar(sizeof(character2),character2,c,buf);\n    ok=0;\n    for(e=0;e&lt;f;e++) {\n      utf8getchar(sizeof(character),character,e,digits);\n      if(!strcmp(character,character2)) {\n\tok=1;\n\tbreak;\n      }\n    }\n    if(ok) {\n      *word=((*word)*f)+e;\n    } else {\n      fprintf(stdout,\"%s: in_word:\",procname);\n      fprintf(stdout,\" illegal digit '%s'\\n\",character2);\n      help=1;\n    }\n  }\n\n#ifdef DEBUG58\n  fprintf(stdout,\"%s: in_word:\",procname);\n  fprintf(stdout,\" word: %lu\",*word);\n  fprintf(stdout,\", digits: %s\",digits);\n  fprintf(stdout,\", string: %s\",buf);\n  fprintf(stdout,\"\\n\");\n#endif\n}\n\nstatic void line_clear(int *len, unsigned char **buf)\n{\n  if(*len&lt;1) {\n    *len=129;\n    *buf=realloc(*buf,*len);\n  }\n  **buf='\\0';\n}\n\nstatic int line_add_string_sort(int *len, unsigned char **buf, unsigned char *string)\n{\n  int cmp,count,add;\n  unsigned char *p;\n\n  p=*buf;\n  add=1;\n  while(*p!='\\0') {\n    cmp=strncmp(string,p,strlen(string));\n    if(cmp&gt;0) {\n      while(*p!=' ' &amp;&amp; *p!='\\0') \/\/ find next space\n\tp++;\n      while(*p==' ' &amp;&amp; *p!='\\0') \/\/ find next non space\n\tp++;\n    } else if(cmp==0) {\n      add=0;\n      break;\n    } else {\n      break;\n    }\n  }\n\n  if(add) {\n    count=strlen(*buf)+strlen(string)+1+1;\n    if(*buf==NULL || count&gt;*len) {\n      int diff=p-*buf;\n      *len = *len + 128;\n      *buf=realloc(*buf,*len);\n      p=*buf+diff;\n    }\n    memmove(p+strlen(string)+1,p,strlen(p)+1);\n    memmove(p,string,strlen(string));\n    p+=strlen(string);\n    *p=' ';\n  }\n\n  return(add);\n}\n\nstatic void line_get_string(int len, unsigned char *buf, int n, unsigned char *string)\n{\n  int e,ok,count;\n  unsigned char *p,*q;\n\n  ok=0;\n  p=string;\n  e=0;\n\n  while(*p!='\\0') {\n    if(e==n) {\n      ok=1;\n      break;\n    }\n    while(*p!=' ' &amp;&amp; *p!='\\0') \/\/ find next space\n      p++;\n    while(*p==' ' &amp;&amp; *p!='\\0') \/\/ find next non space\n      p++;\n    e++;\n  }\n  if(ok) {\n    q=buf;\n    count=0;\n    while(*q!=' ' &amp;&amp; *q!='\\0') {\n      if(++count&lt;len)\n\t*q++=*p;\n      p++;\n    }\n    *q='\\0';\n  } else {\n    buf&#91;0]='\\0';\n  }\n}\n\nstatic int size=5, zero=1, sspace=0, snewline=1,\n  scrlf=1, chars=72, pchars=0, words=0, pwords=0,\n  lines=10, plines=0, plinesdigits=5, slineno=1,\n  quiet=0, sort=0, unique=0, sample=0;\nstatic unsigned long limit, word;\nstatic unsigned char *digits=\"0123456789\", character&#91;32];\nstatic unsigned char digitstemp&#91;256];\nstatic unsigned char linenobuf&#91;1024];\n\nstatic void readword(unsigned char *buf)\n{\n  int d,e;\n  unsigned char temp1024&#91;1024];\n  \n  if(limit!=0) {\n    word=0;\n    \n    if(zero) {\n      word=ressu_gen_limit(limit); \/\/ include zeroes\n      \/\/fprintf(stdout,\"(%02ld)\",word);\n    } else if(limit&gt;=1) {\n      while((word=ressu_gen_limit(limit))==0); \/\/ skip zeroes\n    }\n\t  \n    out_word(sizeof(temp1024),temp1024,digits,word);\n\t  \n    \/\/ fill leading zeroes\n    \n    buf&#91;0]='\\0';\n    utf8getchar(sizeof(character),character,0,digits);\n    for(d=size-utf8len(temp1024);d&gt;0;d--) {\n      strcat(buf,character);\n    }\n\t  \n    \/\/ rest of the number\n\t  \n    strcat(buf,temp1024);\n\t  \n  } else if(digits!=NULL) {\n    int digitslen;\n\t  \n    buf&#91;0]='\\0';\n    digitslen=utf8len(digits);\n\t  \n    \/\/ fill whole word digit by digit\n\t  \n    \/\/fprintf(stdout,\"&#91;\");\n    for(d=0;d&lt;size;d++) {\n      if(digits&#91;0]=='0' &amp;&amp; !zero)\n\te=ressu_gen_limit(digitslen-1)+1;\n      else\n\te=ressu_gen_limit(digitslen);\n      utf8getchar(sizeof(temp1024),temp1024,e,digits);\n      \/\/fprintf(stdout,\"%s\",temp1024);\n      strcat(buf,temp1024);\n    }\n    \/\/fprintf(stdout,\"]\");\n  }\n}\n\nstatic int line_number_length()\n{\n  int c;\n  out_word(sizeof(linenobuf),linenobuf,\"0123456789\",lines-1);\n  c=strlen(linenobuf);\n  if(c&lt;5)\n    c=5;\n  return(c);\n}\n\nstatic void print_line_number()\n{\n  unsigned char linenobuf&#91;1024];\n  \n  if(pwords==0 &amp;&amp; slineno) {\n    sprintf(linenobuf,\"%0*d\",plinesdigits,plines);\n    fprintf(stdout,\"%s\",linenobuf);\n    fprintf(stdout,\" \");\n  }\n}\n\nstatic void calc_spaces()\n{\n  if(sspace&gt;=2 &amp;&amp;\n     ( (pwords&gt;0 &amp;&amp; pwords%sspace==0) ||\n       (slineno &amp;&amp; pwords==0) ) )\n    pchars++;\n    \n  if(sspace &amp;&amp;\n     ( (pwords&gt;0) ||\n       (slineno &amp;&amp; pwords==0) ) ) \n    pchars++;\n}\n\nstatic void print_spaces()\n{\n  if(sspace&gt;=2 &amp;&amp;\n     \/\/ space between word groups\n     ( (pwords&gt;0 &amp;&amp; pwords%sspace==0) ||\n     \/\/ space after linenumber\n       (slineno &amp;&amp; pwords==0) ) )\n    fprintf(stdout,\" \");\n\n  if(sspace &amp;&amp;\n     \/\/ space between words\n     ( (pwords&gt;0) ||\n     \/\/ space after linenumber\n       (slineno &amp;&amp; pwords==0) ) ) \n    fprintf(stdout,\" \");\n}\n\nstatic void print_word(unsigned char *buf)\n{\n  if(size!=0) {\n    fprintf(stdout,\"%*s\",size,buf);\n  } else {\n    fprintf(stdout,\"%s\",buf);\n  }\n}\n\n#ifdef SHA256\n\nstatic void newressu_file_digest(char *filename,unsigned char *hash)\n{\n  int c;\n  unsigned char buffer&#91;1024];\n  FILE *fp1;\n  HashCtx ctx;\n  \n  HashInit(&amp;ctx);\n  if((fp1 = fopen(filename, \"rb\"))!=NULL) {\n    while((c=fread(buffer, 1, sizeof(buffer), fp1)) &gt; 0)\n      HashUpdate(&amp;ctx, buffer, c);\n    fclose(fp1);\n  }\n  HashFinal(hash, &amp;ctx);  \n}\n\n#endif\n\nint main(int argc, char *argv&#91;])\n{\n  int c, d, status=0;\n\n  procname=argv&#91;0];\n\n  limit=0;\n#ifdef DEBUG4\n  ccp=cc;\n  cc_bytes=0;\n#endif\n  clockbytes=0;\n  for(d=0;d&lt;1024;d++)\n    periods&#91;d]=0;\n\n  \/\/ look thru command line parameters\n  \n  for(c=1;c&lt;argc;c++) {\n    if(!strncmp(\"-\",argv&#91;c],1)) {\n      if(!strcmp(\"--lineno\",argv&#91;c])) {\n\tslineno=!slineno;\n\n      } else if(!strcmp(\"--crlf\",argv&#91;c])) {\n\tscrlf=!scrlf;\n\tslineno=0;\n\n      } else if(!strcmp(\"--quiet\",argv&#91;c])) {\n\tquiet=!quiet;\n\n      } else if(!strcmp(\"--stats\",argv&#91;c]) ||\n\t!strcmp(\"--stat\",argv&#91;c])) {\n\tstats=!stats;\n\n      } else if(!strcmp(\"--rand\",argv&#91;c])) {\n\tdigits = \"0123456789\";\n\tsspace=2;\n\tsnewline=5;\n\tslineno=1;\n\twords=10;\n\tchars=0;\n\tlimit=100000;\n\t\/\/size=5;\n\t\/\/lines=20000;\n\t\n      } else if(!strncmp(\"--space\",argv&#91;c],7)) {\n\tif(*(argv&#91;c]+7)!='\\0' &amp;&amp; atoi(argv&#91;c]+7)&gt;1) {\n\t  sspace=atoi(argv&#91;c]+7);\n\t} else if(c+1&lt;argc &amp;&amp; atoi(argv&#91;c+1])&gt;1) {\n\t  sspace=atoi(argv&#91;c+1]);\n\t  c++;\n\t} else {\n\t  sspace=!sspace;\n\t}\n\n      } else if(!strncmp(\"--newline\",argv&#91;c],9)) {\n\tif(*(argv&#91;c]+9)!='\\0' &amp;&amp; atoi(argv&#91;c]+9)&gt;1) {\n\t  snewline=atoi(argv&#91;c]+9);\n\t} else if(c+1&lt;argc &amp;&amp; atoi(argv&#91;c+1])&gt;1) {\n\t  snewline=atoi(argv&#91;c+1]);\n\t  c++;\n\t} else {\n\t  snewline=!snewline;\n\t}\n\n     } else if(!strcmp(\"--zero\",argv&#91;c])) {\n\tzero=!zero;\n\n      } else if(!strcmp(\"--sort\",argv&#91;c])) {\n\tsort=!sort;\n\tif(sspace==0)\n\t  sspace=1;\n\t\t\n      } else if(!strcmp(\"--unique\",argv&#91;c])) {\n\tunique=!unique;\n\tif(sspace==0)\n\t  sspace=1;\n\t\t\n      } else if(!strcmp(\"--lotto\",argv&#91;c])) {\n\tsort=!sort;\n\tif(sspace==0)\n\t  sspace=1;\n\t\/\/sort=1;\n\t\/\/unique=1;\n\n      } else if(!strcmp(\"--sample\",argv&#91;c])) {\n\tsample=!sample;\n\t\n      } else if(!strcmp(\"--copyright\",argv&#91;c]) ||\n\t !strcmp(\"--version\",argv&#91;c])) {\n\tnewressu_version();\n#ifdef SHA256\n\tunsigned char filedigest&#91;HashLen];\n\tnewressu_file_digest(\"\/proc\/self\/exe\", filedigest);\n\tfprintf(stderr,\"\\nsha256: \");\n\tfor(int c = 0;c &lt; HashLen; c++) {\n\t  fprintf(stderr,\"%02x\", filedigest&#91;c]);\n\t}\n#endif\n\n\tfprintf(stderr,\"\\n\\n\");\n\thelp=1;\n\t\n      } else if(!strncmp(\"--lim\",argv&#91;c],5)) {\n\tif(*(argv&#91;c]+5)!='\\0') {\n\t  in_word(&amp;limit, digits, argv&#91;c]+5);\n\t} else if(c+1&lt;argc) {\n\t  in_word(&amp;limit, digits, argv&#91;c+1]);\n\t  c++;\n\t}\n\tif(sspace&lt;1) \/\/ 23.6.2021\n\t  sspace=1;\n\n      } else if(!strncmp(\"-s\",argv&#91;c],2)) {\n\tif(*(argv&#91;c]+2)!='\\0') {\n\t  size=atoi(argv&#91;c]+2);\n\t} else if(c+1&lt;argc) {\n\t  size=atoi(argv&#91;c+1]);\n\t  c++;\n\t}\n\tlimit=0; \/\/ 23.6.2021\n\tif(size==0)\n\t  size=1;\n\tif(size&gt;1024)\n\t  size=1024;\n\n      } else if(!strncmp(\"--bits\",argv&#91;c],6)) {\n\tif(*(argv&#91;c]+6)!='\\0') {\n\t  ressu_bits_needed=atoi(argv&#91;c]+6);\n\t} else if(c+1&lt;argc) {\n\t  ressu_bits_needed=atoi(argv&#91;c+1]);\n\t  c++;\n\t}\t\n\n      } else if(!strncmp(\"--bytes\",argv&#91;c],7)) {\n\tif(*(argv&#91;c]+7)!='\\0') {\n\t  ressut_bytes=atoi(argv&#91;c]+7);\n\t} else if(c+1&lt;argc) {\n\t  ressut_bytes=atoi(argv&#91;c+1]);\n\t  c++;\n\t}\t\n\n      } else if(!strncmp(\"-w\",argv&#91;c],2)) { \/\/ words per line\n\tif(*(argv&#91;c]+2)!='\\0') {\n\t  words=atoi(argv&#91;c]+2);\n\t} else if(c+1&lt;argc) {\n\t  words=atoi(argv&#91;c+1]);\n\t  c++;\n\t}\n\tif(words&lt;1)\n\t  words=1;\n\t\n\tchars = 0;\n\t\n      } else if(!strncmp(\"-c\",argv&#91;c],2)) {  \/\/ characters per line\n\tif(*(argv&#91;c]+2)!='\\0') {\n\t  chars=atoi(argv&#91;c]+2);\n\t} else if(c+1&lt;argc) {\n\t  chars=atoi(argv&#91;c+1]);\n\t  c++;\n\t}\n\twords=0;\n\t\n      } else if(!strncmp(\"-l\",argv&#91;c],2)) { \/\/ lines\n\tif(*(argv&#91;c]+2)!='\\0') {\n\t  lines=atoi(argv&#91;c]+2);\n\t} else if(c+1&lt;argc) {\n\t  lines=atoi(argv&#91;c+1]);\n\t  c++;\n\t}\n\tif(lines&lt;1)\n\t  lines=1;\n\n      } else if(!strcmp(\"-x\",argv&#91;c])) {\n\tdigits = \"0123456789abcdef\";\n\tsize=4;\n\n      } else if(!strcmp(\"-d\",argv&#91;c])) {\n\tdigits = \"0123456789\";\n\tsize=5;\n\n      } else if(!strcmp(\"-o\",argv&#91;c])) {\n\tdigits = \"01234567\";\n\tsize=3;\n\n      } else if(!strcmp(\"-b\",argv&#91;c])) {\n\tdigits = \"01\";\n\tsize=8;\n\n      } else if(!strcmp(\"-1\",argv&#91;c])) {\n\tdigits=\n\t  \"0123456789\" \\\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\";\n\tsize=8;\n\n      } else if(!strcmp(\"-11\",argv&#91;c])) {\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\tsize=8;\n\n      } else if(!strcmp(\"-12\",argv&#91;c])) {\n\tdigits=\n\t  \"0123456789\";\n\tsize=8;\n\n      } else if(!strcmp(\"-2\",argv&#91;c])) {\n\tdigits=\n\t  \"0123456789\" \\\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\" \\\n\t  \"_-\";\n\tsize=8;\n\n      } else if(!strcmp(\"-3\",argv&#91;c])) { \/\/ 9.5.2021 JariK\n\tdigits=\n\t  \"!\\\"#$%&amp;'()*+,-.\/0123456789:;&lt;=&gt;?@\" \\\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ&#91;\\\\]^_`\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz{|}~\";\n\tsize=8;\n\n      } else if(!strcmp(\"--rus\",argv&#91;c])) { \/\/ russian alphabet\n\tdigits=\n\t  \"\u0410\u0411\u0412\u0413\u0414\u0415\u0401\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\" \\\n\t  \"\u0430\u0431\u0432\u0433\u0434\u0435\u0451\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\";\n\tsize=8;\n\n      } else if(!strcmp(\"--dnk\",argv&#91;c]) || \/\/ danish alphabet\n\t\t!strcmp(\"--nor\",argv&#91;c])) { \/\/ norwegian alphabet\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00c6\u00d8\u00c5\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\u00e6\u00f8\u00e5\";\n\tsize=8;\n\n      } else if(!strcmp(\"--fin\",argv&#91;c]) || \/\/ finnish alphabet\n\t\t!strcmp(\"--swe\",argv&#91;c])) { \/\/ swedish alphabet\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00c5\u00c4\u00d6\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\u00e5\u00e4\u00f6\";\n\tsize=8;\n\n      } else if(!strcmp(\"--est\",argv&#91;c])) { \/\/ estonian alphabet\n\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRS\u0160Z\u017dTUVW\u00d5\u00c4\u00d6\u00dcXY\" \\\n\t  \"abcdefghijklmnopqrs\u0161z\u017etuvw\u00f5\u00e4\u00f6\u00fcxy\";\n\tsize=8;\n  \n      } else if(!strcmp(\"--ltu\",argv&#91;c])) { \/\/ lithuanian alphabet\n\tdigits=\n\t  \"A\u0104BC\u010cDE\u0118\u0116FGHI\u012eYJKLMNOPRS\u0160TU\u0172\u016aVZ\u017d\" \\\n\t  \"a\u0105bc\u010dde\u0119\u0117fghi\u012fyjklmnoprs\u0161tu\u0173\u016bvz\u017e\";\n\t  \n\tsize=8;\n\n      } else if(!strcmp(\"--lva\",argv&#91;c])) { \/\/ latvian alphabet\n\tdigits=\n\t  \"A\u0100BC\u010cDE\u0112FG\u0122HI\u012aJK\u0136L\u013bMN\u0145OPRS\u0160TU\u016aVZ\u017d\" \\\n\t  \"a\u0101bc\u010dde\u0113fg\u0123hi\u012bjk\u0137l\u013cmn\u0146oprs\u0161tu\u016bvz\u017e\";\n\tsize=8;\n\n      } else if(!strcmp(\"--fra\",argv&#91;c]) \/\/ french alphabet\n\t\t||!strcmp(\"--gbr\",argv&#91;c]) \/\/ great britain alphabet\n\t\t||!strcmp(\"--usa\",argv&#91;c]) \/\/ united states alphabet\n\t\t||!strcmp(\"--ita\",argv&#91;c]) \/\/ italian alphabet\n\t\t) {\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\";\n\tsize=8;\n\n      } else if(!strcmp(\"--deu\",argv&#91;c])) { \/\/ deutche alphabet\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00c4\u00d6\u00dc\u1e9e\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\u00e4\u00f6\u00fc\u00df\";\n\tsize=8;\n\n      } else if(!strcmp(\"--grc\",argv&#91;c])) { \/\/ greek alphabet\n\tdigits=\n\t  \"\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\" \\\n\t  \"\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\";\n\tsize=8;\n   \n      } else if(!strcmp(\"--cards\",argv&#91;c])) {\n\tdigits=\n\t  \"\ud83c\udca1\ud83c\udca2\ud83c\udca3\ud83c\udca4\ud83c\udca5\ud83c\udca6\ud83c\udca7\ud83c\udca8\ud83c\udca9\ud83c\udcaa\ud83c\udcab\ud83c\udcad\ud83c\udcae\" \\\n\t  \"\ud83c\udcb1\ud83c\udcb2\ud83c\udcb3\ud83c\udcb4\ud83c\udcb5\ud83c\udcb6\ud83c\udcb7\ud83c\udcb8\ud83c\udcb9\ud83c\udcba\ud83c\udcbb\ud83c\udcbd\ud83c\udcbe\" \\\n\t  \"\ud83c\udcc1\ud83c\udcc2\ud83c\udcc3\ud83c\udcc4\ud83c\udcc5\ud83c\udcc6\ud83c\udcc7\ud83c\udcc8\ud83c\udcc9\ud83c\udcca\ud83c\udccb\ud83c\udccd\ud83c\udcce\" \\\n\t  \"\ud83c\udcd1\ud83c\udcd2\ud83c\udcd3\ud83c\udcd4\ud83c\udcd5\ud83c\udcd6\ud83c\udcd7\ud83c\udcd8\ud83c\udcd9\ud83c\udcda\ud83c\udcdb\ud83c\udcdd\ud83c\udcde\";\n\tsize=1;\n\n      } else if(!strcmp(\"--isalnum\",argv&#91;c]) || \/\/ 9.5.2021 JariK\n\t        !strcmp(\"--isalpha\",argv&#91;c]) ||\n\t        !strcmp(\"--isdigit\",argv&#91;c]) ||\n\t        !strcmp(\"--isgraph\",argv&#91;c]) ||\n\t        !strcmp(\"--islower\",argv&#91;c]) ||\n\t        !strcmp(\"--isprint\",argv&#91;c]) ||\n\t        !strcmp(\"--ispunct\",argv&#91;c]) ||\n\t        !strcmp(\"--isupper\",argv&#91;c]) ||\n\t\t!strcmp(\"--isxdigit\",argv&#91;c])) {\n\tunsigned char *p=digitstemp;\n\tfor(d=0;d&lt;256;d++) {\n\t  if((!strcmp(\"--isalnum\",argv&#91;c]) &amp;&amp; isalnum(d)) ||\n\t     (!strcmp(\"--isalpha\",argv&#91;c]) &amp;&amp; isalpha(d)) ||\n\t     (!strcmp(\"--isdigit\",argv&#91;c]) &amp;&amp; isdigit(d)) ||\n\t     (!strcmp(\"--isgraph\",argv&#91;c]) &amp;&amp; isgraph(d)) ||\n\t     (!strcmp(\"--islower\",argv&#91;c]) &amp;&amp; islower(d)) ||\n\t     (!strcmp(\"--isprint\",argv&#91;c]) &amp;&amp; isprint(d)) ||\n\t     (!strcmp(\"--ispunct\",argv&#91;c]) &amp;&amp; ispunct(d)) ||\n\t     (!strcmp(\"--isupper\",argv&#91;c]) &amp;&amp; isupper(d)) ||\n\t     (!strcmp(\"--isxdigit\",argv&#91;c]) &amp;&amp; isxdigit(d))) {\n\t    *p++=d;\n\t  }\n\t}\n\t*p='\\0';\n\tdigits=digitstemp;\n\tsize=8;\n\n      } else if(!strncmp(\"-i\",argv&#91;c],2)) {\n\tdigits=NULL;\n\tif(*(argv&#91;c]+2)!='\\0') {\n\t  digits=argv&#91;c]+2;\n\t} else if(c+1 &lt; argc) {\n\t  digits=argv&#91;c+1];\n\t  c++;\n\t}\n\tif(digits==NULL || utf8len(digits)&lt;2) {\n\t  fprintf(stderr,\"%s: not enough digits \\\"%s\\\"\\n\",procname,argv&#91;c]);\n\t  help = 1;\n\t}\n\tsize=1;\n\n      } else if(!strcmp(\"--ressu\",argv&#91;c])) {\n\tinput=INPUT_RESSU;\n\n      } else if(!strcmp(\"--debug\",argv&#91;c])) {\n\tinput=INPUT_DEBUG;\n\n      } else if(!strcmp(\"--fast\",argv&#91;c])) {\n\tinput=INPUT_FAST;\n\n      } else if(!strcmp(\"--single\",argv&#91;c])) {\n\tinput=INPUT_SINGLE;\n\n#ifdef FORT\n      } else if(!strcmp(\"--fort\",argv&#91;c])) {\n\tinput=INPUT_FORT;\n\n      } else if(!strcmp(\"--fortverbose\",argv&#91;c])) {\n\tfort_verbose=!fort_verbose;\n\n#endif\n      } else if(!strcmp(\"--urandom\",argv&#91;c])) {\n\tinput=INPUT_URANDOM;\n\n#ifdef USE_RANDOM\n      } else if(!strcmp(\"--random\",argv&#91;c])) {\n\tinput=INPUT_RANDOM;\n\n#endif\n      } else {\n\tfprintf(stderr,\"%s: invalid option %s\\n\",procname,argv&#91;c]);\n\tstatus=1;\n\thelp = 1;\n      }\n    } else {\n      help = 1;\n\n    } \/\/ if(!strncmp\n  } \/\/ for(c=0\n\n#ifdef FORT\n  if(input==INPUT_FORT) {\n    strcpy(fort_random_file,\"newressufort.rnd\");\n    \/\/fort_verbose=0;\n    fort_init();\n  }\n#endif\n  \n  if(sample) {\n\n\/\/sample file size = CLIM*DLIM*BLKSIZE\n#define CLIM 8192 \/\/ outer loop\n#define DLIM 256 \/\/ inner loop\n#define BLKSIZE 4096 \/\/ block size\n\n#define STAT_LINE_READY 2\n#define STAT_LINE_NOW 2\n#define STAT_LINE_ANIM 2\n    \n#define TIMEFORMAT \"%H:%M %Z\"\n#define TIMEFORMAT2 \"%a %H:%M %Z\"\n#define DATEFORMAT \"%a %d %b %Y\"\n    \n    unsigned int c, d;\n    unsigned char buffer&#91;BLKSIZE];\n    FILE *fp1;\n    time_t secondsstart, secondsnow;\n#ifdef STAT_LINE_ANIM\n    long int secs, prev_secs=-1;\n    int crs=0;\n#endif\n\n    if((fp1=fopen(samplefilename,\"a\")) != NULL) {\n\n      secondsstart=time(NULL);\n\n      for(c=0;c&lt;CLIM;c++) {\n\tsecondsnow=time(NULL);\n\t\n\t\/\/ print status line:\n\t\/\/ blk 10, written 10MB, 269KB\/sec, left 8 h 38 m, ready at Sat 17 Jul 2021 01:57:43 EEST, now Fri 17:19:32 EEST\n\t\n\tstat_line_begin();\n\tstat_line_printf(\"\\rblk %d, written \",c);\n\tstat_line_readable((unsigned long)c*DLIM*BLKSIZE);\n\t\n\tif(c&gt;0) {\n\t  stat_line_printf(\", \");\n\t  stat_line_readable((unsigned long)((double)c*DLIM*BLKSIZE\/(secondsnow-secondsstart)) );\n\t  stat_line_printf(\"\/sec\");\n\n\t  char timebuf&#91;128], timebuf2&#91;128];\n\t  \n#ifdef STAT_LINE_NOW\n\n\t  \/\/ print now\n\t  \n\t  stat_line_printf(\", now\");\n\t  strftime(timebuf,sizeof(timebuf),TIMEFORMAT2,\n\t\t   localtime((time_t *)&amp;secondsnow));\n\t  stat_line_printf(\" %s\",timebuf);\n#endif\n\n\t  \/\/ print left\n\t  \n\t  long int secondsleft=(int)((((double)secondsnow-secondsstart)\/c)*(CLIM-c) );\n\t  long int secondsleft2;\n\t  long int temp,timeprinted=0;\n\n\t  secondsleft2=secondsleft;\n\t  stat_line_printf(\", left\");\n\t  \n\t  temp=secondsleft2\/(24*3600);\n\t  if(temp&gt;0) {\n\t    timeprinted=1;\n\t    stat_line_printf(\" %dd\",temp);\n\t    secondsleft2-=temp*(24*3600);\n\t  }\n\t  temp=secondsleft2\/3600;\n\t  if(temp&gt;0) {\n\t    timeprinted=1;\n\t    stat_line_printf(\" %dh\",temp);\n\t    secondsleft2-=temp*3600;\n\t  }\n\t  temp=secondsleft2\/60;\n\t  if(temp&gt;0) {\n\t    timeprinted=1;\n\t    stat_line_printf(\" %dm\",temp);\n\t    secondsleft2-=temp*60;\n\t  }\n\t  temp=secondsleft2;\n\t  if(!timeprinted) {\n\t    stat_line_printf(\" %d seconds\",temp);\n\t  }\n\n#ifdef STAT_LINE_READY\n\n\t  long int secondsend=(int)secondsstart+((((double)secondsnow-secondsstart)\/c)*CLIM);\n\n\t  \/\/ print end date if different7\n\t  \n\t  stat_line_printf(\", ready at\");\n\t  strftime(timebuf,sizeof(timebuf),DATEFORMAT,\n\t\t   localtime((time_t *)&amp;secondsend));\n\t  strftime(timebuf2,sizeof(timebuf2),DATEFORMAT,\n\t\t   localtime((time_t *)&amp;secondsnow));\n\t  if(strcmp(timebuf,timebuf2)) {\n\t    stat_line_printf(\" %s\",timebuf);\n\t  }\n\n\t  \/\/ print end time\n\t  \n\t  strftime(timebuf,sizeof(timebuf),TIMEFORMAT,\n\t\t   localtime((time_t *)&amp;secondsend));\n\t  stat_line_printf(\" %s\",timebuf);\n#endif\n\n\t}\n\n\tstat_line_end();\n\t\n\t\/\/ do the work\n\t\n#ifdef STAT_LINE_ANIM\n\tunsigned char cursor&#91;4] = { '|', '\/', '-', '\\\\' };\n\n\tfprintf(stderr,\" \");\n#endif\n\tfor(d=0;d&lt;DLIM;d++) {\n#ifdef STAT_LINE_ANIM\n\t  secs=time(NULL)%sizeof(cursor);\n\t  if(prev_secs!=secs) {\n\t    if(prev_secs!=-1) \n\t      crs=(crs+1)%sizeof(cursor);\n\t    fprintf(stderr,\"\\b%c\",cursor&#91;crs]);\n\t    fflush(stderr);\n\t    prev_secs=secs;\n\t  }\n#endif\n\t  if(input==INPUT_RESSU) \/\/ ressu prod\n\t    ressu_genbytes(sizeof(buffer),buffer);\n\t  else if(input==INPUT_DEBUG) \/\/ ressu debug\n\t    ressu_genbytes_debug(sizeof(buffer),buffer);\n\t  else if(input==INPUT_FAST) \/\/ ressu fast\n\t    ressu_genbytes_fast(sizeof(buffer),buffer);\n\t  else if(input==INPUT_SINGLE) \/\/ ressu single\n\t    ressu_genbytes_single(sizeof(buffer),buffer);\n#ifdef FORT\n\t  else if(input==INPUT_FORT) \/\/ ressu fort\n\t    fort_random_data_xor(sizeof(buffer),buffer);\n#endif\n\t  else if(input==INPUT_URANDOM) \/\/ urandom\n\t    readfile_xor(sizeof(buffer),buffer,urandomfilename);\n#ifdef USE_RANDOM\n\t  else if(input==INPUT_RANDOM) \/\/ random\n\t    readfile_xor(sizeof(buffer),buffer,randomfilename);\n#endif\n\t  \n#ifdef WRITE_SAMPLE\n\t  fwrite(buffer,1,sizeof(buffer),fp1);\n#endif\n\t} \/\/ for(d=0;\n#ifdef STAT_LINE_ANIM\n\tfprintf(stderr,\"\\b \\b\");\n\tprev_secs=-1;\n#endif\n      }\n      fclose(fp1);\n    } \/\/ if((fp1=fopen\n\n    \/\/ remove last status line\n    \n    stat_line_begin();\n    stat_line_printf(\"Done!\");\n    stat_line_end();\n    fprintf(stdout,\"\\n\");\n    fflush(stdout);\n    exit(status);\n  } \/\/ if(sample)\n\n  \/\/ get linenumber length in digits\n\n  plinesdigits=line_number_length();\n\n  \/\/ get data length in digits\n\n  if(limit!=0) {\n    unsigned char wordbuf&#91;128];\n    out_word(sizeof(wordbuf),wordbuf,digits,limit-1);\n    size=utf8len(wordbuf);\n  }\n\n  pchars=0;\n  pwords=0;\n  int linew=0;\n\n  \/\/ in beginning of line, count printed line number\n      \n  if(!quiet &amp;&amp; slineno) {\n    sprintf(linenobuf,\"%0*d\",plinesdigits,plines);\n    pchars += strlen(linenobuf);\n    pchars++;\n  }\n\n  \/\/ count words\n  \n  while((chars&gt;0 &amp;&amp; pchars+size &lt; chars) ||\n\t(words&gt;0 &amp;&amp; pwords &lt; words)) {\n\n    linew++;\n\n    calc_spaces();\n    \n    pchars+=size;\n    pwords++;\n  }\n\n  unsigned long wordvalues=1;\n\n  for(c=0;c&lt;size;c++) {\n    if(wordvalues!=0 &amp;&amp; wordvalues*utf8len(digits)&lt;(unsigned long)65536*65536*65536) {\n      wordvalues*=utf8len(digits);\n    } else {\n      wordvalues=0;\n    }\n  }\n\n  if(limit &gt; 0) {\n    if(sort==1 &amp;&amp; limit-!zero&lt;words) {\n      fprintf(stderr,\"%s: limit is less than words (zero)\",procname);\n      fprintf(stderr,\", limit:%lu\",limit);\n      fprintf(stderr,\", words:%d\",words);\n      fprintf(stderr,\", zero:%d\",zero);\n      fprintf(stderr,\"\\n\");\n      \n      help=1;\n      lines=0;\n    }\n  } else {\n    if(sort==1 &amp;&amp; size&gt;0 &amp;&amp; wordvalues&gt;0 &amp;&amp; wordvalues&lt;linew) {\n      fprintf(stderr,\"%s:\",procname);\n      fprintf(stderr,\" digits is less than calculated words\");\n      fprintf(stderr,\", digits:%d(%lu)\",utf8len(digits),wordvalues);\n      fprintf(stderr,\", words:%d\\n\",linew);\n      help=1;\n      lines=0;\n    }\n  }\n\n  \/\/ small words as single ressu_gen_limit() call\n  \n  if(limit==0 &amp;&amp; wordvalues&gt;0)\n    limit=wordvalues;\n\n  if(stats) {\n    fprintf(stdout,\"randomsource: %s\",randomgen&#91;input]);\n    fprintf(stdout,\", size: %d\",size);\n    fprintf(stdout,\", linew: %d\",linew);\n    fprintf(stdout,\", pchars: %d\",pchars);\n    fprintf(stdout,\", pwords: %d\",pwords);\n    fprintf(stdout,\", tchars: %d\",size*linew*lines);\n    fprintf(stdout,\", digitslen: %d\",utf8len(digits));\n    if(wordvalues&gt;0)\n      fprintf(stdout,\", wordvalues: %lu\",wordvalues);\n    if(limit&gt;0)\n      fprintf(stdout,\", limit: %lu\",limit);\n    fprintf(stdout,\"\\n\");\n  }\n  \n  if(help) {\n    struct helpline {\n      char *command;\n      char *text;\n    } helplines&#91;] = {\n      { \"newressu -d\", \"print random decimal digits (default)\" },\n      { \"newressu -o\", \"print octal digits\" },\n      { \"newressu -x\", \"print hexadecimal digits\" },\n      { \"newressu -b\", \"print binary digits\" },\n      { \"newressu -d --space\", \"print decimal digits, with spaces between \\\"words\\\"\" },\n      { \"newressu -b --space\", \"print binary digits, with spaces between \\\"words\\\"\" },\n      { \"newressu -d -l30\", \"print decimal digits, 30 lines\" },\n      { \"newressu -d -l30 --lineno\", \"print decimal digits, 30 lines, no linenumbers\"  },\n      { \"newressu -d -c128\", \"print decimal digits, 128 characters per line\"  },\n      { \"newressu -d --lim10\", \"print decimal numbers between 0-9\" },\n      { \"newressu -d --lim10 -x\",\"print hexadecimal numbers with decimal limit\" },\n      { \"newressu -d -s10 --space\",\"print decimal numbers with spaces and wordsize 10\" },\n      { \"newressu -d --space --zero --lim7\",\"print rollings of dice (1-6)\" },\n      { \"newressu -b -s1 --space\",\"print throws of coin (0,1)\" },\n      { \"newressu -d --lim41 -w7 --zero --lotto\",\"print lotto numbers for finnish lotto 7x(1-40)\" },\n      { \"newressu -d -s5 --sort -w16\",\"print 16 sorted decimal numbers from 0 to 99999\" },\n      { \"newressu --isalnum\", \"print alphanumeric characters\" },\n      { \"newressu --isalpha\", \"print alphabetic characters\" },\n      { \"newressu --isgraph\", \"print printables excluding space\" },\n      { \"newressu --islower\", \"print lowercase characters\" },\n      { \"newressu --ispunct\", \"print punctuation characters\" },\n      { \"newressu --isupper\", \"print uppercase characters\" },\n      { \"newressu -1\", \"print material for passwords\" },\n      { \"newressu -i\u0430\u044d\u044b\u0443\u043e\u044f\u0435\u0451\u044e\u0438\", \"print russian vowels\" },\n      { \"newressu --ressu\", \"use randomness from ressu (default)\" },\n      { \"newressu --debug\", \"use randomness from debugging ressu\" },\n      { \"newressu --fast\", \"use randomness from fast ressu\" },\n      { \"newressu --single\", \"use randomness from single round of ressu\" },\n#ifdef FORT\n      { \"newressu --fort\", \"use randomness from fort\" },\n#endif\n      { \"newressu --urandom\", \"use randomness from \/dev\/urandom\" },\n#ifdef USE_RANDOM\n      { \"newressu --random\", \"use randomness from \/dev\/random\" },\n#endif\n    };\n    \n    for(c=0;c&lt;sizeof(helplines)\/sizeof(helplines&#91;0]);c++) {\n      fprintf(stderr,\"%-50s\",helplines&#91;c].text);\n      fprintf(stderr,\"%-25s\",helplines&#91;c].command);\n      fprintf(stderr,\"\\n\");\n    }\n    for(c=0;c&lt;chars;c++)\n      fprintf(stdout,\"*\");\n    fprintf(stdout,\"\\n\");\n    if(lines&gt;1)\n      lines=1; \/\/ print one line below help as a sample\n  }\n\n  if(lines==0)\n    exit(status);\n\n  int linecnt=0;\n  unsigned char *line=NULL;\n  unsigned char wordbuf&#91;1025];\n  \n  for(;;) {\n\n    if(!sort) { \/\/ also lotto\n\n      pwords=0;\n\n      while(pwords&lt;linew) {\n\treadword(wordbuf);\n\n\tif(!quiet) {\n\n#ifdef FORT\n\t  fort_partial_line = 1;\n#endif\n\t\n\t  \/\/ in beginning of line, print line number\n\n\t  print_line_number();\n\t\n\t  \/\/ want to print spaces between \"words\"?\n\n\t  print_spaces();\n\t\n\t  \/\/ print word\n\n\t  print_word(wordbuf);\n\t}\n\n\tpwords++;\n      } \/\/ while(pwords&lt;linew) {\n    } else { \/\/ if(!sort)\n\n      pwords=0;\n      \n      line_clear(&amp;linecnt,&amp;line);\n\n      \/\/ fetch and save words on this row\n\n      while(pwords&lt;linew) {\n\treadword(wordbuf);\n\n\tif(line_add_string_sort(&amp;linecnt,&amp;line,wordbuf)) {\n\t  pwords++;\n\t}\n      } \/\/ while(pwords&lt;linew) {\n\n      pwords=0;\n\n      \/\/ print words on this row\n\n      while(pwords&lt;linew) {\n\n\tline_get_string(sizeof(wordbuf),wordbuf,pwords,line);\n\n\tif(!quiet) {\n\n#ifdef FORT\n\t  fort_partial_line = 1;\n#endif\t  \n\n\t  \/\/ in beginning of line, print line number\n\n\t  print_line_number();\n\t\n\t  \/\/ want to print spaces between \"words\"?\n\t\n\t  print_spaces();\n\n\t  \/\/ print word\n\t\n\t  print_word(wordbuf);\n\t}\n\tpwords++;\n      } \/\/ while(pwords&lt;linew) {\n    } \/\/ if(!sort)\n\n    if(!quiet) {\n      fprintf(stdout,\"\\n\");\n    }\n    plines++;\n    if(!quiet &amp;&amp; snewline&gt;1 &amp;&amp;\n       plines&lt;lines &amp;&amp;\n       plines%snewline==0)\n      fprintf(stdout,\"\\n\");\n\n#ifdef FORT\n    fort_partial_line = 0;\n#endif\n    \n    \/\/ all needed lines printed?\n\n    if(plines &gt;= lines)\n      break;\n\n  } \/\/ for(;;)\n  fflush(stdout);\n\n#ifdef FORT\n  if(input==INPUT_FORT) {\n    fort_save();\n  }\n#endif\n  exit(status);\n}\n\n#endif \/\/ MAIN<\/code><\/pre>\n\n\n\n<p>newressu.h:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void ressu_genbytes(int size, unsigned char *buffer);<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En ole aiemmin kuvannut makefile tiedostoa, t\u00e4m\u00e4 on ensimm\u00e4inen. Makefile:n avulla voidaan automatisoida ohjelman k\u00e4\u00e4nn\u00f6kset kuvaamalla ne ns makefile tiedostoon. Seuraavassa makefile:ss\u00e4 m\u00e4\u00e4ritell\u00e4\u00e4n viisi tavoitetta: newressu, newressuw, newressum, fort ja sha256. Newressu on versio newressusta, jossa on mukana fort (sha256) ja ei ole web satunnaislukujen hakua. Newressuw on kuten edellinen, mutta mukana on my\u00f6s web&hellip; <a class=\"more-link\" href=\"https:\/\/moijari.com\/?p=1756\">Continue reading <span class=\"screen-reader-text\">Using make, little rewrite of fort 0.51, added fort to newressu 2.4<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6],"tags":[],"_links":{"self":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/1756"}],"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=1756"}],"version-history":[{"count":33,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/1756\/revisions"}],"predecessor-version":[{"id":1797,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/1756\/revisions\/1797"}],"wp:attachment":[{"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1756"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1756"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}