All posts by admin

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);
 /* ... */
}

Terttu pasianssi jatkuu

Olen jatkanut Tertun koodaamista, ja pasianssi näyttäisi vielä menevän läpi. Olen miettinyt ohjelman sorsien julkaisemista, ja aloitankin laittamalla tähän valittuja paloja… Seuraava on osa pääohjelmaa. Varsinainen ydin ei seuraavassa vielä näy (vuodelta 1998). Lisäilen koodia, jos päätän jatkaa julkaisua..

Kaikki oikeudet tietenkin pidätetään.

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


#include <stdarg.h>

struct htmlrepl { /* JariK 20140202 */
  unsigned char *orig;
  unsigned char *new;
} htmlrepls[] ={
  /* 0xc3+0x80- ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ */
  "À","&Agrave;",  "Á","&Aacute;",  "Â","&Acirc;",  "Ã","&Atilde;",  "Ä","&Auml;",
  "Å","&Aring;",
  "È","&Egrave;",  "É","&Eacute;",  "Ê","&Ecirc;",                   "Ë","&Euml;",
  "Ì","&Igrave;",  "Í","&Iacute;",  "Î","&Icirc;",                   "Ï","&Iuml;",
  "Ò","&Ograve;",  "Ó","&Oacute;",  "Ô","&Ocirc;",  "Õ","&Otilde;",  "Ö","&Ouml;",
  "Ù","&Ugrave;",  "Ú","&Uacute;",  "Û","&Ucirc;",                   "Ü","&Uuml;",
                   "Ý","&Yacute;",                                   "Ÿ","&Yuml;",
  "à","&agrave;",  "á","&aacute;",  "â","&acirc;",  "ã","&atilde;",  "ä","&auml;",
  "å","&aring;",
  "è","&egrave;",  "é","&eacute;",  "ê","&ecirc;",                   "ë","&euml;",
  "ì","&igrave;",  "í","&iacute;",  "î","&icirc;",                   "ï","&iuml;",
  "ò","&ograve;",  "ó","&oacute;",  "ô","&ocirc;",  "õ","&otilde;",  "ö","&ouml;",
  "ù","&ugrave;",  "ú","&uacute;",  "û","&ucirc;",                   "ü","&uuml;",
                   "ý","&yacute;",                                   "ÿ","&yuml;",
};

unsigned char html1[8192],html2[8192],*html;

void html_printf(const char *format, ...)
{
  int c,done;
  va_list args;
  unsigned char buffer[128],string[10],*b,*h;

  va_start(args, format);
  vsnprintf(buffer, sizeof buffer, format, args);
  va_end(args);

  b=buffer;
  h=html+strlen(html);

  while(*b!='\0') {
    done=0;
    if(*b==0xc3) {
      for(c=0;c<sizeof(htmlrepls)/sizeof(htmlrepls[0]);c++) {
	if(!strncmp(b,htmlrepls[c].orig,strlen(htmlrepls[c].orig))) {
	  strcpy(h,htmlrepls[c].new);
	  h+=strlen(h);
	  b+=strlen(htmlrepls[c].orig);
	  done=1;
	}
      }
    }
    if(!done) {
      *h++=*b++;
      *h='\0';
    }
  }
}

Contact information

Olen ohjelmoija, ja suurin osa tekemästäni työstä on ollut kaupan järjestelmien parissa. Asiakkaina ovat olleet muunmuassa Metsä Botnia, Vattenfall, Puolustusvoimat, Bombardier, Paulig, Tradeka ja Inex Partners.

Työkaluina olen käyttänyt Sapin MM, Fi/CO, BW ja APO, Hp:n Transact, Image ja VPLUS järjestelmiä. Opiskeluaikoina käytän tietysti linuxia.

Yhteystiedot

Jari Kuivaniemi (+358 50 3089 817)

mail: jarik(ät)moijari(piste)com

Hello world!

 +-----------+-----------+-----------+
 |     2     |     3     | 4         |
 |         7 |           |           |
 | 9         |         6 |     7     |
 +-----------+-----------+-----------+
 | 1         |         8 |     6     |
 |         4 | 5         |         3 |
 |     9     |     6     | 2         |
 +-----------+-----------+-----------+
 | 7         |         5 |     9     |
 |     5     |     2     | 8         |
 |         1 | 8         |         6 |
 +-----------+-----------+------------
 points 3249812              Sudoku #1