Exemplo n.º 1
0
/* 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 );
}
Exemplo n.º 2
0
/* 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 );
}