@@ -276,7 +276,7 @@ static void cfs_crypto_init(void)
276
276
* For a file name like 'path/to/16384/16401[.123]' return part1 = 16384, part2 = 16401 and part3 = 123.
277
277
* Returns 0 on success and negative value on error.
278
278
*/
279
- static int extract_fname_parts (const char * fname ,unsigned int * part1 ,unsigned int * part2 ,unsigned int * part3 )
279
+ static int extract_fname_parts (const char * fname ,uint32 * part1 ,uint32 * part2 ,uint32 * part3 )
280
280
{
281
281
int idx = strlen (fname );
282
282
if (idx == 0 )
@@ -321,13 +321,36 @@ static int extract_fname_parts(const char* fname, unsigned int* part1, unsigned
321
321
/* Encryption and decryption using AES in CTR mode */
322
322
static void cfs_aes_crypt_block (const char * fname ,void * block ,uint32 offs ,uint32 size )
323
323
{
324
- unsignedint fname_part1 ,fname_part2 ,fname_part3 ;
324
+ uint32 aes_in [4 ];/* 16 bytes, 128 bits */
325
+ uint32 aes_out [4 ];
326
+ uint8 * plaintext = (uint8 * )block ;
327
+ uint8 * pgamma = (uint8 * )& aes_out ;
328
+ uint32 i ,fname_part1 ,fname_part2 ,fname_part3 ;
329
+
325
330
if (extract_fname_parts (fname ,& fname_part1 ,& fname_part2 ,& fname_part3 )< 0 )
326
331
fname_part1 = fname_part2 = fname_part3 = 0 ;
327
332
333
+ // AALEKSEEV TODO MAKE DEBUG4
328
334
elog (LOG ,"cfs_aes_crypt_block, fname = %s, part1 = %d, part2 = %d, part3 = %d, offs = %d, size = %d" ,
329
335
fname ,fname_part1 ,fname_part2 ,fname_part3 ,offs ,size );
330
336
337
+ aes_in [0 ]= fname_part1 ;
338
+ aes_in [1 ]= fname_part2 ;
339
+ aes_in [2 ]= fname_part3 ;
340
+ aes_in [3 ]= offs & 0xFFFFFFF0 ;
341
+ rijndael_encrypt (& cfs_state -> aes_context , (u4byte * )& aes_in , (u4byte * )& aes_out );
342
+
343
+ for (i = 0 ;i < size ;i ++ )
344
+ {
345
+ plaintext [i ] ^=aes_out [offs & 0xF ];
346
+ offs ++ ;
347
+ if ((offs & 0xF )== 0 )
348
+ {
349
+ /* Prepare next gamma part */
350
+ aes_in [3 ]= offs ;
351
+ rijndael_encrypt (& cfs_state -> aes_context , (u4byte * )& aes_in , (u4byte * )& aes_out );
352
+ }
353
+ }
331
354
}
332
355
333
356
void cfs_encrypt (const char * fname ,void * block ,uint32 offs ,uint32 size )