blob: d1940cb18c4859f76a09fa035fba12a5d4c55cfc [file] [log] [blame]
Roman Peniaev35c31fe2014-07-21 21:53:44 +09001/*
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