3535#include "sqlcipher.h"
3636#include <tomcrypt.h>
3737
38+ #define FORTUNA_MAX_SZ 32
3839static prng_state prng ;
39- static unsigned int random_block_sz = 32 ;
4040static unsigned int ltc_init = 0 ;
4141static unsigned int ltc_ref_count = 0 ;
4242static sqlite3_mutex * ltc_rand_mutex = NULL ;
4343
4444static int sqlcipher_ltc_add_random (void * ctx , void * buffer , int length ) {
4545 int rc = 0 ;
4646 int data_to_read = length ;
47- int block_sz = data_to_read < random_block_sz ? data_to_read : random_block_sz ;
47+ int block_sz = data_to_read < FORTUNA_MAX_SZ ? data_to_read : FORTUNA_MAX_SZ ;
4848 const unsigned char * data = (const unsigned char * )buffer ;
4949#ifndef SQLCIPHER_LTC_NO_MUTEX_RAND
5050 sqlite3_mutex_enter (ltc_rand_mutex );
@@ -56,10 +56,8 @@ static int sqlcipher_ltc_add_random(void *ctx, void *buffer, int length) {
5656 break ;
5757 }
5858 data_to_read -= block_sz ;
59- if (data_to_read > 0 ){
60- block_sz = data_to_read < random_block_sz ? data_to_read : random_block_sz ;
61- data += block_sz ;
62- }
59+ data += block_sz ;
60+ block_sz = data_to_read < FORTUNA_MAX_SZ ? data_to_read : FORTUNA_MAX_SZ ;
6361 }
6462 fortuna_ready (& prng );
6563#ifndef SQLCIPHER_LTC_NO_MUTEX_RAND
@@ -69,42 +67,56 @@ static int sqlcipher_ltc_add_random(void *ctx, void *buffer, int length) {
6967}
7068
7169static int sqlcipher_ltc_activate (void * ctx ) {
72- int random_buffer_sz = sizeof (char ) * 32 ;
73- unsigned char * random_buffer = sqlcipher_malloc (random_buffer_sz );
74- sqlcipher_memset (random_buffer , 0 , random_buffer_sz );
75-
70+ unsigned char random_buffer [FORTUNA_MAX_SZ ];
71+ #ifndef SQLCIPHER_LTC_NO_MUTEX_RAND
72+ if (ltc_rand_mutex == NULL ){
73+ ltc_rand_mutex = sqlite3_mutex_alloc (SQLITE_MUTEX_FAST );
74+ }
75+ sqlite3_mutex_enter (ltc_rand_mutex );
76+ #endif
77+ sqlcipher_memset (random_buffer , 0 , FORTUNA_MAX_SZ );
7678 if (ltc_init == 0 ) {
7779 if (register_prng (& fortuna_desc ) != CRYPT_OK ) return SQLITE_ERROR ;
7880 if (register_cipher (& rijndael_desc ) != CRYPT_OK ) return SQLITE_ERROR ;
7981 if (register_hash (& sha1_desc ) != CRYPT_OK ) return SQLITE_ERROR ;
80- #ifndef SQLCIPHER_LTC_NO_MUTEX_RAND
81- if (ltc_rand_mutex == NULL ){
82- ltc_rand_mutex = sqlite3_mutex_alloc (SQLITE_MUTEX_FAST );
83- }
84- #endif
8582 if (fortuna_start (& prng ) != CRYPT_OK ) {
8683 return SQLITE_ERROR ;
8784 }
8885 ltc_init = 1 ;
8986 }
90- sqlite3_randomness (random_buffer_sz , random_buffer );
91- if (sqlcipher_ltc_add_random (ctx , random_buffer , random_buffer_sz ) != SQLITE_OK ) {
87+ ltc_ref_count ++ ;
88+ #ifndef SQLCIPHER_TEST
89+ sqlite3_randomness (FORTUNA_MAX_SZ , random_buffer );
90+ #endif
91+ #ifndef SQLCIPHER_LTC_NO_MUTEX_RAND
92+ sqlite3_mutex_leave (ltc_rand_mutex );
93+ #endif
94+ if (sqlcipher_ltc_add_random (ctx , random_buffer , FORTUNA_MAX_SZ ) != SQLITE_OK ) {
9295 return SQLITE_ERROR ;
9396 }
94- sqlcipher_free (random_buffer , random_buffer_sz );
95- ltc_ref_count ++ ;
97+ sqlcipher_memset (random_buffer , 0 , FORTUNA_MAX_SZ );
9698 return SQLITE_OK ;
9799}
98100
99101static int sqlcipher_ltc_deactivate (void * ctx ) {
102+ #ifndef SQLCIPHER_LTC_NO_MUTEX_RAND
103+ sqlite3_mutex_enter (ltc_rand_mutex );
104+ #endif
100105 ltc_ref_count -- ;
101106 if (ltc_ref_count == 0 ){
102107 fortuna_done (& prng );
108+ sqlcipher_memset ((void * )& prng , 0 , sizeof (prng ));
103109#ifndef SQLCIPHER_LTC_NO_MUTEX_RAND
110+ sqlite3_mutex_leave (ltc_rand_mutex );
104111 sqlite3_mutex_free (ltc_rand_mutex );
105112 ltc_rand_mutex = NULL ;
106113#endif
107114 }
115+ #ifndef SQLCIPHER_LTC_NO_MUTEX_RAND
116+ else {
117+ sqlite3_mutex_leave (ltc_rand_mutex );
118+ }
119+ #endif
108120 return SQLITE_OK ;
109121}
110122
0 commit comments