radare2/libr/include/r_hash.h
2017-04-11 22:47:16 +02:00

199 lines
5.0 KiB
C

#ifndef R2_HASH_H
#define R2_HASH_H
#include "r_types.h"
#ifdef __cplusplus
extern "C" {
#endif
R_LIB_VERSION_HEADER (r_hash);
#define MD5_CTX R_MD5_CTX
/* hashing */
typedef struct {
ut32 state[4];
ut32 count[2];
ut8 buffer[64];
} R_MD5_CTX;
typedef struct {
ut32 H[5];
ut32 W[80];
int lenW;
ut32 sizeHi, sizeLo;
} R_SHA_CTX;
typedef struct {
ut32 crc;
ut32 size;
int reflect;
ut32 poly;
ut32 xout;
} R_CRC_CTX;
enum CRC_PRESETS {
CRC_PRESET_32 = 0,
CRC_PRESET_16,
CRC_PRESET_32_ECMA_267,
CRC_PRESET_32C,
CRC_PRESET_24,
CRC_PRESET_16_CITT,
CRC_PRESET_16_USB,
CRC_PRESET_16_HDLC,
CRC_PRESET_15_CAN,
CRC_PRESET_8_SMBUS,
CRC_PRESET_SIZE
};
#define SHA256_BLOCK_LENGTH 64
typedef struct _SHA256_CTX {
ut32 state[8];
ut64 bitcount;
ut8 buffer[SHA256_BLOCK_LENGTH];
} R_SHA256_CTX;
#define SHA384_BLOCK_LENGTH 128
#define SHA512_BLOCK_LENGTH 128
typedef struct _SHA512_CTX {
ut64 state[8];
ut64 bitcount[2];
ut8 buffer[SHA512_BLOCK_LENGTH];
} R_SHA512_CTX;
typedef R_SHA512_CTX R_SHA384_CTX;
/* Fix names conflict with ruby bindings */
#define RHash struct r_hash_t
struct r_hash_t {
R_MD5_CTX md5;
R_SHA_CTX sha1;
R_SHA256_CTX sha256;
R_SHA384_CTX sha384;
R_SHA512_CTX sha512;
bool rst;
ut8 digest[128];
};
typedef struct r_hash_seed_t {
int prefix;
ut8 *buf;
int len;
} RHashSeed;
#define R_HASH_SIZE_CRC8_SMBUS 1
#define R_HASH_SIZE_CRC15_CAN 2
#define R_HASH_SIZE_CRC16 2
#define R_HASH_SIZE_CRC16_HDLC 2
#define R_HASH_SIZE_CRC16_USB 2
#define R_HASH_SIZE_CRC16_CITT 2
#define R_HASH_SIZE_CRC24 3
#define R_HASH_SIZE_CRC32 4
#define R_HASH_SIZE_CRC32C 4
#define R_HASH_SIZE_CRC32_ECMA_267 4
#define R_HASH_SIZE_XXHASH 4
#define R_HASH_SIZE_MD4 16
#define R_HASH_SIZE_MD5 16
#define R_HASH_SIZE_SHA1 20
#define R_HASH_SIZE_SHA256 32
#define R_HASH_SIZE_SHA384 48
#define R_HASH_SIZE_SHA512 64
#define R_HASH_SIZE_ADLER32 4
/* entropy is double !! fail with size 4 */
#define R_HASH_SIZE_ENTROPY 4
#define R_HASH_SIZE_PCPRINT 1
#define R_HASH_SIZE_MOD255 1
#define R_HASH_SIZE_PARITY 1
#define R_HASH_SIZE_XOR 1
#define R_HASH_SIZE_XORPAIR 2
#define R_HASH_SIZE_HAMDIST 1
#define R_HASH_SIZE_LUHN 1
#define R_HASH_NBITS (8*sizeof(ut64))
#define R_HASH_NONE 0
#define R_HASH_MD5 1
#define R_HASH_SHA1 1 << 1
#define R_HASH_SHA256 1 << 2
#define R_HASH_SHA384 1 << 3
#define R_HASH_SHA512 1 << 4
#define R_HASH_CRC16 1 << 5
#define R_HASH_CRC32 1 << 6
#define R_HASH_MD4 1 << 7
#define R_HASH_XOR 1 << 8
#define R_HASH_XORPAIR 1 << 9
#define R_HASH_PARITY 1 << 10
#define R_HASH_ENTROPY 1 << 11
#define R_HASH_HAMDIST 1 << 12
#define R_HASH_PCPRINT 1 << 13
#define R_HASH_MOD255 1 << 14
#define R_HASH_XXHASH 1 << 15
#define R_HASH_ADLER32 1 << 16
#define R_HASH_BASE64 1 << 17
#define R_HASH_BASE91 1 << 18
#define R_HASH_PUNYCODE 1 << 19
#define R_HASH_LUHN 1 << 20
#define R_HASH_CRC8_SMBUS 1 << 21
#define R_HASH_CRC15_CAN 1 << 22
#define R_HASH_CRC16_HDLC 1 << 23
#define R_HASH_CRC16_USB 1 << 24
#define R_HASH_CRC16_CITT 1 << 25
#define R_HASH_CRC24 1 << 26
#define R_HASH_CRC32C 1 << 27
#define R_HASH_CRC32_ECMA_267 1 << 28
#define R_HASH_ALL 0x1FFFFFFFF
#ifdef R_API
/* OO */
R_API RHash *r_hash_new(bool rst, int flags);
R_API void r_hash_free(RHash *ctx);
/* methods */
R_API ut8 *r_hash_do_md4(RHash *ctx, const ut8 *input, int len);
R_API ut8 *r_hash_do_md5(RHash *ctx, const ut8 *input, int len);
R_API ut8 *r_hash_do_sha1(RHash *ctx, const ut8 *input, int len);
R_API ut8 *r_hash_do_sha256(RHash *ctx, const ut8 *input, int len);
R_API ut8 *r_hash_do_sha384(RHash *ctx, const ut8 *input, int len);
R_API ut8 *r_hash_do_sha512(RHash *ctx, const ut8 *input, int len);
R_API ut8 *r_hash_do_xxhash(RHash *ctx, const ut8 *input, int len);
R_API char *r_hash_to_string(RHash *ctx, const char *name, const ut8 *data, int len);
/* static methods */
R_API const char *r_hash_name(ut64 bit);
R_API ut64 r_hash_name_to_bits(const char *name);
R_API int r_hash_size(ut64 bit);
R_API int r_hash_calculate(RHash *ctx, ut64 algobit, const ut8 *input, int len);
/* checksums */
/* XXX : crc16 should use 0 as arg0 by default */
/* static methods */
R_API ut8 r_hash_deviation(const ut8 *b, ut64 len);
R_API ut32 r_hash_adler32(const ut8 *buf, int len);
R_API ut32 r_hash_xxhash(const ut8 *buf, ut64 len);
R_API ut8 r_hash_xor(const ut8 *b, ut64 len);
R_API ut16 r_hash_xorpair(const ut8 *a, ut64 len);
R_API int r_hash_parity(const ut8 *buf, ut64 len);
R_API ut8 r_hash_mod255(const ut8 *b, ut64 len);
R_API ut64 r_hash_luhn(const ut8 *buf, ut64 len);
R_API ut32 r_hash_crc_preset (const ut8 *data, ut32 size, enum CRC_PRESETS preset);
/* analysis */
R_API ut8 r_hash_hamdist(const ut8 *buf, int len);
R_API double r_hash_entropy(const ut8 *data, ut64 len);
R_API double r_hash_entropy_fraction(const ut8 *data, ut64 len);
R_API int r_hash_pcprint(const ut8 *buffer, ut64 len);
/* lifecycle */
R_API void r_hash_do_begin(RHash *ctx, int flags);
R_API void r_hash_do_end(RHash *ctx, int flags);
R_API void r_hash_do_spice(RHash *ctx, int algo, int loops, RHashSeed *seed);
#endif
#ifdef __cplusplus
}
#endif
#endif