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 omac_process.c
15  OMAC1 support, process data, Tom St Denis
16*/
17
18
19#ifdef LTC_OMAC
20
21/**
22   Process data through OMAC
23   @param omac     The OMAC state
24   @param in       The input data to send through OMAC
25   @param inlen    The length of the input (octets)
26   @return CRYPT_OK if successful
27*/
28int omac_process(omac_state *omac, const unsigned char *in, unsigned long inlen)
29{
30   unsigned long n, x;
31   int           err;
32
33   LTC_ARGCHK(omac  != NULL);
34   LTC_ARGCHK(in    != NULL);
35   if ((err = cipher_is_valid(omac->cipher_idx)) != CRYPT_OK) {
36      return err;
37   }
38
39   if ((omac->buflen > (int)sizeof(omac->block)) || (omac->buflen < 0) ||
40       (omac->blklen > (int)sizeof(omac->block)) || (omac->buflen > omac->blklen)) {
41      return CRYPT_INVALID_ARG;
42   }
43
44#ifdef LTC_FAST
45   if (omac->buflen == 0 && inlen > 16) {
46      int y;
47      for (x = 0; x < (inlen - 16); x += 16) {
48          for (y = 0; y < 16; y += sizeof(LTC_FAST_TYPE)) {
49              *((LTC_FAST_TYPE*)(&omac->prev[y])) ^= *((LTC_FAST_TYPE*)(&in[y]));
50          }
51          in += 16;
52          if ((err = cipher_descriptor[omac->cipher_idx].ecb_encrypt(omac->prev, omac->prev, &omac->key)) != CRYPT_OK) {
53             return err;
54          }
55      }
56      inlen -= x;
57    }
58#endif
59
60   while (inlen != 0) {
61       /* ok if the block is full we xor in prev, encrypt and replace prev */
62       if (omac->buflen == omac->blklen) {
63          for (x = 0; x < (unsigned long)omac->blklen; x++) {
64              omac->block[x] ^= omac->prev[x];
65          }
66          if ((err = cipher_descriptor[omac->cipher_idx].ecb_encrypt(omac->block, omac->prev, &omac->key)) != CRYPT_OK) {
67             return err;
68          }
69          omac->buflen = 0;
70       }
71
72       /* add bytes */
73       n = MIN(inlen, (unsigned long)(omac->blklen - omac->buflen));
74       XMEMCPY(omac->block + omac->buflen, in, n);
75       omac->buflen  += n;
76       inlen         -= n;
77       in            += n;
78   }
79
80   return CRYPT_OK;
81}
82
83#endif
84
85
86/* $Source: /cvs/libtom/libtomcrypt/src/mac/omac/omac_process.c,v $ */
87/* $Revision: 1.9 $ */
88/* $Date: 2006/11/03 00:39:49 $ */
89