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
13/**
14  @file xcbc_process.c
15  XCBC Support, XCBC-MAC a block of memory
16*/
17
18#ifdef LTC_XCBC
19
20/** XCBC-MAC a block of memory
21  @param cipher     Index of cipher to use
22  @param key        [in]  Secret key
23  @param keylen     Length of key in octets
24  @param in         [in]  Message to MAC
25  @param inlen      Length of input in octets
26  @param out        [out] Destination for the MAC tag
27  @param outlen     [in/out] Output size and final tag size
28  Return CRYPT_OK on success.
29*/
30int xcbc_memory(int cipher,
31               const unsigned char *key, unsigned long keylen,
32               const unsigned char *in,  unsigned long inlen,
33                     unsigned char *out, unsigned long *outlen)
34{
35   xcbc_state *xcbc;
36   int         err;
37
38   /* is the cipher valid? */
39   if ((err = cipher_is_valid(cipher)) != CRYPT_OK) {
40      return err;
41   }
42
43   /* Use accelerator if found */
44   if (cipher_descriptor[cipher].xcbc_memory != NULL) {
45      return cipher_descriptor[cipher].xcbc_memory(key, keylen, in, inlen, out, outlen);
46   }
47
48   xcbc = XCALLOC(1, sizeof(*xcbc));
49   if (xcbc == NULL) {
50      return CRYPT_MEM;
51   }
52
53   if ((err = xcbc_init(xcbc, cipher, key, keylen)) != CRYPT_OK) {
54     goto done;
55   }
56
57   if ((err = xcbc_process(xcbc, in, inlen)) != CRYPT_OK) {
58     goto done;
59   }
60
61   err = xcbc_done(xcbc, out, outlen);
62done:
63   XFREE(xcbc);
64   return err;
65}
66
67#endif
68
69/* $Source: /cvs/libtom/libtomcrypt/src/mac/xcbc/xcbc_memory.c,v $ */
70/* $Revision: 1.4 $ */
71/* $Date: 2006/11/21 23:02:42 $ */
72