Пример #1
0
int main( int argc, char * const argv[] )
#endif
{
	libcerror_error_t *error           = NULL;
	libcfile_file_t *source_file       = NULL;
	uint8_t *buffer                    = NULL;
	char *program                      = "crc32sum";
	char *source                       = NULL;
	libcstring_system_integer_t option = 0;
	size64_t source_size               = 0;
	off_t source_offset                = 0;
	ssize_t read_count                 = 0;
	uint32_t calculated_crc32          = 0;
	uint32_t crc32                     = 0;
	uint32_t initial_value             = 0;
	uint32_t polynomial                = 0xedb88320UL;
	uint8_t bit_index                  = 0;
	uint8_t weak_crc                   = 0;
	int calculation_method             = 2;
	int result                         = 0;
	int validate_crc                   = 0;
	int verbose                        = 0;

	assorted_output_version_fprint(
	 stdout,
	 program );

	while( ( option = libcsystem_getopt(
	                   argc,
	                   argv,
	                   _LIBCSTRING_SYSTEM_STRING( "12c:hi:o:p:s:vVw" ) ) ) != (libcstring_system_integer_t) -1 )
	{
		switch( option )
		{
			case '?':
			default:
				fprintf(
				 stderr,
				 "Invalid argument: %" PRIs_LIBCSTRING_SYSTEM "\n",
				 argv[ optind ] );

				usage_fprint(
				 stdout );

				return( EXIT_FAILURE );

			case '1':
				calculation_method = 1;

				break;

			case '2':
				calculation_method = 2;

				break;

			case 'c':
				crc32 = atol( optarg );

				validate_crc = 1;

				break;

			case 'h':
				usage_fprint(
				 stdout );

				return( EXIT_SUCCESS );

			case 'i':
				initial_value = atol( optarg );

				break;

			case 'o':
				source_offset = atol( optarg );

				break;

			case 'p':
				polynomial = atol( optarg );

				break;

			case 's':
				source_size = atol( optarg );

				break;

			case 'v':
				verbose = 1;

				break;

			case 'V':
				assorted_output_copyright_fprint(
				 stdout );

				return( EXIT_SUCCESS );

			case 'w':
				weak_crc = 1;

				break;
		}
	}
	if( optind == argc )
	{
		fprintf(
		 stderr,
		 "Missing source file.\n" );

		usage_fprint(
		 stdout );

		return( EXIT_FAILURE );
	}
	source = argv[ optind ];

	libcnotify_stream_set(
	 stderr,
	 NULL );
	libcnotify_verbose_set(
	 verbose );

	/* Open the source file
	 */
	if( libcfile_file_initialize(
	     &source_file,
	     &error ) != 1 )
	{
		fprintf(
		 stderr,
		 "Unable to create source file.\n" );

		goto on_error;
	}
	if( libcfile_file_open(
	     source_file,
	     source,
	     LIBCFILE_OPEN_READ,
	     &error ) != 1 )
	{
		fprintf(
		 stderr,
		 "Unable to open source file.\n" );

		goto on_error;
	}
	if( source_size == 0 )
	{
		if( libcfile_file_get_size(
		     source_file,
		     &source_size,
		     &error ) == -1 )
		{
			fprintf(
			 stderr,
			 "Unable to determine size of source file.\n" );

			goto on_error;
		}
	}
	if( source_size == 0 )
	{
		fprintf(
		 stderr,
		 "Invalid source size value is zero.\n" );

		goto on_error;
	}
	if( source_size > (size_t) SSIZE_MAX )
	{
		fprintf(
		 stderr,
		 "Invalid source size value exceeds maximum.\n" );

		goto on_error;
	}
	buffer = (uint8_t *) memory_allocate(
	                      sizeof( uint8_t ) * source_size );

	if( buffer == NULL )
	{
		fprintf(
		 stderr,
		 "Unable to create buffer.\n" );

		goto on_error;
	}
	/* Position the source file at the right offset
	 */
	if( libcfile_file_seek_offset(
	     source_file,
	     source_offset,
	     SEEK_SET,
	     &error ) == -1 )
	{
		fprintf(
		 stderr,
		 "Unable to seek offset in source file.\n" );

		goto on_error;
	}
	read_count = libcfile_file_read_buffer(
		      source_file,
		      buffer,
		      source_size,
	              &error );

	if( read_count != (ssize_t) source_size )
	{
		fprintf(
		 stderr,
		 "Unable to read from source file.\n" );

		goto on_error;
	}
	/* Clean up
	 */
	if( libcfile_file_close(
	     source_file,
	     &error ) != 0 )
	{
		fprintf(
		 stderr,
		 "Unable to close source file.\n" );

		goto on_error;
	}
	if( libcfile_file_free(
	     &source_file,
	     &error ) != 1 )
	{
		fprintf(
		 stderr,
		 "Unable to free source file.\n" );

		goto on_error;
	}
	if( calculation_method == 1 )
	{
		result = crc32_calculate_modulo2(
			  &calculated_crc32,
			  buffer,
			  source_size,
			  initial_value,
			  weak_crc,
			  &error );
	}
	else if( calculation_method == 2 )
	{
                initialize_crc32_table(
                 polynomial );

		result = crc32_calculate(
			  &calculated_crc32,
			  buffer,
			  source_size,
			  initial_value,
			  weak_crc,
			  &error );
	}
	if( result != 1 )
	{
		fprintf(
		 stderr,
		 "Unable to calculate CRC-32.\n" );

		goto on_error;
	}
	if( libcnotify_verbose != 0 )
	{
		libcnotify_print_data(
		 buffer,
		 source_size,
		 0 );
	}
	fprintf(
	 stdout,
	 "Calculated CRC-32: %" PRIu32 " (0x%08" PRIx32 ")\n",
	 calculated_crc32,
	 calculated_crc32 );

	if( validate_crc != 0 )
	{
		if( calculated_crc32 != crc32 )
		{
			fprintf(
			 stdout,
			 "Mismatch between CRC-32: %" PRIu32 " and calculated CRC-32: %" PRIu32 "\n",
			 crc32,
			 calculated_crc32 );

			result = crc32_validate(
			          crc32,
			          calculated_crc32,
			          &bit_index,
			          &error );

			if( result == -1 )
			{
				fprintf(
				 stderr,
				 "Unable to locate error.\n" );

				goto on_error;
			}
			else if( result != 0 )
			{
				fprintf(
				 stdout,
				 "Single bit-error in bit: %" PRIu8 " of CRC-32\n",
				 bit_index );
			}
			result = crc32_locate_error_offset(
			          crc32,
			          calculated_crc32,
			          buffer,
			          source_size,
			          initial_value,
			          &error );

			if( result == -1 )
			{
				fprintf(
				 stderr,
				 "Unable to locate error.\n" );

				goto on_error;
			}
		}
		else
		{
			fprintf(
			 stdout,
			 "Match between CRC-32: %" PRIu32 " and calculated CRC-32: %" PRIu32 "\n",
			 crc32,
			 calculated_crc32 );
		}
	}
	memory_free(
	 buffer );

	return( EXIT_SUCCESS );

on_error:
	if( error != NULL )
	{
		libcnotify_print_error_backtrace(
		 error );
		libcerror_error_free(
		 &error );
	}
	if( buffer != NULL )
	{
		memory_free(
		 buffer );
	}
	if( source_file != NULL )
	{
		libcfile_file_free(
		 &source_file,
		 NULL );
	}
	return( EXIT_FAILURE );
}
Пример #2
0
if (s->check_type == XZ_CHECK_CRC32) {
				ret = crc32_validate(s, b);
				if (ret != XZ_STREAM_END)
					return ret;
			}
#ifdef XZ_DEC_ANY_CHECK
			else if (!check_skip(s, b)) {
				return XZ_OK;
			}
#endif