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, tomstdenis@gmail.com, http://libtomcrypt.com
10 */
11 #include "tomcrypt.h"
12 #include <stdarg.h>
13
14 /**
15 @file pmac_memory_multi.c
16 PMAC implementation, process multiple blocks of memory, by Tom St Denis
17 */
18
19 #ifdef LTC_PMAC
20
21 /**
22 PMAC multiple blocks of memory
23 @param cipher The index of the cipher desired
24 @param key The secret key
25 @param keylen The length of the secret key (octets)
26 @param out [out] Destination for the authentication tag
27 @param outlen [in/out] The max size and resulting size of the authentication tag
28 @param in The data you wish to send through PMAC
29 @param inlen The length of data you wish to send through PMAC (octets)
30 @param ... tuples of (data,len) pairs to PMAC, terminated with a (NULL,x) (x=don't care)
31 @return CRYPT_OK if successful
32 */
pmac_memory_multi(int cipher,const unsigned char * key,unsigned long keylen,unsigned char * out,unsigned long * outlen,const unsigned char * in,unsigned long inlen,...)33 int pmac_memory_multi(int cipher,
34 const unsigned char *key, unsigned long keylen,
35 unsigned char *out, unsigned long *outlen,
36 const unsigned char *in, unsigned long inlen, ...)
37 {
38 int err;
39 pmac_state *pmac;
40 va_list args;
41 const unsigned char *curptr;
42 unsigned long curlen;
43
44 LTC_ARGCHK(key != NULL);
45 LTC_ARGCHK(in != NULL);
46 LTC_ARGCHK(out != NULL);
47 LTC_ARGCHK(outlen != NULL);
48
49 /* allocate ram for pmac state */
50 pmac = XMALLOC(sizeof(pmac_state));
51 if (pmac == NULL) {
52 return CRYPT_MEM;
53 }
54
55 if ((err = pmac_init(pmac, cipher, key, keylen)) != CRYPT_OK) {
56 goto LBL_ERR;
57 }
58 va_start(args, inlen);
59 curptr = in;
60 curlen = inlen;
61 for (;;) {
62 /* process buf */
63 if ((err = pmac_process(pmac, curptr, curlen)) != CRYPT_OK) {
64 goto LBL_ERR;
65 }
66 /* step to next */
67 curptr = va_arg(args, const unsigned char*);
68 if (curptr == NULL) {
69 break;
70 }
71 curlen = va_arg(args, unsigned long);
72 }
73 if ((err = pmac_done(pmac, out, outlen)) != CRYPT_OK) {
74 goto LBL_ERR;
75 }
76 LBL_ERR:
77 #ifdef LTC_CLEAN_STACK
78 zeromem(pmac, sizeof(pmac_state));
79 #endif
80 XFREE(pmac);
81 va_end(args);
82 return err;
83 }
84
85 #endif
86
87 /* $Source: /cvs/libtom/libtomcrypt/src/mac/pmac/pmac_memory_multi.c,v $ */
88 /* $Revision: 1.6 $ */
89 /* $Date: 2006/11/03 00:39:49 $ */
90