Terttu jatkuu

Olen vielä jatkanut tertun koodaamista, olen tehnyt seuraavia muutoksia:

Lisätty html parametrien käsittely. Lisätty koodia session id:lle, lisätty reset, fetch, prev ja next nappulat. Lisätty otsakkeen kenttien perusteella haku fetch nappulalla. Lisätty save nappula, se ei vielä toimi. Lisätty yksinkertaiset session muuttujat. Lisätty koodi prev ja next nappuloille. Korjattu pikku bugi css tekstin lähetyksestä.

Lopun koodipätkissä session id:n antamiseen tarvittavat rutiinit, eli session id:n muodostus ja satunnaisbittigeneraattori(genbytes). Satunnaisbittigeneraattori ei ole kai ole kovin hyvä sellaisenaan, koska se perustuu suoraan kelloon, mutta siitä saa kohtuullisen lähteen satunnaisbittigeneraattorille.

Edit: Katsoin uudestaan tuota istunnon avaimen generointirutiinia, ja huomasin että se ei käytä mitään muuta kuin genbyte:iä istunnon avaimen generointiin. Siksi lisäsin tuon linuxin satunnaislukugeneraattorin yhdeksi lähteeksi. Tein muutaman genbyte testiohjelman, ja kuten edellisessä kappaleessa kerroinkin, genbytes ei sellaisenaan riitä (kokeile generoida istuntoavaimia pelkällä genbytellä siten, että aloitat generaattorin aina samasta kellonajasta)… En onnistunut ohjeideni mukaan löytämään uudestaan samoja generoituja avaimia. Tämä editti taitaa olla ankka. Hups! Generaattori perustuu vaihteluihin, joita löytyy luettaessa kelloa toistuvasti. Jokainen luettu bitti vaikuttaa ~kaikkiin syntyvän satunnaisluvun bitteihin(f), Omissa testeissäni vaihtelu riitti, mutta jättäisin kuitenkin tuon linuxin satunnaislukugeneraattori rivin.

Kaikki oikeudet tietenkin pidätetään.

Viimeinen versio ohjelmasta löytyy seuraavasta linkistä: moijari.com:5002

#define SESSIONIDLEN 24 /* 6*24=144 riittävä? */
#define SESSIONIDRAW 18

unsigned char sessionid[SESSIONIDLEN+1]="";

char sessiondigits[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-";

void get_session_id(unsigned char *id)
{
 int c;
 int slen=strlen(sessiondigits);
 unsigned char d,buffer[SESSIONIDRAW],*i;
 urandom_xor(sizeof(buffer),buffer);
 genbytes(sizeof(buffer),buffer,20);
#ifdef USE_RANDOM_GEN
 /* Read Schneier: Applied Cryptography, second edition, p 426 distilling randomness */
 random_gen_xor(sizeof(buffer),buffer);
#endif

#ifdef USE_FORT_RANDOM_DATA
 /* Read Schneier: Fortuna (PRNG) */
 fort_random_data_xor(sizeof(buffer),buffer);
#endif

 for(i=id,c=0;c<SESSIONIDRAW;c+=3) {
   d=(buffer[c]&0xfc)>>2;
   *i++=sessiondigits[d];
   d=((buffer[c]&0x03) << 4)| (buffer[c+1]&0xf0)>>4;
   *i++=sessiondigits[d];
   d=((buffer[c+1]&0x0f) << 2)| (buffer[c+2]&0xc0)>>6;
   *i++=sessiondigits[d];
   d=(buffer[c+2]&0x3f);
   *i++=sessiondigits[d];
 }

 *i='\0';

 fprintf(stdout,"sessionid: %sn",id);
 fflush(stdout);
}

#include <sys/time.h>

long genbyte()
{
 int byte;
 struct timeval tv;

 gettimeofday(&tv,NULL);

 byte=
   (tv.tv_usec&0xff)^
   ((tv.tv_usec>>8)&0xff)^
   ((tv.tv_usec>>16)&0xff)^
   ((tv.tv_usec>>24)&0xff)^
   (tv.tv_sec&0xff)^
   ((tv.tv_sec>>8)&0xff)^
   ((tv.tv_sec>>16)&0xff)^
   ((tv.tv_sec>>24)&0xff);
 return(byte);
}

genbytes(int size,unsigned char *buffer,int b)
{
 int c,d,e,f;
 long u;
 unsigned char byte;
 struct timeval tv;

 f=0;
 for(c=0;c<8*b;c++) {
   for(d=0;d<size;d++) {
     u=genbyte();
     e=buffer[d];
     e=((e&0x80)>>7) | ((e&0x7f)<<1);
     e=e^u;
     buffer[d]=e;
   }
   for(d=0;d<size;d++) { /* see rc4 */
     f=(f+buffer[d])%size;
     e=buffer[d];
     buffer[d]=buffer[f];
     buffer[f]=e;
   }
 }
}

void urandom_xor(int len2,unsigned char *buf2) {
  int n,c,len;
  unsigned char buffer2[32],*buf;

  FILE *fp1;
  fp1=fopen("/dev/urandom","rb");
  if(fp1!=NULL) {
    len=len2;
    buf=buf2;
    while(len!=0) {
      n=(len<32) ? len : 32;
      fread(buffer2,1,n,fp1);
      for(c=0;c<n;c++)
        buf[c]^=buffer2[c];
      len-=n;
      buf+=n;
    }
     fclose(fp1);
  }
}

int htmlevent(int news,char *sovellus) {
 /* ... */
 if(sessionid[0]=='�'
   get_session_id(sessionid);
 /* ... */
}