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