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