blob: 7fe42a55743b31b869da0146f11dff2979460d4a [file] [log] [blame]
drhae85dc82001-01-13 14:34:05 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drhae85dc82001-01-13 14:34:05 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drhae85dc82001-01-13 14:34:05 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** 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.
drhae85dc82001-01-13 14:34:05 +000010**
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**
drh18472fa2008-10-07 15:25:48 +000018** $Id: random.c,v 1.27 2008/10/07 15:25:48 drh Exp $
drhae85dc82001-01-13 14:34:05 +000019*/
20#include "sqliteInt.h"
drhae85dc82001-01-13 14:34:05 +000021
drhaf9ff332002-01-16 21:00:27 +000022
drh93aed5a2008-01-16 17:46:38 +000023/* All threads share a single random number generator.
24** This structure is the current state of the generator.
25*/
drh78f82d12008-09-02 00:52:52 +000026static SQLITE_WSD struct sqlite3PrngType {
drh93aed5a2008-01-16 17:46:38 +000027 unsigned char isInit; /* True if initialized */
28 unsigned char i, j; /* State variables */
29 unsigned char s[256]; /* State variables */
drh78f82d12008-09-02 00:52:52 +000030} sqlite3Prng = { 0, };
drh93aed5a2008-01-16 17:46:38 +000031
drhae85dc82001-01-13 14:34:05 +000032/*
drhad75e982001-10-09 04:19:46 +000033** Get a single 8-bit random value from the RC4 PRNG. The Mutex
34** must be held while executing this routine.
drhaf9ff332002-01-16 21:00:27 +000035**
36** Why not just use a library random generator like lrand48() for this?
drhf0863fe2005-06-12 21:35:51 +000037** Because the OP_NewRowid opcode in the VDBE depends on having a very
drhaf9ff332002-01-16 21:00:27 +000038** good source of random numbers. The lrand48() library function may
39** well be good enough. But maybe not. Or maybe lrand48() has some
40** subtle problems on some systems that could cause problems. It is hard
41** to know. To minimize the risk of problems due to bad lrand48()
drhaaab5722002-02-19 13:39:21 +000042** implementations, SQLite uses this random number generator based
drhaf9ff332002-01-16 21:00:27 +000043** on RC4, which we know works very well.
drhf0863fe2005-06-12 21:35:51 +000044**
45** (Later): Actually, OP_NewRowid does not depend on a good source of
46** randomness any more. But we will leave this code in all the same.
drhae85dc82001-01-13 14:34:05 +000047*/
drhaedd8922007-01-05 14:38:54 +000048static int randomByte(void){
drhbbd82df2004-02-11 09:46:30 +000049 unsigned char t;
drhae85dc82001-01-13 14:34:05 +000050
drhad75e982001-10-09 04:19:46 +000051
drh78f82d12008-09-02 00:52:52 +000052 /* The "wsdPrng" macro will resolve to the pseudo-random number generator
53 ** state vector. If writable static data is unsupported on the target,
54 ** we have to locate the state vector at run-time. In the more common
55 ** case where writable static data is supported, wsdPrng can refer directly
56 ** to the "sqlite3Prng" state vector declared above.
57 */
58#ifdef SQLITE_OMIT_WSD
59 struct sqlite3PrngType *p = &GLOBAL(struct sqlite3PrngType, sqlite3Prng);
60# define wsdPrng p[0]
61#else
62# define wsdPrng sqlite3Prng
63#endif
64
65
drh90bfcda2001-09-23 19:46:51 +000066 /* Initialize the state of the random number generator once,
67 ** the first time this routine is called. The seed value does
68 ** not need to contain a lot of randomness since we are not
69 ** trying to do secure encryption or anything like that...
drhae85dc82001-01-13 14:34:05 +000070 **
71 ** Nothing in this file or anywhere else in SQLite does any kind of
72 ** encryption. The RC4 algorithm is being used as a PRNG (pseudo-random
73 ** number generator) not as an encryption device.
74 */
drh78f82d12008-09-02 00:52:52 +000075 if( !wsdPrng.isInit ){
drhae85dc82001-01-13 14:34:05 +000076 int i;
drhae85dc82001-01-13 14:34:05 +000077 char k[256];
drh78f82d12008-09-02 00:52:52 +000078 wsdPrng.j = 0;
79 wsdPrng.i = 0;
drhd677b3d2007-08-20 22:48:41 +000080 sqlite3OsRandomness(sqlite3_vfs_find(0), 256, k);
drhae85dc82001-01-13 14:34:05 +000081 for(i=0; i<256; i++){
drh78f82d12008-09-02 00:52:52 +000082 wsdPrng.s[i] = i;
drhae85dc82001-01-13 14:34:05 +000083 }
84 for(i=0; i<256; i++){
drh78f82d12008-09-02 00:52:52 +000085 wsdPrng.j += wsdPrng.s[i] + k[i];
86 t = wsdPrng.s[wsdPrng.j];
87 wsdPrng.s[wsdPrng.j] = wsdPrng.s[i];
88 wsdPrng.s[i] = t;
drhae85dc82001-01-13 14:34:05 +000089 }
drh78f82d12008-09-02 00:52:52 +000090 wsdPrng.isInit = 1;
drhae85dc82001-01-13 14:34:05 +000091 }
92
93 /* Generate and return single random byte
94 */
drh78f82d12008-09-02 00:52:52 +000095 wsdPrng.i++;
96 t = wsdPrng.s[wsdPrng.i];
97 wsdPrng.j += t;
98 wsdPrng.s[wsdPrng.i] = wsdPrng.s[wsdPrng.j];
99 wsdPrng.s[wsdPrng.j] = t;
100 t += wsdPrng.s[wsdPrng.i];
101 return wsdPrng.s[t];
drhad75e982001-10-09 04:19:46 +0000102}
103
104/*
drhbbd82df2004-02-11 09:46:30 +0000105** Return N random bytes.
drhad75e982001-10-09 04:19:46 +0000106*/
drh2fa18682008-03-19 14:15:34 +0000107void sqlite3_randomness(int N, void *pBuf){
drhbbd82df2004-02-11 09:46:30 +0000108 unsigned char *zBuf = pBuf;
drh18472fa2008-10-07 15:25:48 +0000109#if SQLITE_THREADSAFE
danielk197759f8c082008-06-18 17:09:10 +0000110 sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_PRNG);
drh65bbf292008-06-19 01:03:17 +0000111#endif
drh51fc3472007-08-21 13:51:23 +0000112 sqlite3_mutex_enter(mutex);
drhbbd82df2004-02-11 09:46:30 +0000113 while( N-- ){
114 *(zBuf++) = randomByte();
drhae85dc82001-01-13 14:34:05 +0000115 }
drh51fc3472007-08-21 13:51:23 +0000116 sqlite3_mutex_leave(mutex);
drhae85dc82001-01-13 14:34:05 +0000117}
drh93aed5a2008-01-16 17:46:38 +0000118
drh3088d592008-03-21 16:45:47 +0000119#ifndef SQLITE_OMIT_BUILTIN_TEST
drh93aed5a2008-01-16 17:46:38 +0000120/*
121** For testing purposes, we sometimes want to preserve the state of
drh78f82d12008-09-02 00:52:52 +0000122** PRNG and restore the PRNG to its saved state at a later time, or
123** to reset the PRNG to its initial state. These routines accomplish
124** those tasks.
125**
drh2fa18682008-03-19 14:15:34 +0000126** The sqlite3_test_control() interface calls these routines to
127** control the PRNG.
drh93aed5a2008-01-16 17:46:38 +0000128*/
drh78f82d12008-09-02 00:52:52 +0000129static SQLITE_WSD struct sqlite3PrngType sqlite3SavedPrng = { 0, };
drh2fa18682008-03-19 14:15:34 +0000130void sqlite3PrngSaveState(void){
drh78f82d12008-09-02 00:52:52 +0000131 memcpy(
132 &GLOBAL(struct sqlite3PrngType, sqlite3SavedPrng),
133 &GLOBAL(struct sqlite3PrngType, sqlite3Prng),
134 sizeof(sqlite3Prng)
135 );
drh93aed5a2008-01-16 17:46:38 +0000136}
drh2fa18682008-03-19 14:15:34 +0000137void sqlite3PrngRestoreState(void){
drh78f82d12008-09-02 00:52:52 +0000138 memcpy(
139 &GLOBAL(struct sqlite3PrngType, sqlite3Prng),
140 &GLOBAL(struct sqlite3PrngType, sqlite3SavedPrng),
141 sizeof(sqlite3Prng)
142 );
drh93aed5a2008-01-16 17:46:38 +0000143}
drh2fa18682008-03-19 14:15:34 +0000144void sqlite3PrngResetState(void){
drh78f82d12008-09-02 00:52:52 +0000145 GLOBAL(struct sqlite3PrngType, sqlite3Prng).isInit = 0;
drh93aed5a2008-01-16 17:46:38 +0000146}
drh3088d592008-03-21 16:45:47 +0000147#endif /* SQLITE_OMIT_BUILTIN_TEST */