mirror of
https://git.tukaani.org/xz.git
synced 2024-04-04 12:36:23 +02:00
Half of developers were already forgetting to use these functions, which could have caused total breakage in some future liblzma version or even now if --enable-small was used. Now liblzma uses pthread_once() to do the initializations unless it has been built with --disable-threads which make these initializations thread-unsafe. When --enable-small isn't used, liblzma currently gets needlessly linked against libpthread (on systems that have it). While it is stupid for now, liblzma will need threads in future anyway, so this stupidity will be temporary only. When --enable-small is used, different code CRC32 and CRC64 is now used than without --enable-small. This made the resulting binary slightly smaller, but the main reason was to clean it up and to handle the lack of lzma_init_check(). The pkg-config file lzma.pc was renamed to liblzma.pc. I'm not sure if it works correctly and portably for static linking (Libs.private includes -pthread or other operating system specific flags). Hopefully someone complains if it is bad. lzma_rc_prices[] is now included as a precomputed array even with --enable-small. It's just 128 bytes now that it uses uint8_t instead of uint32_t. Smaller array seemed to be at least as fast as the more bloated uint32_t array on x86; hopefully it's not bad on other architectures.
175 lines
3 KiB
C
175 lines
3 KiB
C
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
/// \file check.c
|
|
/// \brief Single API to access different integrity checks
|
|
//
|
|
// This code has been put into the public domain.
|
|
//
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "check.h"
|
|
|
|
|
|
extern LZMA_API lzma_bool
|
|
lzma_check_is_supported(lzma_check type)
|
|
{
|
|
if ((unsigned int)(type) > LZMA_CHECK_ID_MAX)
|
|
return false;
|
|
|
|
static const lzma_bool available_checks[LZMA_CHECK_ID_MAX + 1] = {
|
|
true, // LZMA_CHECK_NONE
|
|
|
|
#ifdef HAVE_CHECK_CRC32
|
|
true,
|
|
#else
|
|
false,
|
|
#endif
|
|
|
|
false, // Reserved
|
|
false, // Reserved
|
|
|
|
#ifdef HAVE_CHECK_CRC64
|
|
true,
|
|
#else
|
|
false,
|
|
#endif
|
|
|
|
false, // Reserved
|
|
false, // Reserved
|
|
false, // Reserved
|
|
false, // Reserved
|
|
false, // Reserved
|
|
|
|
#ifdef HAVE_CHECK_SHA256
|
|
true,
|
|
#else
|
|
false,
|
|
#endif
|
|
|
|
false, // Reserved
|
|
false, // Reserved
|
|
false, // Reserved
|
|
false, // Reserved
|
|
false, // Reserved
|
|
};
|
|
|
|
return available_checks[(unsigned int)(type)];
|
|
}
|
|
|
|
|
|
extern LZMA_API uint32_t
|
|
lzma_check_size(lzma_check type)
|
|
{
|
|
if ((unsigned int)(type) > LZMA_CHECK_ID_MAX)
|
|
return UINT32_MAX;
|
|
|
|
// See file-format.txt section 2.1.1.2.
|
|
static const uint8_t check_sizes[LZMA_CHECK_ID_MAX + 1] = {
|
|
0,
|
|
4, 4, 4,
|
|
8, 8, 8,
|
|
16, 16, 16,
|
|
32, 32, 32,
|
|
64, 64, 64
|
|
};
|
|
|
|
return check_sizes[(unsigned int)(type)];
|
|
}
|
|
|
|
|
|
extern void
|
|
lzma_check_init(lzma_check_state *check, lzma_check type)
|
|
{
|
|
switch (type) {
|
|
case LZMA_CHECK_NONE:
|
|
break;
|
|
|
|
#ifdef HAVE_CHECK_CRC32
|
|
case LZMA_CHECK_CRC32:
|
|
check->state.crc32 = 0;
|
|
break;
|
|
#endif
|
|
|
|
#ifdef HAVE_CHECK_CRC64
|
|
case LZMA_CHECK_CRC64:
|
|
check->state.crc64 = 0;
|
|
break;
|
|
#endif
|
|
|
|
#ifdef HAVE_CHECK_SHA256
|
|
case LZMA_CHECK_SHA256:
|
|
lzma_sha256_init(check);
|
|
break;
|
|
#endif
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
extern void
|
|
lzma_check_update(lzma_check_state *check, lzma_check type,
|
|
const uint8_t *buf, size_t size)
|
|
{
|
|
switch (type) {
|
|
#ifdef HAVE_CHECK_CRC32
|
|
case LZMA_CHECK_CRC32:
|
|
check->state.crc32 = lzma_crc32(buf, size, check->state.crc32);
|
|
break;
|
|
#endif
|
|
|
|
#ifdef HAVE_CHECK_CRC64
|
|
case LZMA_CHECK_CRC64:
|
|
check->state.crc64 = lzma_crc64(buf, size, check->state.crc64);
|
|
break;
|
|
#endif
|
|
|
|
#ifdef HAVE_CHECK_SHA256
|
|
case LZMA_CHECK_SHA256:
|
|
lzma_sha256_update(buf, size, check);
|
|
break;
|
|
#endif
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
extern void
|
|
lzma_check_finish(lzma_check_state *check, lzma_check type)
|
|
{
|
|
switch (type) {
|
|
#ifdef HAVE_CHECK_CRC32
|
|
case LZMA_CHECK_CRC32:
|
|
check->buffer.u32[0] = integer_le_32(check->state.crc32);
|
|
break;
|
|
#endif
|
|
|
|
#ifdef HAVE_CHECK_CRC64
|
|
case LZMA_CHECK_CRC64:
|
|
check->buffer.u64[0] = integer_le_64(check->state.crc64);
|
|
break;
|
|
#endif
|
|
|
|
#ifdef HAVE_CHECK_SHA256
|
|
case LZMA_CHECK_SHA256:
|
|
lzma_sha256_finish(check);
|
|
break;
|
|
#endif
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|