Mercurial > dropbear
comparison libtomcrypt/src/modes/lrw/lrw_process.c @ 398:59c7938af2bd
merge of '1250b8af44b62d8f4fe0f8d9fc7e7a1cc34e7e1c'
and '7f8670ac3bb975f40967f3979d09d2199b7e90c8'
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sat, 03 Feb 2007 08:20:30 +0000 |
parents | 0cbe8f6dbf9e |
children | f849a5ca2efc |
comparison
equal
deleted
inserted
replaced
396:e7c1a77d2921 | 398:59c7938af2bd |
---|---|
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, [email protected], 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 */ | |
29 int 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 $ */ |