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