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