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 xcbc_memory_multi.c
16  XCBC support, process multiple blocks of memory, Tom St Denis
17*/
18
19#ifdef LTC_XCBC
20
21/**
22   XCBC multiple blocks of memory
23   @param cipher    The index of the desired cipher
24   @param key       The secret key
25   @param keylen    The length of the secret key (octets)
26   @param out       [out] The destination of the authentication tag
27   @param outlen    [in/out]  The max size and resulting size of the authentication tag (octets)
28   @param in        The data to send through XCBC
29   @param inlen     The length of the data to send through XCBC (octets)
30   @param ...       tuples of (data,len) pairs to XCBC, terminated with a (NULL,x) (x=don't care)
31   @return CRYPT_OK if successful
32*/
33int xcbc_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   xcbc_state          *xcbc;
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 xcbc state */
50   xcbc = XMALLOC(sizeof(xcbc_state));
51   if (xcbc == NULL) {
52      return CRYPT_MEM;
53   }
54
55   /* xcbc process the message */
56   if ((err = xcbc_init(xcbc, cipher, key, keylen)) != CRYPT_OK) {
57      goto LBL_ERR;
58   }
59   va_start(args, inlen);
60   curptr = in;
61   curlen = inlen;
62   for (;;) {
63      /* process buf */
64      if ((err = xcbc_process(xcbc, curptr, curlen)) != CRYPT_OK) {
65         goto LBL_ERR;
66      }
67      /* step to next */
68      curptr = va_arg(args, const unsigned char*);
69      if (curptr == NULL) {
70         break;
71      }
72      curlen = va_arg(args, unsigned long);
73   }
74   if ((err = xcbc_done(xcbc, out, outlen)) != CRYPT_OK) {
75      goto LBL_ERR;
76   }
77LBL_ERR:
78#ifdef LTC_CLEAN_STACK
79   zeromem(xcbc, sizeof(xcbc_state));
80#endif
81   XFREE(xcbc);
82   va_end(args);
83   return err;
84}
85
86#endif
87
88/* $Source: /cvs/libtom/libtomcrypt/src/mac/xcbc/xcbc_memory_multi.c,v $ */
89/* $Revision: 1.1 $ */
90/* $Date: 2006/11/03 01:53:25 $ */
91