Home | History | Annotate | Download | only in lrw
      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 lrw_setiv.c
     15    LRW_MODE implementation, Set the current IV, Tom St Denis
     16 */
     17 
     18 #ifdef LTC_LRW_MODE
     19 
     20 /**
     21   Set the IV for LRW
     22   @param IV      The IV, must be 16 octets
     23   @param len     Length ... must be 16 :-)
     24   @param lrw     The LRW state to update
     25   @return CRYPT_OK if successful
     26 */
     27 int lrw_setiv(const unsigned char *IV, unsigned long len, symmetric_LRW *lrw)
     28 {
     29    int           err;
     30 #ifdef LRW_TABLES
     31    unsigned char T[16];
     32    int           x, y;
     33 #endif
     34    LTC_ARGCHK(IV != NULL);
     35    LTC_ARGCHK(lrw != NULL);
     36 
     37    if (len != 16) {
     38       return CRYPT_INVALID_ARG;
     39    }
     40 
     41    if ((err = cipher_is_valid(lrw->cipher)) != CRYPT_OK) {
     42       return err;
     43    }
     44 
     45    /* copy the IV */
     46    XMEMCPY(lrw->IV, IV, 16);
     47 
     48    /* check if we have to actually do work */
     49    if (cipher_descriptor[lrw->cipher].accel_lrw_encrypt != NULL && cipher_descriptor[lrw->cipher].accel_lrw_decrypt != NULL) {
     50        /* we have accelerators, let's bail since they don't use lrw->pad anyways */
     51        return CRYPT_OK;
     52    }
     53 
     54 #ifdef LRW_TABLES
     55    XMEMCPY(T, &lrw->PC[0][IV[0]][0], 16);
     56    for (x = 1; x < 16; x++) {
     57 #ifdef LTC_FAST
     58        for (y = 0; y < 16; y += sizeof(LTC_FAST_TYPE)) {
     59            *((LTC_FAST_TYPE *)(T + y)) ^= *((LTC_FAST_TYPE *)(&lrw->PC[x][IV[x]][y]));
     60        }
     61 #else
     62        for (y = 0; y < 16; y++) {
     63            T[y] ^= lrw->PC[x][IV[x]][y];
     64        }
     65 #endif
     66    }
     67    XMEMCPY(lrw->pad, T, 16);
     68 #else
     69    gcm_gf_mult(lrw->tweak, IV, lrw->pad);
     70 #endif
     71 
     72    return CRYPT_OK;
     73 }
     74 
     75 
     76 #endif
     77 /* $Source: /cvs/libtom/libtomcrypt/src/modes/lrw/lrw_setiv.c,v $ */
     78 /* $Revision: 1.12 $ */
     79 /* $Date: 2006/06/29 01:53:13 $ */
     80