int zuluCryptCreateVolume( const char * dev,const char * fs,const char * type,const char * pass,size_t pass_size,const char * rng ) { string_t st ; int fd ; int r ; if( StringPrefixMatch( dev,"/dev/",5 ) ){ return _create_volume( dev,fs,type,pass,pass_size,rng ) ; }else{ /* * zuluCryptAttachLoopDeviceToFile() is defined in ./create_loop.c */ if( zuluCryptAttachLoopDeviceToFile( dev,O_RDWR,&fd,&st ) ){ r = _create_volume( StringContent( st ),fs,type,pass,pass_size,rng ) ; StringDelete( &st ) ; close( fd ) ; return r ; }else{ return 3 ; } } }
static int _create_tcrypt_volume( const char * device,const char * file_system, const char * rng,const char * key,size_t key_len, int key_source,u_int64_t hidden_volume_size, const char * file_system_h,const char * key_h,size_t key_len_h,int key_source_h ) { string_t st = StringVoid ; string_t xt = StringVoid ; tcrypt_t info ; int r = 3 ; if( zuluCryptPathIsNotValid( device ) ){ return 1 ; } memset( &info,'\0',sizeof( tcrypt_t ) ) ; info.device = device ; info.key_source = key_source ; info.key_source_h = key_source_h ; info.hidden_volume_size = hidden_volume_size ; if( StringPrefixMatch( rng,"/dev/urandom",12 ) ){ info.weak_keys_and_salt = 1 ; } if( info.key_source == TCRYPT_PASSPHRASE ){ info.key = key ; info.key_source_1 = "passphrase" ; }else{ /* * zuluCryptCreateKeyFile() is defined in open_tcrypt.c */ st = zuluCryptCreateKeyFile( key,key_len,"create_tcrypt-1-" ) ; info.key = StringContent( st ) ; info.key_source = TCRYPT_KEYFILE_FILE ; info.key_source_1 = "keyfiles" ; } if( info.hidden_volume_size > 0 ){ if( info.key_source_h == TCRYPT_PASSPHRASE ){ info.key_h = key_h ; info.key_source_h_1 = "h_passphrase" ; }else{ xt = zuluCryptCreateKeyFile( key_h,key_len_h,"create_tcrypt-2-" ) ; info.key_h = StringContent( xt ) ; info.key_source_h = TCRYPT_KEYFILE_FILE ; info.key_source_h_1 = "h_keyfiles" ; } } if( _create_volume( &info ) == TC_OK ){ r = _create_file_system( device,file_system,info.key_source,info.key,key_len,TCRYPT_NORMAL ) ; if( info.hidden_volume_size > 0 && r == 0 ){ r = _create_file_system( device,file_system_h,info.key_source_h,info.key_h,key_len_h,TCRYPT_HIDDEN ) ; } } /* * zuluCryptDeleteFile() is defined in file_path_security.c */ if( st != StringVoid ){ zuluCryptDeleteFile( StringContent( st ) ) ; StringDelete( &st ) ; } if( xt != StringVoid ){ zuluCryptDeleteFile( StringContent( xt ) ) ; StringDelete( &xt ) ; } return r ; }