static u_int64_t _offset( const char * offset ) { char * e ; char f ; u_int64_t r = 0 ; size_t s = StringSize( offset ) ; if( s == 0 ){ return 0 ; }else{ f = *( offset + s - 1 ) ; } if( !( f >= '0' && f <= '9' ) ){ /* * The argument ends with a non digit number,assume the argument is not in offsets but * in bytes and convert it to offsets */ e = StringCopy_2( offset ) ; *( e + s - 1 ) = '\0' ; r = StringConvertToInt( e ) ; if( f == 'b' || f == 'B' ) { if( r < 512 ){ r = 0 ; }else{ r = r / 512 ; } }else if( f == 'k' || f == 'K' ){ r = 2 * r ; }else if( f == 'm' || f == 'M' ){ r = 2 * 1024 * r ; }else if( f == 'g' || f == 'G' ){ r = 2 * 1024 * 1024 * r ; }else if( f == 't' || f == 'T' ){ r = 1.0 * 2 * 1024 * 1024 * 1024 * r ; }else{ r = 0 ; } StringFree( e ) ; }else{ r = StringConvertToInt( offset ) ; } return r ; }
static int _open_plain( const char * device,const resolve_path_t * opts ) { uint32_t flags ; struct crypt_device * cd ; struct crypt_params_plain params ; size_t size ; /* * open_struct_t is defined in includes.h */ const open_struct_t * opt = opts->args ; const args * e = opt->variables ; memset( ¶ms,'\0',sizeof( struct crypt_params_plain ) ) ; params.hash = e->hash ; if( zuluCryptPathIsNotValid( device ) ){ return 3 ; } if( crypt_init( &cd,device ) != 0 ){ return 2 ; } params.offset = _offset( e->offset ) ; if( opts->open_mode == O_RDONLY ){ flags = CRYPT_ACTIVATE_READONLY ; }else{ flags = CRYPT_ACTIVATE_ALLOW_DISCARDS ; } size = ( size_t ) StringConvertToInt( e->keySize ) / 8 ; if( crypt_format( cd,CRYPT_PLAIN,e->algo,e->cipher,NULL,NULL,size,¶ms ) != 0 ){ return zuluExit( 2,cd ) ; } if( crypt_activate_by_passphrase( cd,opt->mapper_name,CRYPT_ANY_SLOT, opt->key,opt->key_len,flags ) < 0 ){ return zuluExit( 2,cd ) ; }else{ return zuluExit( 0,cd ) ; } }
int zuluCryptSecurityConvertUID( uid_t uid,const char * u_id ) { if( u_id != NULL ){ if( uid == 0 ){ return StringConvertToInt( u_id ) ; }else{ return -1 ; } }else{ return uid ; } }
static u_int64_t _offset( const char * offset ) { char * e ; u_int64_t r = 0 ; size_t s = StringSize( offset ) ; if( s == 0 ){ return 0 ; }else{ e = StringCopy_2( offset ) ; if( StringEndsWithAtLeastOne( e,"m","MB","mb","Mb","M",NULL ) ){ r = StringConvertToInt( _remove_letters( e ) ) ; r = 2 * 1024 * r ; }else if( StringEndsWithAtLeastOne( e,"g","GB","gb","Gb","G",NULL ) ){ r = StringConvertToInt( _remove_letters( e ) ) ; r = 2 * 1024 * 1024 * r ; }else if( StringEndsWithAtLeastOne( e,"t","TB","tb","Tb","T",NULL ) ){ r = StringConvertToInt( _remove_letters( e ) ) ; r = 1.0 * 2 * 1024 * 1024 * 1024 * r ; }else if( StringEndsWithAtLeastOne( e,"k","KB","kb","Kb","K",NULL ) ){ r = StringConvertToInt( _remove_letters( e ) ) ; r = 2 * r ; }else if( StringEndsWithAtLeastOne( e,"b","B",NULL ) ){ r = StringConvertToInt( _remove_letters( e ) ) ; if( r < 512 ){ r = 0 ; }else{ r = r / 512 ; } }else { r = StringConvertToInt( offset ) ; } StringFree( e ) ; } return r ; }
void zuluCryptTrueCryptVeraCryptVolumeInfo( const char * type,tvcrypt * e ) { stringList_t stl = StringListSplit( type,'.' ) ; size_t p = StringListSize( stl ) ; const char * q ; memset( e,'\0',sizeof( tvcrypt ) ) ; if( p > 0 ){ e->type = StringListCopyStringAtFirstPlace( stl ) ; if( p > 1 ){ q = StringListContentAtSecondPlace( stl ) ; e->iteration_count = ( int )StringConvertToInt( q ) ; } } StringListDelete( &stl ) ; }