root/src/liblzma/check/check.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. LZMA_API
  2. LZMA_API
  3. lzma_check_init
  4. lzma_check_update
  5. lzma_check_finish

///////////////////////////////////////////////////////////////////////////////
//
/// \file       check.c
/// \brief      Single API to access different integrity checks
//
//  Author:     Lasse Collin
//
//  This file has been put into the public domain.
//  You can do whatever you want with this file.
//
///////////////////////////////////////////////////////////////////////////////

#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] = conv32le(check->state.crc32);
                break;
#endif

#ifdef HAVE_CHECK_CRC64
        case LZMA_CHECK_CRC64:
                check->buffer.u64[0] = conv64le(check->state.crc64);
                break;
#endif

#ifdef HAVE_CHECK_SHA256
        case LZMA_CHECK_SHA256:
                lzma_sha256_finish(check);
                break;
#endif

        default:
                break;
        }

        return;
}

/* [<][>][^][v][top][bottom][index][help] */