summaryrefslogtreecommitdiffstats
path: root/lib/isc/include/isc/hmac.h
blob: 68b63d478a9e0cc83fb63be6f51f7e8d3e6dbcc0 (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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
 *
 * SPDX-License-Identifier: MPL-2.0
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, you can obtain one at https://mozilla.org/MPL/2.0/.
 *
 * See the COPYRIGHT file distributed with this work for additional
 * information regarding copyright ownership.
 */

/*!
 * \file isc/hmac.h
 * \brief This is the header for for message authentication code.
 */

#pragma once

#include <isc/lang.h>
#include <isc/md.h>
#include <isc/result.h>
#include <isc/types.h>

typedef void isc_hmac_t;

/**
 * isc_hmac:
 * @type: the digest type
 * @key: the key
 * @keylen: the length of the key
 * @buf: data to hash
 * @len: length of the data to hash
 * @digest: the output buffer
 * @digestlen: in: the length of @digest
 *             out: the length of the data written to @digest
 *
 * This function computes the message authentication code using a digest type
 * @type with key @key which is @keylen bytes long from data in @buf which is
 * @len bytes long, and places the output into @digest, which must have space
 * for the hash function output (use ISC_MAX_MD_SIZE if unsure). @digestlen
 * is used to pass in the length of the digest buffer and returns the length
 * of digest written to @digest.
 */
isc_result_t
isc_hmac(const isc_md_type_t *type, const void *key, const size_t keylen,
	 const unsigned char *buf, const size_t len, unsigned char *digest,
	 unsigned int *digestlen);

/**
 * isc_hmac_new:
 *
 * This function allocates, initializes and returns HMAC context.
 */
isc_hmac_t *
isc_hmac_new(void);

/**
 * isc_hmac_free:
 * @md: HMAC context
 *
 * This function cleans up HMAC context and frees up the space allocated to it.
 */
void
isc_hmac_free(isc_hmac_t *hmac);

/**
 * isc_hmac_init:
 * @md: HMAC context
 * @key: HMAC key
 * @keylen: HMAC key length
 * @type: digest type
 *
 * This function sets up HMAC context to use a hash function of @type and key
 * @key which is @keylen bytes long.
 */

isc_result_t
isc_hmac_init(isc_hmac_t *hmac, const void *key, const size_t keylen,
	      const isc_md_type_t *type);

/**
 * isc_hmac_reset:
 * @hmac: HMAC context
 *
 * This function resets the HMAC context.  This can be used to reuse an already
 * existing context.
 */
isc_result_t
isc_hmac_reset(isc_hmac_t *hmac);

/**
 * isc_hmac_update:
 * @hmac: HMAC context
 * @buf: data to hash
 * @len: length of the data to hash
 *
 * This function can be called repeatedly with chunks of the message @buf to be
 * authenticated which is @len bytes long.
 */
isc_result_t
isc_hmac_update(isc_hmac_t *hmac, const unsigned char *buf, const size_t len);

/**
 * isc_hmac_final:
 * @hmac: HMAC context
 * @digest: the output buffer
 * @digestlen: in: the length of @digest
 *             out: the length of the data written to @digest
 *
 * This function retrieves the message authentication code from @hmac and places
 * it in @digest, which must have space for the hash function output. @digestlen
 * is used to pass in the length of the digest buffer and returns the length
 * of digest written to @digest.  After calling this function no additional
 * calls to isc_hmac_update() can be made.
 */
isc_result_t
isc_hmac_final(isc_hmac_t *hmac, unsigned char *digest,
	       unsigned int *digestlen);

/**
 * isc_hmac_md_type:
 * @hmac: HMAC context
 *
 * This function return the isc_md_type_t previously set for the supplied
 * HMAC context or NULL if no isc_md_type_t has been set.
 */
const isc_md_type_t *
isc_hmac_get_md_type(isc_hmac_t *hmac);

/**
 * isc_hmac_get_size:
 *
 * This function return the size of the message digest when passed an isc_hmac_t
 * structure, i.e. the size of the hash.
 */
size_t
isc_hmac_get_size(isc_hmac_t *hmac);

/**
 * isc_hmac_get_block_size:
 *
 * This function return the block size of the message digest when passed an
 * isc_hmac_t structure.
 */
int
isc_hmac_get_block_size(isc_hmac_t *hmac);