@@ -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
- unsigned int 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 )
0 commit comments