• 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 
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 */
omac_process(omac_state * omac,const unsigned char * in,unsigned long inlen)28 int 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