Annotation of embedaddon/php/ext/sqlite/libsqlite/src/random.c, revision 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>