1261287Sdes/* $OpenBSD: blowfish.c,v 1.18 2004/11/02 17:23:26 hshoexer Exp $ */
2263970Sdes/* $FreeBSD$ */
3261287Sdes/*
4261287Sdes * Blowfish block cipher for OpenBSD
5261287Sdes * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
6261287Sdes * All rights reserved.
7261287Sdes *
8261287Sdes * Implementation advice by David Mazieres <dm@lcs.mit.edu>.
9261287Sdes *
10261287Sdes * Redistribution and use in source and binary forms, with or without
11261287Sdes * modification, are permitted provided that the following conditions
12261287Sdes * are met:
13261287Sdes * 1. Redistributions of source code must retain the above copyright
14261287Sdes *    notice, this list of conditions and the following disclaimer.
15261287Sdes * 2. Redistributions in binary form must reproduce the above copyright
16261287Sdes *    notice, this list of conditions and the following disclaimer in the
17261287Sdes *    documentation and/or other materials provided with the distribution.
18261287Sdes * 3. All advertising materials mentioning features or use of this software
19261287Sdes *    must display the following acknowledgement:
20261287Sdes *      This product includes software developed by Niels Provos.
21261287Sdes * 4. The name of the author may not be used to endorse or promote products
22261287Sdes *    derived from this software without specific prior written permission.
23261287Sdes *
24261287Sdes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
25261287Sdes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26261287Sdes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27261287Sdes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
28261287Sdes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29261287Sdes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30261287Sdes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31261287Sdes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32261287Sdes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33261287Sdes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34261287Sdes */
35261287Sdes
36261287Sdes/*
37261287Sdes * This code is derived from section 14.3 and the given source
38261287Sdes * in section V of Applied Cryptography, second edition.
39261287Sdes * Blowfish is an unpatented fast block cipher designed by
40261287Sdes * Bruce Schneier.
41261287Sdes */
42261287Sdes
43261287Sdes#include "includes.h"
44263970Sdes__RCSID("$FreeBSD$");
45261287Sdes
46261287Sdes#if !defined(HAVE_BCRYPT_PBKDF) && (!defined(HAVE_BLOWFISH_INITSTATE) || \
47261287Sdes    !defined(HAVE_BLOWFISH_EXPAND0STATE) || !defined(HAVE_BLF_ENC))
48261287Sdes
49261287Sdes#if 0
50261287Sdes#include <stdio.h>		/* used for debugging */
51261287Sdes#include <string.h>
52261287Sdes#endif
53261287Sdes
54261287Sdes#include <sys/types.h>
55261320Sdes#ifdef HAVE_BLF_H
56261287Sdes#include <blf.h>
57261320Sdes#endif
58261287Sdes
59261287Sdes#undef inline
60261287Sdes#ifdef __GNUC__
61261287Sdes#define inline __inline
62261287Sdes#else				/* !__GNUC__ */
63261287Sdes#define inline
64261287Sdes#endif				/* !__GNUC__ */
65261287Sdes
66261287Sdes/* Function for Feistel Networks */
67261287Sdes
68261287Sdes#define F(s, x) ((((s)[        (((x)>>24)&0xFF)]  \
69261287Sdes		 + (s)[0x100 + (((x)>>16)&0xFF)]) \
70261287Sdes		 ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \
71261287Sdes		 + (s)[0x300 + ( (x)     &0xFF)])
72261287Sdes
73261287Sdes#define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n])
74261287Sdes
75261287Sdesvoid
76261287SdesBlowfish_encipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr)
77261287Sdes{
78261287Sdes	u_int32_t Xl;
79261287Sdes	u_int32_t Xr;
80261287Sdes	u_int32_t *s = c->S[0];
81261287Sdes	u_int32_t *p = c->P;
82261287Sdes
83261287Sdes	Xl = *xl;
84261287Sdes	Xr = *xr;
85261287Sdes
86261287Sdes	Xl ^= p[0];
87261287Sdes	BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2);
88261287Sdes	BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4);
89261287Sdes	BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6);
90261287Sdes	BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8);
91261287Sdes	BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10);
92261287Sdes	BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12);
93261287Sdes	BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14);
94261287Sdes	BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16);
95261287Sdes
96261287Sdes	*xl = Xr ^ p[17];
97261287Sdes	*xr = Xl;
98261287Sdes}
99261287Sdes
100261287Sdesvoid
101261287SdesBlowfish_decipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr)
102261287Sdes{
103261287Sdes	u_int32_t Xl;
104261287Sdes	u_int32_t Xr;
105261287Sdes	u_int32_t *s = c->S[0];
106261287Sdes	u_int32_t *p = c->P;
107261287Sdes
108261287Sdes	Xl = *xl;
109261287Sdes	Xr = *xr;
110261287Sdes
111261287Sdes	Xl ^= p[17];
112261287Sdes	BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15);
113261287Sdes	BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13);
114261287Sdes	BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11);
115261287Sdes	BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9);
116261287Sdes	BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7);
117261287Sdes	BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5);
118261287Sdes	BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3);
119261287Sdes	BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1);
120261287Sdes
121261287Sdes	*xl = Xr ^ p[0];
122261287Sdes	*xr = Xl;
123261287Sdes}
124261287Sdes
125261287Sdesvoid
126261287SdesBlowfish_initstate(blf_ctx *c)
127261287Sdes{
128261287Sdes	/* P-box and S-box tables initialized with digits of Pi */
129261287Sdes
130261287Sdes	static const blf_ctx initstate =
131261287Sdes	{ {
132261287Sdes		{
133261287Sdes			0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
134261287Sdes			0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
135261287Sdes			0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
136261287Sdes			0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
137261287Sdes			0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
138261287Sdes			0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
139261287Sdes			0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
140261287Sdes			0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
141261287Sdes			0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
142261287Sdes			0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
143261287Sdes			0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
144261287Sdes			0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
145261287Sdes			0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
146261287Sdes			0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
147261287Sdes			0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
148261287Sdes			0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
149261287Sdes			0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
150261287Sdes			0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
151261287Sdes			0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
152261287Sdes			0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
153261287Sdes			0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
154261287Sdes			0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
155261287Sdes			0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
156261287Sdes			0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
157261287Sdes			0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
158261287Sdes			0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
159261287Sdes			0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
160261287Sdes			0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
161261287Sdes			0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
162261287Sdes			0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
163261287Sdes			0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
164261287Sdes			0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
165261287Sdes			0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
166261287Sdes			0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
167261287Sdes			0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
168261287Sdes			0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
169261287Sdes			0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
170261287Sdes			0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
171261287Sdes			0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
172261287Sdes			0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
173261287Sdes			0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
174261287Sdes			0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
175261287Sdes			0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
176261287Sdes			0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
177261287Sdes			0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
178261287Sdes			0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
179261287Sdes			0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
180261287Sdes			0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
181261287Sdes			0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
182261287Sdes			0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
183261287Sdes			0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
184261287Sdes			0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
185261287Sdes			0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
186261287Sdes			0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
187261287Sdes			0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
188261287Sdes			0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
189261287Sdes			0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
190261287Sdes			0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
191261287Sdes			0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
192261287Sdes			0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
193261287Sdes			0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
194261287Sdes			0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
195261287Sdes			0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
196261287Sdes		0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a},
197261287Sdes		{
198261287Sdes			0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
199261287Sdes			0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
200261287Sdes			0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
201261287Sdes			0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
202261287Sdes			0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
203261287Sdes			0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
204261287Sdes			0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
205261287Sdes			0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
206261287Sdes			0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
207261287Sdes			0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
208261287Sdes			0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
209261287Sdes			0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
210261287Sdes			0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
211261287Sdes			0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
212261287Sdes			0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
213261287Sdes			0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
214261287Sdes			0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
215261287Sdes			0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
216261287Sdes			0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
217261287Sdes			0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
218261287Sdes			0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
219261287Sdes			0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
220261287Sdes			0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
221261287Sdes			0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
222261287Sdes			0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
223261287Sdes			0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
224261287Sdes			0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
225261287Sdes			0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
226261287Sdes			0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
227261287Sdes			0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
228261287Sdes			0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
229261287Sdes			0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
230261287Sdes			0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
231261287Sdes			0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
232261287Sdes			0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
233261287Sdes			0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
234261287Sdes			0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
235261287Sdes			0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
236261287Sdes			0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
237261287Sdes			0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
238261287Sdes			0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
239261287Sdes			0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
240261287Sdes			0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
241261287Sdes			0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
242261287Sdes			0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
243261287Sdes			0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
244261287Sdes			0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
245261287Sdes			0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
246261287Sdes			0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
247261287Sdes			0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
248261287Sdes			0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
249261287Sdes			0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
250261287Sdes			0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
251261287Sdes			0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
252261287Sdes			0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
253261287Sdes			0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
254261287Sdes			0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
255261287Sdes			0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
256261287Sdes			0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
257261287Sdes			0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
258261287Sdes			0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
259261287Sdes			0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
260261287Sdes			0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
261261287Sdes		0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7},
262261287Sdes		{
263261287Sdes			0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
264261287Sdes			0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
265261287Sdes			0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
266261287Sdes			0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
267261287Sdes			0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
268261287Sdes			0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
269261287Sdes			0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
270261287Sdes			0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
271261287Sdes			0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
272261287Sdes			0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
273261287Sdes			0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
274261287Sdes			0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
275261287Sdes			0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
276261287Sdes			0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
277261287Sdes			0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
278261287Sdes			0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
279261287Sdes			0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
280261287Sdes			0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
281261287Sdes			0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
282261287Sdes			0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
283261287Sdes			0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
284261287Sdes			0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
285261287Sdes			0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
286261287Sdes			0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
287261287Sdes			0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
288261287Sdes			0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
289261287Sdes			0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
290261287Sdes			0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
291261287Sdes			0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
292261287Sdes			0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
293261287Sdes			0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
294261287Sdes			0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
295261287Sdes			0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
296261287Sdes			0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
297261287Sdes			0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
298261287Sdes			0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
299261287Sdes			0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
300261287Sdes			0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
301261287Sdes			0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
302261287Sdes			0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
303261287Sdes			0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
304261287Sdes			0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
305261287Sdes			0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
306261287Sdes			0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
307261287Sdes			0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
308261287Sdes			0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
309261287Sdes			0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
310261287Sdes			0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
311261287Sdes			0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
312261287Sdes			0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
313261287Sdes			0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
314261287Sdes			0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
315261287Sdes			0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
316261287Sdes			0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
317261287Sdes			0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
318261287Sdes			0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
319261287Sdes			0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
320261287Sdes			0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
321261287Sdes			0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
322261287Sdes			0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
323261287Sdes			0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
324261287Sdes			0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
325261287Sdes			0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
326261287Sdes		0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0},
327261287Sdes		{
328261287Sdes			0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
329261287Sdes			0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
330261287Sdes			0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
331261287Sdes			0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
332261287Sdes			0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
333261287Sdes			0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
334261287Sdes			0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
335261287Sdes			0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
336261287Sdes			0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
337261287Sdes			0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
338261287Sdes			0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
339261287Sdes			0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
340261287Sdes			0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
341261287Sdes			0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
342261287Sdes			0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
343261287Sdes			0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
344261287Sdes			0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
345261287Sdes			0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
346261287Sdes			0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
347261287Sdes			0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
348261287Sdes			0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
349261287Sdes			0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
350261287Sdes			0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
351261287Sdes			0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
352261287Sdes			0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
353261287Sdes			0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
354261287Sdes			0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
355261287Sdes			0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
356261287Sdes			0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
357261287Sdes			0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
358261287Sdes			0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
359261287Sdes			0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
360261287Sdes			0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
361261287Sdes			0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
362261287Sdes			0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
363261287Sdes			0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
364261287Sdes			0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
365261287Sdes			0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
366261287Sdes			0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
367261287Sdes			0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
368261287Sdes			0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
369261287Sdes			0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
370261287Sdes			0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
371261287Sdes			0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
372261287Sdes			0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
373261287Sdes			0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
374261287Sdes			0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
375261287Sdes			0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
376261287Sdes			0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
377261287Sdes			0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
378261287Sdes			0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
379261287Sdes			0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
380261287Sdes			0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
381261287Sdes			0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
382261287Sdes			0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
383261287Sdes			0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
384261287Sdes			0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
385261287Sdes			0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
386261287Sdes			0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
387261287Sdes			0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
388261287Sdes			0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
389261287Sdes			0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
390261287Sdes			0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
391261287Sdes		0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}
392261287Sdes	},
393261287Sdes	{
394261287Sdes		0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
395261287Sdes		0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
396261287Sdes		0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
397261287Sdes		0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
398261287Sdes		0x9216d5d9, 0x8979fb1b
399261287Sdes	} };
400261287Sdes
401261287Sdes	*c = initstate;
402261287Sdes}
403261287Sdes
404261287Sdesu_int32_t
405261287SdesBlowfish_stream2word(const u_int8_t *data, u_int16_t databytes,
406261287Sdes    u_int16_t *current)
407261287Sdes{
408261287Sdes	u_int8_t i;
409261287Sdes	u_int16_t j;
410261287Sdes	u_int32_t temp;
411261287Sdes
412261287Sdes	temp = 0x00000000;
413261287Sdes	j = *current;
414261287Sdes
415261287Sdes	for (i = 0; i < 4; i++, j++) {
416261287Sdes		if (j >= databytes)
417261287Sdes			j = 0;
418261287Sdes		temp = (temp << 8) | data[j];
419261287Sdes	}
420261287Sdes
421261287Sdes	*current = j;
422261287Sdes	return temp;
423261287Sdes}
424261287Sdes
425261287Sdesvoid
426261287SdesBlowfish_expand0state(blf_ctx *c, const u_int8_t *key, u_int16_t keybytes)
427261287Sdes{
428261287Sdes	u_int16_t i;
429261287Sdes	u_int16_t j;
430261287Sdes	u_int16_t k;
431261287Sdes	u_int32_t temp;
432261287Sdes	u_int32_t datal;
433261287Sdes	u_int32_t datar;
434261287Sdes
435261287Sdes	j = 0;
436261287Sdes	for (i = 0; i < BLF_N + 2; i++) {
437261287Sdes		/* Extract 4 int8 to 1 int32 from keystream */
438261287Sdes		temp = Blowfish_stream2word(key, keybytes, &j);
439261287Sdes		c->P[i] = c->P[i] ^ temp;
440261287Sdes	}
441261287Sdes
442261287Sdes	j = 0;
443261287Sdes	datal = 0x00000000;
444261287Sdes	datar = 0x00000000;
445261287Sdes	for (i = 0; i < BLF_N + 2; i += 2) {
446261287Sdes		Blowfish_encipher(c, &datal, &datar);
447261287Sdes
448261287Sdes		c->P[i] = datal;
449261287Sdes		c->P[i + 1] = datar;
450261287Sdes	}
451261287Sdes
452261287Sdes	for (i = 0; i < 4; i++) {
453261287Sdes		for (k = 0; k < 256; k += 2) {
454261287Sdes			Blowfish_encipher(c, &datal, &datar);
455261287Sdes
456261287Sdes			c->S[i][k] = datal;
457261287Sdes			c->S[i][k + 1] = datar;
458261287Sdes		}
459261287Sdes	}
460261287Sdes}
461261287Sdes
462261287Sdes
463261287Sdesvoid
464261287SdesBlowfish_expandstate(blf_ctx *c, const u_int8_t *data, u_int16_t databytes,
465261287Sdes    const u_int8_t *key, u_int16_t keybytes)
466261287Sdes{
467261287Sdes	u_int16_t i;
468261287Sdes	u_int16_t j;
469261287Sdes	u_int16_t k;
470261287Sdes	u_int32_t temp;
471261287Sdes	u_int32_t datal;
472261287Sdes	u_int32_t datar;
473261287Sdes
474261287Sdes	j = 0;
475261287Sdes	for (i = 0; i < BLF_N + 2; i++) {
476261287Sdes		/* Extract 4 int8 to 1 int32 from keystream */
477261287Sdes		temp = Blowfish_stream2word(key, keybytes, &j);
478261287Sdes		c->P[i] = c->P[i] ^ temp;
479261287Sdes	}
480261287Sdes
481261287Sdes	j = 0;
482261287Sdes	datal = 0x00000000;
483261287Sdes	datar = 0x00000000;
484261287Sdes	for (i = 0; i < BLF_N + 2; i += 2) {
485261287Sdes		datal ^= Blowfish_stream2word(data, databytes, &j);
486261287Sdes		datar ^= Blowfish_stream2word(data, databytes, &j);
487261287Sdes		Blowfish_encipher(c, &datal, &datar);
488261287Sdes
489261287Sdes		c->P[i] = datal;
490261287Sdes		c->P[i + 1] = datar;
491261287Sdes	}
492261287Sdes
493261287Sdes	for (i = 0; i < 4; i++) {
494261287Sdes		for (k = 0; k < 256; k += 2) {
495261287Sdes			datal ^= Blowfish_stream2word(data, databytes, &j);
496261287Sdes			datar ^= Blowfish_stream2word(data, databytes, &j);
497261287Sdes			Blowfish_encipher(c, &datal, &datar);
498261287Sdes
499261287Sdes			c->S[i][k] = datal;
500261287Sdes			c->S[i][k + 1] = datar;
501261287Sdes		}
502261287Sdes	}
503261287Sdes
504261287Sdes}
505261287Sdes
506261287Sdesvoid
507261287Sdesblf_key(blf_ctx *c, const u_int8_t *k, u_int16_t len)
508261287Sdes{
509261287Sdes	/* Initialize S-boxes and subkeys with Pi */
510261287Sdes	Blowfish_initstate(c);
511261287Sdes
512261287Sdes	/* Transform S-boxes and subkeys with key */
513261287Sdes	Blowfish_expand0state(c, k, len);
514261287Sdes}
515261287Sdes
516261287Sdesvoid
517261287Sdesblf_enc(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
518261287Sdes{
519261287Sdes	u_int32_t *d;
520261287Sdes	u_int16_t i;
521261287Sdes
522261287Sdes	d = data;
523261287Sdes	for (i = 0; i < blocks; i++) {
524261287Sdes		Blowfish_encipher(c, d, d + 1);
525261287Sdes		d += 2;
526261287Sdes	}
527261287Sdes}
528261287Sdes
529261287Sdesvoid
530261287Sdesblf_dec(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
531261287Sdes{
532261287Sdes	u_int32_t *d;
533261287Sdes	u_int16_t i;
534261287Sdes
535261287Sdes	d = data;
536261287Sdes	for (i = 0; i < blocks; i++) {
537261287Sdes		Blowfish_decipher(c, d, d + 1);
538261287Sdes		d += 2;
539261287Sdes	}
540261287Sdes}
541261287Sdes
542261287Sdesvoid
543261287Sdesblf_ecb_encrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
544261287Sdes{
545261287Sdes	u_int32_t l, r;
546261287Sdes	u_int32_t i;
547261287Sdes
548261287Sdes	for (i = 0; i < len; i += 8) {
549261287Sdes		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
550261287Sdes		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
551261287Sdes		Blowfish_encipher(c, &l, &r);
552261287Sdes		data[0] = l >> 24 & 0xff;
553261287Sdes		data[1] = l >> 16 & 0xff;
554261287Sdes		data[2] = l >> 8 & 0xff;
555261287Sdes		data[3] = l & 0xff;
556261287Sdes		data[4] = r >> 24 & 0xff;
557261287Sdes		data[5] = r >> 16 & 0xff;
558261287Sdes		data[6] = r >> 8 & 0xff;
559261287Sdes		data[7] = r & 0xff;
560261287Sdes		data += 8;
561261287Sdes	}
562261287Sdes}
563261287Sdes
564261287Sdesvoid
565261287Sdesblf_ecb_decrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
566261287Sdes{
567261287Sdes	u_int32_t l, r;
568261287Sdes	u_int32_t i;
569261287Sdes
570261287Sdes	for (i = 0; i < len; i += 8) {
571261287Sdes		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
572261287Sdes		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
573261287Sdes		Blowfish_decipher(c, &l, &r);
574261287Sdes		data[0] = l >> 24 & 0xff;
575261287Sdes		data[1] = l >> 16 & 0xff;
576261287Sdes		data[2] = l >> 8 & 0xff;
577261287Sdes		data[3] = l & 0xff;
578261287Sdes		data[4] = r >> 24 & 0xff;
579261287Sdes		data[5] = r >> 16 & 0xff;
580261287Sdes		data[6] = r >> 8 & 0xff;
581261287Sdes		data[7] = r & 0xff;
582261287Sdes		data += 8;
583261287Sdes	}
584261287Sdes}
585261287Sdes
586261287Sdesvoid
587261287Sdesblf_cbc_encrypt(blf_ctx *c, u_int8_t *iv, u_int8_t *data, u_int32_t len)
588261287Sdes{
589261287Sdes	u_int32_t l, r;
590261287Sdes	u_int32_t i, j;
591261287Sdes
592261287Sdes	for (i = 0; i < len; i += 8) {
593261287Sdes		for (j = 0; j < 8; j++)
594261287Sdes			data[j] ^= iv[j];
595261287Sdes		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
596261287Sdes		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
597261287Sdes		Blowfish_encipher(c, &l, &r);
598261287Sdes		data[0] = l >> 24 & 0xff;
599261287Sdes		data[1] = l >> 16 & 0xff;
600261287Sdes		data[2] = l >> 8 & 0xff;
601261287Sdes		data[3] = l & 0xff;
602261287Sdes		data[4] = r >> 24 & 0xff;
603261287Sdes		data[5] = r >> 16 & 0xff;
604261287Sdes		data[6] = r >> 8 & 0xff;
605261287Sdes		data[7] = r & 0xff;
606261287Sdes		iv = data;
607261287Sdes		data += 8;
608261287Sdes	}
609261287Sdes}
610261287Sdes
611261287Sdesvoid
612261287Sdesblf_cbc_decrypt(blf_ctx *c, u_int8_t *iva, u_int8_t *data, u_int32_t len)
613261287Sdes{
614261287Sdes	u_int32_t l, r;
615261287Sdes	u_int8_t *iv;
616261287Sdes	u_int32_t i, j;
617261287Sdes
618261287Sdes	iv = data + len - 16;
619261287Sdes	data = data + len - 8;
620261287Sdes	for (i = len - 8; i >= 8; i -= 8) {
621261287Sdes		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
622261287Sdes		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
623261287Sdes		Blowfish_decipher(c, &l, &r);
624261287Sdes		data[0] = l >> 24 & 0xff;
625261287Sdes		data[1] = l >> 16 & 0xff;
626261287Sdes		data[2] = l >> 8 & 0xff;
627261287Sdes		data[3] = l & 0xff;
628261287Sdes		data[4] = r >> 24 & 0xff;
629261287Sdes		data[5] = r >> 16 & 0xff;
630261287Sdes		data[6] = r >> 8 & 0xff;
631261287Sdes		data[7] = r & 0xff;
632261287Sdes		for (j = 0; j < 8; j++)
633261287Sdes			data[j] ^= iv[j];
634261287Sdes		iv -= 8;
635261287Sdes		data -= 8;
636261287Sdes	}
637261287Sdes	l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
638261287Sdes	r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
639261287Sdes	Blowfish_decipher(c, &l, &r);
640261287Sdes	data[0] = l >> 24 & 0xff;
641261287Sdes	data[1] = l >> 16 & 0xff;
642261287Sdes	data[2] = l >> 8 & 0xff;
643261287Sdes	data[3] = l & 0xff;
644261287Sdes	data[4] = r >> 24 & 0xff;
645261287Sdes	data[5] = r >> 16 & 0xff;
646261287Sdes	data[6] = r >> 8 & 0xff;
647261287Sdes	data[7] = r & 0xff;
648261287Sdes	for (j = 0; j < 8; j++)
649261287Sdes		data[j] ^= iva[j];
650261287Sdes}
651261287Sdes
652261287Sdes#if 0
653261287Sdesvoid
654261287Sdesreport(u_int32_t data[], u_int16_t len)
655261287Sdes{
656261287Sdes	u_int16_t i;
657261287Sdes	for (i = 0; i < len; i += 2)
658261287Sdes		printf("Block %0hd: %08lx %08lx.\n",
659261287Sdes		    i / 2, data[i], data[i + 1]);
660261287Sdes}
661261287Sdesvoid
662261287Sdesmain(void)
663261287Sdes{
664261287Sdes
665261287Sdes	blf_ctx c;
666261287Sdes	char    key[] = "AAAAA";
667261287Sdes	char    key2[] = "abcdefghijklmnopqrstuvwxyz";
668261287Sdes
669261287Sdes	u_int32_t data[10];
670261287Sdes	u_int32_t data2[] =
671261287Sdes	{0x424c4f57l, 0x46495348l};
672261287Sdes
673261287Sdes	u_int16_t i;
674261287Sdes
675261287Sdes	/* First test */
676261287Sdes	for (i = 0; i < 10; i++)
677261287Sdes		data[i] = i;
678261287Sdes
679261287Sdes	blf_key(&c, (u_int8_t *) key, 5);
680261287Sdes	blf_enc(&c, data, 5);
681261287Sdes	blf_dec(&c, data, 1);
682261287Sdes	blf_dec(&c, data + 2, 4);
683261287Sdes	printf("Should read as 0 - 9.\n");
684261287Sdes	report(data, 10);
685261287Sdes
686261287Sdes	/* Second test */
687261287Sdes	blf_key(&c, (u_int8_t *) key2, strlen(key2));
688261287Sdes	blf_enc(&c, data2, 1);
689261287Sdes	printf("\nShould read as: 0x324ed0fe 0xf413a203.\n");
690261287Sdes	report(data2, 2);
691261287Sdes	blf_dec(&c, data2, 1);
692261287Sdes	report(data2, 2);
693261287Sdes}
694261287Sdes#endif
695261287Sdes
696261287Sdes#endif /* !defined(HAVE_BCRYPT_PBKDF) && (!defined(HAVE_BLOWFISH_INITSTATE) || \
697261287Sdes    !defined(HAVE_BLOWFISH_EXPAND0STATE) || !defined(HAVE_BLF_ENC)) */
698261287Sdes
699