1207753Smm/////////////////////////////////////////////////////////////////////////////// 2207753Smm// 3207753Smm/// \file check.c 4207753Smm/// \brief Single API to access different integrity checks 5207753Smm// 6207753Smm// Author: Lasse Collin 7207753Smm// 8207753Smm// This file has been put into the public domain. 9207753Smm// You can do whatever you want with this file. 10207753Smm// 11207753Smm/////////////////////////////////////////////////////////////////////////////// 12207753Smm 13207753Smm#include "check.h" 14207753Smm 15207753Smm 16207753Smmextern LZMA_API(lzma_bool) 17207753Smmlzma_check_is_supported(lzma_check type) 18207753Smm{ 19207753Smm if ((unsigned int)(type) > LZMA_CHECK_ID_MAX) 20207753Smm return false; 21207753Smm 22207753Smm static const lzma_bool available_checks[LZMA_CHECK_ID_MAX + 1] = { 23207753Smm true, // LZMA_CHECK_NONE 24207753Smm 25207753Smm#ifdef HAVE_CHECK_CRC32 26207753Smm true, 27207753Smm#else 28207753Smm false, 29207753Smm#endif 30207753Smm 31207753Smm false, // Reserved 32207753Smm false, // Reserved 33207753Smm 34207753Smm#ifdef HAVE_CHECK_CRC64 35207753Smm true, 36207753Smm#else 37207753Smm false, 38207753Smm#endif 39207753Smm 40207753Smm false, // Reserved 41207753Smm false, // Reserved 42207753Smm false, // Reserved 43207753Smm false, // Reserved 44207753Smm false, // Reserved 45207753Smm 46207753Smm#ifdef HAVE_CHECK_SHA256 47207753Smm true, 48207753Smm#else 49207753Smm false, 50207753Smm#endif 51207753Smm 52207753Smm false, // Reserved 53207753Smm false, // Reserved 54207753Smm false, // Reserved 55207753Smm false, // Reserved 56207753Smm false, // Reserved 57207753Smm }; 58207753Smm 59207753Smm return available_checks[(unsigned int)(type)]; 60207753Smm} 61207753Smm 62207753Smm 63207753Smmextern LZMA_API(uint32_t) 64207753Smmlzma_check_size(lzma_check type) 65207753Smm{ 66207753Smm if ((unsigned int)(type) > LZMA_CHECK_ID_MAX) 67207753Smm return UINT32_MAX; 68207753Smm 69207753Smm // See file-format.txt section 2.1.1.2. 70207753Smm static const uint8_t check_sizes[LZMA_CHECK_ID_MAX + 1] = { 71207753Smm 0, 72207753Smm 4, 4, 4, 73207753Smm 8, 8, 8, 74207753Smm 16, 16, 16, 75207753Smm 32, 32, 32, 76207753Smm 64, 64, 64 77207753Smm }; 78207753Smm 79207753Smm return check_sizes[(unsigned int)(type)]; 80207753Smm} 81207753Smm 82207753Smm 83207753Smmextern void 84207753Smmlzma_check_init(lzma_check_state *check, lzma_check type) 85207753Smm{ 86207753Smm switch (type) { 87207753Smm case LZMA_CHECK_NONE: 88207753Smm break; 89207753Smm 90207753Smm#ifdef HAVE_CHECK_CRC32 91207753Smm case LZMA_CHECK_CRC32: 92207753Smm check->state.crc32 = 0; 93207753Smm break; 94207753Smm#endif 95207753Smm 96207753Smm#ifdef HAVE_CHECK_CRC64 97207753Smm case LZMA_CHECK_CRC64: 98207753Smm check->state.crc64 = 0; 99207753Smm break; 100207753Smm#endif 101207753Smm 102207753Smm#ifdef HAVE_CHECK_SHA256 103207753Smm case LZMA_CHECK_SHA256: 104207753Smm lzma_sha256_init(check); 105207753Smm break; 106207753Smm#endif 107207753Smm 108207753Smm default: 109207753Smm break; 110207753Smm } 111207753Smm 112207753Smm return; 113207753Smm} 114207753Smm 115207753Smm 116207753Smmextern void 117207753Smmlzma_check_update(lzma_check_state *check, lzma_check type, 118207753Smm const uint8_t *buf, size_t size) 119207753Smm{ 120207753Smm switch (type) { 121207753Smm#ifdef HAVE_CHECK_CRC32 122207753Smm case LZMA_CHECK_CRC32: 123207753Smm check->state.crc32 = lzma_crc32(buf, size, check->state.crc32); 124207753Smm break; 125207753Smm#endif 126207753Smm 127207753Smm#ifdef HAVE_CHECK_CRC64 128207753Smm case LZMA_CHECK_CRC64: 129207753Smm check->state.crc64 = lzma_crc64(buf, size, check->state.crc64); 130207753Smm break; 131207753Smm#endif 132207753Smm 133207753Smm#ifdef HAVE_CHECK_SHA256 134207753Smm case LZMA_CHECK_SHA256: 135207753Smm lzma_sha256_update(buf, size, check); 136207753Smm break; 137207753Smm#endif 138207753Smm 139207753Smm default: 140207753Smm break; 141207753Smm } 142207753Smm 143207753Smm return; 144207753Smm} 145207753Smm 146207753Smm 147207753Smmextern void 148207753Smmlzma_check_finish(lzma_check_state *check, lzma_check type) 149207753Smm{ 150207753Smm switch (type) { 151207753Smm#ifdef HAVE_CHECK_CRC32 152207753Smm case LZMA_CHECK_CRC32: 153207753Smm check->buffer.u32[0] = conv32le(check->state.crc32); 154207753Smm break; 155207753Smm#endif 156207753Smm 157207753Smm#ifdef HAVE_CHECK_CRC64 158207753Smm case LZMA_CHECK_CRC64: 159207753Smm check->buffer.u64[0] = conv64le(check->state.crc64); 160207753Smm break; 161207753Smm#endif 162207753Smm 163207753Smm#ifdef HAVE_CHECK_SHA256 164207753Smm case LZMA_CHECK_SHA256: 165207753Smm lzma_sha256_finish(check); 166207753Smm break; 167207753Smm#endif 168207753Smm 169207753Smm default: 170207753Smm break; 171207753Smm } 172207753Smm 173207753Smm return; 174207753Smm} 175