static int zuluExit( int st,stringList_t stl ) { zuluCryptSecurityUnlockMemory( stl ) ; /* * this function is defined in ../string/StringList.c */ StringListClearDelete( &stl ) ; switch( st ){ case 0 : printf( gettext( "SUCCESS: key added successfully\n" ) ) ; break ; case 1 : printf( gettext( "ERROR: Presented key does not match any key in the volume\n" ) ) ; break ; case 2 : printf( gettext( "ERROR: Could not open luks volume\n" ) ) ; break ; case 3 : printf( gettext( "ERROR: Volume is not a luks volume\n" ) ); break ; case 4 : printf( gettext( "ERROR: Insufficient privilege to open a system device,\n\ only root user or members of group \"zulucrypt\" can do that\n" ) ) ; break ; case 5 : printf( gettext( "ERROR: Could not open volume in write mode\n" ) ) ; break ; case 6 : printf( gettext( "ERROR: All key slots are occupied, can not add any more keys\n" ) ) ; break ; case 7 : printf( gettext( "ERROR: Can not get passphrase in silent mode\n" ) ) ; break ; case 8 : printf( gettext( "ERROR: Insufficient memory to hold passphrase\n" ) ) ; break ; case 9 : printf( gettext( "ERROR: New passphrases do not match\n" ) ) ; break ; case 10 : printf( gettext( "ERROR: One or more required argument(s) for this operation is missing\n" ));break ; case 11 : printf( gettext( "ERROR: One or both keyfile(s) does not exist\n" ) ) ; break ; case 12 : printf( gettext( "ERROR: Insufficient privilege to open key file for reading\n" ) ) ; break ; case 13 : printf( gettext( "ERROR: Couldnt get enought memory to hold the key file\n" ) ) ; break ; case 14 : printf( gettext( "ERROR: Could not get a key from a socket\n" ) ) ; break ; case 15 : printf( gettext( "ERROR: Could not get elevated privilege,check binary permissions\n" ) ) ; break ; default : printf( gettext( "ERROR: Unrecognized error with status number %d encountered\n" ),st ) ; } return st ; }
static int zuluExit( stringList_t stl, int status ) { ssize_t index ; switch( status ){ case 0 : printf( gettext( "SUCCESS: Mapper created successfully\n" ) ) ; index = StringListHasStartSequence( stl,crypt_get_dir() ) ; if( index >= 0 ){ printf( gettext( "Opened mapper path: " ) ) ; StringListPrintLineAt( stl,index ) ; } break ; case 1 : printf( gettext( "ERROR: Could not create mapper\n" ) ) ;break ; case 2 : printf( gettext( "ERROR: Could not resolve device path\n" ) ) ;break ; case 3 : printf( gettext( "\nSUCCESS: Random data successfully written\n" ) ) ;break ; case 5 : printf( gettext( "INFO: User chose not to proceed\n" ) ) ;break ; case 8 : printf( gettext( "ERROR: Insufficitied privilege to oped device \n" ) ) ;break ; case 9 : printf( gettext( "ERROR: Device path is invalid\n" ) ) ;break ; case 10: printf( gettext( "ERROR: Passphrase file does not exist\n" ) ) ;break ; case 11: printf( gettext( "ERROR: Could not get enought memory to hold the key file\n" ) ) ;break ; case 12: printf( gettext( "ERROR: Insufficient privilege to open key file for reading\n" ) ) ;break ; case 13: printf( gettext( "ERROR: Can not open a mapper on a device with an opened mapper\n" ) ) ;break ; case 14: printf( gettext( "ERROR: Can not open a mapper on a mounted device\n" ) ) ;break ; case 15: printf( gettext( "INFO: Signal caught,exiting prematurely\n" ) ) ;break ; case 16: printf( gettext( "ERROR: Can not get passphrase in silent mode\n" ) ) ;break ; case 17: printf( gettext( "ERROR: Insufficient memory to hold passphrase\n" ) ) ;break ; case 18: printf( gettext( "ERROR: Insufficient memory to hold 3 characters?really?\n" ) ) ;break ; case 19: printf( gettext( "ERROR: Insufficient privilege to open the file with your privileges?\n" ) ) ;break ; } StringListClearDelete( &stl ) ; return status ; }
static int zuluExit( int st,const char * device,const char * m_point,stringList_t stl ) { switch( st ){ case 0 : _printResult( device,m_point ) ; break ; case 1 : printf( gettext( "ERROR: Failed to mount ntfs/exfat file system using ntfs-3g,is ntfs-3g/exfat package installed?\n" ) ) ;break ; case 2 : printf( gettext( "ERROR: There seem to be an open volume accociated with given address\n" ) ) ; break ; case 3 : printf( gettext( "ERROR: No file or device exist on given path\n" ) ) ; break ; case 4 : printf( gettext( "ERROR: Volume could not be opened with the presented key\n" ) ) ; break ; case 5 : printf( gettext( "ERROR: Insufficient privilege to mount the device with given options\n" ) ) ; break ; case 6 : printf( gettext( "ERROR: Insufficient privilege to open device in read write mode or device does not exist\n" ) ) ; break ; case 7 : printf( gettext( "ERROR: Only root user can perform this operation\n" ) ) ; break ; case 8 : printf( gettext( "ERROR: -O and -m options can not be used together\n" ) ) ; break ; case 9 : printf( gettext( "ERROR: Could not create mount point, invalid path or path already taken\n" ) ) ; break ; case 10: printf( gettext( "ERROR: Shared mount point path aleady taken\n" ) ) ; break ; case 11: printf( gettext( "ERROR: There seem to be an opened mapper associated with the device\n" ) ) ; break ; case 12: printf( gettext( "ERROR: Could not get a passphrase from the module\n" ) ) ; break ; case 13: printf( gettext( "ERROR: Could not get passphrase in silent mode\n" ) ); break ; case 14: printf( gettext( "ERROR: Insufficient memory to hold passphrase\n" ) ) ; break ; case 15: printf( gettext( "ERROR: One or more required argument(s) for this operation is missing\n" ) ) ; break ; case 16: printf( gettext( "ERROR: Invalid path to key file\n" ) ) ; break ; case 17: printf( gettext( "ERROR: Could not get enought memory to hold the key file\n" ) ) ; break ; case 18: printf( gettext( "ERROR: Insufficient privilege to open key file for reading\n" ) ); break ; case 19: printf( gettext( "ERROR: Could not get a passphrase through a local socket\n" ) ); break ; case 20: printf( gettext( "ERROR: Failed to mount a filesystem:invalid/unsupported mount option or unsupported file system encountered\n" ) );break ; case 21: printf( gettext( "ERROR: Could not create a lock on /etc/mtab\n" ) ) ; break ; case 22: printf( gettext( "ERROR: Insufficient privilege to open a system volume\n" ) ) ; break ; default: printf( gettext( "ERROR: Unrecognized error with status number %d encountered\n" ),st ) ; } zuluCryptSecurityUnlockMemory( stl ) ; StringListClearDelete( &stl ) ; return st ; }
static int zuluExit( int st,stringList_t stl ) { zuluCryptSecurityUnlockMemory( stl ) ; /* * this function is defined in ../string/StringList.c */ StringListClearDelete( &stl ) ; switch ( st ){ case 0 : printf( gettext( "SUCCESS: Key removed successfully\n" ) ) ; break ; case 2 : printf( gettext( "ERROR: There is no key in the volume that match the presented key\n" ) ) ; break ; case 3 : printf( gettext( "ERROR: Could not open the volume\n" ) ) ; break ; case 4 : printf( gettext( "ERROR: Insufficient privilege to open a system device,\ only root user or members of group zulucrypt can do that\n" ) ) ; break ; case 5 : printf( gettext( "ERROR: Could not open the volume in write mode\n" ) ) ; break ; case 6 : printf( gettext( "ERROR: Insufficient memory to hold your response\n" ) ) ; break ; case 7 : printf( gettext( "INFO: Operation terminated per user request\n" ) ) ; break ; case 8 : printf( gettext( "ERROR: Can not get passphrase in silent mode\n" ) ) ; break ; case 9 : printf( gettext( "ERROR: Insufficient memory to hold passphrase\n" ) ) ; break ; case 10: printf( gettext( "ERROR: One or more required argument(s) for this operation is missing\n" ) );break ; case 11: printf( gettext( "ERROR: Keyfile does not exist\n" ) ) ; break ; case 12: printf( gettext( "ERROR: Could not get enough memory to open the key file\n" ) ) ; break ; case 13: printf( gettext( "ERROR: Insufficient privilege to open key file for reading\n" ) ) ; break ; case 14: printf( gettext( "ERROR: Could not get a key from a socket\n" ) ) ; break ; default: printf( gettext( "ERROR: Unrecognized error with status number %d encountered\n" ),st ); } return st ; }
static int open_plain_as_me_1(const struct_opts * opts,const char * mapping_name,uid_t uid,int op ) { /* * Below is a form of memory management.All strings are collected in a stringlist object to easily delete them * when the function returns.This allows for the function to have multiple exit points without risks of leaking * memory from manually examining each exit point to make sure all strings are deleted or go with multiple goto * code deleting blocks to take into account different exit points. */ stringList_t stl ; string_t * stringArray = StringListArray( &stl,5 ) ; string_t * mapper = &stringArray[ 0 ] ; string_t * passphrase = &stringArray[ 1 ] ; string_t * p = &stringArray[ 2 ] ; string_t * dev_st = &stringArray[ 3 ] ; string_t * dev_1 = &stringArray[ 4 ] ; size_t len = 0 ; const char * source = opts->key_source ; const char * pass = opts->key ; int k = opts->ask_confirmation ; const char * cpass = NULL ; char * d ; const char * device = opts->device ; const char * dev = opts->device ; int j ; int n ; const char * cmapper ; if( StringPrefixEqual( device,"/dev/loop" ) ){ /* * zuluCryptLoopDeviceAddress() is defined in ../lib/create_loop_device.c */ d = zuluCryptLoopDeviceAddress( device ) ; *dev_st = StringInherit( &d ) ; dev = StringContent( *dev_st ) ; *dev_1 = StringCopy( *dev_st ) ; device = StringReplaceString( * dev_1,"\\040"," " ) ; } /* * zuluCryptPartitionIsSystemPartition() is defined in ./partition.c */ if( zuluCryptPartitionIsSystemPartition( device,uid ) ){ if( uid != 0 ){ return zuluExit( stl,8 ) ; } } /* * ZULUCRYPTlongMapperPath and ZULUCRYPTshortMapperPath are in ../constants.h * zuluCryptCreateMapperName() is defined at ../lib/create_mapper_name.c */ *mapper = zuluCryptCreateMapperName( device,mapping_name,uid,ZULUCRYPTshortMapperPath ) ; *p = zuluCryptCreateMapperName( device,mapping_name,uid,ZULUCRYPTlongMapperPath ) ; j = zuluCryptCheckOpenedMapper( StringContent( *p ) ) ; /* * zuluCryptPartitionIsMounted() is defined in ../lib/process_mountinfo.c */ n = zuluCryptPartitionIsMounted( dev ) ; if( j == 1 ){ return zuluExit( stl,13 ) ; } if( n == 1 ){ return zuluExit( stl,14 ) ; } if( k == 0 ){ *passphrase = StringRandomString( 64 ) ; cpass = StringContent( *passphrase ) ; len = StringLength( *passphrase ) ; }else if( source == NULL ){ printf( gettext( "Enter passphrase: " ) ) ; /* * ZULUCRYPT_KEY_MAX_SIZE is set in ../constants.h */ switch( StringSilentlyGetFromTerminal_1( passphrase,ZULUCRYPT_KEY_MAX_SIZE ) ){ case 1 : return zuluExit( stl,16 ) ; case 2 : return zuluExit( stl,17 ) ; } printf( "\n" ) ; cpass = StringContent( *passphrase ) ; len = StringLength( *passphrase ) ; }else{ if( strcmp( source,"-p" ) == 0 ){ *passphrase = String( pass ) ; cpass = StringContent( *passphrase ) ; len = StringLength( *passphrase ) ; }else if( strcmp( source,"-f" ) == 0 ){ /* * zuluCryptGetPassFromFile() is defined at "path_access.c" */ switch( zuluCryptGetPassFromFile( pass,uid,passphrase ) ){ case 1 : return zuluExit( stl,10 ) ; case 2 : return zuluExit( stl,11 ) ; case 4 : return zuluExit( stl,12 ) ; } cpass = StringContent( *passphrase ) ; len = StringLength( *passphrase ) ; } } if( zuluCryptSecurityGainElevatedPrivileges() ){ /* * zuluCryptOpenPlain() is defined in ../lib/open_plain.c */ if( zuluCryptOpenPlain( device,StringContent( *mapper ),"rw",cpass,len ) != 0 ){ zuluCryptSecurityDropElevatedPrivileges() ; return zuluExit( stl,1 ) ; } } zuluCryptSecurityDropElevatedPrivileges() ; /* * Create a mapper path(usually at /dev/mapper) associated with opened plain mapper above. */ cmapper = StringMultiplePrepend( *mapper,"/",crypt_get_dir(),NULL ) ; /* * mapper path is usually a soft link to /dev/dm-X * resolve the mapper path to its respective /dev/dm-X and set permission on it. * * We set permission of /dev/dm-X pointing to the device to "u+rw" because we want notmal user to be able * to write to the device through the mapper. * * Useful when a normal user want to delete content of the device by writing random data to it. */ d = zuluCryptRealPath( cmapper ) ; if( zuluCryptSecurityGainElevatedPrivileges() ){ if( d != NULL ){ _ignore_result( chown( d,uid,0 ) ) ; _ignore_result( chmod( d,S_IRWXU ) ) ; StringFree( d ) ; } zuluCryptSecurityDropElevatedPrivileges() ; }else{ return zuluExit( stl,1 ) ; } if( op == 1 ){ return zuluExit( stl,0 ) ; }else{ StringListClearDelete( &stl ) ; return 0 ; } }
static int zuluExit_1( int st,const char * device,stringList_t stl ) { printf( gettext( "ERROR: device \"%s\" is not a luks device\n" ),device ) ; StringListClearDelete( &stl ) ; return st ; }