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_done.c
     15   OMAC1 support, terminate a stream, Tom St Denis
     16 */
     17 
     18 #ifdef LTC_OMAC
     19 
     20 /**
     21   Terminate an OMAC stream
     22   @param omac   The OMAC state
     23   @param out    [out] Destination for the authentication tag
     24   @param outlen [in/out]  The max size and resulting size of the authentication tag
     25   @return CRYPT_OK if successful
     26 */
     27 int omac_done(omac_state *omac, unsigned char *out, unsigned long *outlen)
     28 {
     29    int       err, mode;
     30    unsigned  x;
     31 
     32    LTC_ARGCHK(omac   != NULL);
     33    LTC_ARGCHK(out    != NULL);
     34    LTC_ARGCHK(outlen != 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    /* figure out mode */
     45    if (omac->buflen != omac->blklen) {
     46       /* add the 0x80 byte */
     47       omac->block[omac->buflen++] = 0x80;
     48 
     49       /* pad with 0x00 */
     50       while (omac->buflen < omac->blklen) {
     51          omac->block[omac->buflen++] = 0x00;
     52       }
     53       mode = 1;
     54    } else {
     55       mode = 0;
     56    }
     57 
     58    /* now xor prev + Lu[mode] */
     59    for (x = 0; x < (unsigned)omac->blklen; x++) {
     60        omac->block[x] ^= omac->prev[x] ^ omac->Lu[mode][x];
     61    }
     62 
     63    /* encrypt it */
     64    if ((err = cipher_descriptor[omac->cipher_idx].ecb_encrypt(omac->block, omac->block, &omac->key)) != CRYPT_OK) {
     65       return err;
     66    }
     67    cipher_descriptor[omac->cipher_idx].done(&omac->key);
     68 
     69    /* output it */
     70    for (x = 0; x < (unsigned)omac->blklen && x < *outlen; x++) {
     71        out[x] = omac->block[x];
     72    }
     73    *outlen = x;
     74 
     75 #ifdef LTC_CLEAN_STACK
     76    zeromem(omac, sizeof(*omac));
     77 #endif
     78    return CRYPT_OK;
     79 }
     80 
     81 #endif
     82 
     83 
     84 /* $Source: /cvs/libtom/libtomcrypt/src/mac/omac/omac_done.c,v $ */
     85 /* $Revision: 1.7 $ */
     86 /* $Date: 2006/11/03 00:39:49 $ */
     87