Ressu 2.0 Vaihtoehtoiset satunnaisuuslähteet

Lisäsin muutaman kytkimen newressu-satunnaislukulelun parametreihin. Kytkimillä voi valita toisen satunnaislukulähteen. –fast kytkimellä valitaan nopea versio ressusta, joka ajaa ressu_genbytes_fast rutiinin kahteen kertaan. –urandom lukee satunnaisuuden /dev/urandom tiedostosta. –random lukee satunnaisuuden /dev/random tiedostosta. Oletuksena /dev/random:in käyttö on pois päältä (USE_RANDOM). –ressu on oletustoiminta, eli käytetään uutta ressua.

Tällä ensimmäisellä readfile_xor() rutiinilla luetaan satunnaisuutta /dev/*random tiedostoista:

#define aDEBUG9 2

static void fort_readfile_xor(int len,
    unsigned char *buf,
    unsigned char *filename)
{
  int c, n, n2;
  unsigned char temp[64];
  FILE *fp1;

  if((fp1 = fopen(filename, "rb"))
      != NULL) {
    while(len != 0) {
      n = (len < sizeof(temp)) ?
          len : sizeof(temp);
      n2=fread(temp, 1, n, fp1);
      for(c = 0; c < n2; c++)
        buf[c] ^= temp[c];
      len -= n2;
      buf += n2;
    }
    fclose(fp1);
  }
}

Seuraavaksi kokonaan uusittu ressu_genbyte(): input muuttuja määrittelee satunnaisuuden lähteen, 0=ressu, 1=fast ressu, 2=urandom ja 3=random.

int input=0;

#define GENT_SIZE 4096
#define aUSE_RANDOM 2

int ressu_genbyte()
{
  static unsigned char gent[GENT_SIZE];
  static unsigned char gent_pos=0;
  unsigned char ch;

  if(input==0) { // ressu
    ressu_genbytes(sizeof(ch), &ch);
  } else {
    if(gent_pos==0) {
      if(input==1) { // ressu_fast
        ressu_genbytes_fast(sizeof(gent),gent);
        ressu_genbytes_fast(sizeof(gent),gent);
      } else if(input==2) { // urandom
        readfile_xor(sizeof(gent),gent,"/dev/urandom");
#ifdef USE_RANDOM
      } else if(input==3) { // random
        readfile_xor(sizeof(gent),gent,"/dev/random");
#endif
      }
    }
    ch=gent[gent_pos];
    gent_pos=(gent_pos+1)%sizeof(gent);
  }
  return(ch);
}

Seuraavassa uudet rivit main():in parametrien käsittelyssä: mukana pari edeltävää ja pari seuraavaa riviä:

      } else if(!strncmp("-i",argv[c],2)) {
        digits=NULL;
        if(*(argv[c]+2)!='\0') {
          digits=argv[c]+2;
        } else if(c+1 < argc) {
          digits=argv[c+1];
          c++;
        }
        if(digits==NULL || utf8len(digits)<2) {
          fprintf(stderr,"%s: not enough digits \"%s\"\n",procname,argv[c]);
          help = 1;
        }
        size=1;
      } else if(!strcmp("--ressu",argv[c])) {
        input=0;
      } else if(!strcmp("--fast",argv[c])) {
        input=1;
      } else if(!strcmp("--urandom",argv[c])) {
        input=2;
#ifdef USE_RANDOM
      } else if(!strcmp("--random",argv[c])) {
        input=3;
#endif
      } else {
        fprintf(stderr,"%s: invalid option %s\n",procname,argv[c]);
        help = 1;
      }