Skip to content

Commit eb3c1dc

Browse files
Tracking the state of the prng
1 parent bac7518 commit eb3c1dc

1 file changed

Lines changed: 20 additions & 10 deletions

File tree

src/crypto_libtomcrypt.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,42 @@
33
#include "sqlcipher.h"
44
#include <tomcrypt.h>
55

6+
typedef struct {
7+
prng_state prng;
8+
} ltc_ctx;
9+
610
static unsigned int ltc_init = 0;
711

812
static int sqlcipher_ltc_activate(void *ctx) {
13+
ltc_ctx *ltc = (ltc_ctx*)ctx;
914
sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
1015
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;
1420
ltc_init = 1;
1521
}
1622
sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
23+
return SQLITE_OK;
1724
}
1825

1926
static int sqlcipher_ltc_deactivate(void *ctx) {
27+
ltc_ctx *ltc = (ltc_ctx*)ctx;
28+
fortuna_done(&(ltc->prng));
2029
}
2130

2231
static int sqlcipher_ltc_random(void *ctx, void *buffer, int length) {
23-
prng_state prng;
2432
int random_value;
2533
int random_buffer_sz = 256;
2634
char random_buffer[random_buffer_sz];
35+
ltc_ctx *ltc = (ltc_ctx*)ctx;
2736

28-
if(fortuna_start(&prng) != CRYPT_OK) return SQLITE_ERROR;
2937
sqlite3_randomness(sizeof(random_value), &random_value);
3038
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));
3542
return SQLITE_OK;
3643
}
3744

@@ -107,12 +114,15 @@ static int sqlcipher_ltc_ctx_cmp(void *c1, void *c2) {
107114
}
108115

109116
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);
111120
return SQLITE_OK;
112121
}
113122

114123
static int sqlcipher_ltc_ctx_free(void **ctx) {
115124
sqlcipher_ltc_deactivate(&ctx);
125+
sqlcipher_free(*ctx, sizeof(ltc_ctx));
116126
return SQLITE_OK;
117127
}
118128

0 commit comments

Comments
 (0)