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>