225f6993e677d7b6a4e28a8b590fa37f3918fa07
[libgcrypt.git] / cipher / cipher-internal.h
1 /* cipher-internal.h  - Internal defs for cipher.c
2  * Copyright (C) 2011 Free Software Foundation, Inc.
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 #ifndef G10_CIPHER_INTERNAL_H
21 #define G10_CIPHER_INTERNAL_H
22
23 /* The maximum supported size of a block in bytes.  */
24 #define MAX_BLOCKSIZE 16
25
26 /* Magic values for the context structure.  */
27 #define CTX_MAGIC_NORMAL 0x24091964
28 #define CTX_MAGIC_SECURE 0x46919042
29
30 /* Try to use 16 byte aligned cipher context for better performance.
31    We use the aligned attribute, thus it is only possible to implement
32    this with gcc.  */
33 #undef NEED_16BYTE_ALIGNED_CONTEXT
34 #ifdef HAVE_GCC_ATTRIBUTE_ALIGNED
35 # define NEED_16BYTE_ALIGNED_CONTEXT 1
36 #endif
37
38 /* Undef this symbol to trade GCM speed for 256 bytes of memory per context */
39 #define GCM_USE_TABLES 1
40
41
42 /* GCM_USE_INTEL_PCLMUL inidicates whether to compile GCM with Intel PCLMUL
43    code.  */
44 #undef GCM_USE_INTEL_PCLMUL
45 #if defined(ENABLE_PCLMUL_SUPPORT) && defined(GCM_USE_TABLES)
46 # if ((defined(__i386__) && SIZEOF_UNSIGNED_LONG == 4) || defined(__x86_64__))
47 #  if __GNUC__ >= 4
48 #   define GCM_USE_INTEL_PCLMUL 1
49 #  endif
50 # endif
51 #endif /* GCM_USE_INTEL_PCLMUL */
52
53
54 /* A VIA processor with the Padlock engine as well as the Intel AES_NI
55    instructions require an alignment of most data on a 16 byte
56    boundary.  Because we trick out the compiler while allocating the
57    context, the align attribute as used in rijndael.c does not work on
58    its own.  Thus we need to make sure that the entire context
59    structure is a aligned on that boundary.  We achieve this by
60    defining a new type and use that instead of our usual alignment
61    type.  */
62 typedef union
63 {
64   PROPERLY_ALIGNED_TYPE foo;
65 #ifdef NEED_16BYTE_ALIGNED_CONTEXT
66   char bar[16] __attribute__ ((aligned (16)));
67 #endif
68   char c[1];
69 } cipher_context_alignment_t;
70
71
72 /* The handle structure.  */
73 struct gcry_cipher_handle
74 {
75   int magic;
76   size_t actual_handle_size;     /* Allocated size of this handle. */
77   size_t handle_offset;          /* Offset to the malloced block.  */
78   gcry_cipher_spec_t *spec;
79
80   /* The algorithm id.  This is a hack required because the module
81      interface does not easily allow to retrieve this value. */
82   int algo;
83
84   /* A structure with function pointers for bulk operations.  Due to
85      limitations of the module system (we don't want to change the
86      API) we need to keep these function pointers here.  The cipher
87      open function intializes them and the actual encryption routines
88      use them if they are not NULL.  */
89   struct {
90     void (*cfb_enc)(void *context, unsigned char *iv,
91                     void *outbuf_arg, const void *inbuf_arg,
92                     size_t nblocks);
93     void (*cfb_dec)(void *context, unsigned char *iv,
94                     void *outbuf_arg, const void *inbuf_arg,
95                     size_t nblocks);
96     void (*cbc_enc)(void *context, unsigned char *iv,
97                     void *outbuf_arg, const void *inbuf_arg,
98                     size_t nblocks, int cbc_mac);
99     void (*cbc_dec)(void *context, unsigned char *iv,
100                     void *outbuf_arg, const void *inbuf_arg,
101                     size_t nblocks);
102     void (*ctr_enc)(void *context, unsigned char *iv,
103                     void *outbuf_arg, const void *inbuf_arg,
104                     size_t nblocks);
105   } bulk;
106
107
108   int mode;
109   unsigned int flags;
110
111   struct {
112     unsigned int key:1; /* Set to 1 if a key has been set.  */
113     unsigned int iv:1;  /* Set to 1 if a IV has been set.  */
114     unsigned int tag:1; /* Set to 1 if a tag is finalized. */
115   } marks;
116
117   /* The initialization vector.  For best performance we make sure
118      that it is properly aligned.  In particular some implementations
119      of bulk operations expect an 16 byte aligned IV.  IV is also used
120      to store CBC-MAC in CCM mode; counter IV is stored in U_CTR.  */
121   union {
122     cipher_context_alignment_t iv_align;
123     unsigned char iv[MAX_BLOCKSIZE];
124   } u_iv;
125
126   /* The counter for CTR mode.  This field is also used by AESWRAP and
127      thus we can't use the U_IV union.  */
128   union {
129     cipher_context_alignment_t iv_align;
130     unsigned char ctr[MAX_BLOCKSIZE];
131   } u_ctr;
132
133   /* Space to save an IV or CTR for chaining operations.  */
134   unsigned char lastiv[MAX_BLOCKSIZE];
135   int unused;  /* Number of unused bytes in LASTIV. */
136
137   union {
138     /* Mode specific storage for CCM mode. */
139     struct {
140       size_t encryptlen;
141       size_t aadlen;
142       unsigned int authlen;
143
144       /* Space to save partial input lengths for MAC. */
145       unsigned char macbuf[GCRY_CCM_BLOCK_LEN];
146       int mac_unused;  /* Number of unprocessed bytes in MACBUF. */
147
148       unsigned char s0[GCRY_CCM_BLOCK_LEN];
149
150       unsigned int nonce:1;/* Set to 1 if nonce has been set.  */
151       unsigned int lengths:1; /* Set to 1 if CCM length parameters has been
152                                  processed.  */
153     } ccm;
154
155     /* Mode specific storage for CMAC mode. */
156     struct {
157       unsigned int tag:1; /* Set to 1 if tag has been finalized.  */
158
159       /* Subkeys for tag creation, not cleared by gcry_cipher_reset. */
160       unsigned char subkeys[2][MAX_BLOCKSIZE];
161     } cmac;
162
163     /* Mode specific storage for GCM mode. */
164     struct {
165       /* The interim tag for GCM mode.  */
166       union {
167         cipher_context_alignment_t iv_align;
168         unsigned char tag[MAX_BLOCKSIZE];
169       } u_tag;
170
171       /* byte counters for GCM */
172       u32 aadlen[2];
173       u32 datalen[2];
174
175       /* encrypted tag counter */
176       unsigned char tagiv[MAX_BLOCKSIZE];
177
178       /* Pre-calculated table for GCM. */
179 #ifdef GCM_USE_TABLES
180  #if defined(HAVE_U64_TYPEDEF) && (SIZEOF_UNSIGNED_LONG == 8 \
181                                    || defined(__x86_64__))
182       #define GCM_TABLES_USE_U64 1
183       u64 gcm_table[2 * 16];
184  #else
185       #undef GCM_TABLES_USE_U64
186       u32 gcm_table[4 * 16];
187  #endif
188 #endif
189
190       unsigned int datalen_over_limits:1;
191       unsigned int disallow_encryption_because_of_setiv_in_fips_mode:1;
192 #ifdef GCM_USE_INTEL_PCLMUL
193       unsigned int use_intel_pclmul:1;
194 #endif
195     } gcm;
196   } u_mode;
197
198   /* What follows are two contexts of the cipher in use.  The first
199      one needs to be aligned well enough for the cipher operation
200      whereas the second one is a copy created by cipher_setkey and
201      used by cipher_reset.  That second copy has no need for proper
202      aligment because it is only accessed by memcpy.  */
203   cipher_context_alignment_t context;
204 };
205
206
207 /*-- cipher-cbc.c --*/
208 gcry_err_code_t _gcry_cipher_cbc_encrypt
209 /*           */ (gcry_cipher_hd_t c,
210                  unsigned char *outbuf, size_t outbuflen,
211                  const unsigned char *inbuf, size_t inbuflen);
212 gcry_err_code_t _gcry_cipher_cbc_decrypt
213 /*           */ (gcry_cipher_hd_t c,
214                  unsigned char *outbuf, size_t outbuflen,
215                  const unsigned char *inbuf, size_t inbuflen);
216
217 /*-- cipher-cfb.c --*/
218 gcry_err_code_t _gcry_cipher_cfb_encrypt
219 /*           */ (gcry_cipher_hd_t c,
220                  unsigned char *outbuf, size_t outbuflen,
221                  const unsigned char *inbuf, size_t inbuflen);
222 gcry_err_code_t _gcry_cipher_cfb_decrypt
223 /*           */ (gcry_cipher_hd_t c,
224                  unsigned char *outbuf, size_t outbuflen,
225                  const unsigned char *inbuf, size_t inbuflen);
226
227
228 /*-- cipher-ofb.c --*/
229 gcry_err_code_t _gcry_cipher_ofb_encrypt
230 /*           */ (gcry_cipher_hd_t c,
231                  unsigned char *outbuf, size_t outbuflen,
232                  const unsigned char *inbuf, size_t inbuflen);
233
234 /*-- cipher-ctr.c --*/
235 gcry_err_code_t _gcry_cipher_ctr_encrypt
236 /*           */ (gcry_cipher_hd_t c,
237                  unsigned char *outbuf, size_t outbuflen,
238                  const unsigned char *inbuf, size_t inbuflen);
239
240
241 /*-- cipher-aeswrap.c --*/
242 gcry_err_code_t _gcry_cipher_aeswrap_encrypt
243 /*           */   (gcry_cipher_hd_t c,
244                    byte *outbuf, size_t outbuflen,
245                    const byte *inbuf, size_t inbuflen);
246 gcry_err_code_t _gcry_cipher_aeswrap_decrypt
247 /*           */   (gcry_cipher_hd_t c,
248                    byte *outbuf, size_t outbuflen,
249                    const byte *inbuf, size_t inbuflen);
250
251
252 /*-- cipher-ccm.c --*/
253 gcry_err_code_t _gcry_cipher_ccm_encrypt
254 /*           */ (gcry_cipher_hd_t c,
255                  unsigned char *outbuf, size_t outbuflen,
256                  const unsigned char *inbuf, size_t inbuflen);
257 gcry_err_code_t _gcry_cipher_ccm_decrypt
258 /*           */ (gcry_cipher_hd_t c,
259                  unsigned char *outbuf, size_t outbuflen,
260                  const unsigned char *inbuf, size_t inbuflen);
261 gcry_err_code_t _gcry_cipher_ccm_set_nonce
262 /*           */ (gcry_cipher_hd_t c, const unsigned char *nonce,
263                  size_t noncelen);
264 gcry_err_code_t _gcry_cipher_ccm_authenticate
265 /*           */ (gcry_cipher_hd_t c, const unsigned char *abuf, size_t abuflen);
266 gcry_err_code_t _gcry_cipher_ccm_set_lengths
267 /*           */ (gcry_cipher_hd_t c, size_t encryptedlen, size_t aadlen,
268                  size_t taglen);
269 gcry_err_code_t _gcry_cipher_ccm_get_tag
270 /*           */ (gcry_cipher_hd_t c,
271                  unsigned char *outtag, size_t taglen);
272 gcry_err_code_t _gcry_cipher_ccm_check_tag
273 /*           */ (gcry_cipher_hd_t c,
274                  const unsigned char *intag, size_t taglen);
275
276
277 /*-- cipher-gcm.c --*/
278 gcry_err_code_t _gcry_cipher_gcm_encrypt
279 /*           */   (gcry_cipher_hd_t c,
280                    unsigned char *outbuf, size_t outbuflen,
281                    const unsigned char *inbuf, size_t inbuflen);
282 gcry_err_code_t _gcry_cipher_gcm_decrypt
283 /*           */   (gcry_cipher_hd_t c,
284                    unsigned char *outbuf, size_t outbuflen,
285                    const unsigned char *inbuf, size_t inbuflen);
286 gcry_err_code_t _gcry_cipher_gcm_setiv
287 /*           */   (gcry_cipher_hd_t c,
288                    const unsigned char *iv, size_t ivlen);
289 gcry_err_code_t _gcry_cipher_gcm_authenticate
290 /*           */   (gcry_cipher_hd_t c,
291                    const unsigned char *aadbuf, size_t aadbuflen);
292 gcry_err_code_t _gcry_cipher_gcm_get_tag
293 /*           */   (gcry_cipher_hd_t c,
294                    unsigned char *outtag, size_t taglen);
295 gcry_err_code_t _gcry_cipher_gcm_check_tag
296 /*           */   (gcry_cipher_hd_t c,
297                    const unsigned char *intag, size_t taglen);
298
299
300 #endif /*G10_CIPHER_INTERNAL_H*/