Home | History | Annotate | Download | only in omac
      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 
     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 */
     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