/* Sets the keys * Returns 1 if successful or -1 on error */ int rc4crypt_set_keys( const system_character_t *string, uint8_t **key_data, size_t *key_data_size, libcerror_error_t **error ) { static char *function = "rc4crypt_set_keys"; size_t string_length = 0; uint32_t base16_variant = 0; string_length = system_string_length( string ); *key_data_size = string_length / 2; *key_data = (uint8_t *) memory_allocate( sizeof( uint8_t ) * *key_data_size ); if( *key_data == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_MEMORY, LIBCERROR_MEMORY_ERROR_INSUFFICIENT, "%s: unable to create key data.", function ); goto on_error; } if( memory_set( *key_data, 0, *key_data_size ) == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_MEMORY, LIBCERROR_MEMORY_ERROR_SET_FAILED, "%s: unable to clear key data.", function ); goto on_error; } base16_variant = LIBUNA_BASE16_VARIANT_RFC4648; #if defined( HAVE_WIDE_SYSTEM_CHARACTER ) if( _BYTE_STREAM_HOST_IS_ENDIAN_BIG ) { base16_variant |= LIBUNA_BASE16_VARIANT_ENCODING_UTF16_BIG_ENDIAN; } else { base16_variant |= LIBUNA_BASE16_VARIANT_ENCODING_UTF16_LITTLE_ENDIAN; } #endif if( libuna_base16_stream_copy_to_byte_stream( (uint8_t *) string, string_length, *key_data, *key_data_size, base16_variant, 0, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_COPY_FAILED, "%s: unable to copy key data.", function ); goto on_error; } return( 1 ); on_error: if( *key_data != NULL ) { memory_set( *key_data, 0, *key_data_size ); memory_free( *key_data ); *key_data = NULL; *key_data_size = 0; } return( -1 ); }
/* Sets the volume key data * Returns 1 if successful or -1 on error */ int wipekey_handle_set_volume_key_data( wipekey_handle_t *wipekey_handle, const libcstring_system_character_t *string, libcerror_error_t **error ) { static char *function = "wipekey_handle_set_volume_key_data"; size_t string_length = 0; uint32_t base16_variant = 0; if( wipekey_handle == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid wipekey handle.", function ); return( -1 ); } string_length = libcstring_system_string_length( string ); if( memory_set( wipekey_handle->volume_key_data, 0, 16 ) == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_MEMORY, LIBCERROR_MEMORY_ERROR_SET_FAILED, "%s: unable to clear volume key data.", function ); goto on_error; } base16_variant = LIBUNA_BASE16_VARIANT_RFC4648; #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( _BYTE_STREAM_HOST_IS_ENDIAN_BIG ) { base16_variant |= LIBUNA_BASE16_VARIANT_ENCODING_UTF16_BIG_ENDIAN; } else { base16_variant |= LIBUNA_BASE16_VARIANT_ENCODING_UTF16_LITTLE_ENDIAN; } #endif if( string_length != 32 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_UNSUPPORTED_VALUE, "%s: unsupported string length.", function ); goto on_error; } if( libuna_base16_stream_copy_to_byte_stream( (uint8_t *) string, string_length, wipekey_handle->volume_key_data, 16, base16_variant, 0, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_COPY_FAILED, "%s: unable to copy volume key data.", function ); goto on_error; } return( 1 ); on_error: memory_set( wipekey_handle->volume_key_data, 0, 16 ); return( -1 ); }