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