Home | History | Annotate | Download | only in pmac
      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 (at) 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 */
     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