version 0.3.33
[fms.git] / libs / libtomcrypt / headers / tomcrypt_mac.h
1 #ifdef LTC_HMAC
2 typedef struct Hmac_state {
3      hash_state     md;
4      int            hash;
5      hash_state     hashstate;
6      unsigned char  *key;
7 } hmac_state;
8
9 int hmac_init(hmac_state *hmac, int hash, const unsigned char *key, unsigned long keylen);
10 int hmac_process(hmac_state *hmac, const unsigned char *in, unsigned long inlen);
11 int hmac_done(hmac_state *hmac, unsigned char *out, unsigned long *outlen);
12 int hmac_test(void);
13 int hmac_memory(int hash, 
14                 const unsigned char *key, unsigned long keylen,
15                 const unsigned char *in,  unsigned long inlen, 
16                       unsigned char *out, unsigned long *outlen);
17 int hmac_memory_multi(int hash, 
18                 const unsigned char *key,  unsigned long keylen,
19                       unsigned char *out,  unsigned long *outlen,
20                 const unsigned char *in,   unsigned long inlen, ...);
21 int hmac_file(int hash, const char *fname, const unsigned char *key,
22               unsigned long keylen, 
23               unsigned char *dst, unsigned long *dstlen);
24 #endif
25
26 #ifdef LTC_OMAC
27
28 typedef struct {
29    int             cipher_idx, 
30                    buflen,
31                    blklen;
32    unsigned char   block[MAXBLOCKSIZE],
33                    prev[MAXBLOCKSIZE],
34                    Lu[2][MAXBLOCKSIZE];
35    symmetric_key   key;
36 } omac_state;
37
38 int omac_init(omac_state *omac, int cipher, const unsigned char *key, unsigned long keylen);
39 int omac_process(omac_state *omac, const unsigned char *in, unsigned long inlen);
40 int omac_done(omac_state *omac, unsigned char *out, unsigned long *outlen);
41 int omac_memory(int cipher, 
42                const unsigned char *key, unsigned long keylen,
43                const unsigned char *in,  unsigned long inlen,
44                      unsigned char *out, unsigned long *outlen);
45 int omac_memory_multi(int cipher, 
46                 const unsigned char *key, unsigned long keylen,
47                       unsigned char *out, unsigned long *outlen,
48                 const unsigned char *in,  unsigned long inlen, ...);
49 int omac_file(int cipher, 
50               const unsigned char *key, unsigned long keylen,
51               const          char *filename, 
52                     unsigned char *out, unsigned long *outlen);
53 int omac_test(void);
54 #endif /* OMAC */
55
56 #ifdef LTC_PMAC
57
58 typedef struct {
59    unsigned char     Ls[32][MAXBLOCKSIZE],    /* L shifted by i bits to the left */
60                      Li[MAXBLOCKSIZE],        /* value of Li [current value, we calc from previous recall] */
61                      Lr[MAXBLOCKSIZE],        /* L * x^-1 */
62                      block[MAXBLOCKSIZE],     /* currently accumulated block */
63                      checksum[MAXBLOCKSIZE];  /* current checksum */
64
65    symmetric_key     key;                     /* scheduled key for cipher */
66    unsigned long     block_index;             /* index # for current block */
67    int               cipher_idx,              /* cipher idx */
68                      block_len,               /* length of block */
69                      buflen;                  /* number of bytes in the buffer */
70 } pmac_state;
71
72 int pmac_init(pmac_state *pmac, int cipher, const unsigned char *key, unsigned long keylen);
73 int pmac_process(pmac_state *pmac, const unsigned char *in, unsigned long inlen);
74 int pmac_done(pmac_state *pmac, unsigned char *out, unsigned long *outlen);
75
76 int pmac_memory(int cipher, 
77                const unsigned char *key, unsigned long keylen,
78                const unsigned char *msg, unsigned long msglen,
79                      unsigned char *out, unsigned long *outlen);
80
81 int pmac_memory_multi(int cipher, 
82                 const unsigned char *key, unsigned long keylen,
83                       unsigned char *out, unsigned long *outlen,
84                 const unsigned char *in, unsigned long inlen, ...);
85
86 int pmac_file(int cipher, 
87              const unsigned char *key, unsigned long keylen,
88              const          char *filename, 
89                    unsigned char *out, unsigned long *outlen);
90
91 int pmac_test(void);
92
93 /* internal functions */
94 int pmac_ntz(unsigned long x);
95 void pmac_shift_xor(pmac_state *pmac);
96
97 #endif /* PMAC */
98
99 #ifdef EAX_MODE
100
101 #if !(defined(LTC_OMAC) && defined(LTC_CTR_MODE))
102    #error EAX_MODE requires OMAC and CTR
103 #endif
104
105 typedef struct {
106    unsigned char N[MAXBLOCKSIZE];
107    symmetric_CTR ctr;
108    omac_state    headeromac, ctomac;
109 } eax_state;
110
111 int eax_init(eax_state *eax, int cipher, const unsigned char *key, unsigned long keylen,
112              const unsigned char *nonce, unsigned long noncelen,
113              const unsigned char *header, unsigned long headerlen);
114
115 int eax_encrypt(eax_state *eax, const unsigned char *pt, unsigned char *ct, unsigned long length);
116 int eax_decrypt(eax_state *eax, const unsigned char *ct, unsigned char *pt, unsigned long length);
117 int eax_addheader(eax_state *eax, const unsigned char *header, unsigned long length);
118 int eax_done(eax_state *eax, unsigned char *tag, unsigned long *taglen);
119
120 int eax_encrypt_authenticate_memory(int cipher,
121     const unsigned char *key,    unsigned long keylen,
122     const unsigned char *nonce,  unsigned long noncelen,
123     const unsigned char *header, unsigned long headerlen,
124     const unsigned char *pt,     unsigned long ptlen,
125           unsigned char *ct,
126           unsigned char *tag,    unsigned long *taglen);
127
128 int eax_decrypt_verify_memory(int cipher,
129     const unsigned char *key,    unsigned long keylen,
130     const unsigned char *nonce,  unsigned long noncelen,
131     const unsigned char *header, unsigned long headerlen,
132     const unsigned char *ct,     unsigned long ctlen,
133           unsigned char *pt,
134           unsigned char *tag,    unsigned long taglen,
135           int           *stat);
136
137  int eax_test(void);
138 #endif /* EAX MODE */
139
140 #ifdef OCB_MODE
141 typedef struct {
142    unsigned char     L[MAXBLOCKSIZE],         /* L value */
143                      Ls[32][MAXBLOCKSIZE],    /* L shifted by i bits to the left */
144                      Li[MAXBLOCKSIZE],        /* value of Li [current value, we calc from previous recall] */
145                      Lr[MAXBLOCKSIZE],        /* L * x^-1 */
146                      R[MAXBLOCKSIZE],         /* R value */
147                      checksum[MAXBLOCKSIZE];  /* current checksum */
148
149    symmetric_key     key;                     /* scheduled key for cipher */
150    unsigned long     block_index;             /* index # for current block */
151    int               cipher,                  /* cipher idx */
152                      block_len;               /* length of block */
153 } ocb_state;
154
155 int ocb_init(ocb_state *ocb, int cipher, 
156              const unsigned char *key, unsigned long keylen, const unsigned char *nonce);
157
158 int ocb_encrypt(ocb_state *ocb, const unsigned char *pt, unsigned char *ct);
159 int ocb_decrypt(ocb_state *ocb, const unsigned char *ct, unsigned char *pt);
160
161 int ocb_done_encrypt(ocb_state *ocb, 
162                      const unsigned char *pt,  unsigned long ptlen,
163                            unsigned char *ct, 
164                            unsigned char *tag, unsigned long *taglen);
165
166 int ocb_done_decrypt(ocb_state *ocb, 
167                      const unsigned char *ct,  unsigned long ctlen,
168                            unsigned char *pt, 
169                      const unsigned char *tag, unsigned long taglen, int *stat);
170
171 int ocb_encrypt_authenticate_memory(int cipher,
172     const unsigned char *key,    unsigned long keylen,
173     const unsigned char *nonce,  
174     const unsigned char *pt,     unsigned long ptlen,
175           unsigned char *ct,
176           unsigned char *tag,    unsigned long *taglen);
177
178 int ocb_decrypt_verify_memory(int cipher,
179     const unsigned char *key,    unsigned long keylen,
180     const unsigned char *nonce,  
181     const unsigned char *ct,     unsigned long ctlen,
182           unsigned char *pt,
183     const unsigned char *tag,    unsigned long taglen,
184           int           *stat);
185
186 int ocb_test(void);
187
188 /* internal functions */
189 void ocb_shift_xor(ocb_state *ocb, unsigned char *Z);
190 int ocb_ntz(unsigned long x);
191 int s_ocb_done(ocb_state *ocb, const unsigned char *pt, unsigned long ptlen,
192                unsigned char *ct, unsigned char *tag, unsigned long *taglen, int mode);
193
194 #endif /* OCB_MODE */
195
196 #ifdef CCM_MODE
197
198 #define CCM_ENCRYPT 0
199 #define CCM_DECRYPT 1
200
201 int ccm_memory(int cipher,
202     const unsigned char *key,    unsigned long keylen,
203     symmetric_key       *uskey,
204     const unsigned char *nonce,  unsigned long noncelen,
205     const unsigned char *header, unsigned long headerlen,
206           unsigned char *pt,     unsigned long ptlen,
207           unsigned char *ct,
208           unsigned char *tag,    unsigned long *taglen,
209                     int  direction);
210
211 int ccm_test(void);
212
213 #endif /* CCM_MODE */
214
215 #if defined(LRW_MODE) || defined(GCM_MODE)
216 void gcm_gf_mult(const unsigned char *a, const unsigned char *b, unsigned char *c);
217 #endif
218
219
220 /* table shared between GCM and LRW */
221 #if defined(GCM_TABLES) || defined(LRW_TABLES) || ((defined(GCM_MODE) || defined(GCM_MODE)) && defined(LTC_FAST))
222 extern const unsigned char gcm_shift_table[];
223 #endif
224
225 #ifdef GCM_MODE
226
227 #define GCM_ENCRYPT 0
228 #define GCM_DECRYPT 1
229
230 #define GCM_MODE_IV    0
231 #define GCM_MODE_AAD   1
232 #define GCM_MODE_TEXT  2
233
234 typedef struct { 
235    symmetric_key       K;
236    unsigned char       H[16],        /* multiplier */
237                        X[16],        /* accumulator */
238                        Y[16],        /* counter */
239                        Y_0[16],      /* initial counter */
240                        buf[16];      /* buffer for stuff */
241
242    int                 cipher,       /* which cipher */
243                        ivmode,       /* Which mode is the IV in? */
244                        mode,         /* mode the GCM code is in */
245                        buflen;       /* length of data in buf */
246
247    ulong64             totlen,       /* 64-bit counter used for IV and AAD */
248                        pttotlen;     /* 64-bit counter for the PT */
249
250 #ifdef GCM_TABLES
251    unsigned char       PC[16][256][16]  /* 16 tables of 8x128 */
252 #ifdef GCM_TABLES_SSE2
253 __attribute__ ((aligned (16)))
254 #endif
255 ;
256 #endif  
257 } gcm_state;
258
259 void gcm_mult_h(gcm_state *gcm, unsigned char *I);
260
261 int gcm_init(gcm_state *gcm, int cipher,
262              const unsigned char *key, int keylen);
263
264 int gcm_reset(gcm_state *gcm);
265
266 int gcm_add_iv(gcm_state *gcm, 
267                const unsigned char *IV,     unsigned long IVlen);
268
269 int gcm_add_aad(gcm_state *gcm,
270                const unsigned char *adata,  unsigned long adatalen);
271
272 int gcm_process(gcm_state *gcm,
273                      unsigned char *pt,     unsigned long ptlen,
274                      unsigned char *ct,
275                      int direction);
276
277 int gcm_done(gcm_state *gcm, 
278                      unsigned char *tag,    unsigned long *taglen);
279
280 int gcm_memory(      int           cipher,
281                const unsigned char *key,    unsigned long keylen,
282                const unsigned char *IV,     unsigned long IVlen,
283                const unsigned char *adata,  unsigned long adatalen,
284                      unsigned char *pt,     unsigned long ptlen,
285                      unsigned char *ct, 
286                      unsigned char *tag,    unsigned long *taglen,
287                                int direction);
288 int gcm_test(void);
289
290 #endif /* GCM_MODE */
291
292 #ifdef PELICAN
293
294 typedef struct pelican_state
295 {
296     symmetric_key K;
297     unsigned char state[16];
298     int           buflen;
299 } pelican_state;
300
301 int pelican_init(pelican_state *pelmac, const unsigned char *key, unsigned long keylen);
302 int pelican_process(pelican_state *pelmac, const unsigned char *in, unsigned long inlen);
303 int pelican_done(pelican_state *pelmac, unsigned char *out);
304 int pelican_test(void);
305
306 int pelican_memory(const unsigned char *key, unsigned long keylen,
307                    const unsigned char *in, unsigned long inlen,
308                          unsigned char *out);
309
310 #endif
311
312 #ifdef LTC_XCBC
313
314 typedef struct {
315    unsigned char K[3][MAXBLOCKSIZE],
316                  IV[MAXBLOCKSIZE];
317
318    symmetric_key key;
319
320              int cipher,
321                  buflen,
322                  blocksize;
323 } xcbc_state;
324
325 int xcbc_init(xcbc_state *xcbc, int cipher, const unsigned char *key, unsigned long keylen);
326 int xcbc_process(xcbc_state *xcbc, const unsigned char *in, unsigned long inlen);
327 int xcbc_done(xcbc_state *xcbc, unsigned char *out, unsigned long *outlen);
328 int xcbc_memory(int cipher, 
329                const unsigned char *key, unsigned long keylen,
330                const unsigned char *in,  unsigned long inlen,
331                      unsigned char *out, unsigned long *outlen);
332 int xcbc_memory_multi(int cipher, 
333                 const unsigned char *key, unsigned long keylen,
334                       unsigned char *out, unsigned long *outlen,
335                 const unsigned char *in,  unsigned long inlen, ...);
336 int xcbc_file(int cipher, 
337               const unsigned char *key, unsigned long keylen,
338               const          char *filename, 
339                     unsigned char *out, unsigned long *outlen);
340 int xcbc_test(void);
341
342 #endif
343
344 #ifdef LTC_F9_MODE
345
346 typedef struct {
347    unsigned char akey[MAXBLOCKSIZE],
348                  ACC[MAXBLOCKSIZE],
349                  IV[MAXBLOCKSIZE];
350
351    symmetric_key key;
352
353              int cipher,
354                  buflen,
355                  keylen,
356                  blocksize;
357 } f9_state;
358
359 int f9_init(f9_state *f9, int cipher, const unsigned char *key, unsigned long keylen);
360 int f9_process(f9_state *f9, const unsigned char *in, unsigned long inlen);
361 int f9_done(f9_state *f9, unsigned char *out, unsigned long *outlen);
362 int f9_memory(int cipher, 
363                const unsigned char *key, unsigned long keylen,
364                const unsigned char *in,  unsigned long inlen,
365                      unsigned char *out, unsigned long *outlen);
366 int f9_memory_multi(int cipher, 
367                 const unsigned char *key, unsigned long keylen,
368                       unsigned char *out, unsigned long *outlen,
369                 const unsigned char *in,  unsigned long inlen, ...);
370 int f9_file(int cipher, 
371               const unsigned char *key, unsigned long keylen,
372               const          char *filename, 
373                     unsigned char *out, unsigned long *outlen);
374 int f9_test(void);
375
376 #endif
377
378
379 /* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_mac.h,v $ */
380 /* $Revision: 1.20 $ */
381 /* $Date: 2006/11/08 21:57:04 $ */