Annotation of embedaddon/php/ext/sqlite/libsqlite/src/random.c, revision 1.1.1.1

1.1       misho       1: /*
                      2: ** 2001 September 15
                      3: **
                      4: ** The author disclaims copyright to this source code.  In place of
                      5: ** a legal notice, here is a blessing:
                      6: **
                      7: **    May you do good and not evil.
                      8: **    May you find forgiveness for yourself and forgive others.
                      9: **    May you share freely, never taking more than you give.
                     10: **
                     11: *************************************************************************
                     12: ** This file contains code to implement a pseudo-random number
                     13: ** generator (PRNG) for SQLite.
                     14: **
                     15: ** Random numbers are used by some of the database backends in order
                     16: ** to generate random integer keys for tables or random filenames.
                     17: **
                     18: ** $Id: random.c 195361 2005-09-07 15:11:33Z iliaa $
                     19: */
                     20: #include "sqliteInt.h"
                     21: #include "os.h"
                     22: 
                     23: 
                     24: /*
                     25: ** Get a single 8-bit random value from the RC4 PRNG.  The Mutex
                     26: ** must be held while executing this routine.
                     27: **
                     28: ** Why not just use a library random generator like lrand48() for this?
                     29: ** Because the OP_NewRecno opcode in the VDBE depends on having a very
                     30: ** good source of random numbers.  The lrand48() library function may
                     31: ** well be good enough.  But maybe not.  Or maybe lrand48() has some
                     32: ** subtle problems on some systems that could cause problems.  It is hard
                     33: ** to know.  To minimize the risk of problems due to bad lrand48()
                     34: ** implementations, SQLite uses this random number generator based
                     35: ** on RC4, which we know works very well.
                     36: */
                     37: static int randomByte(){
                     38:   unsigned char t;
                     39: 
                     40:   /* All threads share a single random number generator.
                     41:   ** This structure is the current state of the generator.
                     42:   */
                     43:   static struct {
                     44:     unsigned char isInit;          /* True if initialized */
                     45:     unsigned char i, j;            /* State variables */
                     46:     unsigned char s[256];          /* State variables */
                     47:   } prng;
                     48: 
                     49:   /* Initialize the state of the random number generator once,
                     50:   ** the first time this routine is called.  The seed value does
                     51:   ** not need to contain a lot of randomness since we are not
                     52:   ** trying to do secure encryption or anything like that...
                     53:   **
                     54:   ** Nothing in this file or anywhere else in SQLite does any kind of
                     55:   ** encryption.  The RC4 algorithm is being used as a PRNG (pseudo-random
                     56:   ** number generator) not as an encryption device.
                     57:   */
                     58:   if( !prng.isInit ){
                     59:     int i;
                     60:     char k[256];
                     61:     prng.j = 0;
                     62:     prng.i = 0;
                     63:     sqliteOsRandomSeed(k);
                     64:     for(i=0; i<256; i++){
                     65:       prng.s[i] = i;
                     66:     }
                     67:     for(i=0; i<256; i++){
                     68:       prng.j += prng.s[i] + k[i];
                     69:       t = prng.s[prng.j];
                     70:       prng.s[prng.j] = prng.s[i];
                     71:       prng.s[i] = t;
                     72:     }
                     73:     prng.isInit = 1;
                     74:   }
                     75: 
                     76:   /* Generate and return single random byte
                     77:   */
                     78:   prng.i++;
                     79:   t = prng.s[prng.i];
                     80:   prng.j += t;
                     81:   prng.s[prng.i] = prng.s[prng.j];
                     82:   prng.s[prng.j] = t;
                     83:   t += prng.s[prng.i];
                     84:   return prng.s[t];
                     85: }
                     86: 
                     87: /*
                     88: ** Return N random bytes.
                     89: */
                     90: void sqliteRandomness(int N, void *pBuf){
                     91:   unsigned char *zBuf = pBuf;
                     92:   sqliteOsEnterMutex();
                     93:   while( N-- ){
                     94:     *(zBuf++) = randomByte();
                     95:   }
                     96:   sqliteOsLeaveMutex();
                     97: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>