Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/sqlite/src/src/random.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 | #include "sqliteInt.h" | - | ||||||||||||
19 | - | |||||||||||||
20 | - | |||||||||||||
21 | /* All threads share a single random number generator. | - | ||||||||||||
22 | ** This structure is the current state of the generator. | - | ||||||||||||
23 | */ | - | ||||||||||||
24 | static SQLITE_WSD struct sqlite3PrngType { | - | ||||||||||||
25 | unsigned char isInit; /* True if initialized */ | - | ||||||||||||
26 | unsigned char i, j; /* State variables */ | - | ||||||||||||
27 | unsigned char s[256]; /* State variables */ | - | ||||||||||||
28 | } sqlite3Prng; | - | ||||||||||||
29 | - | |||||||||||||
30 | /* | - | ||||||||||||
31 | ** Return N random bytes. | - | ||||||||||||
32 | */ | - | ||||||||||||
33 | void sqlite3_randomness(int N, void *pBuf){ | - | ||||||||||||
34 | unsigned char t; | - | ||||||||||||
35 | unsigned char *zBuf = pBuf; | - | ||||||||||||
36 | - | |||||||||||||
37 | /* The "wsdPrng" macro will resolve to the pseudo-random number generator | - | ||||||||||||
38 | ** state vector. If writable static data is unsupported on the target, | - | ||||||||||||
39 | ** we have to locate the state vector at run-time. In the more common | - | ||||||||||||
40 | ** case where writable static data is supported, wsdPrng can refer directly | - | ||||||||||||
41 | ** to the "sqlite3Prng" state vector declared above. | - | ||||||||||||
42 | */ | - | ||||||||||||
43 | #ifdef SQLITE_OMIT_WSD | - | ||||||||||||
44 | struct sqlite3PrngType *p = &GLOBAL(struct sqlite3PrngType, sqlite3Prng); | - | ||||||||||||
45 | # define wsdPrng p[0] | - | ||||||||||||
46 | #else | - | ||||||||||||
47 | # define wsdPrng sqlite3Prng | - | ||||||||||||
48 | #endif | - | ||||||||||||
49 | - | |||||||||||||
50 | #if SQLITE_THREADSAFE | - | ||||||||||||
51 | sqlite3_mutex *mutex; | - | ||||||||||||
52 | #endif | - | ||||||||||||
53 | - | |||||||||||||
54 | #ifndef SQLITE_OMIT_AUTOINIT | - | ||||||||||||
55 | if( sqlite3_initialize() ) return; never executed: return;
| 0-2368905 | ||||||||||||
56 | #endif | - | ||||||||||||
57 | - | |||||||||||||
58 | #if SQLITE_THREADSAFE | - | ||||||||||||
59 | mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_PRNG); | - | ||||||||||||
60 | #endif | - | ||||||||||||
61 | - | |||||||||||||
62 | sqlite3_mutex_enter(mutex); | - | ||||||||||||
63 | if( N<=0 || pBuf==0 ){
| 0-2367489 | ||||||||||||
64 | wsdPrng.isInit = 0; | - | ||||||||||||
65 | sqlite3_mutex_leave(mutex); | - | ||||||||||||
66 | return; executed 1416 times by 438 tests: return; Executed by:
| 1416 | ||||||||||||
67 | } | - | ||||||||||||
68 | - | |||||||||||||
69 | /* Initialize the state of the random number generator once, | - | ||||||||||||
70 | ** the first time this routine is called. The seed value does | - | ||||||||||||
71 | ** not need to contain a lot of randomness since we are not | - | ||||||||||||
72 | ** trying to do secure encryption or anything like that... | - | ||||||||||||
73 | ** | - | ||||||||||||
74 | ** Nothing in this file or anywhere else in SQLite does any kind of | - | ||||||||||||
75 | ** encryption. The RC4 algorithm is being used as a PRNG (pseudo-random | - | ||||||||||||
76 | ** number generator) not as an encryption device. | - | ||||||||||||
77 | */ | - | ||||||||||||
78 | if( !wsdPrng.isInit ){
| 1074-2366415 | ||||||||||||
79 | int i; | - | ||||||||||||
80 | char k[256]; | - | ||||||||||||
81 | wsdPrng.j = 0; | - | ||||||||||||
82 | wsdPrng.i = 0; | - | ||||||||||||
83 | sqlite3OsRandomness(sqlite3_vfs_find(0), 256, k); | - | ||||||||||||
84 | for(i=0; i<256; i++){
| 1074-274944 | ||||||||||||
85 | wsdPrng.s[i] = (u8)i; | - | ||||||||||||
86 | } executed 274944 times by 396 tests: end of block Executed by:
| 274944 | ||||||||||||
87 | for(i=0; i<256; i++){
| 1074-274944 | ||||||||||||
88 | wsdPrng.j += wsdPrng.s[i] + k[i]; | - | ||||||||||||
89 | t = wsdPrng.s[wsdPrng.j]; | - | ||||||||||||
90 | wsdPrng.s[wsdPrng.j] = wsdPrng.s[i]; | - | ||||||||||||
91 | wsdPrng.s[i] = t; | - | ||||||||||||
92 | } executed 274944 times by 396 tests: end of block Executed by:
| 274944 | ||||||||||||
93 | wsdPrng.isInit = 1; | - | ||||||||||||
94 | } executed 1074 times by 396 tests: end of block Executed by:
| 1074 | ||||||||||||
95 | - | |||||||||||||
96 | assert( N>0 ); | - | ||||||||||||
97 | do{ | - | ||||||||||||
98 | wsdPrng.i++; | - | ||||||||||||
99 | t = wsdPrng.s[wsdPrng.i]; | - | ||||||||||||
100 | wsdPrng.j += t; | - | ||||||||||||
101 | wsdPrng.s[wsdPrng.i] = wsdPrng.s[wsdPrng.j]; | - | ||||||||||||
102 | wsdPrng.s[wsdPrng.j] = t; | - | ||||||||||||
103 | t += wsdPrng.s[wsdPrng.i]; | - | ||||||||||||
104 | *(zBuf++) = wsdPrng.s[t]; | - | ||||||||||||
105 | }while( --N ); executed 288366033 times by 396 tests: end of block Executed by:
| 2367489-288366033 | ||||||||||||
106 | sqlite3_mutex_leave(mutex); | - | ||||||||||||
107 | } executed 2367489 times by 396 tests: end of block Executed by:
| 2367489 | ||||||||||||
108 | - | |||||||||||||
109 | #ifndef SQLITE_UNTESTABLE | - | ||||||||||||
110 | /* | - | ||||||||||||
111 | ** For testing purposes, we sometimes want to preserve the state of | - | ||||||||||||
112 | ** PRNG and restore the PRNG to its saved state at a later time, or | - | ||||||||||||
113 | ** to reset the PRNG to its initial state. These routines accomplish | - | ||||||||||||
114 | ** those tasks. | - | ||||||||||||
115 | ** | - | ||||||||||||
116 | ** The sqlite3_test_control() interface calls these routines to | - | ||||||||||||
117 | ** control the PRNG. | - | ||||||||||||
118 | */ | - | ||||||||||||
119 | static SQLITE_WSD struct sqlite3PrngType sqlite3SavedPrng; | - | ||||||||||||
120 | void sqlite3PrngSaveState(void){ | - | ||||||||||||
121 | memcpy( | - | ||||||||||||
122 | &GLOBAL(struct sqlite3PrngType, sqlite3SavedPrng), | - | ||||||||||||
123 | &GLOBAL(struct sqlite3PrngType, sqlite3Prng), | - | ||||||||||||
124 | sizeof(sqlite3Prng) | - | ||||||||||||
125 | ); | - | ||||||||||||
126 | } executed 5 times by 1 test: end of block Executed by:
| 5 | ||||||||||||
127 | void sqlite3PrngRestoreState(void){ | - | ||||||||||||
128 | memcpy( | - | ||||||||||||
129 | &GLOBAL(struct sqlite3PrngType, sqlite3Prng), | - | ||||||||||||
130 | &GLOBAL(struct sqlite3PrngType, sqlite3SavedPrng), | - | ||||||||||||
131 | sizeof(sqlite3Prng) | - | ||||||||||||
132 | ); | - | ||||||||||||
133 | } executed 927 times by 1 test: end of block Executed by:
| 927 | ||||||||||||
134 | #endif /* SQLITE_UNTESTABLE */ | - | ||||||||||||
Source code | Switch to Preprocessed file |