cryptlib  3.4.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros
rc5enc.c
Go to the documentation of this file.
1 /* crypto/rc5/rc5_enc.c */
2 /* Copyright (C) 1995-1998 Eric Young ([email protected])
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young ([email protected]).
7  * The implementation was written so as to conform with Netscapes SSL.
8  *
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to. The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson ([email protected]).
15  *
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  * notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  * notice, this list of conditions and the following disclaimer in the
30  * documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  * must display the following acknowledgement:
33  * "This product includes cryptographic software written by
34  * Eric Young ([email protected])"
35  * The word 'cryptographic' can be left out if the rouines from the library
36  * being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from
38  * the apps directory (application code) you must include an acknowledgement:
39  * "This product includes software written by Tim Hudson ([email protected])"
40  *
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed. i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58 
59 #if defined( INC_ALL )
60  #include "osconfig.h"
61  #include "rc5.h"
62  #include "rc5locl.h"
63 #else
64  #include "crypt/osconfig.h"
65  #include "crypt/rc5.h"
66  #include "crypt/rc5locl.h"
67 #endif /* Compiler-specific includes */
68 
69 #ifndef USE_ASM
70 
71 void RC5_32_cbc_encrypt(const unsigned char *in, unsigned char *out,
72  long length, RC5_32_KEY *ks, unsigned char *iv,
73  int encrypt)
74  {
75  register unsigned long tin0,tin1;
76  register unsigned long tout0,tout1,xor0,xor1;
77  register long l=length;
78  unsigned long tin[2];
79 
80  if (encrypt)
81  {
82  c2l(iv,tout0);
83  c2l(iv,tout1);
84  iv-=8;
85  for (l-=8; l>=0; l-=8)
86  {
87  c2l(in,tin0);
88  c2l(in,tin1);
89  tin0^=tout0;
90  tin1^=tout1;
91  tin[0]=tin0;
92  tin[1]=tin1;
93  RC5_32_encrypt(tin,ks);
94  tout0=tin[0]; l2c(tout0,out);
95  tout1=tin[1]; l2c(tout1,out);
96  }
97  if (l != -8)
98  {
99  c2ln(in,tin0,tin1,l+8);
100  tin0^=tout0;
101  tin1^=tout1;
102  tin[0]=tin0;
103  tin[1]=tin1;
104  RC5_32_encrypt(tin,ks);
105  tout0=tin[0]; l2c(tout0,out);
106  tout1=tin[1]; l2c(tout1,out);
107  }
108  l2c(tout0,iv);
109  l2c(tout1,iv);
110  }
111  else
112  {
113  c2l(iv,xor0);
114  c2l(iv,xor1);
115  iv-=8;
116  for (l-=8; l>=0; l-=8)
117  {
118  c2l(in,tin0); tin[0]=tin0;
119  c2l(in,tin1); tin[1]=tin1;
120  RC5_32_decrypt(tin,ks);
121  tout0=tin[0]^xor0;
122  tout1=tin[1]^xor1;
123  l2c(tout0,out);
124  l2c(tout1,out);
125  xor0=tin0;
126  xor1=tin1;
127  }
128  if (l != -8)
129  {
130  c2l(in,tin0); tin[0]=tin0;
131  c2l(in,tin1); tin[1]=tin1;
132  RC5_32_decrypt(tin,ks);
133  tout0=tin[0]^xor0;
134  tout1=tin[1]^xor1;
135  l2cn(tout0,tout1,out,l+8);
136  xor0=tin0;
137  xor1=tin1;
138  }
139  l2c(xor0,iv);
140  l2c(xor1,iv);
141  }
142  tin0=tin1=tout0=tout1=xor0=xor1=0;
143  tin[0]=tin[1]=0;
144  }
145 
146 void RC5_32_encrypt(unsigned long *d, RC5_32_KEY *key)
147  {
148  RC5_32_INT a,b,*s;
149 
150  s=key->data;
151 
152  a=d[0]+s[0];
153  b=d[1]+s[1];
154  E_RC5_32(a,b,s, 2);
155  E_RC5_32(a,b,s, 4);
156  E_RC5_32(a,b,s, 6);
157  E_RC5_32(a,b,s, 8);
158  E_RC5_32(a,b,s,10);
159  E_RC5_32(a,b,s,12);
160  E_RC5_32(a,b,s,14);
161  E_RC5_32(a,b,s,16);
162  if (key->rounds == 12)
163  {
164  E_RC5_32(a,b,s,18);
165  E_RC5_32(a,b,s,20);
166  E_RC5_32(a,b,s,22);
167  E_RC5_32(a,b,s,24);
168  }
169  else if (key->rounds == 16)
170  {
171  /* Do a full expansion to avoid a jump */
172  E_RC5_32(a,b,s,18);
173  E_RC5_32(a,b,s,20);
174  E_RC5_32(a,b,s,22);
175  E_RC5_32(a,b,s,24);
176  E_RC5_32(a,b,s,26);
177  E_RC5_32(a,b,s,28);
178  E_RC5_32(a,b,s,30);
179  E_RC5_32(a,b,s,32);
180  }
181  d[0]=a;
182  d[1]=b;
183  }
184 
185 void RC5_32_decrypt(unsigned long *d, RC5_32_KEY *key)
186  {
187  RC5_32_INT a,b,*s;
188 
189  s=key->data;
190 
191  a=d[0];
192  b=d[1];
193  if (key->rounds == 16)
194  {
195  D_RC5_32(a,b,s,32);
196  D_RC5_32(a,b,s,30);
197  D_RC5_32(a,b,s,28);
198  D_RC5_32(a,b,s,26);
199  /* Do a full expansion to avoid a jump */
200  D_RC5_32(a,b,s,24);
201  D_RC5_32(a,b,s,22);
202  D_RC5_32(a,b,s,20);
203  D_RC5_32(a,b,s,18);
204  }
205  else if (key->rounds == 12)
206  {
207  D_RC5_32(a,b,s,24);
208  D_RC5_32(a,b,s,22);
209  D_RC5_32(a,b,s,20);
210  D_RC5_32(a,b,s,18);
211  }
212  D_RC5_32(a,b,s,16);
213  D_RC5_32(a,b,s,14);
214  D_RC5_32(a,b,s,12);
215  D_RC5_32(a,b,s,10);
216  D_RC5_32(a,b,s, 8);
217  D_RC5_32(a,b,s, 6);
218  D_RC5_32(a,b,s, 4);
219  D_RC5_32(a,b,s, 2);
220  d[0]=a-s[0];
221  d[1]=b-s[1];
222  }
223 #endif /* USE_ASM */