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@gmail.com, http://libtomcrypt.com 10 */ 11#include "tomcrypt.h" 12 13/** 14 @file lrw_process.c 15 LRW_MODE implementation, Encrypt/decrypt blocks, Tom St Denis 16*/ 17 18#ifdef LTC_LRW_MODE 19 20/** 21 Process blocks with LRW, since decrypt/encrypt are largely the same they share this code. 22 @param pt The "input" data 23 @param ct [out] The "output" data 24 @param len The length of the input, must be a multiple of 128-bits (16 octets) 25 @param mode LRW_ENCRYPT or LRW_DECRYPT 26 @param lrw The LRW state 27 @return CRYPT_OK if successful 28*/ 29int lrw_process(const unsigned char *pt, unsigned char *ct, unsigned long len, int mode, symmetric_LRW *lrw) 30{ 31 unsigned char prod[16]; 32 int x, err; 33#ifdef LRW_TABLES 34 int y; 35#endif 36 37 LTC_ARGCHK(pt != NULL); 38 LTC_ARGCHK(ct != NULL); 39 LTC_ARGCHK(lrw != NULL); 40 41 if (len & 15) { 42 return CRYPT_INVALID_ARG; 43 } 44 45 while (len) { 46 /* copy pad */ 47 XMEMCPY(prod, lrw->pad, 16); 48 49 /* increment IV */ 50 for (x = 15; x >= 0; x--) { 51 lrw->IV[x] = (lrw->IV[x] + 1) & 255; 52 if (lrw->IV[x]) { 53 break; 54 } 55 } 56 57 /* update pad */ 58#ifdef LRW_TABLES 59 /* for each byte changed we undo it's affect on the pad then add the new product */ 60 for (; x < 16; x++) { 61#ifdef LTC_FAST 62 for (y = 0; y < 16; y += sizeof(LTC_FAST_TYPE)) { 63 *((LTC_FAST_TYPE *)(lrw->pad + y)) ^= *((LTC_FAST_TYPE *)(&lrw->PC[x][lrw->IV[x]][y])) ^ *((LTC_FAST_TYPE *)(&lrw->PC[x][(lrw->IV[x]-1)&255][y])); 64 } 65#else 66 for (y = 0; y < 16; y++) { 67 lrw->pad[y] ^= lrw->PC[x][lrw->IV[x]][y] ^ lrw->PC[x][(lrw->IV[x]-1)&255][y]; 68 } 69#endif 70 } 71#else 72 gcm_gf_mult(lrw->tweak, lrw->IV, lrw->pad); 73#endif 74 75 /* xor prod */ 76#ifdef LTC_FAST 77 for (x = 0; x < 16; x += sizeof(LTC_FAST_TYPE)) { 78 *((LTC_FAST_TYPE *)(ct + x)) = *((LTC_FAST_TYPE *)(pt + x)) ^ *((LTC_FAST_TYPE *)(prod + x)); 79 } 80#else 81 for (x = 0; x < 16; x++) { 82 ct[x] = pt[x] ^ prod[x]; 83 } 84#endif 85 86 /* send through cipher */ 87 if (mode == LRW_ENCRYPT) { 88 if ((err = cipher_descriptor[lrw->cipher].ecb_encrypt(ct, ct, &lrw->key)) != CRYPT_OK) { 89 return err; 90 } 91 } else { 92 if ((err = cipher_descriptor[lrw->cipher].ecb_decrypt(ct, ct, &lrw->key)) != CRYPT_OK) { 93 return err; 94 } 95 } 96 97 /* xor prod */ 98#ifdef LTC_FAST 99 for (x = 0; x < 16; x += sizeof(LTC_FAST_TYPE)) { 100 *((LTC_FAST_TYPE *)(ct + x)) = *((LTC_FAST_TYPE *)(ct + x)) ^ *((LTC_FAST_TYPE *)(prod + x)); 101 } 102#else 103 for (x = 0; x < 16; x++) { 104 ct[x] = ct[x] ^ prod[x]; 105 } 106#endif 107 108 /* move to next */ 109 pt += 16; 110 ct += 16; 111 len -= 16; 112 } 113 114 return CRYPT_OK; 115} 116 117#endif 118/* $Source: /cvs/libtom/libtomcrypt/src/modes/lrw/lrw_process.c,v $ */ 119/* $Revision: 1.10 $ */ 120/* $Date: 2006/06/29 01:53:13 $ */ 121