24
24
#define CRYPTOLIB " portable"
25
25
#endif
26
26
27
- #define BETHELA_VERSION " version 3.6.1 "
27
+ #define BETHELA_VERSION " version 3.7.0 "
28
28
29
29
#define HELP_FLAG " --help"
30
30
#define VERSION_FLAG " --version"
@@ -426,10 +426,7 @@ int main(int argc, char *args[]) {
426
426
427
427
bool run_thread = true ;
428
428
429
- char *next_buffer = new char [BUFFER_BYTESIZE];
430
- char *prev_buffer = new char [BUFFER_BYTESIZE];
431
- Krypt::Bytes *decryptedBuffer = new Krypt::Bytes[BUFFER_BYTESIZE];
432
-
429
+ char *read_buffer = new char [BUFFER_BYTESIZE];
433
430
char *filesig = new char [bconst::FILESIGNATURE.size ()];
434
431
435
432
while (run_thread) {
@@ -461,6 +458,7 @@ int main(int argc, char *args[]) {
461
458
" it might be read protected, corrupted or non-existent...\n " ;
462
459
output_mtx.unlock ();
463
460
} else {
461
+
464
462
output_mtx.lock ();
465
463
std::cout << " decrypting : " << target_file << " ...\n " ;
466
464
output_mtx.unlock ();
@@ -478,90 +476,85 @@ int main(int argc, char *args[]) {
478
476
output_file.close ();
479
477
output_file.open (outfname, std::ios::binary | std::ios::app);
480
478
481
- unsigned char *iv = new unsigned char [AES_BLOCKSIZE];
479
+ unsigned char iv [AES_BLOCKSIZE];
482
480
curr_file.read (reinterpret_cast <char *>(iv), AES_BLOCKSIZE);
483
481
484
- char *swap_buffer_ptr;
482
+ // new decryption
485
483
486
- curr_file. read (prev_buffer, BUFFER_BYTESIZE) ;
487
- size_t prev_buffer_size = curr_file. gcount () ;
488
- size_t next_buffer_size = 0 ;
484
+ constexpr size_t BUFFER_SIZE_NOLAST = BUFFER_BYTESIZE - AES_BLOCKSIZE ;
485
+ char decrypted_block_holder[AES_BLOCKSIZE] = {} ;
486
+ char last_block[AES_BLOCKSIZE] = {} ;
489
487
490
- while (!curr_file.eof ()) {
491
- curr_file.read (next_buffer, BUFFER_BYTESIZE);
492
- next_buffer_size = curr_file.gcount ();
488
+ bool lastblock_remains = false ;
493
489
494
- if (!next_buffer_size ) {
495
- break ;
496
- }
490
+ while (!curr_file. eof () ) {
491
+ curr_file. read (read_buffer, BUFFER_BYTESIZE) ;
492
+ size_t read_buffer_size = curr_file. gcount ();
497
493
498
- for (size_t index = 0 ; index < prev_buffer_size; index += AES_BLOCKSIZE) {
499
- aes_scheme.blockDecrypt (
500
- reinterpret_cast <unsigned char *>(prev_buffer + index),
501
- reinterpret_cast <unsigned char *>(decryptedBuffer + index), iv
502
- );
494
+ if (lastblock_remains) {
495
+ if (read_buffer_size) {
496
+ aes_scheme.blockDecrypt (
497
+ reinterpret_cast <unsigned char *>(last_block),
498
+ reinterpret_cast <unsigned char *>(decrypted_block_holder), iv
499
+ );
500
+ output_file.write (reinterpret_cast <char *>(decrypted_block_holder), AES_BLOCKSIZE);
501
+ lastblock_remains = false ;
502
+ } else {
503
+ break ;
504
+ }
503
505
}
504
506
505
- output_file.write (reinterpret_cast <char *>(decryptedBuffer), prev_buffer_size);
506
-
507
- swap_buffer_ptr = next_buffer;
508
- next_buffer = prev_buffer;
509
- prev_buffer = swap_buffer_ptr;
510
- swap_buffer_ptr = nullptr ;
511
- std::swap (next_buffer_size, prev_buffer_size);
512
- }
513
-
514
- size_t remaining_blocks = prev_buffer_size / AES_BLOCKSIZE;
515
- size_t remaining_bytes = prev_buffer_size % AES_BLOCKSIZE;
516
- size_t index = 0 ;
507
+ if (read_buffer_size == BUFFER_BYTESIZE) {
508
+ size_t index;
509
+ for (index = 0 ; index < BUFFER_SIZE_NOLAST; index += AES_BLOCKSIZE) {
510
+ aes_scheme.blockDecrypt (
511
+ reinterpret_cast <unsigned char *>(read_buffer + index),
512
+ reinterpret_cast <unsigned char *>(decrypted_block_holder), iv
513
+ );
514
+ std::memcpy (read_buffer + index, decrypted_block_holder, AES_BLOCKSIZE);
515
+ }
517
516
518
- bool excludeLastBlock = (remaining_blocks && remaining_bytes == 0 );
517
+ output_file.write (reinterpret_cast <char *>(read_buffer), BUFFER_SIZE_NOLAST);
518
+ std::memcpy (last_block, read_buffer + index, AES_BLOCKSIZE);
519
+ } else if (read_buffer_size % AES_BLOCKSIZE == 0 ) {
520
+ size_t index;
521
+ for (index = 0 ; index < read_buffer_size - AES_BLOCKSIZE; index += AES_BLOCKSIZE) {
522
+ aes_scheme.blockDecrypt (
523
+ reinterpret_cast <unsigned char *>(read_buffer + index),
524
+ reinterpret_cast <unsigned char *>(decrypted_block_holder), iv
525
+ );
526
+ std::memcpy (read_buffer + index, decrypted_block_holder, AES_BLOCKSIZE);
527
+ }
519
528
520
- if (remaining_blocks) {
521
- for (index = 0 ; index < remaining_blocks - excludeLastBlock; ++index) {
522
- aes_scheme.blockDecrypt (
523
- reinterpret_cast <unsigned char *>(prev_buffer + (index * AES_BLOCKSIZE)),
524
- reinterpret_cast <unsigned char *>(decryptedBuffer + (index * AES_BLOCKSIZE)), iv
525
- );
529
+ output_file.write (reinterpret_cast <char *>(read_buffer), read_buffer_size - AES_BLOCKSIZE);
530
+ std::memcpy (last_block, read_buffer + index, AES_BLOCKSIZE);
526
531
}
527
532
528
- output_file.write (
529
- reinterpret_cast <char *>(decryptedBuffer), (remaining_blocks - excludeLastBlock) * AES_BLOCKSIZE
530
- );
533
+ lastblock_remains = true ;
531
534
}
532
535
533
- Krypt::ByteArray recover;
536
+ if (lastblock_remains) {
537
+ Krypt::ByteArray recover =
538
+ aes_scheme.decrypt (reinterpret_cast <unsigned char *>(last_block), AES_BLOCKSIZE, iv);
534
539
535
- if (excludeLastBlock) {
536
- recover = aes_scheme.decrypt (
537
- reinterpret_cast <unsigned char *>(prev_buffer + (index * AES_BLOCKSIZE)), AES_BLOCKSIZE, iv
538
- );
539
- } else {
540
- recover = aes_scheme.decrypt (
541
- reinterpret_cast <unsigned char *>(prev_buffer + (index * AES_BLOCKSIZE)), remaining_bytes, iv
542
- );
540
+ output_file.write (reinterpret_cast <char *>(recover.array ), recover.length );
541
+ lastblock_remains = false ;
543
542
}
544
543
545
- output_file. write ( reinterpret_cast < char *>(recover. array ), recover. length );
544
+ // new decryption
546
545
547
546
cnt++;
548
547
549
548
std::memset ((unsigned char *) iv, 0x00 , AES_BLOCKSIZE);
550
- delete[] iv;
551
-
552
549
checkif_replace (args[COMMAND], target_file);
553
550
}
554
551
}
555
552
556
- std::memset ((char *) next_buffer, 0x00 , BUFFER_BYTESIZE);
557
- std::memset ((char *) prev_buffer, 0x00 , BUFFER_BYTESIZE);
553
+ std::memset ((char *) read_buffer, 0x00 , BUFFER_BYTESIZE);
558
554
std::memset ((char *) filesig, 0x00 , bconst::FILESIGNATURE.size ());
559
- std::memset ((Krypt::Bytes *) decryptedBuffer, 0x00 , BUFFER_BYTESIZE);
560
555
561
- delete[] next_buffer;
562
- delete[] prev_buffer;
556
+ delete[] read_buffer;
563
557
delete[] filesig;
564
- delete[] decryptedBuffer;
565
558
};
566
559
567
560
std::vector<std::thread> threads;
0 commit comments