|
3 | 3 | #include "sqlcipher.h" |
4 | 4 | #include <tomcrypt.h> |
5 | 5 |
|
| 6 | +typedef struct { |
| 7 | + prng_state prng; |
| 8 | +} ltc_ctx; |
| 9 | + |
6 | 10 | static unsigned int ltc_init = 0; |
7 | 11 |
|
8 | 12 | static int sqlcipher_ltc_activate(void *ctx) { |
| 13 | + ltc_ctx *ltc = (ltc_ctx*)ctx; |
9 | 14 | sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); |
10 | 15 | if(ltc_init == 0) { |
11 | | - register_prng(&fortuna_desc); |
12 | | - register_cipher(&rijndael_desc); |
13 | | - register_hash(&sha1_desc); |
| 16 | + if(register_prng(&fortuna_desc) != CRYPT_OK) return SQLITE_ERROR; |
| 17 | + if(register_cipher(&rijndael_desc) != CRYPT_OK) return SQLITE_ERROR; |
| 18 | + if(register_hash(&sha1_desc) != CRYPT_OK) return SQLITE_ERROR; |
| 19 | + if(fortuna_start(&(ltc->prng)) != CRYPT_OK) return SQLITE_ERROR; |
14 | 20 | ltc_init = 1; |
15 | 21 | } |
16 | 22 | sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); |
| 23 | + return SQLITE_OK; |
17 | 24 | } |
18 | 25 |
|
19 | 26 | static int sqlcipher_ltc_deactivate(void *ctx) { |
| 27 | + ltc_ctx *ltc = (ltc_ctx*)ctx; |
| 28 | + fortuna_done(&(ltc->prng)); |
20 | 29 | } |
21 | 30 |
|
22 | 31 | static int sqlcipher_ltc_random(void *ctx, void *buffer, int length) { |
23 | | - prng_state prng; |
24 | 32 | int random_value; |
25 | 33 | int random_buffer_sz = 256; |
26 | 34 | char random_buffer[random_buffer_sz]; |
| 35 | + ltc_ctx *ltc = (ltc_ctx*)ctx; |
27 | 36 |
|
28 | | - if(fortuna_start(&prng) != CRYPT_OK) return SQLITE_ERROR; |
29 | 37 | sqlite3_randomness(sizeof(random_value), &random_value); |
30 | 38 | sqlite3_snprintf(random_buffer_sz, random_buffer, "%d", random_value); |
31 | | - if(fortuna_add_entropy(random_buffer, random_buffer_sz, &prng) != CRYPT_OK) return SQLITE_ERROR; |
32 | | - if(fortuna_ready(&prng) != CRYPT_OK) return SQLITE_ERROR; |
33 | | - fortuna_read(buffer, length, &prng); |
34 | | - fortuna_done(&prng); |
| 39 | + if(fortuna_add_entropy(random_buffer, random_buffer_sz, &(ltc->prng)) != CRYPT_OK) return SQLITE_ERROR; |
| 40 | + if(fortuna_ready(&(ltc->prng)) != CRYPT_OK) return SQLITE_ERROR; |
| 41 | + fortuna_read(buffer, length, &(ltc->prng)); |
35 | 42 | return SQLITE_OK; |
36 | 43 | } |
37 | 44 |
|
@@ -107,12 +114,15 @@ static int sqlcipher_ltc_ctx_cmp(void *c1, void *c2) { |
107 | 114 | } |
108 | 115 |
|
109 | 116 | static int sqlcipher_ltc_ctx_init(void **ctx) { |
110 | | - sqlcipher_ltc_activate(&ctx); |
| 117 | + *ctx = sqlcipher_malloc(sizeof(ltc_ctx)); |
| 118 | + if(*ctx == NULL) return SQLITE_NOMEM; |
| 119 | + sqlcipher_ltc_activate(*ctx); |
111 | 120 | return SQLITE_OK; |
112 | 121 | } |
113 | 122 |
|
114 | 123 | static int sqlcipher_ltc_ctx_free(void **ctx) { |
115 | 124 | sqlcipher_ltc_deactivate(&ctx); |
| 125 | + sqlcipher_free(*ctx, sizeof(ltc_ctx)); |
116 | 126 | return SQLITE_OK; |
117 | 127 | } |
118 | 128 |
|
|
0 commit comments