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