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;
}