aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan/plugins/openssl/openssl_hmac.h
blob: 175513c2fb0f9d7e18af7783c0f8e4865ea48d7b (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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/*
 * Copyright (C) 2012 Tobias Brunner
 * Hochschule fuer Technik Rapperswil
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

/**
 * @defgroup openssl_hmac openssl_hmac
 * @{ @ingroup openssl_p
 */

#ifndef OPENSSL_HMAC_H_
#define OPENSSL_HMAC_H_

typedef struct openssl_hmac_t openssl_hmac_t;

#include <crypto/hashers/hasher.h>

/**
 * Simple wrapper around OpenSSL's functions to calculate HMAC message
 * authentication codes
 */
struct openssl_hmac_t {

	/**
	 * Generate message authentication code.
	 *
	 * If out is NULL, no result is given back.  A next call will
	 * append the data to already supplied data.  If out is not NULL,
	 * the mac of all apended data is calculated, written to out and the
	 * internal state is reset.
	 *
	 * @param data		chunk of data to authenticate
	 * @param out		pointer where the generated bytes will be written
	 */
	void (*get_mac)(openssl_hmac_t *this, chunk_t data, u_int8_t *out);

	/**
	 * Generates message authentication code and allocates memory for it.
	 *
	 * If out is NULL, no result is given back.  A next call will
	 * append the data to already supplied data.  If out is not NULL,
	 * the mac of all apended data is calculated, returned in out and the
	 * internal state is reset;
	 *
	 * @param data		chunk of data to authenticate
	 * @param out		chunk which will hold generated bytes
	 */
	void (*allocate_mac)(openssl_hmac_t *this, chunk_t data, chunk_t *out);

	/**
	 * Get the size of the resulting MAC.
	 *
	 * @return			block size in bytes
	 */
	size_t (*get_block_size)(openssl_hmac_t *this);

	/**
	 * Set the key to be used for the HMAC.
	 *
	 * Any key length is accepted.
	 *
	 * @param key		key to set
	 */
	void (*set_key)(openssl_hmac_t *this, chunk_t key);

	/**
	 * Destroys an openssl_hmac_t object.
	 */
	void (*destroy)(openssl_hmac_t *this);
};

/**
 * Creates a new openssl_hmac_t object.
 *
 * @param algo			hash algorithm to use
 * @return				openssl_hmac_t object, NULL if not supported
 */
openssl_hmac_t *openssl_hmac_create(hash_algorithm_t algo);

#endif /** OPENSSL_HMAC_H_ @}*/