"SfR Fresh" - the SfR Freeware/Shareware Archive 
Member "pms-0.94/library/blowfish/bf_enc.c" of archive pms-0.94.tar.gz:
As a special service "SfR Fresh" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting with prefixed line numbers.
Alternatively you can here view or download the uninterpreted source code file.
That can be also achieved for any archive member file by clicking within an archive contents listing on the first character of the file(path) respectively on the according byte size field.
1 /* crypto/bf/bf_enc.c */
2 /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
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 (tjh@cryptsoft.com).
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 (eay@cryptsoft.com)"
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 (tjh@cryptsoft.com)"
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 #include "blowfish.h"
60 #include "bf_locl.h"
61
62 /* Blowfish as implemented from 'Blowfish: Springer-Verlag paper'
63 * (From LECTURE NOTES IN COIMPUTER SCIENCE 809, FAST SOFTWARE ENCRYPTION,
64 * CAMBRIDGE SECURITY WORKSHOP, CAMBRIDGE, U.K., DECEMBER 9-11, 1993)
65 */
66
67 #if (BF_ROUNDS != 16) && (BF_ROUNDS != 20)
68 If you set BF_ROUNDS to some value other than 16 or 20, you will have
69 to modify the code.
70 #endif
71
72 void BF_encrypt(data,key)
73 BF_LONG *data;
74 BF_KEY *key;
75 {
76 register BF_LONG l,r,*p,*s;
77
78 p=key->P;
79 s= &(key->S[0]);
80 l=data[0];
81 r=data[1];
82
83 l^=p[0];
84 BF_ENC(r,l,s,p[ 1]);
85 BF_ENC(l,r,s,p[ 2]);
86 BF_ENC(r,l,s,p[ 3]);
87 BF_ENC(l,r,s,p[ 4]);
88 BF_ENC(r,l,s,p[ 5]);
89 BF_ENC(l,r,s,p[ 6]);
90 BF_ENC(r,l,s,p[ 7]);
91 BF_ENC(l,r,s,p[ 8]);
92 BF_ENC(r,l,s,p[ 9]);
93 BF_ENC(l,r,s,p[10]);
94 BF_ENC(r,l,s,p[11]);
95 BF_ENC(l,r,s,p[12]);
96 BF_ENC(r,l,s,p[13]);
97 BF_ENC(l,r,s,p[14]);
98 BF_ENC(r,l,s,p[15]);
99 BF_ENC(l,r,s,p[16]);
100 #if BF_ROUNDS == 20
101 BF_ENC(r,l,s,p[17]);
102 BF_ENC(l,r,s,p[18]);
103 BF_ENC(r,l,s,p[19]);
104 BF_ENC(l,r,s,p[20]);
105 #endif
106 r^=p[BF_ROUNDS+1];
107
108 data[1]=l&0xffffffffL;
109 data[0]=r&0xffffffffL;
110 }
111
112 #ifndef BF_DEFAULT_OPTIONS
113
114 void BF_decrypt(data,key)
115 BF_LONG *data;
116 BF_KEY *key;
117 {
118 register BF_LONG l,r,*p,*s;
119
120 p=key->P;
121 s= &(key->S[0]);
122 l=data[0];
123 r=data[1];
124
125 l^=p[BF_ROUNDS+1];
126 #if BF_ROUNDS == 20
127 BF_ENC(r,l,s,p[20]);
128 BF_ENC(l,r,s,p[19]);
129 BF_ENC(r,l,s,p[18]);
130 BF_ENC(l,r,s,p[17]);
131 #endif
132 BF_ENC(r,l,s,p[16]);
133 BF_ENC(l,r,s,p[15]);
134 BF_ENC(r,l,s,p[14]);
135 BF_ENC(l,r,s,p[13]);
136 BF_ENC(r,l,s,p[12]);
137 BF_ENC(l,r,s,p[11]);
138 BF_ENC(r,l,s,p[10]);
139 BF_ENC(l,r,s,p[ 9]);
140 BF_ENC(r,l,s,p[ 8]);
141 BF_ENC(l,r,s,p[ 7]);
142 BF_ENC(r,l,s,p[ 6]);
143 BF_ENC(l,r,s,p[ 5]);
144 BF_ENC(r,l,s,p[ 4]);
145 BF_ENC(l,r,s,p[ 3]);
146 BF_ENC(r,l,s,p[ 2]);
147 BF_ENC(l,r,s,p[ 1]);
148 r^=p[0];
149
150 data[1]=l&0xffffffffL;
151 data[0]=r&0xffffffffL;
152 }
153
154 void BF_cbc_encrypt(in, out, length, ks, iv, encrypt)
155 unsigned char *in;
156 unsigned char *out;
157 long length;
158 BF_KEY *ks;
159 unsigned char *iv;
160 int encrypt;
161 {
162 register BF_LONG tin0,tin1;
163 register BF_LONG tout0,tout1,xor0,xor1;
164 register long l=length;
165 BF_LONG tin[2];
166
167 if (encrypt)
168 {
169 n2l(iv,tout0);
170 n2l(iv,tout1);
171 iv-=8;
172 for (l-=8; l>=0; l-=8)
173 {
174 n2l(in,tin0);
175 n2l(in,tin1);
176 tin0^=tout0;
177 tin1^=tout1;
178 tin[0]=tin0;
179 tin[1]=tin1;
180 BF_encrypt(tin,ks);
181 tout0=tin[0];
182 tout1=tin[1];
183 l2n(tout0,out);
184 l2n(tout1,out);
185 }
186 if (l != -8)
187 {
188 n2ln(in,tin0,tin1,l+8);
189 tin0^=tout0;
190 tin1^=tout1;
191 tin[0]=tin0;
192 tin[1]=tin1;
193 BF_encrypt(tin,ks);
194 tout0=tin[0];
195 tout1=tin[1];
196 l2n(tout0,out);
197 l2n(tout1,out);
198 }
199 l2n(tout0,iv);
200 l2n(tout1,iv);
201 }
202 else
203 {
204 n2l(iv,xor0);
205 n2l(iv,xor1);
206 iv-=8;
207 for (l-=8; l>=0; l-=8)
208 {
209 n2l(in,tin0);
210 n2l(in,tin1);
211 tin[0]=tin0;
212 tin[1]=tin1;
213 BF_decrypt(tin,ks);
214 tout0=tin[0]^xor0;
215 tout1=tin[1]^xor1;
216 l2n(tout0,out);
217 l2n(tout1,out);
218 xor0=tin0;
219 xor1=tin1;
220 }
221 if (l != -8)
222 {
223 n2l(in,tin0);
224 n2l(in,tin1);
225 tin[0]=tin0;
226 tin[1]=tin1;
227 BF_decrypt(tin,ks);
228 tout0=tin[0]^xor0;
229 tout1=tin[1]^xor1;
230 l2nn(tout0,tout1,out,l+8);
231 xor0=tin0;
232 xor1=tin1;
233 }
234 l2n(xor0,iv);
235 l2n(xor1,iv);
236 }
237 tin0=tin1=tout0=tout1=xor0=xor1=0;
238 tin[0]=tin[1]=0;
239 }
240
241 #endif