1 #ifndef R2_HASH_H
2 #define R2_HASH_H
3 
4 #include "r_types.h"
5 #include "r_util/r_mem.h"
6 
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 
11 R_LIB_VERSION_HEADER (r_hash);
12 
13 #if HAVE_LIB_SSL
14 #include <openssl/sha.h>
15 #include <openssl/md5.h>
16 typedef MD5_CTX R_MD5_CTX;
17 typedef SHA_CTX R_SHA_CTX;
18 typedef SHA256_CTX R_SHA256_CTX;
19 typedef SHA512_CTX R_SHA384_CTX;
20 typedef SHA512_CTX R_SHA512_CTX;
21 #define SHA256_BLOCK_LENGTH SHA256_CBLOCK
22 #define SHA384_BLOCK_LENGTH SHA384_CBLOCK
23 #define SHA512_BLOCK_LENGTH SHA512_CBLOCK
24 #else
25 #define MD5_CTX R_MD5_CTX
26 
27 /* hashing */
28 typedef struct {
29 	ut32 state[4];
30 	ut32 count[2];
31 	ut8 buffer[64];
32 } R_MD5_CTX;
33 
34 typedef struct {
35 	ut32 H[5];
36 	ut32 W[80];
37 	int lenW;
38 	ut32 sizeHi, sizeLo;
39 } R_SHA_CTX;
40 
41 #define SHA256_BLOCK_LENGTH 64
42 typedef struct _SHA256_CTX {
43 	ut32 state[8];
44 	ut64 bitcount;
45 	ut8 buffer[SHA256_BLOCK_LENGTH];
46 } R_SHA256_CTX;
47 
48 #define SHA384_BLOCK_LENGTH 128
49 #define SHA512_BLOCK_LENGTH 128
50 typedef struct _SHA512_CTX {
51 	ut64 state[8];
52 	ut64 bitcount[2];
53 	ut8 buffer[SHA512_BLOCK_LENGTH];
54 } R_SHA512_CTX;
55 typedef R_SHA512_CTX R_SHA384_CTX;
56 #endif
57 
58 
59 /*
60  * Since we have not enough space in bitmask, you may do fine
61  * selection of required hash functions by the followed macros.
62  *
63  * TODO: subject to place in config
64  */
65 //#define R_HAVE_CRC8_EXTRA 1
66 #define R_HAVE_CRC15_EXTRA 1
67 //#define R_HAVE_CRC16_EXTRA 1
68 #define R_HAVE_CRC24 1
69 #define R_HAVE_CRC32_EXTRA 1
70 #define R_HAVE_CRC64 1
71 #define R_HAVE_CRC64_EXTRA 1
72 
73 /* select CRC-digest intergal holder */
74 #if R_HAVE_CRC64 || R_HAVE_CRC64_EXTRA
75 typedef ut64 utcrc;
76 #define PFMTCRCx PFMT64x
77 #else
78 typedef ut32 utcrc;
79 #define PFMTCRCx PFMT32x
80 #endif
81 #define UTCRC_C(x) ((utcrc)(x))
82 
83 R_API ut8 r_hash_fletcher8(const ut8 *d, size_t length);
84 R_API ut16 r_hash_fletcher16(const ut8 *data, size_t len);
85 R_API ut32 r_hash_fletcher32(const ut8 *data, size_t len);
86 R_API ut64 r_hash_fletcher64(const ut8 *addr, size_t len);
87 
88 typedef struct {
89 	utcrc crc;
90 	ut32 size;
91 	int reflect;
92 	utcrc poly;
93 	utcrc xout;
94 } R_CRC_CTX;
95 
96 enum CRC_PRESETS {
97 	CRC_PRESET_8_SMBUS = 0,
98 #if R_HAVE_CRC8_EXTRA
99 	CRC_PRESET_CRC8_CDMA2000,
100 	CRC_PRESET_CRC8_DARC,
101 	CRC_PRESET_CRC8_DVB_S2,
102 	CRC_PRESET_CRC8_EBU,
103 	CRC_PRESET_CRC8_ICODE,
104 	CRC_PRESET_CRC8_ITU,
105 	CRC_PRESET_CRC8_MAXIM,
106 	CRC_PRESET_CRC8_ROHC,
107 	CRC_PRESET_CRC8_WCDMA,
108 #endif /* #if R_HAVE_CRC8_EXTRA */
109 
110 #if R_HAVE_CRC15_EXTRA
111 	CRC_PRESET_15_CAN,
112 #endif /* R_HAVCE_CRC15_EXTRA */
113 
114 	CRC_PRESET_16,
115 	CRC_PRESET_16_CITT,
116 	CRC_PRESET_16_USB,
117 	CRC_PRESET_16_HDLC,
118 #if R_HAVE_CRC16_EXTRA
119 	CRC_PRESET_CRC16_AUG_CCITT,
120 	CRC_PRESET_CRC16_BUYPASS,
121 	CRC_PRESET_CRC16_CDMA2000,
122 	CRC_PRESET_CRC16_DDS110,
123 	CRC_PRESET_CRC16_DECT_R,
124 	CRC_PRESET_CRC16_DECT_X,
125 	CRC_PRESET_CRC16_DNP,
126 	CRC_PRESET_CRC16_EN13757,
127 	CRC_PRESET_CRC16_GENIBUS,
128 	CRC_PRESET_CRC16_MAXIM,
129 	CRC_PRESET_CRC16_MCRF4XX,
130 	CRC_PRESET_CRC16_RIELLO,
131 	CRC_PRESET_CRC16_T10_DIF,
132 	CRC_PRESET_CRC16_TELEDISK,
133 	CRC_PRESET_CRC16_TMS37157,
134 	CRC_PRESET_CRCA,
135 	CRC_PRESET_CRC16_KERMIT,
136 	CRC_PRESET_CRC16_MODBUS,
137 	CRC_PRESET_CRC16_X25,
138 	CRC_PRESET_CRC16_XMODEM,
139 #endif /* #if R_HAVE_CRC16_EXTRA */
140 
141 #if R_HAVE_CRC24
142 	CRC_PRESET_24,
143 #endif /* #if R_HAVE_CRC24 */
144 
145 	CRC_PRESET_32,
146 	CRC_PRESET_32_ECMA_267,
147 	CRC_PRESET_32C,
148 #if R_HAVE_CRC32_EXTRA
149 	CRC_PRESET_CRC32_BZIP2,
150 	CRC_PRESET_CRC32D,
151 	CRC_PRESET_CRC32_MPEG2,
152 	CRC_PRESET_CRC32_POSIX,
153 	CRC_PRESET_CRC32Q,
154 	CRC_PRESET_CRC32_JAMCRC,
155 	CRC_PRESET_CRC32_XFER,
156 #endif /* #if R_HAVE_CRC32_EXTRA */
157 
158 #if R_HAVE_CRC64
159 	CRC_PRESET_CRC64,
160 #endif /* R_HAVE_CRC64 */
161 
162 #if R_HAVE_CRC64_EXTRA
163 	CRC_PRESET_CRC64_ECMA182,
164 	CRC_PRESET_CRC64_WE,
165 	CRC_PRESET_CRC64_XZ,
166 	CRC_PRESET_CRC64_ISO,
167 #endif /* #if R_HAVE_CRC64_EXTRA */
168 
169 	CRC_PRESET_SIZE
170 };
171 
172 /* Fix names conflict with ruby bindings */
173 #define RHash struct r_hash_t
174 
175 struct r_hash_t {
176 	R_MD5_CTX md5;
177 	R_SHA_CTX sha1;
178 	R_SHA256_CTX sha256;
179 	R_SHA384_CTX sha384;
180 	R_SHA512_CTX sha512;
181 	bool rst;
182 	double entropy;
183 	ut8 R_ALIGNED(8) digest[128];
184 };
185 
186 typedef struct r_hash_seed_t {
187 	int prefix;
188 	ut8 *buf;
189 	int len;
190 } RHashSeed;
191 
192 #define R_HASH_SIZE_CRC8_SMBUS 1
193 #if R_HAVE_CRC8_EXTRA
194 #define R_HASH_SIZE_CRC8_CDMA2000 1
195 #define R_HASH_SIZE_CRC8_DARC 1
196 #define R_HASH_SIZE_CRC8_DVB_S2 1
197 #define R_HASH_SIZE_CRC8_EBU 1
198 #define R_HASH_SIZE_CRC8_ICODE 1
199 #define R_HASH_SIZE_CRC8_ITU 1
200 #define R_HASH_SIZE_CRC8_MAXIM 1
201 #define R_HASH_SIZE_CRC8_ROHC 1
202 #define R_HASH_SIZE_CRC8_WCDMA 1
203 #endif /* #if R_HAVE_CRC8_EXTRA */
204 
205 #if R_HAVE_CRC15_EXTRA
206 #define R_HASH_SIZE_CRC15_CAN 2
207 #endif /* #if R_HAVE_CRC15_EXTRA */
208 
209 #define R_HASH_SIZE_CRC16 2
210 #define R_HASH_SIZE_CRC16_HDLC 2
211 #define R_HASH_SIZE_CRC16_USB 2
212 #define R_HASH_SIZE_CRC16_CITT 2
213 #if R_HAVE_CRC16_EXTRA
214 #define R_HASH_SIZE_CRC16_AUG_CCITT 2
215 #define R_HASH_SIZE_CRC16_BUYPASS 2
216 #define R_HASH_SIZE_CRC16_CDMA2000 2
217 #define R_HASH_SIZE_CRC16_DDS110 2
218 #define R_HASH_SIZE_CRC16_DECT_R 2
219 #define R_HASH_SIZE_CRC16_DECT_X 2
220 #define R_HASH_SIZE_CRC16_DNP 2
221 #define R_HASH_SIZE_CRC16_EN13757 2
222 #define R_HASH_SIZE_CRC16_GENIBUS 2
223 #define R_HASH_SIZE_CRC16_MAXIM 2
224 #define R_HASH_SIZE_CRC16_MCRF4XX 2
225 #define R_HASH_SIZE_CRC16_RIELLO 2
226 #define R_HASH_SIZE_CRC16_T10_DIF 2
227 #define R_HASH_SIZE_CRC16_TELEDISK 2
228 #define R_HASH_SIZE_CRC16_TMS37157 2
229 #define R_HASH_SIZE_CRCA 2
230 #define R_HASH_SIZE_CRC16_KERMIT 2
231 #define R_HASH_SIZE_CRC16_MODBUS 2
232 #define R_HASH_SIZE_CRC16_X25 2
233 #define R_HASH_SIZE_CRC16_XMODEM 2
234 #endif /* #if R_HAVE_CRC16_EXTRA */
235 
236 #if R_HAVE_CRC24
237 #define R_HASH_SIZE_CRC24 3
238 #endif /* #if R_HAVE_CRC24 */
239 
240 #define R_HASH_SIZE_CRC32 4
241 #define R_HASH_SIZE_CRC32C 4
242 #define R_HASH_SIZE_CRC32_ECMA_267 4
243 #if R_HAVE_CRC32_EXTRA
244 #define R_HASH_SIZE_CRC32_BZIP2 4
245 #define R_HASH_SIZE_CRC32D 4
246 #define R_HASH_SIZE_CRC32_MPEG2 4
247 #define R_HASH_SIZE_CRC32_POSIX 4
248 #define R_HASH_SIZE_CRC32Q 4
249 #define R_HASH_SIZE_CRC32_JAMCRC 4
250 #define R_HASH_SIZE_CRC32_XFER 4
251 #endif /* #if R_HAVE_CRC32_EXTRA */
252 
253 #if R_HAVE_CRC64
254 #define R_HASH_SIZE_CRC64 8
255 #endif /* #if R_HAVE_CRC64 */
256 #if R_HAVE_CRC64_EXTRA
257 #define R_HASH_SIZE_CRC64_ECMA182 8
258 #define R_HASH_SIZE_CRC64_WE 8
259 #define R_HASH_SIZE_CRC64_XZ 8
260 #define R_HASH_SIZE_CRC64_ISO 8
261 #endif /* #if R_HAVE_CRC64_EXTRA */
262 
263 #define R_HASH_SIZE_XXHASH 4
264 #define R_HASH_SIZE_MD4 16
265 #define R_HASH_SIZE_MD5 16
266 #define R_HASH_SIZE_SHA1 20
267 #define R_HASH_SIZE_SHA256 32
268 #define R_HASH_SIZE_SHA384 48
269 #define R_HASH_SIZE_SHA512 64
270 #define R_HASH_SIZE_ADLER32 4
271 /* entropy is double !! size 0 for test in r_hash_to_string */
272 #define R_HASH_SIZE_ENTROPY 0
273 #define R_HASH_SIZE_PCPRINT 1
274 #define R_HASH_SIZE_MOD255 1
275 #define R_HASH_SIZE_PARITY 1
276 #define R_HASH_SIZE_XOR 1
277 #define R_HASH_SIZE_XORPAIR 2
278 #define R_HASH_SIZE_HAMDIST 1
279 #define R_HASH_SIZE_LUHN 1
280 #define R_HASH_SIZE_FLETCHER8 1
281 #define R_HASH_SIZE_FLETCHER16 2
282 #define R_HASH_SIZE_FLETCHER32 4
283 #define R_HASH_SIZE_FLETCHER64 8
284 
285 #define R_HASH_NBITS (8*sizeof(ut64))
286 
287 enum HASH_INDICES {
288 	R_HASH_IDX_MD5 = 0,
289 	R_HASH_IDX_SHA1,
290 	R_HASH_IDX_SHA256,
291 	R_HASH_IDX_SHA384,
292 	R_HASH_IDX_SHA512,
293 	R_HASH_IDX_MD4,
294 	R_HASH_IDX_XOR,
295 	R_HASH_IDX_XORPAIR,
296 	R_HASH_IDX_PARITY,
297 	R_HASH_IDX_ENTROPY,
298 	R_HASH_IDX_HAMDIST,
299 	R_HASH_IDX_PCPRINT,
300 	R_HASH_IDX_MOD255,
301 	R_HASH_IDX_XXHASH,
302 	R_HASH_IDX_ADLER32,
303 	R_HASH_IDX_BASE64,
304 	R_HASH_IDX_BASE91,
305 	R_HASH_IDX_PUNYCODE,
306 	R_HASH_IDX_LUHN,
307 
308 	R_HASH_IDX_CRC8_SMBUS,
309 #if R_HAVE_CRC8_EXTRA
310 	R_HASH_IDX_CRC8_CDMA2000,
311 	R_HASH_IDX_CRC8_DARC,
312 	R_HASH_IDX_CRC8_DVB_S2,
313 	R_HASH_IDX_CRC8_EBU,
314 	R_HASH_IDX_CRC8_ICODE,
315 	R_HASH_IDX_CRC8_ITU,
316 	R_HASH_IDX_CRC8_MAXIM,
317 	R_HASH_IDX_CRC8_ROHC,
318 	R_HASH_IDX_CRC8_WCDMA,
319 #endif /* #if R_HAVE_CRC8_EXTRA */
320 
321 #if R_HAVE_CRC15_EXTRA
322 	R_HASH_IDX_CRC15_CAN,
323 #endif /* #if R_HAVE_CRC15_EXTRA */
324 
325 	R_HASH_IDX_CRC16,
326 	R_HASH_IDX_CRC16_HDLC,
327 	R_HASH_IDX_CRC16_USB,
328 	R_HASH_IDX_CRC16_CITT,
329 #if R_HAVE_CRC16_EXTRA
330 	R_HASH_IDX_CRC16_AUG_CCITT,
331 	R_HASH_IDX_CRC16_BUYPASS,
332 	R_HASH_IDX_CRC16_CDMA2000,
333 	R_HASH_IDX_CRC16_DDS110,
334 	R_HASH_IDX_CRC16_DECT_R,
335 	R_HASH_IDX_CRC16_DECT_X,
336 	R_HASH_IDX_CRC16_DNP,
337 	R_HASH_IDX_CRC16_EN13757,
338 	R_HASH_IDX_CRC16_GENIBUS,
339 	R_HASH_IDX_CRC16_MAXIM,
340 	R_HASH_IDX_CRC16_MCRF4XX,
341 	R_HASH_IDX_CRC16_RIELLO,
342 	R_HASH_IDX_CRC16_T10_DIF,
343 	R_HASH_IDX_CRC16_TELEDISK,
344 	R_HASH_IDX_CRC16_TMS37157,
345 	R_HASH_IDX_CRCA,
346 	R_HASH_IDX_CRC16_KERMIT,
347 	R_HASH_IDX_CRC16_MODBUS,
348 	R_HASH_IDX_CRC16_X25,
349 	R_HASH_IDX_CRC16_XMODEM,
350 #endif /* #if R_HAVE_CRC16_EXTRA */
351 
352 #if R_HAVE_CRC24
353 	R_HASH_IDX_CRC24,
354 #endif /* #if R_HAVE_CRC24 */
355 
356 	R_HASH_IDX_CRC32,
357 	R_HASH_IDX_CRC32C,
358 	R_HASH_IDX_CRC32_ECMA_267,
359 #if R_HAVE_CRC32_EXTRA
360 	R_HASH_IDX_CRC32_BZIP2,
361 	R_HASH_IDX_CRC32D,
362 	R_HASH_IDX_CRC32_MPEG2,
363 	R_HASH_IDX_CRC32_POSIX,
364 	R_HASH_IDX_CRC32Q,
365 	R_HASH_IDX_CRC32_JAMCRC,
366 	R_HASH_IDX_CRC32_XFER,
367 #endif /* #if R_HAVE_CRC32_EXTRA */
368 
369 #if R_HAVE_CRC64
370 	R_HASH_IDX_CRC64,
371 #endif /* #if R_HAVE_CRC64 */
372 #if R_HAVE_CRC64_EXTRA
373 	R_HASH_IDX_CRC64_ECMA182,
374 	R_HASH_IDX_CRC64_WE,
375 	R_HASH_IDX_CRC64_XZ,
376 	R_HASH_IDX_CRC64_ISO,
377 #endif /* #if R_HAVE_CRC64_EXTRA */
378 
379 	R_HASH_IDX_FLETCHER8,
380 	R_HASH_IDX_FLETCHER16,
381 	R_HASH_IDX_FLETCHER32,
382 	R_HASH_IDX_FLETCHER64,
383 	R_HASH_NUM_INDICES
384 };
385 
386 #define R_HASH_NONE 0
387 #define R_HASH_MD5 (1ULL << R_HASH_IDX_MD5)
388 #define R_HASH_SHA1 (1ULL << R_HASH_IDX_SHA1)
389 #define R_HASH_SHA256 (1ULL << R_HASH_IDX_SHA256)
390 #define R_HASH_SHA384 (1ULL << R_HASH_IDX_SHA384)
391 #define R_HASH_SHA512 (1ULL << R_HASH_IDX_SHA512)
392 #define R_HASH_MD4 (1ULL << R_HASH_IDX_MD4)
393 #define R_HASH_XOR (1ULL << R_HASH_IDX_XOR)
394 #define R_HASH_XORPAIR (1ULL << R_HASH_IDX_XORPAIR)
395 #define R_HASH_PARITY (1ULL << R_HASH_IDX_PARITY)
396 #define R_HASH_ENTROPY (1ULL << R_HASH_IDX_ENTROPY)
397 #define R_HASH_HAMDIST (1ULL << R_HASH_IDX_HAMDIST)
398 #define R_HASH_PCPRINT (1ULL << R_HASH_IDX_PCPRINT)
399 #define R_HASH_MOD255 (1ULL << R_HASH_IDX_MOD255)
400 #define R_HASH_XXHASH (1ULL << R_HASH_IDX_XXHASH)
401 #define R_HASH_ADLER32 (1ULL << R_HASH_IDX_ADLER32)
402 #define R_HASH_BASE64 (1ULL << R_HASH_IDX_BASE64)
403 #define R_HASH_BASE91 (1ULL << R_HASH_IDX_BASE91)
404 #define R_HASH_PUNYCODE (1ULL << R_HASH_IDX_PUNYCODE)
405 #define R_HASH_LUHN (1ULL << R_HASH_IDX_LUHN)
406 #define R_HASH_FLETCHER8 (1ULL << R_HASH_IDX_FLETCHER8)
407 #define R_HASH_FLETCHER16 (1ULL << R_HASH_IDX_FLETCHER16)
408 #define R_HASH_FLETCHER32 (1ULL << R_HASH_IDX_FLETCHER32)
409 #define R_HASH_FLETCHER64 (1ULL << R_HASH_IDX_FLETCHER64)
410 
411 #define R_HASH_CRC8_SMBUS (1ULL << R_HASH_IDX_CRC8_SMBUS)
412 #if R_HAVE_CRC8_EXTRA
413 #define R_HASH_CRC8_CDMA2000 (1ULL << R_HASH_IDX_CRC8_CDMA2000)
414 #define R_HASH_CRC8_DARC (1ULL << R_HASH_IDX_CRC8_DARC)
415 #define R_HASH_CRC8_DVB_S2 (1ULL << R_HASH_IDX_CRC8_DVB_S2)
416 #define R_HASH_CRC8_EBU (1ULL << R_HASH_IDX_CRC8_EBU)
417 #define R_HASH_CRC8_ICODE (1ULL << R_HASH_IDX_CRC8_ICODE)
418 #define R_HASH_CRC8_ITU (1ULL << R_HASH_IDX_CRC8_ITU)
419 #define R_HASH_CRC8_MAXIM (1ULL << R_HASH_IDX_CRC8_MAXIM)
420 #define R_HASH_CRC8_ROHC (1ULL << R_HASH_IDX_CRC8_ROHC)
421 #define R_HASH_CRC8_WCDMA (1ULL << R_HASH_IDX_CRC8_WCDMA)
422 #endif /* #if R_HAVE_CRC8_EXTRA */
423 
424 #if R_HAVE_CRC15_EXTRA
425 #define R_HASH_CRC15_CAN (1ULL << R_HASH_IDX_CRC15_CAN)
426 #endif /* #if R_HAVE_CRC15_EXTRA */
427 
428 #define R_HASH_CRC16 (1ULL << R_HASH_IDX_CRC16)
429 #define R_HASH_CRC16_HDLC (1ULL << R_HASH_IDX_CRC16_HDLC)
430 #define R_HASH_CRC16_USB (1ULL << R_HASH_IDX_CRC16_USB)
431 #define R_HASH_CRC16_CITT (1ULL << R_HASH_IDX_CRC16_CITT)
432 #if R_HAVE_CRC16_EXTRA
433 #define R_HASH_CRC16_AUG_CCITT (1ULL << R_HASH_IDX_CRC16_AUG_CCITT)
434 #define R_HASH_CRC16_BUYPASS (1ULL << R_HASH_IDX_CRC16_BUYPASS)
435 #define R_HASH_CRC16_CDMA2000 (1ULL << R_HASH_IDX_CRC16_CDMA2000)
436 #define R_HASH_CRC16_DDS110 (1ULL << R_HASH_IDX_CRC16_DDS110)
437 #define R_HASH_CRC16_DECT_R (1ULL << R_HASH_IDX_CRC16_DECT_R)
438 #define R_HASH_CRC16_DECT_X (1ULL << R_HASH_IDX_CRC16_DECT_X)
439 #define R_HASH_CRC16_DNP (1ULL << R_HASH_IDX_CRC16_DNP)
440 #define R_HASH_CRC16_EN13757 (1ULL << R_HASH_IDX_CRC16_EN13757)
441 #define R_HASH_CRC16_GENIBUS (1ULL << R_HASH_IDX_CRC16_GENIBUS)
442 #define R_HASH_CRC16_MAXIM (1ULL << R_HASH_IDX_CRC16_MAXIM)
443 #define R_HASH_CRC16_MCRF4XX (1ULL << R_HASH_IDX_CRC16_MCRF4XX)
444 #define R_HASH_CRC16_RIELLO (1ULL << R_HASH_IDX_CRC16_RIELLO)
445 #define R_HASH_CRC16_T10_DIF (1ULL << R_HASH_IDX_CRC16_T10_DIF)
446 #define R_HASH_CRC16_TELEDISK (1ULL << R_HASH_IDX_CRC16_TELEDISK)
447 #define R_HASH_CRC16_TMS37157 (1ULL << R_HASH_IDX_CRC16_TMS37157)
448 #define R_HASH_CRCA (1ULL << R_HASH_IDX_CRCA)
449 #define R_HASH_CRC16_KERMIT (1ULL << R_HASH_IDX_CRC16_KERMIT)
450 #define R_HASH_CRC16_MODBUS (1ULL << R_HASH_IDX_CRC16_MODBUS)
451 #define R_HASH_CRC16_X25 (1ULL << R_HASH_IDX_CRC16_X25)
452 #define R_HASH_CRC16_XMODEM (1ULL << R_HASH_IDX_CRC16_XMODEM)
453 #endif /* #if R_HAVE_CRC16_EXTRA */
454 
455 #if R_HAVE_CRC24
456 #define R_HASH_CRC24 (1ULL << R_HASH_IDX_CRC24)
457 #endif /* #if R_HAVE_CRC24 */
458 
459 #define R_HASH_CRC32 (1ULL << R_HASH_IDX_CRC32)
460 #define R_HASH_CRC32C (1ULL << R_HASH_IDX_CRC32C)
461 #define R_HASH_CRC32_ECMA_267 (1ULL << R_HASH_IDX_CRC32_ECMA_267)
462 #if R_HAVE_CRC32_EXTRA
463 #define R_HASH_CRC32_BZIP2 (1ULL << R_HASH_IDX_CRC32_BZIP2)
464 #define R_HASH_CRC32D (1ULL << R_HASH_IDX_CRC32D)
465 #define R_HASH_CRC32_MPEG2 (1ULL << R_HASH_IDX_CRC32_MPEG2)
466 #define R_HASH_CRC32_POSIX (1ULL << R_HASH_IDX_CRC32_POSIX)
467 #define R_HASH_CRC32Q (1ULL << R_HASH_IDX_CRC32Q)
468 #define R_HASH_CRC32_JAMCRC (1ULL << R_HASH_IDX_CRC32_JAMCRC)
469 #define R_HASH_CRC32_XFER (1ULL << R_HASH_IDX_CRC32_XFER)
470 #endif /* #if R_HAVE_CRC32_EXTRA */
471 
472 #if R_HAVE_CRC64
473 #define R_HASH_CRC64 (1ULL << R_HASH_IDX_CRC64)
474 #endif /* #if R_HAVE_CRC64 */
475 #if R_HAVE_CRC64_EXTRA
476 #define R_HASH_CRC64_ECMA182 (1ULL << R_HASH_IDX_CRC64_ECMA182)
477 #define R_HASH_CRC64_WE (1ULL << R_HASH_IDX_CRC64_WE)
478 #define R_HASH_CRC64_XZ (1ULL << R_HASH_IDX_CRC64_XZ)
479 #define R_HASH_CRC64_ISO (1ULL << R_HASH_IDX_CRC64_ISO)
480 #endif /* #if R_HAVE_CRC64 */
481 
482 #define R_HASH_ALL ((1ULL << R_MIN(63, R_HASH_NUM_INDICES))-1)
483 
484 #ifdef R_API
485 /* OO */
486 R_API RHash *r_hash_new(bool rst, ut64 flags);
487 R_API void r_hash_free(RHash *ctx);
488 
489 /* methods */
490 R_API ut8 *r_hash_do_md4(RHash *ctx, const ut8 *input, int len);
491 R_API ut8 *r_hash_do_md5(RHash *ctx, const ut8 *input, int len);
492 R_API ut8 *r_hash_do_sha1(RHash *ctx, const ut8 *input, int len);
493 R_API ut8 *r_hash_do_sha256(RHash *ctx, const ut8 *input, int len);
494 R_API ut8 *r_hash_do_sha384(RHash *ctx, const ut8 *input, int len);
495 R_API ut8 *r_hash_do_sha512(RHash *ctx, const ut8 *input, int len);
496 R_API ut8 *r_hash_do_hmac_sha256(RHash *ctx, const ut8 *input, int len, const ut8 *key, int klen);
497 
498 R_API char *r_hash_to_string(RHash *ctx, const char *name, const ut8 *data, int len);
499 
500 /* static methods */
501 R_API const char *r_hash_name(ut64 bit);
502 R_API ut64 r_hash_name_to_bits(const char *name);
503 R_API int r_hash_size(ut64 bit);
504 R_API int r_hash_calculate(RHash *ctx, ut64 algobit, const ut8 *input, int len);
505 
506 /* checksums */
507 /* XXX : crc16 should use 0 as arg0 by default */
508 /* static methods */
509 R_API ut8 r_hash_deviation(const ut8 *b, ut64 len);
510 R_API ut32 r_hash_adler32(const ut8 *buf, int len);
511 R_API ut32 r_hash_xxhash(const ut8 *buf, ut64 len);
512 R_API ut8 r_hash_xor(const ut8 *b, ut64 len);
513 R_API ut16 r_hash_xorpair(const ut8 *a, ut64 len);
514 R_API int r_hash_parity(const ut8 *buf, ut64 len);
515 R_API ut8 r_hash_mod255(const ut8 *b, ut64 len);
516 R_API ut64 r_hash_luhn(const ut8 *buf, ut64 len);
517 R_API utcrc r_hash_crc_preset (const ut8 *data, ut32 size, enum CRC_PRESETS preset);
518 
519 /* analysis */
520 R_API ut8  r_hash_hamdist(const ut8 *buf, int len);
521 R_API double r_hash_entropy(const ut8 *data, ut64 len);
522 R_API double r_hash_entropy_fraction(const ut8 *data, ut64 len);
523 R_API int r_hash_pcprint(const ut8 *buffer, ut64 len);
524 
525 /* lifecycle */
526 R_API void r_hash_do_begin(RHash *ctx, ut64 flags);
527 R_API void r_hash_do_end(RHash *ctx, ut64 flags);
528 R_API void r_hash_do_spice(RHash *ctx, ut64 algo, int loops, RHashSeed *seed);
529 #endif
530 
531 #ifdef __cplusplus
532 }
533 #endif
534 
535 #endif
536