static char * _device_name( const char * mapper,char * ( *function )( const char * ) ) { tc_api_task task ; char * e = NULL ; char device[ PATH_MAX + 1 ] = { '\0' } ; mapper = mapper + StringLastIndexOfChar_1( mapper,'/' ) + 1 ; if( tc_api_initialize() ){ if( tc_api_task_initialize( &task,"info_mapped" ) ){ tc_api_task_set( task,"map_name",mapper ) ; tc_api_task_do( task ) ; tc_api_task_info_get( task,"device",sizeof( device ),device ) ; tc_api_task_uninit( task ) ; e = function( device ) ; } tc_api_uninit() ; } return e ; }
static string_t _get_crypto_info_from_tcplay( const char * mapper ) { int key_size ; int ro ; int64_t offset ; tc_api_task task ; char buff[ SIZE ] ; char * buffer = buff ; const char * z ; string_t p = StringVoid ; string_t q ; if( tc_api_initialize() ){ if( tc_api_task_initialize( &task,"info_mapped" ) ){ p = String( mapper ) ; mapper = mapper + StringLastIndexOfChar_1( mapper,'/' ) + 1 ; tc_api_task_set( task,"map_name",mapper ) ; tc_api_task_do( task ) ; tc_api_task_info_get( task,"status",sizeof( buff ),buff ) ; StringMultipleAppend( p," is ",buff,".",NULL ) ; if( StringAtLeastOneMatch_1( buff,"active","active and is in use",NULL ) ){ tc_api_task_info_get( task,"type",sizeof( buff ),buff ) ; q = String( buff ) ; StringMultipleAppend( p," \n type: \t",StringToLowerCase( q ),NULL ) ; StringDelete( &q ) ; tc_api_task_info_get( task,"cipher",sizeof( buff ),buff ) ; /* * zuluCryptConvertCipher() is defined in create_tcrypt.c */ StringMultipleAppend( p,"\n cipher:\t",zuluCryptConvertCipher( buff ),"-xts-plain64",NULL ) ; tc_api_task_info_get( task,"key_bits",sizeof( key_size ),&key_size ) ; z = StringIntToString_1( buffer,SIZE,key_size ) ; StringMultipleAppend( p,"\n keysize:\t",z," bits",NULL ) ; tc_api_task_info_get( task,"iv_offset",sizeof( offset ),&offset ) ; z = StringIntToString_1( buffer,SIZE,offset / 512 ) ; StringMultipleAppend( p,"\n offset:\t",z," sectors",NULL ) ; zuluCryptFormatSize( offset,buffer,SIZE ) ; StringMultipleAppend( p," / ",buffer,NULL ) ; tc_api_task_info_get( task,"device",sizeof( buff ),buff ) ; _device_info( p,buff ) ; tc_api_task_info_get( task,"mode",sizeof( ro ),&ro ) ; if( ro ){ StringAppend( p,"\n mode: \tread only" ) ; }else{ StringAppend( p,"\n mode: \tread and write" ) ; } StringAppend( p,"\n active slots:\tNil" ) ; } tc_api_task_uninit( task ) ; } tc_api_uninit() ; } return p ; }
static int _open_tcrypt_volume( const char * device,const open_struct_t * opts ) { tc_api_task task ; int r = !TC_OK ; size_t i ; size_t k ; const char * const * z ; const char * e ; string_t st = StringVoid ; if( tc_api_initialize() ){ task = tc_api_task_init( "map" ) ; if( tc_api_task_initialized( task ) ){ tc_api_task_set( task,"veracrypt_mode",opts->veraCrypt_volume ) ; tc_api_task_set( task,"map_name",opts->mapper_name ) ; if( StringHasComponent( opts->m_opts,"ro" ) ){ tc_api_task_set( task,"read_only" ) ; } if( opts->tcrypt_system ){ if( StringPrefixEqual( device,"/dev/sd" ) || StringPrefixEqual( device,"/dev/hd" ) ){ st = String( device ) ; e = StringRemoveDigits( st ) ; tc_api_task_set( task,"dev",e ) ; tc_api_task_set( task,"sys",e ) ; }else{ tc_api_task_set( task,"dev",device ) ; tc_api_task_set( task,"sys",device ) ; } }else{ tc_api_task_set( task,"dev",device ) ; } k = opts->tcrypt_keyfiles_count ; z = opts->tcrypt_keyfiles ; tc_api_task_set( task,"passphrase",opts->key ) ; for( i = 0 ; i < k ; i++ ){ tc_api_task_set( task,"keyfiles",*( z + i ) ) ; } r = tc_api_task_do( task ) ; tc_api_task_uninit( task ) ; StringDelete( &st ) ; } tc_api_uninit() ; } return r ; }