3
|
1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis |
|
2 * |
|
3 * LibTomCrypt is a library that provides various cryptographic |
|
4 * algorithms in a highly modular and flexible manner. |
|
5 * |
|
6 * The library is free for all purposes without any express |
|
7 * guarantee it works. |
|
8 * |
|
9 * Tom St Denis, [email protected], http://libtomcrypt.org |
|
10 */ |
|
11 |
|
12 /* EAX Implementation by Tom St Denis */ |
|
13 #include "mycrypt.h" |
|
14 |
|
15 #ifdef EAX_MODE |
|
16 |
|
17 int eax_done(eax_state *eax, unsigned char *tag, unsigned long *taglen) |
|
18 { |
|
19 int err; |
143
|
20 unsigned char *headermac, *ctmac; |
3
|
21 unsigned long x, len; |
|
22 |
|
23 _ARGCHK(eax != NULL); |
|
24 _ARGCHK(tag != NULL); |
|
25 _ARGCHK(taglen != NULL); |
|
26 |
143
|
27 /* allocate ram */ |
|
28 headermac = XMALLOC(MAXBLOCKSIZE); |
|
29 ctmac = XMALLOC(MAXBLOCKSIZE); |
|
30 |
|
31 if (headermac == NULL || ctmac == NULL) { |
|
32 if (headermac != NULL) { |
|
33 XFREE(headermac); |
|
34 } |
|
35 if (ctmac != NULL) { |
|
36 XFREE(ctmac); |
|
37 } |
|
38 return CRYPT_MEM; |
|
39 } |
|
40 |
3
|
41 /* finish ctomac */ |
143
|
42 len = MAXBLOCKSIZE; |
3
|
43 if ((err = omac_done(&eax->ctomac, ctmac, &len)) != CRYPT_OK) { |
143
|
44 goto __ERR; |
3
|
45 } |
|
46 |
|
47 /* finish headeromac */ |
|
48 |
|
49 /* note we specifically don't reset len so the two lens are minimal */ |
|
50 |
|
51 if ((err = omac_done(&eax->headeromac, headermac, &len)) != CRYPT_OK) { |
143
|
52 goto __ERR; |
3
|
53 } |
|
54 |
|
55 /* compute N xor H xor C */ |
|
56 for (x = 0; x < len && x < *taglen; x++) { |
|
57 tag[x] = eax->N[x] ^ headermac[x] ^ ctmac[x]; |
|
58 } |
|
59 *taglen = x; |
|
60 |
143
|
61 err = CRYPT_OK; |
|
62 __ERR: |
3
|
63 #ifdef CLEAN_STACK |
143
|
64 zeromem(ctmac, MAXBLOCKSIZE); |
|
65 zeromem(headermac, MAXBLOCKSIZE); |
|
66 zeromem(eax, sizeof(*eax)); |
3
|
67 #endif |
|
68 |
143
|
69 XFREE(ctmac); |
|
70 XFREE(headermac); |
|
71 |
|
72 return err; |
3
|
73 } |
|
74 |
|
75 #endif |