• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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