1*9df1065fSjoshua /* $OpenBSD: blowfish.c,v 1.3 2024/03/29 02:37:20 joshua Exp $ */
2029d0a84Sjsing /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3029d0a84Sjsing * All rights reserved.
4029d0a84Sjsing *
5029d0a84Sjsing * This package is an SSL implementation written
6029d0a84Sjsing * by Eric Young (eay@cryptsoft.com).
7029d0a84Sjsing * The implementation was written so as to conform with Netscapes SSL.
8029d0a84Sjsing *
9029d0a84Sjsing * This library is free for commercial and non-commercial use as long as
10029d0a84Sjsing * the following conditions are aheared to. The following conditions
11029d0a84Sjsing * apply to all code found in this distribution, be it the RC4, RSA,
12029d0a84Sjsing * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13029d0a84Sjsing * included with this distribution is covered by the same copyright terms
14029d0a84Sjsing * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15029d0a84Sjsing *
16029d0a84Sjsing * Copyright remains Eric Young's, and as such any Copyright notices in
17029d0a84Sjsing * the code are not to be removed.
18029d0a84Sjsing * If this package is used in a product, Eric Young should be given attribution
19029d0a84Sjsing * as the author of the parts of the library used.
20029d0a84Sjsing * This can be in the form of a textual message at program startup or
21029d0a84Sjsing * in documentation (online or textual) provided with the package.
22029d0a84Sjsing *
23029d0a84Sjsing * Redistribution and use in source and binary forms, with or without
24029d0a84Sjsing * modification, are permitted provided that the following conditions
25029d0a84Sjsing * are met:
26029d0a84Sjsing * 1. Redistributions of source code must retain the copyright
27029d0a84Sjsing * notice, this list of conditions and the following disclaimer.
28029d0a84Sjsing * 2. Redistributions in binary form must reproduce the above copyright
29029d0a84Sjsing * notice, this list of conditions and the following disclaimer in the
30029d0a84Sjsing * documentation and/or other materials provided with the distribution.
31029d0a84Sjsing * 3. All advertising materials mentioning features or use of this software
32029d0a84Sjsing * must display the following acknowledgement:
33029d0a84Sjsing * "This product includes cryptographic software written by
34029d0a84Sjsing * Eric Young (eay@cryptsoft.com)"
35029d0a84Sjsing * The word 'cryptographic' can be left out if the rouines from the library
36029d0a84Sjsing * being used are not cryptographic related :-).
37029d0a84Sjsing * 4. If you include any Windows specific code (or a derivative thereof) from
38029d0a84Sjsing * the apps directory (application code) you must include an acknowledgement:
39029d0a84Sjsing * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40029d0a84Sjsing *
41029d0a84Sjsing * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42029d0a84Sjsing * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43029d0a84Sjsing * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44029d0a84Sjsing * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45029d0a84Sjsing * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46029d0a84Sjsing * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47029d0a84Sjsing * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48029d0a84Sjsing * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49029d0a84Sjsing * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50029d0a84Sjsing * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51029d0a84Sjsing * SUCH DAMAGE.
52029d0a84Sjsing *
53029d0a84Sjsing * The licence and distribution terms for any publically available version or
54029d0a84Sjsing * derivative of this code cannot be changed. i.e. this code cannot simply be
55029d0a84Sjsing * copied and put under another distribution licence
56029d0a84Sjsing * [including the GNU Public Licence.]
57029d0a84Sjsing */
58029d0a84Sjsing
59029d0a84Sjsing #include <openssl/blowfish.h>
60029d0a84Sjsing
61029d0a84Sjsing #include <string.h>
62029d0a84Sjsing
63029d0a84Sjsing #include "bf_local.h"
64029d0a84Sjsing
65029d0a84Sjsing /*
66029d0a84Sjsing * Blowfish as implemented from 'Blowfish: Springer-Verlag paper'
67029d0a84Sjsing * (From LECTURE NOTES IN COMPUTER SCIENCE 809, FAST SOFTWARE ENCRYPTION,
68029d0a84Sjsing * CAMBRIDGE SECURITY WORKSHOP, CAMBRIDGE, U.K., DECEMBER 9-11, 1993)
69029d0a84Sjsing */
70029d0a84Sjsing
71029d0a84Sjsing #if (BF_ROUNDS != 16) && (BF_ROUNDS != 20)
72029d0a84Sjsing #error If you set BF_ROUNDS to some value other than 16 or 20, you will have \
73029d0a84Sjsing to modify the code.
74029d0a84Sjsing #endif
75029d0a84Sjsing
76029d0a84Sjsing static const BF_KEY bf_init = {
77029d0a84Sjsing .P = {
78029d0a84Sjsing 0x243f6a88L, 0x85a308d3L, 0x13198a2eL, 0x03707344L,
79029d0a84Sjsing 0xa4093822L, 0x299f31d0L, 0x082efa98L, 0xec4e6c89L,
80029d0a84Sjsing 0x452821e6L, 0x38d01377L, 0xbe5466cfL, 0x34e90c6cL,
81029d0a84Sjsing 0xc0ac29b7L, 0xc97c50ddL, 0x3f84d5b5L, 0xb5470917L,
82029d0a84Sjsing 0x9216d5d9L, 0x8979fb1b
83029d0a84Sjsing },
84029d0a84Sjsing .S = {
85029d0a84Sjsing 0xd1310ba6L, 0x98dfb5acL, 0x2ffd72dbL, 0xd01adfb7L,
86029d0a84Sjsing 0xb8e1afedL, 0x6a267e96L, 0xba7c9045L, 0xf12c7f99L,
87029d0a84Sjsing 0x24a19947L, 0xb3916cf7L, 0x0801f2e2L, 0x858efc16L,
88029d0a84Sjsing 0x636920d8L, 0x71574e69L, 0xa458fea3L, 0xf4933d7eL,
89029d0a84Sjsing 0x0d95748fL, 0x728eb658L, 0x718bcd58L, 0x82154aeeL,
90029d0a84Sjsing 0x7b54a41dL, 0xc25a59b5L, 0x9c30d539L, 0x2af26013L,
91029d0a84Sjsing 0xc5d1b023L, 0x286085f0L, 0xca417918L, 0xb8db38efL,
92029d0a84Sjsing 0x8e79dcb0L, 0x603a180eL, 0x6c9e0e8bL, 0xb01e8a3eL,
93029d0a84Sjsing 0xd71577c1L, 0xbd314b27L, 0x78af2fdaL, 0x55605c60L,
94029d0a84Sjsing 0xe65525f3L, 0xaa55ab94L, 0x57489862L, 0x63e81440L,
95029d0a84Sjsing 0x55ca396aL, 0x2aab10b6L, 0xb4cc5c34L, 0x1141e8ceL,
96029d0a84Sjsing 0xa15486afL, 0x7c72e993L, 0xb3ee1411L, 0x636fbc2aL,
97029d0a84Sjsing 0x2ba9c55dL, 0x741831f6L, 0xce5c3e16L, 0x9b87931eL,
98029d0a84Sjsing 0xafd6ba33L, 0x6c24cf5cL, 0x7a325381L, 0x28958677L,
99029d0a84Sjsing 0x3b8f4898L, 0x6b4bb9afL, 0xc4bfe81bL, 0x66282193L,
100029d0a84Sjsing 0x61d809ccL, 0xfb21a991L, 0x487cac60L, 0x5dec8032L,
101029d0a84Sjsing 0xef845d5dL, 0xe98575b1L, 0xdc262302L, 0xeb651b88L,
102029d0a84Sjsing 0x23893e81L, 0xd396acc5L, 0x0f6d6ff3L, 0x83f44239L,
103029d0a84Sjsing 0x2e0b4482L, 0xa4842004L, 0x69c8f04aL, 0x9e1f9b5eL,
104029d0a84Sjsing 0x21c66842L, 0xf6e96c9aL, 0x670c9c61L, 0xabd388f0L,
105029d0a84Sjsing 0x6a51a0d2L, 0xd8542f68L, 0x960fa728L, 0xab5133a3L,
106029d0a84Sjsing 0x6eef0b6cL, 0x137a3be4L, 0xba3bf050L, 0x7efb2a98L,
107029d0a84Sjsing 0xa1f1651dL, 0x39af0176L, 0x66ca593eL, 0x82430e88L,
108029d0a84Sjsing 0x8cee8619L, 0x456f9fb4L, 0x7d84a5c3L, 0x3b8b5ebeL,
109029d0a84Sjsing 0xe06f75d8L, 0x85c12073L, 0x401a449fL, 0x56c16aa6L,
110029d0a84Sjsing 0x4ed3aa62L, 0x363f7706L, 0x1bfedf72L, 0x429b023dL,
111029d0a84Sjsing 0x37d0d724L, 0xd00a1248L, 0xdb0fead3L, 0x49f1c09bL,
112029d0a84Sjsing 0x075372c9L, 0x80991b7bL, 0x25d479d8L, 0xf6e8def7L,
113029d0a84Sjsing 0xe3fe501aL, 0xb6794c3bL, 0x976ce0bdL, 0x04c006baL,
114029d0a84Sjsing 0xc1a94fb6L, 0x409f60c4L, 0x5e5c9ec2L, 0x196a2463L,
115029d0a84Sjsing 0x68fb6fafL, 0x3e6c53b5L, 0x1339b2ebL, 0x3b52ec6fL,
116029d0a84Sjsing 0x6dfc511fL, 0x9b30952cL, 0xcc814544L, 0xaf5ebd09L,
117029d0a84Sjsing 0xbee3d004L, 0xde334afdL, 0x660f2807L, 0x192e4bb3L,
118029d0a84Sjsing 0xc0cba857L, 0x45c8740fL, 0xd20b5f39L, 0xb9d3fbdbL,
119029d0a84Sjsing 0x5579c0bdL, 0x1a60320aL, 0xd6a100c6L, 0x402c7279L,
120029d0a84Sjsing 0x679f25feL, 0xfb1fa3ccL, 0x8ea5e9f8L, 0xdb3222f8L,
121029d0a84Sjsing 0x3c7516dfL, 0xfd616b15L, 0x2f501ec8L, 0xad0552abL,
122029d0a84Sjsing 0x323db5faL, 0xfd238760L, 0x53317b48L, 0x3e00df82L,
123029d0a84Sjsing 0x9e5c57bbL, 0xca6f8ca0L, 0x1a87562eL, 0xdf1769dbL,
124029d0a84Sjsing 0xd542a8f6L, 0x287effc3L, 0xac6732c6L, 0x8c4f5573L,
125029d0a84Sjsing 0x695b27b0L, 0xbbca58c8L, 0xe1ffa35dL, 0xb8f011a0L,
126029d0a84Sjsing 0x10fa3d98L, 0xfd2183b8L, 0x4afcb56cL, 0x2dd1d35bL,
127029d0a84Sjsing 0x9a53e479L, 0xb6f84565L, 0xd28e49bcL, 0x4bfb9790L,
128029d0a84Sjsing 0xe1ddf2daL, 0xa4cb7e33L, 0x62fb1341L, 0xcee4c6e8L,
129029d0a84Sjsing 0xef20cadaL, 0x36774c01L, 0xd07e9efeL, 0x2bf11fb4L,
130029d0a84Sjsing 0x95dbda4dL, 0xae909198L, 0xeaad8e71L, 0x6b93d5a0L,
131029d0a84Sjsing 0xd08ed1d0L, 0xafc725e0L, 0x8e3c5b2fL, 0x8e7594b7L,
132029d0a84Sjsing 0x8ff6e2fbL, 0xf2122b64L, 0x8888b812L, 0x900df01cL,
133029d0a84Sjsing 0x4fad5ea0L, 0x688fc31cL, 0xd1cff191L, 0xb3a8c1adL,
134029d0a84Sjsing 0x2f2f2218L, 0xbe0e1777L, 0xea752dfeL, 0x8b021fa1L,
135029d0a84Sjsing 0xe5a0cc0fL, 0xb56f74e8L, 0x18acf3d6L, 0xce89e299L,
136029d0a84Sjsing 0xb4a84fe0L, 0xfd13e0b7L, 0x7cc43b81L, 0xd2ada8d9L,
137029d0a84Sjsing 0x165fa266L, 0x80957705L, 0x93cc7314L, 0x211a1477L,
138029d0a84Sjsing 0xe6ad2065L, 0x77b5fa86L, 0xc75442f5L, 0xfb9d35cfL,
139029d0a84Sjsing 0xebcdaf0cL, 0x7b3e89a0L, 0xd6411bd3L, 0xae1e7e49L,
140029d0a84Sjsing 0x00250e2dL, 0x2071b35eL, 0x226800bbL, 0x57b8e0afL,
141029d0a84Sjsing 0x2464369bL, 0xf009b91eL, 0x5563911dL, 0x59dfa6aaL,
142029d0a84Sjsing 0x78c14389L, 0xd95a537fL, 0x207d5ba2L, 0x02e5b9c5L,
143029d0a84Sjsing 0x83260376L, 0x6295cfa9L, 0x11c81968L, 0x4e734a41L,
144029d0a84Sjsing 0xb3472dcaL, 0x7b14a94aL, 0x1b510052L, 0x9a532915L,
145029d0a84Sjsing 0xd60f573fL, 0xbc9bc6e4L, 0x2b60a476L, 0x81e67400L,
146029d0a84Sjsing 0x08ba6fb5L, 0x571be91fL, 0xf296ec6bL, 0x2a0dd915L,
147029d0a84Sjsing 0xb6636521L, 0xe7b9f9b6L, 0xff34052eL, 0xc5855664L,
148029d0a84Sjsing 0x53b02d5dL, 0xa99f8fa1L, 0x08ba4799L, 0x6e85076aL,
149029d0a84Sjsing 0x4b7a70e9L, 0xb5b32944L, 0xdb75092eL, 0xc4192623L,
150029d0a84Sjsing 0xad6ea6b0L, 0x49a7df7dL, 0x9cee60b8L, 0x8fedb266L,
151029d0a84Sjsing 0xecaa8c71L, 0x699a17ffL, 0x5664526cL, 0xc2b19ee1L,
152029d0a84Sjsing 0x193602a5L, 0x75094c29L, 0xa0591340L, 0xe4183a3eL,
153029d0a84Sjsing 0x3f54989aL, 0x5b429d65L, 0x6b8fe4d6L, 0x99f73fd6L,
154029d0a84Sjsing 0xa1d29c07L, 0xefe830f5L, 0x4d2d38e6L, 0xf0255dc1L,
155029d0a84Sjsing 0x4cdd2086L, 0x8470eb26L, 0x6382e9c6L, 0x021ecc5eL,
156029d0a84Sjsing 0x09686b3fL, 0x3ebaefc9L, 0x3c971814L, 0x6b6a70a1L,
157029d0a84Sjsing 0x687f3584L, 0x52a0e286L, 0xb79c5305L, 0xaa500737L,
158029d0a84Sjsing 0x3e07841cL, 0x7fdeae5cL, 0x8e7d44ecL, 0x5716f2b8L,
159029d0a84Sjsing 0xb03ada37L, 0xf0500c0dL, 0xf01c1f04L, 0x0200b3ffL,
160029d0a84Sjsing 0xae0cf51aL, 0x3cb574b2L, 0x25837a58L, 0xdc0921bdL,
161029d0a84Sjsing 0xd19113f9L, 0x7ca92ff6L, 0x94324773L, 0x22f54701L,
162029d0a84Sjsing 0x3ae5e581L, 0x37c2dadcL, 0xc8b57634L, 0x9af3dda7L,
163029d0a84Sjsing 0xa9446146L, 0x0fd0030eL, 0xecc8c73eL, 0xa4751e41L,
164029d0a84Sjsing 0xe238cd99L, 0x3bea0e2fL, 0x3280bba1L, 0x183eb331L,
165029d0a84Sjsing 0x4e548b38L, 0x4f6db908L, 0x6f420d03L, 0xf60a04bfL,
166029d0a84Sjsing 0x2cb81290L, 0x24977c79L, 0x5679b072L, 0xbcaf89afL,
167029d0a84Sjsing 0xde9a771fL, 0xd9930810L, 0xb38bae12L, 0xdccf3f2eL,
168029d0a84Sjsing 0x5512721fL, 0x2e6b7124L, 0x501adde6L, 0x9f84cd87L,
169029d0a84Sjsing 0x7a584718L, 0x7408da17L, 0xbc9f9abcL, 0xe94b7d8cL,
170029d0a84Sjsing 0xec7aec3aL, 0xdb851dfaL, 0x63094366L, 0xc464c3d2L,
171029d0a84Sjsing 0xef1c1847L, 0x3215d908L, 0xdd433b37L, 0x24c2ba16L,
172029d0a84Sjsing 0x12a14d43L, 0x2a65c451L, 0x50940002L, 0x133ae4ddL,
173029d0a84Sjsing 0x71dff89eL, 0x10314e55L, 0x81ac77d6L, 0x5f11199bL,
174029d0a84Sjsing 0x043556f1L, 0xd7a3c76bL, 0x3c11183bL, 0x5924a509L,
175029d0a84Sjsing 0xf28fe6edL, 0x97f1fbfaL, 0x9ebabf2cL, 0x1e153c6eL,
176029d0a84Sjsing 0x86e34570L, 0xeae96fb1L, 0x860e5e0aL, 0x5a3e2ab3L,
177029d0a84Sjsing 0x771fe71cL, 0x4e3d06faL, 0x2965dcb9L, 0x99e71d0fL,
178029d0a84Sjsing 0x803e89d6L, 0x5266c825L, 0x2e4cc978L, 0x9c10b36aL,
179029d0a84Sjsing 0xc6150ebaL, 0x94e2ea78L, 0xa5fc3c53L, 0x1e0a2df4L,
180029d0a84Sjsing 0xf2f74ea7L, 0x361d2b3dL, 0x1939260fL, 0x19c27960L,
181029d0a84Sjsing 0x5223a708L, 0xf71312b6L, 0xebadfe6eL, 0xeac31f66L,
182029d0a84Sjsing 0xe3bc4595L, 0xa67bc883L, 0xb17f37d1L, 0x018cff28L,
183029d0a84Sjsing 0xc332ddefL, 0xbe6c5aa5L, 0x65582185L, 0x68ab9802L,
184029d0a84Sjsing 0xeecea50fL, 0xdb2f953bL, 0x2aef7dadL, 0x5b6e2f84L,
185029d0a84Sjsing 0x1521b628L, 0x29076170L, 0xecdd4775L, 0x619f1510L,
186029d0a84Sjsing 0x13cca830L, 0xeb61bd96L, 0x0334fe1eL, 0xaa0363cfL,
187029d0a84Sjsing 0xb5735c90L, 0x4c70a239L, 0xd59e9e0bL, 0xcbaade14L,
188029d0a84Sjsing 0xeecc86bcL, 0x60622ca7L, 0x9cab5cabL, 0xb2f3846eL,
189029d0a84Sjsing 0x648b1eafL, 0x19bdf0caL, 0xa02369b9L, 0x655abb50L,
190029d0a84Sjsing 0x40685a32L, 0x3c2ab4b3L, 0x319ee9d5L, 0xc021b8f7L,
191029d0a84Sjsing 0x9b540b19L, 0x875fa099L, 0x95f7997eL, 0x623d7da8L,
192029d0a84Sjsing 0xf837889aL, 0x97e32d77L, 0x11ed935fL, 0x16681281L,
193029d0a84Sjsing 0x0e358829L, 0xc7e61fd6L, 0x96dedfa1L, 0x7858ba99L,
194029d0a84Sjsing 0x57f584a5L, 0x1b227263L, 0x9b83c3ffL, 0x1ac24696L,
195029d0a84Sjsing 0xcdb30aebL, 0x532e3054L, 0x8fd948e4L, 0x6dbc3128L,
196029d0a84Sjsing 0x58ebf2efL, 0x34c6ffeaL, 0xfe28ed61L, 0xee7c3c73L,
197029d0a84Sjsing 0x5d4a14d9L, 0xe864b7e3L, 0x42105d14L, 0x203e13e0L,
198029d0a84Sjsing 0x45eee2b6L, 0xa3aaabeaL, 0xdb6c4f15L, 0xfacb4fd0L,
199029d0a84Sjsing 0xc742f442L, 0xef6abbb5L, 0x654f3b1dL, 0x41cd2105L,
200029d0a84Sjsing 0xd81e799eL, 0x86854dc7L, 0xe44b476aL, 0x3d816250L,
201029d0a84Sjsing 0xcf62a1f2L, 0x5b8d2646L, 0xfc8883a0L, 0xc1c7b6a3L,
202029d0a84Sjsing 0x7f1524c3L, 0x69cb7492L, 0x47848a0bL, 0x5692b285L,
203029d0a84Sjsing 0x095bbf00L, 0xad19489dL, 0x1462b174L, 0x23820e00L,
204029d0a84Sjsing 0x58428d2aL, 0x0c55f5eaL, 0x1dadf43eL, 0x233f7061L,
205029d0a84Sjsing 0x3372f092L, 0x8d937e41L, 0xd65fecf1L, 0x6c223bdbL,
206029d0a84Sjsing 0x7cde3759L, 0xcbee7460L, 0x4085f2a7L, 0xce77326eL,
207029d0a84Sjsing 0xa6078084L, 0x19f8509eL, 0xe8efd855L, 0x61d99735L,
208029d0a84Sjsing 0xa969a7aaL, 0xc50c06c2L, 0x5a04abfcL, 0x800bcadcL,
209029d0a84Sjsing 0x9e447a2eL, 0xc3453484L, 0xfdd56705L, 0x0e1e9ec9L,
210029d0a84Sjsing 0xdb73dbd3L, 0x105588cdL, 0x675fda79L, 0xe3674340L,
211029d0a84Sjsing 0xc5c43465L, 0x713e38d8L, 0x3d28f89eL, 0xf16dff20L,
212029d0a84Sjsing 0x153e21e7L, 0x8fb03d4aL, 0xe6e39f2bL, 0xdb83adf7L,
213029d0a84Sjsing 0xe93d5a68L, 0x948140f7L, 0xf64c261cL, 0x94692934L,
214029d0a84Sjsing 0x411520f7L, 0x7602d4f7L, 0xbcf46b2eL, 0xd4a20068L,
215029d0a84Sjsing 0xd4082471L, 0x3320f46aL, 0x43b7d4b7L, 0x500061afL,
216029d0a84Sjsing 0x1e39f62eL, 0x97244546L, 0x14214f74L, 0xbf8b8840L,
217029d0a84Sjsing 0x4d95fc1dL, 0x96b591afL, 0x70f4ddd3L, 0x66a02f45L,
218029d0a84Sjsing 0xbfbc09ecL, 0x03bd9785L, 0x7fac6dd0L, 0x31cb8504L,
219029d0a84Sjsing 0x96eb27b3L, 0x55fd3941L, 0xda2547e6L, 0xabca0a9aL,
220029d0a84Sjsing 0x28507825L, 0x530429f4L, 0x0a2c86daL, 0xe9b66dfbL,
221029d0a84Sjsing 0x68dc1462L, 0xd7486900L, 0x680ec0a4L, 0x27a18deeL,
222029d0a84Sjsing 0x4f3ffea2L, 0xe887ad8cL, 0xb58ce006L, 0x7af4d6b6L,
223029d0a84Sjsing 0xaace1e7cL, 0xd3375fecL, 0xce78a399L, 0x406b2a42L,
224029d0a84Sjsing 0x20fe9e35L, 0xd9f385b9L, 0xee39d7abL, 0x3b124e8bL,
225029d0a84Sjsing 0x1dc9faf7L, 0x4b6d1856L, 0x26a36631L, 0xeae397b2L,
226029d0a84Sjsing 0x3a6efa74L, 0xdd5b4332L, 0x6841e7f7L, 0xca7820fbL,
227029d0a84Sjsing 0xfb0af54eL, 0xd8feb397L, 0x454056acL, 0xba489527L,
228029d0a84Sjsing 0x55533a3aL, 0x20838d87L, 0xfe6ba9b7L, 0xd096954bL,
229029d0a84Sjsing 0x55a867bcL, 0xa1159a58L, 0xcca92963L, 0x99e1db33L,
230029d0a84Sjsing 0xa62a4a56L, 0x3f3125f9L, 0x5ef47e1cL, 0x9029317cL,
231029d0a84Sjsing 0xfdf8e802L, 0x04272f70L, 0x80bb155cL, 0x05282ce3L,
232029d0a84Sjsing 0x95c11548L, 0xe4c66d22L, 0x48c1133fL, 0xc70f86dcL,
233029d0a84Sjsing 0x07f9c9eeL, 0x41041f0fL, 0x404779a4L, 0x5d886e17L,
234029d0a84Sjsing 0x325f51ebL, 0xd59bc0d1L, 0xf2bcc18fL, 0x41113564L,
235029d0a84Sjsing 0x257b7834L, 0x602a9c60L, 0xdff8e8a3L, 0x1f636c1bL,
236029d0a84Sjsing 0x0e12b4c2L, 0x02e1329eL, 0xaf664fd1L, 0xcad18115L,
237029d0a84Sjsing 0x6b2395e0L, 0x333e92e1L, 0x3b240b62L, 0xeebeb922L,
238029d0a84Sjsing 0x85b2a20eL, 0xe6ba0d99L, 0xde720c8cL, 0x2da2f728L,
239029d0a84Sjsing 0xd0127845L, 0x95b794fdL, 0x647d0862L, 0xe7ccf5f0L,
240029d0a84Sjsing 0x5449a36fL, 0x877d48faL, 0xc39dfd27L, 0xf33e8d1eL,
241029d0a84Sjsing 0x0a476341L, 0x992eff74L, 0x3a6f6eabL, 0xf4f8fd37L,
242029d0a84Sjsing 0xa812dc60L, 0xa1ebddf8L, 0x991be14cL, 0xdb6e6b0dL,
243029d0a84Sjsing 0xc67b5510L, 0x6d672c37L, 0x2765d43bL, 0xdcd0e804L,
244029d0a84Sjsing 0xf1290dc7L, 0xcc00ffa3L, 0xb5390f92L, 0x690fed0bL,
245029d0a84Sjsing 0x667b9ffbL, 0xcedb7d9cL, 0xa091cf0bL, 0xd9155ea3L,
246029d0a84Sjsing 0xbb132f88L, 0x515bad24L, 0x7b9479bfL, 0x763bd6ebL,
247029d0a84Sjsing 0x37392eb3L, 0xcc115979L, 0x8026e297L, 0xf42e312dL,
248029d0a84Sjsing 0x6842ada7L, 0xc66a2b3bL, 0x12754cccL, 0x782ef11cL,
249029d0a84Sjsing 0x6a124237L, 0xb79251e7L, 0x06a1bbe6L, 0x4bfb6350L,
250029d0a84Sjsing 0x1a6b1018L, 0x11caedfaL, 0x3d25bdd8L, 0xe2e1c3c9L,
251029d0a84Sjsing 0x44421659L, 0x0a121386L, 0xd90cec6eL, 0xd5abea2aL,
252029d0a84Sjsing 0x64af674eL, 0xda86a85fL, 0xbebfe988L, 0x64e4c3feL,
253029d0a84Sjsing 0x9dbc8057L, 0xf0f7c086L, 0x60787bf8L, 0x6003604dL,
254029d0a84Sjsing 0xd1fd8346L, 0xf6381fb0L, 0x7745ae04L, 0xd736fcccL,
255029d0a84Sjsing 0x83426b33L, 0xf01eab71L, 0xb0804187L, 0x3c005e5fL,
256029d0a84Sjsing 0x77a057beL, 0xbde8ae24L, 0x55464299L, 0xbf582e61L,
257029d0a84Sjsing 0x4e58f48fL, 0xf2ddfda2L, 0xf474ef38L, 0x8789bdc2L,
258029d0a84Sjsing 0x5366f9c3L, 0xc8b38e74L, 0xb475f255L, 0x46fcd9b9L,
259029d0a84Sjsing 0x7aeb2661L, 0x8b1ddf84L, 0x846a0e79L, 0x915f95e2L,
260029d0a84Sjsing 0x466e598eL, 0x20b45770L, 0x8cd55591L, 0xc902de4cL,
261029d0a84Sjsing 0xb90bace1L, 0xbb8205d0L, 0x11a86248L, 0x7574a99eL,
262029d0a84Sjsing 0xb77f19b6L, 0xe0a9dc09L, 0x662d09a1L, 0xc4324633L,
263029d0a84Sjsing 0xe85a1f02L, 0x09f0be8cL, 0x4a99a025L, 0x1d6efe10L,
264029d0a84Sjsing 0x1ab93d1dL, 0x0ba5a4dfL, 0xa186f20fL, 0x2868f169L,
265029d0a84Sjsing 0xdcb7da83L, 0x573906feL, 0xa1e2ce9bL, 0x4fcd7f52L,
266029d0a84Sjsing 0x50115e01L, 0xa70683faL, 0xa002b5c4L, 0x0de6d027L,
267029d0a84Sjsing 0x9af88c27L, 0x773f8641L, 0xc3604c06L, 0x61a806b5L,
268029d0a84Sjsing 0xf0177a28L, 0xc0f586e0L, 0x006058aaL, 0x30dc7d62L,
269029d0a84Sjsing 0x11e69ed7L, 0x2338ea63L, 0x53c2dd94L, 0xc2c21634L,
270029d0a84Sjsing 0xbbcbee56L, 0x90bcb6deL, 0xebfc7da1L, 0xce591d76L,
271029d0a84Sjsing 0x6f05e409L, 0x4b7c0188L, 0x39720a3dL, 0x7c927c24L,
272029d0a84Sjsing 0x86e3725fL, 0x724d9db9L, 0x1ac15bb4L, 0xd39eb8fcL,
273029d0a84Sjsing 0xed545578L, 0x08fca5b5L, 0xd83d7cd3L, 0x4dad0fc4L,
274029d0a84Sjsing 0x1e50ef5eL, 0xb161e6f8L, 0xa28514d9L, 0x6c51133cL,
275029d0a84Sjsing 0x6fd5c7e7L, 0x56e14ec4L, 0x362abfceL, 0xddc6c837L,
276029d0a84Sjsing 0xd79a3234L, 0x92638212L, 0x670efa8eL, 0x406000e0L,
277029d0a84Sjsing 0x3a39ce37L, 0xd3faf5cfL, 0xabc27737L, 0x5ac52d1bL,
278029d0a84Sjsing 0x5cb0679eL, 0x4fa33742L, 0xd3822740L, 0x99bc9bbeL,
279029d0a84Sjsing 0xd5118e9dL, 0xbf0f7315L, 0xd62d1c7eL, 0xc700c47bL,
280029d0a84Sjsing 0xb78c1b6bL, 0x21a19045L, 0xb26eb1beL, 0x6a366eb4L,
281029d0a84Sjsing 0x5748ab2fL, 0xbc946e79L, 0xc6a376d2L, 0x6549c2c8L,
282029d0a84Sjsing 0x530ff8eeL, 0x468dde7dL, 0xd5730a1dL, 0x4cd04dc6L,
283029d0a84Sjsing 0x2939bbdbL, 0xa9ba4650L, 0xac9526e8L, 0xbe5ee304L,
284029d0a84Sjsing 0xa1fad5f0L, 0x6a2d519aL, 0x63ef8ce2L, 0x9a86ee22L,
285029d0a84Sjsing 0xc089c2b8L, 0x43242ef6L, 0xa51e03aaL, 0x9cf2d0a4L,
286029d0a84Sjsing 0x83c061baL, 0x9be96a4dL, 0x8fe51550L, 0xba645bd6L,
287029d0a84Sjsing 0x2826a2f9L, 0xa73a3ae1L, 0x4ba99586L, 0xef5562e9L,
288029d0a84Sjsing 0xc72fefd3L, 0xf752f7daL, 0x3f046f69L, 0x77fa0a59L,
289029d0a84Sjsing 0x80e4a915L, 0x87b08601L, 0x9b09e6adL, 0x3b3ee593L,
290029d0a84Sjsing 0xe990fd5aL, 0x9e34d797L, 0x2cf0b7d9L, 0x022b8b51L,
291029d0a84Sjsing 0x96d5ac3aL, 0x017da67dL, 0xd1cf3ed6L, 0x7c7d2d28L,
292029d0a84Sjsing 0x1f9f25cfL, 0xadf2b89bL, 0x5ad6b472L, 0x5a88f54cL,
293029d0a84Sjsing 0xe029ac71L, 0xe019a5e6L, 0x47b0acfdL, 0xed93fa9bL,
294029d0a84Sjsing 0xe8d3c48dL, 0x283b57ccL, 0xf8d56629L, 0x79132e28L,
295029d0a84Sjsing 0x785f0191L, 0xed756055L, 0xf7960e44L, 0xe3d35e8cL,
296029d0a84Sjsing 0x15056dd4L, 0x88f46dbaL, 0x03a16125L, 0x0564f0bdL,
297029d0a84Sjsing 0xc3eb9e15L, 0x3c9057a2L, 0x97271aecL, 0xa93a072aL,
298029d0a84Sjsing 0x1b3f6d9bL, 0x1e6321f5L, 0xf59c66fbL, 0x26dcf319L,
299029d0a84Sjsing 0x7533d928L, 0xb155fdf5L, 0x03563482L, 0x8aba3cbbL,
300029d0a84Sjsing 0x28517711L, 0xc20ad9f8L, 0xabcc5167L, 0xccad925fL,
301029d0a84Sjsing 0x4de81751L, 0x3830dc8eL, 0x379d5862L, 0x9320f991L,
302029d0a84Sjsing 0xea7a90c2L, 0xfb3e7bceL, 0x5121ce64L, 0x774fbe32L,
303029d0a84Sjsing 0xa8b6e37eL, 0xc3293d46L, 0x48de5369L, 0x6413e680L,
304029d0a84Sjsing 0xa2ae0810L, 0xdd6db224L, 0x69852dfdL, 0x09072166L,
305029d0a84Sjsing 0xb39a460aL, 0x6445c0ddL, 0x586cdecfL, 0x1c20c8aeL,
306029d0a84Sjsing 0x5bbef7ddL, 0x1b588d40L, 0xccd2017fL, 0x6bb4e3bbL,
307029d0a84Sjsing 0xdda26a7eL, 0x3a59ff45L, 0x3e350a44L, 0xbcb4cdd5L,
308029d0a84Sjsing 0x72eacea8L, 0xfa6484bbL, 0x8d6612aeL, 0xbf3c6f47L,
309029d0a84Sjsing 0xd29be463L, 0x542f5d9eL, 0xaec2771bL, 0xf64e6370L,
310029d0a84Sjsing 0x740e0d8dL, 0xe75b1357L, 0xf8721671L, 0xaf537d5dL,
311029d0a84Sjsing 0x4040cb08L, 0x4eb4e2ccL, 0x34d2466aL, 0x0115af84L,
312029d0a84Sjsing 0xe1b00428L, 0x95983a1dL, 0x06b89fb4L, 0xce6ea048L,
313029d0a84Sjsing 0x6f3f3b82L, 0x3520ab82L, 0x011a1d4bL, 0x277227f8L,
314029d0a84Sjsing 0x611560b1L, 0xe7933fdcL, 0xbb3a792bL, 0x344525bdL,
315029d0a84Sjsing 0xa08839e1L, 0x51ce794bL, 0x2f32c9b7L, 0xa01fbac9L,
316029d0a84Sjsing 0xe01cc87eL, 0xbcc7d1f6L, 0xcf0111c3L, 0xa1e8aac7L,
317029d0a84Sjsing 0x1a908749L, 0xd44fbd9aL, 0xd0dadecbL, 0xd50ada38L,
318029d0a84Sjsing 0x0339c32aL, 0xc6913667L, 0x8df9317cL, 0xe0b12b4fL,
319029d0a84Sjsing 0xf79e59b7L, 0x43f5bb3aL, 0xf2d519ffL, 0x27d9459cL,
320029d0a84Sjsing 0xbf97222cL, 0x15e6fc2aL, 0x0f91fc71L, 0x9b941525L,
321029d0a84Sjsing 0xfae59361L, 0xceb69cebL, 0xc2a86459L, 0x12baa8d1L,
322029d0a84Sjsing 0xb6c1075eL, 0xe3056a0cL, 0x10d25065L, 0xcb03a442L,
323029d0a84Sjsing 0xe0ec6e0eL, 0x1698db3bL, 0x4c98a0beL, 0x3278e964L,
324029d0a84Sjsing 0x9f1f9532L, 0xe0d392dfL, 0xd3a0342bL, 0x8971f21eL,
325029d0a84Sjsing 0x1b0a7441L, 0x4ba3348cL, 0xc5be7120L, 0xc37632d8L,
326029d0a84Sjsing 0xdf359f8dL, 0x9b992f2eL, 0xe60b6f47L, 0x0fe3f11dL,
327029d0a84Sjsing 0xe54cda54L, 0x1edad891L, 0xce6279cfL, 0xcd3e7e6fL,
328029d0a84Sjsing 0x1618b166L, 0xfd2c1d05L, 0x848fd2c5L, 0xf6fb2299L,
329029d0a84Sjsing 0xf523f357L, 0xa6327623L, 0x93a83531L, 0x56cccd02L,
330029d0a84Sjsing 0xacf08162L, 0x5a75ebb5L, 0x6e163697L, 0x88d273ccL,
331029d0a84Sjsing 0xde966292L, 0x81b949d0L, 0x4c50901bL, 0x71c65614L,
332029d0a84Sjsing 0xe6c6c7bdL, 0x327a140aL, 0x45e1d006L, 0xc3f27b9aL,
333029d0a84Sjsing 0xc9aa53fdL, 0x62a80f00L, 0xbb25bfe2L, 0x35bdd2f6L,
334029d0a84Sjsing 0x71126905L, 0xb2040222L, 0xb6cbcf7cL, 0xcd769c2bL,
335029d0a84Sjsing 0x53113ec0L, 0x1640e3d3L, 0x38abbd60L, 0x2547adf0L,
336029d0a84Sjsing 0xba38209cL, 0xf746ce76L, 0x77afa1c5L, 0x20756060L,
337029d0a84Sjsing 0x85cbfe4eL, 0x8ae88dd8L, 0x7aaaf9b0L, 0x4cf9aa7eL,
338029d0a84Sjsing 0x1948c25cL, 0x02fb8a8cL, 0x01c36ae4L, 0xd6ebe1f9L,
339029d0a84Sjsing 0x90d4f869L, 0xa65cdea0L, 0x3f09252dL, 0xc208e69fL,
340029d0a84Sjsing 0xb74e6132L, 0xce77e25bL, 0x578fdfe3L, 0x3ac372e6L,
341029d0a84Sjsing }
342029d0a84Sjsing };
343029d0a84Sjsing
344029d0a84Sjsing void
BF_encrypt(BF_LONG * data,const BF_KEY * key)345029d0a84Sjsing BF_encrypt(BF_LONG *data, const BF_KEY *key)
346029d0a84Sjsing {
347029d0a84Sjsing BF_LONG l, r;
348029d0a84Sjsing const BF_LONG *p, *s;
349029d0a84Sjsing
350029d0a84Sjsing p = key->P;
351029d0a84Sjsing s = &(key->S[0]);
352029d0a84Sjsing l = data[0];
353029d0a84Sjsing r = data[1];
354029d0a84Sjsing
355029d0a84Sjsing l ^= p[0];
356029d0a84Sjsing BF_ENC(r, l,s, p[1]);
357029d0a84Sjsing BF_ENC(l, r,s, p[2]);
358029d0a84Sjsing BF_ENC(r, l,s, p[3]);
359029d0a84Sjsing BF_ENC(l, r,s, p[4]);
360029d0a84Sjsing BF_ENC(r, l,s, p[5]);
361029d0a84Sjsing BF_ENC(l, r,s, p[6]);
362029d0a84Sjsing BF_ENC(r, l,s, p[7]);
363029d0a84Sjsing BF_ENC(l, r,s, p[8]);
364029d0a84Sjsing BF_ENC(r, l,s, p[9]);
365029d0a84Sjsing BF_ENC(l, r,s, p[10]);
366029d0a84Sjsing BF_ENC(r, l,s, p[11]);
367029d0a84Sjsing BF_ENC(l, r,s, p[12]);
368029d0a84Sjsing BF_ENC(r, l,s, p[13]);
369029d0a84Sjsing BF_ENC(l, r,s, p[14]);
370029d0a84Sjsing BF_ENC(r, l,s, p[15]);
371029d0a84Sjsing BF_ENC(l, r,s, p[16]);
372029d0a84Sjsing #if BF_ROUNDS == 20
373029d0a84Sjsing BF_ENC(r, l,s, p[17]);
374029d0a84Sjsing BF_ENC(l, r,s, p[18]);
375029d0a84Sjsing BF_ENC(r, l,s, p[19]);
376029d0a84Sjsing BF_ENC(l, r,s, p[20]);
377029d0a84Sjsing #endif
378029d0a84Sjsing r ^= p[BF_ROUNDS + 1];
379029d0a84Sjsing
380029d0a84Sjsing data[1] = l&0xffffffffL;
381029d0a84Sjsing data[0] = r&0xffffffffL;
382029d0a84Sjsing }
383*9df1065fSjoshua LCRYPTO_ALIAS(BF_encrypt);
384029d0a84Sjsing
385029d0a84Sjsing #ifndef BF_DEFAULT_OPTIONS
386029d0a84Sjsing
387029d0a84Sjsing void
BF_decrypt(BF_LONG * data,const BF_KEY * key)388029d0a84Sjsing BF_decrypt(BF_LONG *data, const BF_KEY *key)
389029d0a84Sjsing {
390029d0a84Sjsing BF_LONG l, r;
391029d0a84Sjsing const BF_LONG *p, *s;
392029d0a84Sjsing
393029d0a84Sjsing p = key->P;
394029d0a84Sjsing s = &(key->S[0]);
395029d0a84Sjsing l = data[0];
396029d0a84Sjsing r = data[1];
397029d0a84Sjsing
398029d0a84Sjsing l ^= p[BF_ROUNDS + 1];
399029d0a84Sjsing #if BF_ROUNDS == 20
400029d0a84Sjsing BF_ENC(r, l,s, p[20]);
401029d0a84Sjsing BF_ENC(l, r,s, p[19]);
402029d0a84Sjsing BF_ENC(r, l,s, p[18]);
403029d0a84Sjsing BF_ENC(l, r,s, p[17]);
404029d0a84Sjsing #endif
405029d0a84Sjsing BF_ENC(r, l,s, p[16]);
406029d0a84Sjsing BF_ENC(l, r,s, p[15]);
407029d0a84Sjsing BF_ENC(r, l,s, p[14]);
408029d0a84Sjsing BF_ENC(l, r,s, p[13]);
409029d0a84Sjsing BF_ENC(r, l,s, p[12]);
410029d0a84Sjsing BF_ENC(l, r,s, p[11]);
411029d0a84Sjsing BF_ENC(r, l,s, p[10]);
412029d0a84Sjsing BF_ENC(l, r,s, p[9]);
413029d0a84Sjsing BF_ENC(r, l,s, p[8]);
414029d0a84Sjsing BF_ENC(l, r,s, p[7]);
415029d0a84Sjsing BF_ENC(r, l,s, p[6]);
416029d0a84Sjsing BF_ENC(l, r,s, p[5]);
417029d0a84Sjsing BF_ENC(r, l,s, p[4]);
418029d0a84Sjsing BF_ENC(l, r,s, p[3]);
419029d0a84Sjsing BF_ENC(r, l,s, p[2]);
420029d0a84Sjsing BF_ENC(l, r,s, p[1]);
421029d0a84Sjsing r ^= p[0];
422029d0a84Sjsing
423029d0a84Sjsing data[1] = l&0xffffffffL;
424029d0a84Sjsing data[0] = r&0xffffffffL;
425029d0a84Sjsing }
426*9df1065fSjoshua LCRYPTO_ALIAS(BF_decrypt);
427029d0a84Sjsing
428029d0a84Sjsing void
BF_cbc_encrypt(const unsigned char * in,unsigned char * out,long length,const BF_KEY * schedule,unsigned char * ivec,int encrypt)429029d0a84Sjsing BF_cbc_encrypt(const unsigned char *in, unsigned char *out, long length,
430029d0a84Sjsing const BF_KEY *schedule, unsigned char *ivec, int encrypt)
431029d0a84Sjsing {
432029d0a84Sjsing BF_LONG tin0, tin1;
433029d0a84Sjsing BF_LONG tout0, tout1, xor0, xor1;
434029d0a84Sjsing long l = length;
435029d0a84Sjsing BF_LONG tin[2];
436029d0a84Sjsing
437029d0a84Sjsing if (encrypt) {
438029d0a84Sjsing n2l(ivec, tout0);
439029d0a84Sjsing n2l(ivec, tout1);
440029d0a84Sjsing ivec -= 8;
441029d0a84Sjsing for (l -= 8; l >= 0; l -= 8) {
442029d0a84Sjsing n2l(in, tin0);
443029d0a84Sjsing n2l(in, tin1);
444029d0a84Sjsing tin0 ^= tout0;
445029d0a84Sjsing tin1 ^= tout1;
446029d0a84Sjsing tin[0] = tin0;
447029d0a84Sjsing tin[1] = tin1;
448029d0a84Sjsing BF_encrypt(tin, schedule);
449029d0a84Sjsing tout0 = tin[0];
450029d0a84Sjsing tout1 = tin[1];
451029d0a84Sjsing l2n(tout0, out);
452029d0a84Sjsing l2n(tout1, out);
453029d0a84Sjsing }
454029d0a84Sjsing if (l != -8) {
455029d0a84Sjsing n2ln(in, tin0, tin1, l + 8);
456029d0a84Sjsing tin0 ^= tout0;
457029d0a84Sjsing tin1 ^= tout1;
458029d0a84Sjsing tin[0] = tin0;
459029d0a84Sjsing tin[1] = tin1;
460029d0a84Sjsing BF_encrypt(tin, schedule);
461029d0a84Sjsing tout0 = tin[0];
462029d0a84Sjsing tout1 = tin[1];
463029d0a84Sjsing l2n(tout0, out);
464029d0a84Sjsing l2n(tout1, out);
465029d0a84Sjsing }
466029d0a84Sjsing l2n(tout0, ivec);
467029d0a84Sjsing l2n(tout1, ivec);
468029d0a84Sjsing } else {
469029d0a84Sjsing n2l(ivec, xor0);
470029d0a84Sjsing n2l(ivec, xor1);
471029d0a84Sjsing ivec -= 8;
472029d0a84Sjsing for (l -= 8; l >= 0; l -= 8) {
473029d0a84Sjsing n2l(in, tin0);
474029d0a84Sjsing n2l(in, tin1);
475029d0a84Sjsing tin[0] = tin0;
476029d0a84Sjsing tin[1] = tin1;
477029d0a84Sjsing BF_decrypt(tin, schedule);
478029d0a84Sjsing tout0 = tin[0]^xor0;
479029d0a84Sjsing tout1 = tin[1]^xor1;
480029d0a84Sjsing l2n(tout0, out);
481029d0a84Sjsing l2n(tout1, out);
482029d0a84Sjsing xor0 = tin0;
483029d0a84Sjsing xor1 = tin1;
484029d0a84Sjsing }
485029d0a84Sjsing if (l != -8) {
486029d0a84Sjsing n2l(in, tin0);
487029d0a84Sjsing n2l(in, tin1);
488029d0a84Sjsing tin[0] = tin0;
489029d0a84Sjsing tin[1] = tin1;
490029d0a84Sjsing BF_decrypt(tin, schedule);
491029d0a84Sjsing tout0 = tin[0]^xor0;
492029d0a84Sjsing tout1 = tin[1]^xor1;
493029d0a84Sjsing l2nn(tout0, tout1, out, l + 8);
494029d0a84Sjsing xor0 = tin0;
495029d0a84Sjsing xor1 = tin1;
496029d0a84Sjsing }
497029d0a84Sjsing l2n(xor0, ivec);
498029d0a84Sjsing l2n(xor1, ivec);
499029d0a84Sjsing }
500029d0a84Sjsing tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0;
501029d0a84Sjsing tin[0] = tin[1] = 0;
502029d0a84Sjsing }
503*9df1065fSjoshua LCRYPTO_ALIAS(BF_cbc_encrypt);
504029d0a84Sjsing
505029d0a84Sjsing /*
506029d0a84Sjsing * The input and output encrypted as though 64bit cfb mode is being
507029d0a84Sjsing * used. The extra state information to record how much of the
508029d0a84Sjsing * 64bit block we have used is contained in *num;
509029d0a84Sjsing */
510029d0a84Sjsing
511029d0a84Sjsing void
BF_cfb64_encrypt(const unsigned char * in,unsigned char * out,long length,const BF_KEY * schedule,unsigned char * ivec,int * num,int encrypt)512029d0a84Sjsing BF_cfb64_encrypt(const unsigned char *in, unsigned char *out, long length,
513029d0a84Sjsing const BF_KEY *schedule, unsigned char *ivec, int *num, int encrypt)
514029d0a84Sjsing {
515029d0a84Sjsing BF_LONG v0, v1, t;
516029d0a84Sjsing int n= *num;
517029d0a84Sjsing long l = length;
518029d0a84Sjsing BF_LONG ti[2];
519029d0a84Sjsing unsigned char *iv, c, cc;
520029d0a84Sjsing
521029d0a84Sjsing iv = (unsigned char *)ivec;
522029d0a84Sjsing if (encrypt) {
523029d0a84Sjsing while (l--) {
524029d0a84Sjsing if (n == 0) {
525029d0a84Sjsing n2l(iv, v0);
526029d0a84Sjsing ti[0] = v0;
527029d0a84Sjsing n2l(iv, v1);
528029d0a84Sjsing ti[1] = v1;
529029d0a84Sjsing BF_encrypt((BF_LONG *)ti, schedule);
530029d0a84Sjsing iv = (unsigned char *)ivec;
531029d0a84Sjsing t = ti[0];
532029d0a84Sjsing l2n(t, iv);
533029d0a84Sjsing t = ti[1];
534029d0a84Sjsing l2n(t, iv);
535029d0a84Sjsing iv = (unsigned char *)ivec;
536029d0a84Sjsing }
537029d0a84Sjsing c= *(in++)^iv[n];
538029d0a84Sjsing *(out++) = c;
539029d0a84Sjsing iv[n] = c;
540029d0a84Sjsing n = (n + 1)&0x07;
541029d0a84Sjsing }
542029d0a84Sjsing } else {
543029d0a84Sjsing while (l--) {
544029d0a84Sjsing if (n == 0) {
545029d0a84Sjsing n2l(iv, v0);
546029d0a84Sjsing ti[0] = v0;
547029d0a84Sjsing n2l(iv, v1);
548029d0a84Sjsing ti[1] = v1;
549029d0a84Sjsing BF_encrypt((BF_LONG *)ti, schedule);
550029d0a84Sjsing iv = (unsigned char *)ivec;
551029d0a84Sjsing t = ti[0];
552029d0a84Sjsing l2n(t, iv);
553029d0a84Sjsing t = ti[1];
554029d0a84Sjsing l2n(t, iv);
555029d0a84Sjsing iv = (unsigned char *)ivec;
556029d0a84Sjsing }
557029d0a84Sjsing cc= *(in++);
558029d0a84Sjsing c = iv[n];
559029d0a84Sjsing iv[n] = cc;
560029d0a84Sjsing *(out++) = c^cc;
561029d0a84Sjsing n = (n + 1)&0x07;
562029d0a84Sjsing }
563029d0a84Sjsing }
564029d0a84Sjsing v0 = v1 = ti[0] = ti[1] = t=c = cc = 0;
565029d0a84Sjsing *num = n;
566029d0a84Sjsing }
567*9df1065fSjoshua LCRYPTO_ALIAS(BF_cfb64_encrypt);
568029d0a84Sjsing
569029d0a84Sjsing void
BF_ecb_encrypt(const unsigned char * in,unsigned char * out,const BF_KEY * key,int encrypt)570029d0a84Sjsing BF_ecb_encrypt(const unsigned char *in, unsigned char *out,
571029d0a84Sjsing const BF_KEY *key, int encrypt)
572029d0a84Sjsing {
573029d0a84Sjsing BF_LONG l, d[2];
574029d0a84Sjsing
575029d0a84Sjsing n2l(in, l);
576029d0a84Sjsing d[0] = l;
577029d0a84Sjsing n2l(in, l);
578029d0a84Sjsing d[1] = l;
579029d0a84Sjsing if (encrypt)
580029d0a84Sjsing BF_encrypt(d, key);
581029d0a84Sjsing else
582029d0a84Sjsing BF_decrypt(d, key);
583029d0a84Sjsing l = d[0];
584029d0a84Sjsing l2n(l, out);
585029d0a84Sjsing l = d[1];
586029d0a84Sjsing l2n(l, out);
587029d0a84Sjsing l = d[0] = d[1] = 0;
588029d0a84Sjsing }
589*9df1065fSjoshua LCRYPTO_ALIAS(BF_ecb_encrypt);
590029d0a84Sjsing
591029d0a84Sjsing /*
592029d0a84Sjsing * The input and output encrypted as though 64bit ofb mode is being
593029d0a84Sjsing * used. The extra state information to record how much of the
594029d0a84Sjsing * 64bit block we have used is contained in *num;
595029d0a84Sjsing */
596029d0a84Sjsing void
BF_ofb64_encrypt(const unsigned char * in,unsigned char * out,long length,const BF_KEY * schedule,unsigned char * ivec,int * num)597029d0a84Sjsing BF_ofb64_encrypt(const unsigned char *in, unsigned char *out, long length,
598029d0a84Sjsing const BF_KEY *schedule, unsigned char *ivec, int *num)
599029d0a84Sjsing {
600029d0a84Sjsing BF_LONG v0, v1, t;
601029d0a84Sjsing int n= *num;
602029d0a84Sjsing long l = length;
603029d0a84Sjsing unsigned char d[8];
604029d0a84Sjsing char *dp;
605029d0a84Sjsing BF_LONG ti[2];
606029d0a84Sjsing unsigned char *iv;
607029d0a84Sjsing int save = 0;
608029d0a84Sjsing
609029d0a84Sjsing iv = (unsigned char *)ivec;
610029d0a84Sjsing n2l(iv, v0);
611029d0a84Sjsing n2l(iv, v1);
612029d0a84Sjsing ti[0] = v0;
613029d0a84Sjsing ti[1] = v1;
614029d0a84Sjsing dp = (char *)d;
615029d0a84Sjsing l2n(v0, dp);
616029d0a84Sjsing l2n(v1, dp);
617029d0a84Sjsing while (l--) {
618029d0a84Sjsing if (n == 0) {
619029d0a84Sjsing BF_encrypt((BF_LONG *)ti, schedule);
620029d0a84Sjsing dp = (char *)d;
621029d0a84Sjsing t = ti[0];
622029d0a84Sjsing l2n(t, dp);
623029d0a84Sjsing t = ti[1];
624029d0a84Sjsing l2n(t, dp);
625029d0a84Sjsing save++;
626029d0a84Sjsing }
627029d0a84Sjsing *(out++)= *(in++)^d[n];
628029d0a84Sjsing n = (n + 1)&0x07;
629029d0a84Sjsing }
630029d0a84Sjsing if (save) {
631029d0a84Sjsing v0 = ti[0];
632029d0a84Sjsing v1 = ti[1];
633029d0a84Sjsing iv = (unsigned char *)ivec;
634029d0a84Sjsing l2n(v0, iv);
635029d0a84Sjsing l2n(v1, iv);
636029d0a84Sjsing }
637029d0a84Sjsing t = v0 = v1 = ti[0] = ti[1] = 0;
638029d0a84Sjsing *num = n;
639029d0a84Sjsing }
640*9df1065fSjoshua LCRYPTO_ALIAS(BF_ofb64_encrypt);
641029d0a84Sjsing
642029d0a84Sjsing void
BF_set_key(BF_KEY * key,int len,const unsigned char * data)643029d0a84Sjsing BF_set_key(BF_KEY *key, int len, const unsigned char *data)
644029d0a84Sjsing {
645029d0a84Sjsing int i;
646029d0a84Sjsing BF_LONG *p, ri, in[2];
647029d0a84Sjsing const unsigned char *d, *end;
648029d0a84Sjsing
649029d0a84Sjsing memcpy(key, &bf_init, sizeof(BF_KEY));
650029d0a84Sjsing p = key->P;
651029d0a84Sjsing
652029d0a84Sjsing if (len > ((BF_ROUNDS + 2)*4))
653029d0a84Sjsing len = (BF_ROUNDS + 2)*4;
654029d0a84Sjsing
655029d0a84Sjsing d = data;
656029d0a84Sjsing end = &(data[len]);
657029d0a84Sjsing for (i = 0; i < (BF_ROUNDS + 2); i++) {
658029d0a84Sjsing ri= *(d++);
659029d0a84Sjsing if (d >= end)
660029d0a84Sjsing d = data;
661029d0a84Sjsing
662029d0a84Sjsing ri <<= 8;
663029d0a84Sjsing ri |= *(d++);
664029d0a84Sjsing if (d >= end)
665029d0a84Sjsing d = data;
666029d0a84Sjsing
667029d0a84Sjsing ri <<= 8;
668029d0a84Sjsing ri |= *(d++);
669029d0a84Sjsing if (d >= end)
670029d0a84Sjsing d = data;
671029d0a84Sjsing
672029d0a84Sjsing ri <<= 8;
673029d0a84Sjsing ri |= *(d++);
674029d0a84Sjsing if (d >= end)
675029d0a84Sjsing d = data;
676029d0a84Sjsing
677029d0a84Sjsing p[i]^=ri;
678029d0a84Sjsing }
679029d0a84Sjsing
680029d0a84Sjsing in[0] = 0L;
681029d0a84Sjsing in[1] = 0L;
682029d0a84Sjsing for (i = 0; i < (BF_ROUNDS + 2); i += 2) {
683029d0a84Sjsing BF_encrypt(in, key);
684029d0a84Sjsing p[i ] = in[0];
685029d0a84Sjsing p[i + 1] = in[1];
686029d0a84Sjsing }
687029d0a84Sjsing
688029d0a84Sjsing p = key->S;
689029d0a84Sjsing for (i = 0; i < 4*256; i += 2) {
690029d0a84Sjsing BF_encrypt(in, key);
691029d0a84Sjsing p[i ] = in[0];
692029d0a84Sjsing p[i + 1] = in[1];
693029d0a84Sjsing }
694029d0a84Sjsing }
695*9df1065fSjoshua LCRYPTO_ALIAS(BF_set_key);
696029d0a84Sjsing #endif
697