1/*
2 * HMAC-SHA-224/256/384/512 implementation
3 * Last update: 06/15/2005
4 * Issue date:  06/15/2005
5 *
6 * Since this code has been incorporated into a GPLv2 project, it is
7 * distributed under GPLv2 inside mmc-utils.  The original BSD license
8 * that the code was released under is included below for clarity.
9 *
10 * Copyright (C) 2005 Olivier Gay <olivier.gay@a3.epfl.ch>
11 * All rights reserved.
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 *    notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 *    notice, this list of conditions and the following disclaimer in the
20 *    documentation and/or other materials provided with the distribution.
21 * 3. Neither the name of the project nor the names of its contributors
22 *    may be used to endorse or promote products derived from this software
23 *    without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * SUCH DAMAGE.
36 */
37
38#ifndef HMAC_SHA2_H
39#define HMAC_SHA2_H
40
41#include "sha2.h"
42
43#ifdef __cplusplus
44extern "C" {
45#endif
46
47typedef struct {
48    sha224_ctx ctx_inside;
49    sha224_ctx ctx_outside;
50
51    /* for hmac_reinit */
52    sha224_ctx ctx_inside_reinit;
53    sha224_ctx ctx_outside_reinit;
54
55    unsigned char block_ipad[SHA224_BLOCK_SIZE];
56    unsigned char block_opad[SHA224_BLOCK_SIZE];
57} hmac_sha224_ctx;
58
59typedef struct {
60    sha256_ctx ctx_inside;
61    sha256_ctx ctx_outside;
62
63    /* for hmac_reinit */
64    sha256_ctx ctx_inside_reinit;
65    sha256_ctx ctx_outside_reinit;
66
67    unsigned char block_ipad[SHA256_BLOCK_SIZE];
68    unsigned char block_opad[SHA256_BLOCK_SIZE];
69} hmac_sha256_ctx;
70
71typedef struct {
72    sha384_ctx ctx_inside;
73    sha384_ctx ctx_outside;
74
75    /* for hmac_reinit */
76    sha384_ctx ctx_inside_reinit;
77    sha384_ctx ctx_outside_reinit;
78
79    unsigned char block_ipad[SHA384_BLOCK_SIZE];
80    unsigned char block_opad[SHA384_BLOCK_SIZE];
81} hmac_sha384_ctx;
82
83typedef struct {
84    sha512_ctx ctx_inside;
85    sha512_ctx ctx_outside;
86
87    /* for hmac_reinit */
88    sha512_ctx ctx_inside_reinit;
89    sha512_ctx ctx_outside_reinit;
90
91    unsigned char block_ipad[SHA512_BLOCK_SIZE];
92    unsigned char block_opad[SHA512_BLOCK_SIZE];
93} hmac_sha512_ctx;
94
95void hmac_sha224_init(hmac_sha224_ctx *ctx, const unsigned char *key,
96                      unsigned int key_size);
97void hmac_sha224_reinit(hmac_sha224_ctx *ctx);
98void hmac_sha224_update(hmac_sha224_ctx *ctx, const unsigned char *message,
99                        unsigned int message_len);
100void hmac_sha224_final(hmac_sha224_ctx *ctx, unsigned char *mac,
101                       unsigned int mac_size);
102void hmac_sha224(const unsigned char *key, unsigned int key_size,
103                 const unsigned char *message, unsigned int message_len,
104                 unsigned char *mac, unsigned mac_size);
105
106void hmac_sha256_init(hmac_sha256_ctx *ctx, const unsigned char *key,
107                      unsigned int key_size);
108void hmac_sha256_reinit(hmac_sha256_ctx *ctx);
109void hmac_sha256_update(hmac_sha256_ctx *ctx, const unsigned char *message,
110                        unsigned int message_len);
111void hmac_sha256_final(hmac_sha256_ctx *ctx, unsigned char *mac,
112                       unsigned int mac_size);
113void hmac_sha256(const unsigned char *key, unsigned int key_size,
114                 const unsigned char *message, unsigned int message_len,
115                 unsigned char *mac, unsigned mac_size);
116
117void hmac_sha384_init(hmac_sha384_ctx *ctx, const unsigned char *key,
118                      unsigned int key_size);
119void hmac_sha384_reinit(hmac_sha384_ctx *ctx);
120void hmac_sha384_update(hmac_sha384_ctx *ctx, const unsigned char *message,
121                        unsigned int message_len);
122void hmac_sha384_final(hmac_sha384_ctx *ctx, unsigned char *mac,
123                       unsigned int mac_size);
124void hmac_sha384(const unsigned char *key, unsigned int key_size,
125                 const unsigned char *message, unsigned int message_len,
126                 unsigned char *mac, unsigned mac_size);
127
128void hmac_sha512_init(hmac_sha512_ctx *ctx, const unsigned char *key,
129                      unsigned int key_size);
130void hmac_sha512_reinit(hmac_sha512_ctx *ctx);
131void hmac_sha512_update(hmac_sha512_ctx *ctx, const unsigned char *message,
132                        unsigned int message_len);
133void hmac_sha512_final(hmac_sha512_ctx *ctx, unsigned char *mac,
134                       unsigned int mac_size);
135void hmac_sha512(const unsigned char *key, unsigned int key_size,
136                 const unsigned char *message, unsigned int message_len,
137                 unsigned char *mac, unsigned mac_size);
138
139#ifdef __cplusplus
140}
141#endif
142
143#endif /* !HMAC_SHA2_H */
144
145