summaryrefslogtreecommitdiffstats
path: root/src/lib/hash-method.h
blob: c4250de0a7c4ebb468bd77539491f4bcd2add625 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#ifndef HASH_METHOD_H
#define HASH_METHOD_H

#include "buffer.h"

struct hash_method {
	const char *name;
	/* Block size for the algorithm */
	unsigned int block_size;
	/* Number of bytes that must be allocated for context */
	unsigned int context_size;
	/* Number of bytes that must be allocated for result()'s digest */
	unsigned int digest_size;

	void (*init)(void *context);
	void (*loop)(void *context, const void *data, size_t size);
	void (*result)(void *context, unsigned char *digest_r);
};

const struct hash_method *hash_method_lookup(const char *name);

/* NULL-terminated list of all hash methods */
extern const struct hash_method *hash_methods[];

void hash_method_get_digest(const struct hash_method *meth,
			    const void *data, size_t data_len,
			    unsigned char *result_r);

/** Simple datastack helpers for digesting (hashing)

 * USAGE:

 buffer_t *result = t_hash_str(hash_method_lookup("sha256"), "hello world");
 const char *hex = binary_to_hex(result->data, result->used);

*/

buffer_t *t_hash_data(const struct hash_method *meth,
		      const void *data, size_t data_len);

static inline
buffer_t *t_hash_buffer(const struct hash_method *meth,
			const buffer_t *data)
{
	return t_hash_data(meth, data->data, data->used);
}

static inline
buffer_t *t_hash_str(const struct hash_method *meth,
		     const char *data)
{
	return t_hash_data(meth, data, strlen(data));
}

#endif