2021-06-25 23:01:50 +02:00
use std ::io ::{ BufWriter , BufReader , Read } ;
use zeroize ::Zeroize ;
use doby ::{
cli ,
2021-06-27 20:35:23 +02:00
crypto ::{ EncryptionParams , DobyCipher } ,
2021-06-25 23:01:50 +02:00
MAGIC_BYTES ,
decrypt ,
encrypt ,
} ;
fn main ( ) {
if let Some ( mut cli_args ) = cli ::parse ( ) {
let mut reader = BufReader ::with_capacity ( cli_args . block_size , cli_args . reader ) ;
let mut writer = BufWriter ::with_capacity ( cli_args . block_size , cli_args . writer ) ;
let mut magic_bytes = vec! [ 0 ; MAGIC_BYTES . len ( ) ] ;
match reader . read ( & mut magic_bytes ) {
Ok ( n ) = > {
if n < magic_bytes . len ( ) {
magic_bytes . truncate ( n ) ;
}
if magic_bytes = = MAGIC_BYTES & & ! cli_args . force_encrypt { //we probably want to decrypt
match EncryptionParams ::read ( & mut reader ) {
Ok ( params ) = > {
2021-06-27 20:35:23 +02:00
match params {
Some ( params ) = > {
match DobyCipher ::new ( cli_args . password . as_bytes ( ) , & params ) {
Ok ( cipher ) = > {
match decrypt ( & mut reader , & mut writer , cipher , cli_args . block_size ) {
Ok ( verified ) = > {
if ! verified {
2021-06-30 14:36:49 +02:00
eprintln! ( " WARNING: HMAC verification failed ! \n Either your password is incorrect or the ciphertext has been corrupted. \n Be careful, the data could have been altered by an attacker. " ) ;
2021-06-27 20:35:23 +02:00
}
}
Err ( e ) = > eprintln! ( " I/O error while decrypting: {} " , e )
2021-06-25 23:01:50 +02:00
}
}
2021-06-27 20:35:23 +02:00
Err ( e ) = > eprintln! ( " Invalid argon2 params: {} " , e )
2021-06-25 23:01:50 +02:00
}
}
2021-06-27 20:35:23 +02:00
None = > eprintln! ( " Invalid cipher " )
2021-06-25 23:01:50 +02:00
}
}
Err ( e ) = > eprintln! ( " I/O error while reading headers: {} " , e )
}
} else { //otherwise, encrypt
2021-06-27 20:35:23 +02:00
let params = EncryptionParams ::new ( cli_args . argon2_params , cli_args . cipher ) ;
match DobyCipher ::new ( cli_args . password . as_bytes ( ) , & params ) {
2021-06-25 23:01:50 +02:00
Ok ( cipher ) = > {
if let Err ( e ) = encrypt (
& mut reader ,
& mut writer ,
& params ,
cipher ,
cli_args . block_size ,
Some ( magic_bytes )
) {
eprintln! ( " I/O error while encrypting: {} " , e ) ;
}
}
Err ( e ) = > eprintln! ( " Invalid argon2 params: {} " , e )
}
}
}
Err ( e ) = > eprintln! ( " I/O error while reading magic bytes: {} " , e ) ,
}
cli_args . password . zeroize ( ) ;
}
}