GCM: Add support for split data buffers and online operation
[libgcrypt.git] / cipher / mac-internal.h
1 /* mac-internal.h  -  Internal defs for mac.c
2  * Copyright © 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
3  *
4  * This file is part of Libgcrypt.
5  *
6  * Libgcrypt is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser general Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * Libgcrypt is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 /* The data object used to hold a handle to an encryption object.  */
21 struct gcry_mac_handle;
22 typedef struct gcry_mac_handle *gcry_mac_hd_t;
23
24 \f
25 /*
26  *
27  * Message authentication code related definitions.
28  *
29  */
30
31
32 /* Magic values for the context structure.  */
33 #define CTX_MAGIC_NORMAL 0x59d9b8af
34 #define CTX_MAGIC_SECURE 0x12c27cd0
35
36
37 /* MAC module functions. */
38 typedef gcry_err_code_t (*gcry_mac_open_func_t)(gcry_mac_hd_t h);
39 typedef void (*gcry_mac_close_func_t)(gcry_mac_hd_t h);
40 typedef gcry_err_code_t (*gcry_mac_setkey_func_t)(gcry_mac_hd_t h,
41                                                   const unsigned char *key,
42                                                   size_t keylen);
43 typedef gcry_err_code_t (*gcry_mac_setiv_func_t)(gcry_mac_hd_t h,
44                                                  const unsigned char *iv,
45                                                  size_t ivlen);
46 typedef gcry_err_code_t (*gcry_mac_reset_func_t)(gcry_mac_hd_t h);
47 typedef gcry_err_code_t (*gcry_mac_write_func_t)(gcry_mac_hd_t h,
48                                                  const unsigned char *inbuf,
49                                                  size_t inlen);
50 typedef gcry_err_code_t (*gcry_mac_read_func_t)(gcry_mac_hd_t h,
51                                                 unsigned char *outbuf,
52                                                 size_t *outlen);
53 typedef gcry_err_code_t (*gcry_mac_verify_func_t)(gcry_mac_hd_t h,
54                                                   const unsigned char *inbuf,
55                                                   size_t inlen);
56 typedef unsigned int (*gcry_mac_get_maclen_func_t)(int algo);
57 typedef unsigned int (*gcry_mac_get_keylen_func_t)(int algo);
58
59
60 typedef struct gcry_mac_spec_ops
61 {
62   gcry_mac_open_func_t open;
63   gcry_mac_close_func_t close;
64   gcry_mac_setkey_func_t setkey;
65   gcry_mac_setiv_func_t setiv;
66   gcry_mac_reset_func_t reset;
67   gcry_mac_write_func_t write;
68   gcry_mac_read_func_t read;
69   gcry_mac_verify_func_t verify;
70   gcry_mac_get_maclen_func_t get_maclen;
71   gcry_mac_get_keylen_func_t get_keylen;
72 } gcry_mac_spec_ops_t;
73
74
75 /* Module specification structure for message authentication codes.  */
76 typedef struct gcry_mac_spec
77 {
78   int algo;
79   struct {
80     unsigned int disabled:1;
81     unsigned int fips:1;
82   } flags;
83   const char *name;
84   const gcry_mac_spec_ops_t *ops;
85 } gcry_mac_spec_t;
86
87
88
89 /* The handle structure.  */
90 struct gcry_mac_handle
91 {
92   int magic;
93   int algo;
94   const gcry_mac_spec_t *spec;
95   gcry_ctx_t gcry_ctx;
96   union {
97     struct {
98       gcry_md_hd_t md_ctx;
99       int md_algo;
100     } hmac;
101     struct {
102       gcry_cipher_hd_t ctx;
103       int cipher_algo;
104       unsigned int blklen;
105     } cmac;
106   } u;
107 };
108
109
110 /*
111  * The HMAC algorithm specifications (mac-hmac.c).
112  */
113 #if USE_SHA1
114 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha1;
115 #endif
116 #if USE_SHA256
117 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha256;
118 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha224;
119 #endif
120 #if USE_SHA512
121 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha512;
122 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha384;
123 #endif
124 #ifdef USE_GOST_R_3411_94
125 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_gost3411_94;
126 #endif
127 #ifdef USE_GOST_R_3411_12
128 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_stribog256;
129 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_stribog512;
130 #endif
131 #if USE_WHIRLPOOL
132 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_whirlpool;
133 #endif
134 #if USE_RMD160
135 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_rmd160;
136 #endif
137 #if USE_TIGER
138 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_tiger1;
139 #endif
140 #if USE_MD5
141 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_md5;
142 #endif
143 #if USE_MD4
144 extern gcry_mac_spec_t _gcry_mac_type_spec_hmac_md4;
145 #endif
146
147 /*
148  * The CMAC algorithm specifications (mac-cmac.c).
149  */
150 #if USE_BLOWFISH
151 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_blowfish;
152 #endif
153 #if USE_DES
154 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_tripledes;
155 #endif
156 #if USE_CAST5
157 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_cast5;
158 #endif
159 #if USE_AES
160 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_aes;
161 #endif
162 #if USE_TWOFISH
163 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_twofish;
164 #endif
165 #if USE_SERPENT
166 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_serpent;
167 #endif
168 #if USE_RFC2268
169 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_rfc2268;
170 #endif
171 #if USE_SEED
172 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_seed;
173 #endif
174 #if USE_CAMELLIA
175 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_camellia;
176 #endif
177 #ifdef USE_IDEA
178 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_idea;
179 #endif
180 #if USE_GOST28147
181 extern gcry_mac_spec_t _gcry_mac_type_spec_cmac_gost28147;
182 #endif