@@ -19,10 +19,19 @@ static int sqlcipher_ltc_activate(void *ctx) {
1919 ltc_ctx * ltc = (ltc_ctx * )ctx ;
2020 sqlite3_mutex_enter (sqlite3MutexAlloc (SQLITE_MUTEX_STATIC_MASTER ));
2121 if (ltc_init == 0 ) {
22+ int random_buffer_sz = 256 ;
23+ char random_buffer [random_buffer_sz ];
24+
2225 if (register_prng (& fortuna_desc ) != CRYPT_OK ) return SQLITE_ERROR ;
2326 if (register_cipher (& rijndael_desc ) != CRYPT_OK ) return SQLITE_ERROR ;
2427 if (register_hash (& sha1_desc ) != CRYPT_OK ) return SQLITE_ERROR ;
2528 if (fortuna_start (& (ltc -> prng )) != CRYPT_OK ) return SQLITE_ERROR ;
29+
30+ sqlite3_randomness (random_buffer_sz , random_buffer );
31+ if (sqlcipher_ltc_add_random (ctx , random_buffer , random_buffer_sz ) != SQLITE_OK ) return SQLITE_ERROR ;
32+ if (sqlcipher_ltc_add_random (ctx , & ltc , sizeof (ltc_ctx * )) != SQLITE_OK ) return SQLITE_ERROR ;
33+ if (fortuna_ready (& (ltc -> prng )) != CRYPT_OK ) return SQLITE_ERROR ;
34+
2635 ltc_init = 1 ;
2736 }
2837 sqlite3_mutex_leave (sqlite3MutexAlloc (SQLITE_MUTEX_STATIC_MASTER ));
@@ -40,14 +49,8 @@ static const char* sqlcipher_ltc_get_provider_name(void *ctx) {
4049
4150static int sqlcipher_ltc_random (void * ctx , void * buffer , int length ) {
4251 int random_value ;
43- int random_buffer_sz = 256 ;
44- char random_buffer [random_buffer_sz ];
4552
4653 ltc_ctx * ltc = (ltc_ctx * )ctx ;
47- sqlite3_randomness (sizeof (random_value ), & random_value );
48- sqlite3_snprintf (random_buffer_sz , random_buffer , "%d" , random_value );
49- if (sqlcipher_ltc_add_random (ctx , random_buffer , random_buffer_sz ) != SQLITE_OK ) return SQLITE_ERROR ;
50- if (fortuna_ready (& (ltc -> prng )) != CRYPT_OK ) return SQLITE_ERROR ;
5154 fortuna_read (buffer , length , & (ltc -> prng ));
5255 return SQLITE_OK ;
5356}
@@ -62,17 +65,25 @@ static int sqlcipher_ltc_hmac(void *ctx, unsigned char *hmac_key, int key_sz, un
6265 if ((rc = hmac_process (& hmac , in , in_sz )) != CRYPT_OK ) return SQLITE_ERROR ;
6366 if ((rc = hmac_process (& hmac , in2 , in2_sz )) != CRYPT_OK ) return SQLITE_ERROR ;
6467 if ((rc = hmac_done (& hmac , out , & outlen )) != CRYPT_OK ) return SQLITE_ERROR ;
65- sqlcipher_ltc_add_random (ctx , out , outlen );
6668 return SQLITE_OK ;
6769}
6870
6971static int sqlcipher_ltc_kdf (void * ctx , const unsigned char * pass , int pass_sz , unsigned char * salt , int salt_sz , int workfactor , int key_sz , unsigned char * key ) {
7072 int rc , hash_idx ;
7173 unsigned long outlen = key_sz ;
74+ unsigned long random_buffer_sz = 256 ;
75+ char random_buffer [random_buffer_sz ];
7276
7377 hash_idx = find_hash ("sha1" );
7478 if ((rc = pkcs_5_alg2 (pass , pass_sz , salt , salt_sz ,
7579 workfactor , hash_idx , key , & outlen )) != CRYPT_OK ) return SQLITE_ERROR ;
80+
81+ // improve entropy of foruna
82+ if ((rc = pkcs_5_alg2 (key , key_sz , salt , salt_sz ,
83+ 1 , hash_idx , random_buffer , & random_buffer_sz )) != CRYPT_OK ) return SQLITE_ERROR ;
84+
85+ sqlcipher_ltc_add_random (ctx , random_buffer , random_buffer_sz );
86+
7687 return SQLITE_OK ;
7788}
7889
0 commit comments