Home | History | Annotate | Line # | Download | only in check
      1 // SPDX-License-Identifier: 0BSD
      2 
      3 ///////////////////////////////////////////////////////////////////////////////
      4 //
      5 /// \file       check.c
      6 /// \brief      Single API to access different integrity checks
      7 //
      8 //  Author:     Lasse Collin
      9 //
     10 ///////////////////////////////////////////////////////////////////////////////
     11 
     12 #include "check.h"
     13 
     14 
     15 extern LZMA_API(lzma_bool)
     16 lzma_check_is_supported(lzma_check type)
     17 {
     18 	if ((unsigned int)(type) > LZMA_CHECK_ID_MAX)
     19 		return false;
     20 
     21 	static const lzma_bool available_checks[LZMA_CHECK_ID_MAX + 1] = {
     22 		true,   // LZMA_CHECK_NONE
     23 
     24 #ifdef HAVE_CHECK_CRC32
     25 		true,
     26 #else
     27 		false,
     28 #endif
     29 
     30 		false,  // Reserved
     31 		false,  // Reserved
     32 
     33 #ifdef HAVE_CHECK_CRC64
     34 		true,
     35 #else
     36 		false,
     37 #endif
     38 
     39 		false,  // Reserved
     40 		false,  // Reserved
     41 		false,  // Reserved
     42 		false,  // Reserved
     43 		false,  // Reserved
     44 
     45 #ifdef HAVE_CHECK_SHA256
     46 		true,
     47 #else
     48 		false,
     49 #endif
     50 
     51 		false,  // Reserved
     52 		false,  // Reserved
     53 		false,  // Reserved
     54 		false,  // Reserved
     55 		false,  // Reserved
     56 	};
     57 
     58 	return available_checks[(unsigned int)(type)];
     59 }
     60 
     61 
     62 extern LZMA_API(uint32_t)
     63 lzma_check_size(lzma_check type)
     64 {
     65 	if ((unsigned int)(type) > LZMA_CHECK_ID_MAX)
     66 		return UINT32_MAX;
     67 
     68 	// See file-format.txt section 2.1.1.2.
     69 	static const uint8_t check_sizes[LZMA_CHECK_ID_MAX + 1] = {
     70 		0,
     71 		4, 4, 4,
     72 		8, 8, 8,
     73 		16, 16, 16,
     74 		32, 32, 32,
     75 		64, 64, 64
     76 	};
     77 
     78 	return check_sizes[(unsigned int)(type)];
     79 }
     80 
     81 
     82 extern void
     83 lzma_check_init(lzma_check_state *check, lzma_check type)
     84 {
     85 	switch (type) {
     86 	case LZMA_CHECK_NONE:
     87 		break;
     88 
     89 #ifdef HAVE_CHECK_CRC32
     90 	case LZMA_CHECK_CRC32:
     91 		check->state.crc32 = 0;
     92 		break;
     93 #endif
     94 
     95 #ifdef HAVE_CHECK_CRC64
     96 	case LZMA_CHECK_CRC64:
     97 		check->state.crc64 = 0;
     98 		break;
     99 #endif
    100 
    101 #ifdef HAVE_CHECK_SHA256
    102 	case LZMA_CHECK_SHA256:
    103 		lzma_sha256_init(check);
    104 		break;
    105 #endif
    106 
    107 	default:
    108 		break;
    109 	}
    110 
    111 	return;
    112 }
    113 
    114 
    115 extern void
    116 lzma_check_update(lzma_check_state *check, lzma_check type,
    117 		const uint8_t *buf, size_t size)
    118 {
    119 	switch (type) {
    120 #ifdef HAVE_CHECK_CRC32
    121 	case LZMA_CHECK_CRC32:
    122 		check->state.crc32 = lzma_crc32(buf, size, check->state.crc32);
    123 		break;
    124 #endif
    125 
    126 #ifdef HAVE_CHECK_CRC64
    127 	case LZMA_CHECK_CRC64:
    128 		check->state.crc64 = lzma_crc64(buf, size, check->state.crc64);
    129 		break;
    130 #endif
    131 
    132 #ifdef HAVE_CHECK_SHA256
    133 	case LZMA_CHECK_SHA256:
    134 		lzma_sha256_update(buf, size, check);
    135 		break;
    136 #endif
    137 
    138 	default:
    139 		break;
    140 	}
    141 
    142 	return;
    143 }
    144 
    145 
    146 extern void
    147 lzma_check_finish(lzma_check_state *check, lzma_check type)
    148 {
    149 	switch (type) {
    150 #ifdef HAVE_CHECK_CRC32
    151 	case LZMA_CHECK_CRC32:
    152 		check->buffer.u32[0] = conv32le(check->state.crc32);
    153 		break;
    154 #endif
    155 
    156 #ifdef HAVE_CHECK_CRC64
    157 	case LZMA_CHECK_CRC64:
    158 		check->buffer.u64[0] = conv64le(check->state.crc64);
    159 		break;
    160 #endif
    161 
    162 #ifdef HAVE_CHECK_SHA256
    163 	case LZMA_CHECK_SHA256:
    164 		lzma_sha256_finish(check);
    165 		break;
    166 #endif
    167 
    168 	default:
    169 		break;
    170 	}
    171 
    172 	return;
    173 }
    174