1d059297112922cabb0c674840589be8db821fd9aAdam Langley/* $OpenBSD: blowfish.c,v 1.18 2004/11/02 17:23:26 hshoexer Exp $ */
2d059297112922cabb0c674840589be8db821fd9aAdam Langley/*
3d059297112922cabb0c674840589be8db821fd9aAdam Langley * Blowfish block cipher for OpenBSD
4d059297112922cabb0c674840589be8db821fd9aAdam Langley * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
5d059297112922cabb0c674840589be8db821fd9aAdam Langley * All rights reserved.
6d059297112922cabb0c674840589be8db821fd9aAdam Langley *
7d059297112922cabb0c674840589be8db821fd9aAdam Langley * Implementation advice by David Mazieres <dm@lcs.mit.edu>.
8d059297112922cabb0c674840589be8db821fd9aAdam Langley *
9d059297112922cabb0c674840589be8db821fd9aAdam Langley * Redistribution and use in source and binary forms, with or without
10d059297112922cabb0c674840589be8db821fd9aAdam Langley * modification, are permitted provided that the following conditions
11d059297112922cabb0c674840589be8db821fd9aAdam Langley * are met:
12d059297112922cabb0c674840589be8db821fd9aAdam Langley * 1. Redistributions of source code must retain the above copyright
13d059297112922cabb0c674840589be8db821fd9aAdam Langley *    notice, this list of conditions and the following disclaimer.
14d059297112922cabb0c674840589be8db821fd9aAdam Langley * 2. Redistributions in binary form must reproduce the above copyright
15d059297112922cabb0c674840589be8db821fd9aAdam Langley *    notice, this list of conditions and the following disclaimer in the
16d059297112922cabb0c674840589be8db821fd9aAdam Langley *    documentation and/or other materials provided with the distribution.
17d059297112922cabb0c674840589be8db821fd9aAdam Langley * 3. All advertising materials mentioning features or use of this software
18d059297112922cabb0c674840589be8db821fd9aAdam Langley *    must display the following acknowledgement:
19d059297112922cabb0c674840589be8db821fd9aAdam Langley *      This product includes software developed by Niels Provos.
20d059297112922cabb0c674840589be8db821fd9aAdam Langley * 4. The name of the author may not be used to endorse or promote products
21d059297112922cabb0c674840589be8db821fd9aAdam Langley *    derived from this software without specific prior written permission.
22d059297112922cabb0c674840589be8db821fd9aAdam Langley *
23d059297112922cabb0c674840589be8db821fd9aAdam Langley * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24d059297112922cabb0c674840589be8db821fd9aAdam Langley * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25d059297112922cabb0c674840589be8db821fd9aAdam Langley * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26d059297112922cabb0c674840589be8db821fd9aAdam Langley * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27d059297112922cabb0c674840589be8db821fd9aAdam Langley * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28d059297112922cabb0c674840589be8db821fd9aAdam Langley * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29d059297112922cabb0c674840589be8db821fd9aAdam Langley * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30d059297112922cabb0c674840589be8db821fd9aAdam Langley * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31d059297112922cabb0c674840589be8db821fd9aAdam Langley * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32d059297112922cabb0c674840589be8db821fd9aAdam Langley * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33d059297112922cabb0c674840589be8db821fd9aAdam Langley */
34d059297112922cabb0c674840589be8db821fd9aAdam Langley
35d059297112922cabb0c674840589be8db821fd9aAdam Langley/*
36d059297112922cabb0c674840589be8db821fd9aAdam Langley * This code is derived from section 14.3 and the given source
37d059297112922cabb0c674840589be8db821fd9aAdam Langley * in section V of Applied Cryptography, second edition.
38d059297112922cabb0c674840589be8db821fd9aAdam Langley * Blowfish is an unpatented fast block cipher designed by
39d059297112922cabb0c674840589be8db821fd9aAdam Langley * Bruce Schneier.
40d059297112922cabb0c674840589be8db821fd9aAdam Langley */
41d059297112922cabb0c674840589be8db821fd9aAdam Langley
42d059297112922cabb0c674840589be8db821fd9aAdam Langley#include "includes.h"
43d059297112922cabb0c674840589be8db821fd9aAdam Langley
44d059297112922cabb0c674840589be8db821fd9aAdam Langley#if !defined(HAVE_BCRYPT_PBKDF) && (!defined(HAVE_BLOWFISH_INITSTATE) || \
45d059297112922cabb0c674840589be8db821fd9aAdam Langley    !defined(HAVE_BLOWFISH_EXPAND0STATE) || !defined(HAVE_BLF_ENC))
46d059297112922cabb0c674840589be8db821fd9aAdam Langley
47d059297112922cabb0c674840589be8db821fd9aAdam Langley#if 0
48d059297112922cabb0c674840589be8db821fd9aAdam Langley#include <stdio.h>		/* used for debugging */
49d059297112922cabb0c674840589be8db821fd9aAdam Langley#include <string.h>
50d059297112922cabb0c674840589be8db821fd9aAdam Langley#endif
51d059297112922cabb0c674840589be8db821fd9aAdam Langley
52d059297112922cabb0c674840589be8db821fd9aAdam Langley#include <sys/types.h>
53d059297112922cabb0c674840589be8db821fd9aAdam Langley#include <blf.h>
54d059297112922cabb0c674840589be8db821fd9aAdam Langley
55d059297112922cabb0c674840589be8db821fd9aAdam Langley#undef inline
56d059297112922cabb0c674840589be8db821fd9aAdam Langley#ifdef __GNUC__
57d059297112922cabb0c674840589be8db821fd9aAdam Langley#define inline __inline
58d059297112922cabb0c674840589be8db821fd9aAdam Langley#else				/* !__GNUC__ */
59d059297112922cabb0c674840589be8db821fd9aAdam Langley#define inline
60d059297112922cabb0c674840589be8db821fd9aAdam Langley#endif				/* !__GNUC__ */
61d059297112922cabb0c674840589be8db821fd9aAdam Langley
62d059297112922cabb0c674840589be8db821fd9aAdam Langley/* Function for Feistel Networks */
63d059297112922cabb0c674840589be8db821fd9aAdam Langley
64d059297112922cabb0c674840589be8db821fd9aAdam Langley#define F(s, x) ((((s)[        (((x)>>24)&0xFF)]  \
65d059297112922cabb0c674840589be8db821fd9aAdam Langley		 + (s)[0x100 + (((x)>>16)&0xFF)]) \
66d059297112922cabb0c674840589be8db821fd9aAdam Langley		 ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \
67d059297112922cabb0c674840589be8db821fd9aAdam Langley		 + (s)[0x300 + ( (x)     &0xFF)])
68d059297112922cabb0c674840589be8db821fd9aAdam Langley
69d059297112922cabb0c674840589be8db821fd9aAdam Langley#define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n])
70d059297112922cabb0c674840589be8db821fd9aAdam Langley
71d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid
72d059297112922cabb0c674840589be8db821fd9aAdam LangleyBlowfish_encipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr)
73d059297112922cabb0c674840589be8db821fd9aAdam Langley{
74d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t Xl;
75d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t Xr;
76d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t *s = c->S[0];
77d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t *p = c->P;
78d059297112922cabb0c674840589be8db821fd9aAdam Langley
79d059297112922cabb0c674840589be8db821fd9aAdam Langley	Xl = *xl;
80d059297112922cabb0c674840589be8db821fd9aAdam Langley	Xr = *xr;
81d059297112922cabb0c674840589be8db821fd9aAdam Langley
82d059297112922cabb0c674840589be8db821fd9aAdam Langley	Xl ^= p[0];
83d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2);
84d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4);
85d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6);
86d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8);
87d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10);
88d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12);
89d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14);
90d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16);
91d059297112922cabb0c674840589be8db821fd9aAdam Langley
92d059297112922cabb0c674840589be8db821fd9aAdam Langley	*xl = Xr ^ p[17];
93d059297112922cabb0c674840589be8db821fd9aAdam Langley	*xr = Xl;
94d059297112922cabb0c674840589be8db821fd9aAdam Langley}
95d059297112922cabb0c674840589be8db821fd9aAdam Langley
96d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid
97d059297112922cabb0c674840589be8db821fd9aAdam LangleyBlowfish_decipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr)
98d059297112922cabb0c674840589be8db821fd9aAdam Langley{
99d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t Xl;
100d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t Xr;
101d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t *s = c->S[0];
102d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t *p = c->P;
103d059297112922cabb0c674840589be8db821fd9aAdam Langley
104d059297112922cabb0c674840589be8db821fd9aAdam Langley	Xl = *xl;
105d059297112922cabb0c674840589be8db821fd9aAdam Langley	Xr = *xr;
106d059297112922cabb0c674840589be8db821fd9aAdam Langley
107d059297112922cabb0c674840589be8db821fd9aAdam Langley	Xl ^= p[17];
108d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15);
109d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13);
110d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11);
111d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9);
112d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7);
113d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5);
114d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3);
115d059297112922cabb0c674840589be8db821fd9aAdam Langley	BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1);
116d059297112922cabb0c674840589be8db821fd9aAdam Langley
117d059297112922cabb0c674840589be8db821fd9aAdam Langley	*xl = Xr ^ p[0];
118d059297112922cabb0c674840589be8db821fd9aAdam Langley	*xr = Xl;
119d059297112922cabb0c674840589be8db821fd9aAdam Langley}
120d059297112922cabb0c674840589be8db821fd9aAdam Langley
121d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid
122d059297112922cabb0c674840589be8db821fd9aAdam LangleyBlowfish_initstate(blf_ctx *c)
123d059297112922cabb0c674840589be8db821fd9aAdam Langley{
124d059297112922cabb0c674840589be8db821fd9aAdam Langley	/* P-box and S-box tables initialized with digits of Pi */
125d059297112922cabb0c674840589be8db821fd9aAdam Langley
126d059297112922cabb0c674840589be8db821fd9aAdam Langley	static const blf_ctx initstate =
127d059297112922cabb0c674840589be8db821fd9aAdam Langley	{ {
128d059297112922cabb0c674840589be8db821fd9aAdam Langley		{
129d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
130d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
131d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
132d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
133d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
134d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
135d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
136d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
137d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
138d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
139d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
140d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
141d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
142d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
143d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
144d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
145d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
146d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
147d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
148d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
149d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
150d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
151d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
152d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
153d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
154d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
155d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
156d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
157d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
158d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
159d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
160d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
161d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
162d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
163d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
164d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
165d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
166d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
167d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
168d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
169d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
170d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
171d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
172d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
173d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
174d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
175d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
176d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
177d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
178d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
179d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
180d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
181d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
182d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
183d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
184d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
185d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
186d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
187d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
188d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
189d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
190d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
191d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
192d059297112922cabb0c674840589be8db821fd9aAdam Langley		0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a},
193d059297112922cabb0c674840589be8db821fd9aAdam Langley		{
194d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
195d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
196d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
197d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
198d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
199d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
200d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
201d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
202d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
203d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
204d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
205d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
206d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
207d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
208d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
209d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
210d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
211d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
212d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
213d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
214d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
215d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
216d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
217d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
218d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
219d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
220d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
221d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
222d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
223d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
224d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
225d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
226d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
227d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
228d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
229d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
230d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
231d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
232d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
233d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
234d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
235d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
236d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
237d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
238d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
239d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
240d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
241d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
242d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
243d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
244d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
245d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
246d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
247d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
248d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
249d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
250d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
251d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
252d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
253d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
254d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
255d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
256d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
257d059297112922cabb0c674840589be8db821fd9aAdam Langley		0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7},
258d059297112922cabb0c674840589be8db821fd9aAdam Langley		{
259d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
260d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
261d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
262d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
263d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
264d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
265d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
266d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
267d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
268d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
269d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
270d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
271d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
272d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
273d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
274d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
275d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
276d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
277d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
278d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
279d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
280d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
281d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
282d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
283d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
284d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
285d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
286d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
287d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
288d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
289d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
290d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
291d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
292d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
293d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
294d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
295d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
296d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
297d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
298d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
299d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
300d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
301d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
302d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
303d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
304d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
305d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
306d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
307d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
308d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
309d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
310d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
311d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
312d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
313d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
314d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
315d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
316d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
317d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
318d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
319d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
320d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
321d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
322d059297112922cabb0c674840589be8db821fd9aAdam Langley		0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0},
323d059297112922cabb0c674840589be8db821fd9aAdam Langley		{
324d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
325d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
326d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
327d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
328d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
329d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
330d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
331d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
332d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
333d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
334d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
335d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
336d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
337d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
338d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
339d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
340d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
341d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
342d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
343d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
344d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
345d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
346d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
347d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
348d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
349d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
350d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
351d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
352d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
353d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
354d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
355d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
356d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
357d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
358d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
359d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
360d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
361d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
362d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
363d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
364d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
365d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
366d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
367d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
368d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
369d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
370d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
371d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
372d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
373d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
374d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
375d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
376d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
377d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
378d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
379d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
380d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
381d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
382d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
383d059297112922cabb0c674840589be8db821fd9aAdam Langley			0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
384d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
385d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
386d059297112922cabb0c674840589be8db821fd9aAdam Langley			0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
387d059297112922cabb0c674840589be8db821fd9aAdam Langley		0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}
388d059297112922cabb0c674840589be8db821fd9aAdam Langley	},
389d059297112922cabb0c674840589be8db821fd9aAdam Langley	{
390d059297112922cabb0c674840589be8db821fd9aAdam Langley		0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
391d059297112922cabb0c674840589be8db821fd9aAdam Langley		0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
392d059297112922cabb0c674840589be8db821fd9aAdam Langley		0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
393d059297112922cabb0c674840589be8db821fd9aAdam Langley		0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
394d059297112922cabb0c674840589be8db821fd9aAdam Langley		0x9216d5d9, 0x8979fb1b
395d059297112922cabb0c674840589be8db821fd9aAdam Langley	} };
396d059297112922cabb0c674840589be8db821fd9aAdam Langley
397d059297112922cabb0c674840589be8db821fd9aAdam Langley	*c = initstate;
398d059297112922cabb0c674840589be8db821fd9aAdam Langley}
399d059297112922cabb0c674840589be8db821fd9aAdam Langley
400d059297112922cabb0c674840589be8db821fd9aAdam Langleyu_int32_t
401d059297112922cabb0c674840589be8db821fd9aAdam LangleyBlowfish_stream2word(const u_int8_t *data, u_int16_t databytes,
402d059297112922cabb0c674840589be8db821fd9aAdam Langley    u_int16_t *current)
403d059297112922cabb0c674840589be8db821fd9aAdam Langley{
404d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int8_t i;
405d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int16_t j;
406d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t temp;
407d059297112922cabb0c674840589be8db821fd9aAdam Langley
408d059297112922cabb0c674840589be8db821fd9aAdam Langley	temp = 0x00000000;
409d059297112922cabb0c674840589be8db821fd9aAdam Langley	j = *current;
410d059297112922cabb0c674840589be8db821fd9aAdam Langley
411d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (i = 0; i < 4; i++, j++) {
412d059297112922cabb0c674840589be8db821fd9aAdam Langley		if (j >= databytes)
413d059297112922cabb0c674840589be8db821fd9aAdam Langley			j = 0;
414d059297112922cabb0c674840589be8db821fd9aAdam Langley		temp = (temp << 8) | data[j];
415d059297112922cabb0c674840589be8db821fd9aAdam Langley	}
416d059297112922cabb0c674840589be8db821fd9aAdam Langley
417d059297112922cabb0c674840589be8db821fd9aAdam Langley	*current = j;
418d059297112922cabb0c674840589be8db821fd9aAdam Langley	return temp;
419d059297112922cabb0c674840589be8db821fd9aAdam Langley}
420d059297112922cabb0c674840589be8db821fd9aAdam Langley
421d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid
422d059297112922cabb0c674840589be8db821fd9aAdam LangleyBlowfish_expand0state(blf_ctx *c, const u_int8_t *key, u_int16_t keybytes)
423d059297112922cabb0c674840589be8db821fd9aAdam Langley{
424d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int16_t i;
425d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int16_t j;
426d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int16_t k;
427d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t temp;
428d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t datal;
429d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t datar;
430d059297112922cabb0c674840589be8db821fd9aAdam Langley
431d059297112922cabb0c674840589be8db821fd9aAdam Langley	j = 0;
432d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (i = 0; i < BLF_N + 2; i++) {
433d059297112922cabb0c674840589be8db821fd9aAdam Langley		/* Extract 4 int8 to 1 int32 from keystream */
434d059297112922cabb0c674840589be8db821fd9aAdam Langley		temp = Blowfish_stream2word(key, keybytes, &j);
435d059297112922cabb0c674840589be8db821fd9aAdam Langley		c->P[i] = c->P[i] ^ temp;
436d059297112922cabb0c674840589be8db821fd9aAdam Langley	}
437d059297112922cabb0c674840589be8db821fd9aAdam Langley
438d059297112922cabb0c674840589be8db821fd9aAdam Langley	j = 0;
439d059297112922cabb0c674840589be8db821fd9aAdam Langley	datal = 0x00000000;
440d059297112922cabb0c674840589be8db821fd9aAdam Langley	datar = 0x00000000;
441d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (i = 0; i < BLF_N + 2; i += 2) {
442d059297112922cabb0c674840589be8db821fd9aAdam Langley		Blowfish_encipher(c, &datal, &datar);
443d059297112922cabb0c674840589be8db821fd9aAdam Langley
444d059297112922cabb0c674840589be8db821fd9aAdam Langley		c->P[i] = datal;
445d059297112922cabb0c674840589be8db821fd9aAdam Langley		c->P[i + 1] = datar;
446d059297112922cabb0c674840589be8db821fd9aAdam Langley	}
447d059297112922cabb0c674840589be8db821fd9aAdam Langley
448d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (i = 0; i < 4; i++) {
449d059297112922cabb0c674840589be8db821fd9aAdam Langley		for (k = 0; k < 256; k += 2) {
450d059297112922cabb0c674840589be8db821fd9aAdam Langley			Blowfish_encipher(c, &datal, &datar);
451d059297112922cabb0c674840589be8db821fd9aAdam Langley
452d059297112922cabb0c674840589be8db821fd9aAdam Langley			c->S[i][k] = datal;
453d059297112922cabb0c674840589be8db821fd9aAdam Langley			c->S[i][k + 1] = datar;
454d059297112922cabb0c674840589be8db821fd9aAdam Langley		}
455d059297112922cabb0c674840589be8db821fd9aAdam Langley	}
456d059297112922cabb0c674840589be8db821fd9aAdam Langley}
457d059297112922cabb0c674840589be8db821fd9aAdam Langley
458d059297112922cabb0c674840589be8db821fd9aAdam Langley
459d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid
460d059297112922cabb0c674840589be8db821fd9aAdam LangleyBlowfish_expandstate(blf_ctx *c, const u_int8_t *data, u_int16_t databytes,
461d059297112922cabb0c674840589be8db821fd9aAdam Langley    const u_int8_t *key, u_int16_t keybytes)
462d059297112922cabb0c674840589be8db821fd9aAdam Langley{
463d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int16_t i;
464d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int16_t j;
465d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int16_t k;
466d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t temp;
467d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t datal;
468d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t datar;
469d059297112922cabb0c674840589be8db821fd9aAdam Langley
470d059297112922cabb0c674840589be8db821fd9aAdam Langley	j = 0;
471d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (i = 0; i < BLF_N + 2; i++) {
472d059297112922cabb0c674840589be8db821fd9aAdam Langley		/* Extract 4 int8 to 1 int32 from keystream */
473d059297112922cabb0c674840589be8db821fd9aAdam Langley		temp = Blowfish_stream2word(key, keybytes, &j);
474d059297112922cabb0c674840589be8db821fd9aAdam Langley		c->P[i] = c->P[i] ^ temp;
475d059297112922cabb0c674840589be8db821fd9aAdam Langley	}
476d059297112922cabb0c674840589be8db821fd9aAdam Langley
477d059297112922cabb0c674840589be8db821fd9aAdam Langley	j = 0;
478d059297112922cabb0c674840589be8db821fd9aAdam Langley	datal = 0x00000000;
479d059297112922cabb0c674840589be8db821fd9aAdam Langley	datar = 0x00000000;
480d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (i = 0; i < BLF_N + 2; i += 2) {
481d059297112922cabb0c674840589be8db821fd9aAdam Langley		datal ^= Blowfish_stream2word(data, databytes, &j);
482d059297112922cabb0c674840589be8db821fd9aAdam Langley		datar ^= Blowfish_stream2word(data, databytes, &j);
483d059297112922cabb0c674840589be8db821fd9aAdam Langley		Blowfish_encipher(c, &datal, &datar);
484d059297112922cabb0c674840589be8db821fd9aAdam Langley
485d059297112922cabb0c674840589be8db821fd9aAdam Langley		c->P[i] = datal;
486d059297112922cabb0c674840589be8db821fd9aAdam Langley		c->P[i + 1] = datar;
487d059297112922cabb0c674840589be8db821fd9aAdam Langley	}
488d059297112922cabb0c674840589be8db821fd9aAdam Langley
489d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (i = 0; i < 4; i++) {
490d059297112922cabb0c674840589be8db821fd9aAdam Langley		for (k = 0; k < 256; k += 2) {
491d059297112922cabb0c674840589be8db821fd9aAdam Langley			datal ^= Blowfish_stream2word(data, databytes, &j);
492d059297112922cabb0c674840589be8db821fd9aAdam Langley			datar ^= Blowfish_stream2word(data, databytes, &j);
493d059297112922cabb0c674840589be8db821fd9aAdam Langley			Blowfish_encipher(c, &datal, &datar);
494d059297112922cabb0c674840589be8db821fd9aAdam Langley
495d059297112922cabb0c674840589be8db821fd9aAdam Langley			c->S[i][k] = datal;
496d059297112922cabb0c674840589be8db821fd9aAdam Langley			c->S[i][k + 1] = datar;
497d059297112922cabb0c674840589be8db821fd9aAdam Langley		}
498d059297112922cabb0c674840589be8db821fd9aAdam Langley	}
499d059297112922cabb0c674840589be8db821fd9aAdam Langley
500d059297112922cabb0c674840589be8db821fd9aAdam Langley}
501d059297112922cabb0c674840589be8db821fd9aAdam Langley
502d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid
503d059297112922cabb0c674840589be8db821fd9aAdam Langleyblf_key(blf_ctx *c, const u_int8_t *k, u_int16_t len)
504d059297112922cabb0c674840589be8db821fd9aAdam Langley{
505d059297112922cabb0c674840589be8db821fd9aAdam Langley	/* Initialize S-boxes and subkeys with Pi */
506d059297112922cabb0c674840589be8db821fd9aAdam Langley	Blowfish_initstate(c);
507d059297112922cabb0c674840589be8db821fd9aAdam Langley
508d059297112922cabb0c674840589be8db821fd9aAdam Langley	/* Transform S-boxes and subkeys with key */
509d059297112922cabb0c674840589be8db821fd9aAdam Langley	Blowfish_expand0state(c, k, len);
510d059297112922cabb0c674840589be8db821fd9aAdam Langley}
511d059297112922cabb0c674840589be8db821fd9aAdam Langley
512d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid
513d059297112922cabb0c674840589be8db821fd9aAdam Langleyblf_enc(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
514d059297112922cabb0c674840589be8db821fd9aAdam Langley{
515d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t *d;
516d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int16_t i;
517d059297112922cabb0c674840589be8db821fd9aAdam Langley
518d059297112922cabb0c674840589be8db821fd9aAdam Langley	d = data;
519d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (i = 0; i < blocks; i++) {
520d059297112922cabb0c674840589be8db821fd9aAdam Langley		Blowfish_encipher(c, d, d + 1);
521d059297112922cabb0c674840589be8db821fd9aAdam Langley		d += 2;
522d059297112922cabb0c674840589be8db821fd9aAdam Langley	}
523d059297112922cabb0c674840589be8db821fd9aAdam Langley}
524d059297112922cabb0c674840589be8db821fd9aAdam Langley
525d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid
526d059297112922cabb0c674840589be8db821fd9aAdam Langleyblf_dec(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
527d059297112922cabb0c674840589be8db821fd9aAdam Langley{
528d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t *d;
529d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int16_t i;
530d059297112922cabb0c674840589be8db821fd9aAdam Langley
531d059297112922cabb0c674840589be8db821fd9aAdam Langley	d = data;
532d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (i = 0; i < blocks; i++) {
533d059297112922cabb0c674840589be8db821fd9aAdam Langley		Blowfish_decipher(c, d, d + 1);
534d059297112922cabb0c674840589be8db821fd9aAdam Langley		d += 2;
535d059297112922cabb0c674840589be8db821fd9aAdam Langley	}
536d059297112922cabb0c674840589be8db821fd9aAdam Langley}
537d059297112922cabb0c674840589be8db821fd9aAdam Langley
538d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid
539d059297112922cabb0c674840589be8db821fd9aAdam Langleyblf_ecb_encrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
540d059297112922cabb0c674840589be8db821fd9aAdam Langley{
541d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t l, r;
542d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t i;
543d059297112922cabb0c674840589be8db821fd9aAdam Langley
544d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (i = 0; i < len; i += 8) {
545d059297112922cabb0c674840589be8db821fd9aAdam Langley		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
546d059297112922cabb0c674840589be8db821fd9aAdam Langley		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
547d059297112922cabb0c674840589be8db821fd9aAdam Langley		Blowfish_encipher(c, &l, &r);
548d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[0] = l >> 24 & 0xff;
549d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[1] = l >> 16 & 0xff;
550d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[2] = l >> 8 & 0xff;
551d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[3] = l & 0xff;
552d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[4] = r >> 24 & 0xff;
553d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[5] = r >> 16 & 0xff;
554d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[6] = r >> 8 & 0xff;
555d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[7] = r & 0xff;
556d059297112922cabb0c674840589be8db821fd9aAdam Langley		data += 8;
557d059297112922cabb0c674840589be8db821fd9aAdam Langley	}
558d059297112922cabb0c674840589be8db821fd9aAdam Langley}
559d059297112922cabb0c674840589be8db821fd9aAdam Langley
560d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid
561d059297112922cabb0c674840589be8db821fd9aAdam Langleyblf_ecb_decrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
562d059297112922cabb0c674840589be8db821fd9aAdam Langley{
563d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t l, r;
564d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t i;
565d059297112922cabb0c674840589be8db821fd9aAdam Langley
566d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (i = 0; i < len; i += 8) {
567d059297112922cabb0c674840589be8db821fd9aAdam Langley		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
568d059297112922cabb0c674840589be8db821fd9aAdam Langley		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
569d059297112922cabb0c674840589be8db821fd9aAdam Langley		Blowfish_decipher(c, &l, &r);
570d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[0] = l >> 24 & 0xff;
571d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[1] = l >> 16 & 0xff;
572d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[2] = l >> 8 & 0xff;
573d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[3] = l & 0xff;
574d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[4] = r >> 24 & 0xff;
575d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[5] = r >> 16 & 0xff;
576d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[6] = r >> 8 & 0xff;
577d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[7] = r & 0xff;
578d059297112922cabb0c674840589be8db821fd9aAdam Langley		data += 8;
579d059297112922cabb0c674840589be8db821fd9aAdam Langley	}
580d059297112922cabb0c674840589be8db821fd9aAdam Langley}
581d059297112922cabb0c674840589be8db821fd9aAdam Langley
582d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid
583d059297112922cabb0c674840589be8db821fd9aAdam Langleyblf_cbc_encrypt(blf_ctx *c, u_int8_t *iv, u_int8_t *data, u_int32_t len)
584d059297112922cabb0c674840589be8db821fd9aAdam Langley{
585d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t l, r;
586d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t i, j;
587d059297112922cabb0c674840589be8db821fd9aAdam Langley
588d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (i = 0; i < len; i += 8) {
589d059297112922cabb0c674840589be8db821fd9aAdam Langley		for (j = 0; j < 8; j++)
590d059297112922cabb0c674840589be8db821fd9aAdam Langley			data[j] ^= iv[j];
591d059297112922cabb0c674840589be8db821fd9aAdam Langley		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
592d059297112922cabb0c674840589be8db821fd9aAdam Langley		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
593d059297112922cabb0c674840589be8db821fd9aAdam Langley		Blowfish_encipher(c, &l, &r);
594d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[0] = l >> 24 & 0xff;
595d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[1] = l >> 16 & 0xff;
596d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[2] = l >> 8 & 0xff;
597d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[3] = l & 0xff;
598d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[4] = r >> 24 & 0xff;
599d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[5] = r >> 16 & 0xff;
600d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[6] = r >> 8 & 0xff;
601d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[7] = r & 0xff;
602d059297112922cabb0c674840589be8db821fd9aAdam Langley		iv = data;
603d059297112922cabb0c674840589be8db821fd9aAdam Langley		data += 8;
604d059297112922cabb0c674840589be8db821fd9aAdam Langley	}
605d059297112922cabb0c674840589be8db821fd9aAdam Langley}
606d059297112922cabb0c674840589be8db821fd9aAdam Langley
607d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid
608d059297112922cabb0c674840589be8db821fd9aAdam Langleyblf_cbc_decrypt(blf_ctx *c, u_int8_t *iva, u_int8_t *data, u_int32_t len)
609d059297112922cabb0c674840589be8db821fd9aAdam Langley{
610d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t l, r;
611d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int8_t *iv;
612d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t i, j;
613d059297112922cabb0c674840589be8db821fd9aAdam Langley
614d059297112922cabb0c674840589be8db821fd9aAdam Langley	iv = data + len - 16;
615d059297112922cabb0c674840589be8db821fd9aAdam Langley	data = data + len - 8;
616d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (i = len - 8; i >= 8; i -= 8) {
617d059297112922cabb0c674840589be8db821fd9aAdam Langley		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
618d059297112922cabb0c674840589be8db821fd9aAdam Langley		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
619d059297112922cabb0c674840589be8db821fd9aAdam Langley		Blowfish_decipher(c, &l, &r);
620d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[0] = l >> 24 & 0xff;
621d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[1] = l >> 16 & 0xff;
622d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[2] = l >> 8 & 0xff;
623d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[3] = l & 0xff;
624d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[4] = r >> 24 & 0xff;
625d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[5] = r >> 16 & 0xff;
626d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[6] = r >> 8 & 0xff;
627d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[7] = r & 0xff;
628d059297112922cabb0c674840589be8db821fd9aAdam Langley		for (j = 0; j < 8; j++)
629d059297112922cabb0c674840589be8db821fd9aAdam Langley			data[j] ^= iv[j];
630d059297112922cabb0c674840589be8db821fd9aAdam Langley		iv -= 8;
631d059297112922cabb0c674840589be8db821fd9aAdam Langley		data -= 8;
632d059297112922cabb0c674840589be8db821fd9aAdam Langley	}
633d059297112922cabb0c674840589be8db821fd9aAdam Langley	l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
634d059297112922cabb0c674840589be8db821fd9aAdam Langley	r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
635d059297112922cabb0c674840589be8db821fd9aAdam Langley	Blowfish_decipher(c, &l, &r);
636d059297112922cabb0c674840589be8db821fd9aAdam Langley	data[0] = l >> 24 & 0xff;
637d059297112922cabb0c674840589be8db821fd9aAdam Langley	data[1] = l >> 16 & 0xff;
638d059297112922cabb0c674840589be8db821fd9aAdam Langley	data[2] = l >> 8 & 0xff;
639d059297112922cabb0c674840589be8db821fd9aAdam Langley	data[3] = l & 0xff;
640d059297112922cabb0c674840589be8db821fd9aAdam Langley	data[4] = r >> 24 & 0xff;
641d059297112922cabb0c674840589be8db821fd9aAdam Langley	data[5] = r >> 16 & 0xff;
642d059297112922cabb0c674840589be8db821fd9aAdam Langley	data[6] = r >> 8 & 0xff;
643d059297112922cabb0c674840589be8db821fd9aAdam Langley	data[7] = r & 0xff;
644d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (j = 0; j < 8; j++)
645d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[j] ^= iva[j];
646d059297112922cabb0c674840589be8db821fd9aAdam Langley}
647d059297112922cabb0c674840589be8db821fd9aAdam Langley
648d059297112922cabb0c674840589be8db821fd9aAdam Langley#if 0
649d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid
650d059297112922cabb0c674840589be8db821fd9aAdam Langleyreport(u_int32_t data[], u_int16_t len)
651d059297112922cabb0c674840589be8db821fd9aAdam Langley{
652d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int16_t i;
653d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (i = 0; i < len; i += 2)
654d059297112922cabb0c674840589be8db821fd9aAdam Langley		printf("Block %0hd: %08lx %08lx.\n",
655d059297112922cabb0c674840589be8db821fd9aAdam Langley		    i / 2, data[i], data[i + 1]);
656d059297112922cabb0c674840589be8db821fd9aAdam Langley}
657d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid
658d059297112922cabb0c674840589be8db821fd9aAdam Langleymain(void)
659d059297112922cabb0c674840589be8db821fd9aAdam Langley{
660d059297112922cabb0c674840589be8db821fd9aAdam Langley
661d059297112922cabb0c674840589be8db821fd9aAdam Langley	blf_ctx c;
662d059297112922cabb0c674840589be8db821fd9aAdam Langley	char    key[] = "AAAAA";
663d059297112922cabb0c674840589be8db821fd9aAdam Langley	char    key2[] = "abcdefghijklmnopqrstuvwxyz";
664d059297112922cabb0c674840589be8db821fd9aAdam Langley
665d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t data[10];
666d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int32_t data2[] =
667d059297112922cabb0c674840589be8db821fd9aAdam Langley	{0x424c4f57l, 0x46495348l};
668d059297112922cabb0c674840589be8db821fd9aAdam Langley
669d059297112922cabb0c674840589be8db821fd9aAdam Langley	u_int16_t i;
670d059297112922cabb0c674840589be8db821fd9aAdam Langley
671d059297112922cabb0c674840589be8db821fd9aAdam Langley	/* First test */
672d059297112922cabb0c674840589be8db821fd9aAdam Langley	for (i = 0; i < 10; i++)
673d059297112922cabb0c674840589be8db821fd9aAdam Langley		data[i] = i;
674d059297112922cabb0c674840589be8db821fd9aAdam Langley
675d059297112922cabb0c674840589be8db821fd9aAdam Langley	blf_key(&c, (u_int8_t *) key, 5);
676d059297112922cabb0c674840589be8db821fd9aAdam Langley	blf_enc(&c, data, 5);
677d059297112922cabb0c674840589be8db821fd9aAdam Langley	blf_dec(&c, data, 1);
678d059297112922cabb0c674840589be8db821fd9aAdam Langley	blf_dec(&c, data + 2, 4);
679d059297112922cabb0c674840589be8db821fd9aAdam Langley	printf("Should read as 0 - 9.\n");
680d059297112922cabb0c674840589be8db821fd9aAdam Langley	report(data, 10);
681d059297112922cabb0c674840589be8db821fd9aAdam Langley
682d059297112922cabb0c674840589be8db821fd9aAdam Langley	/* Second test */
683d059297112922cabb0c674840589be8db821fd9aAdam Langley	blf_key(&c, (u_int8_t *) key2, strlen(key2));
684d059297112922cabb0c674840589be8db821fd9aAdam Langley	blf_enc(&c, data2, 1);
685d059297112922cabb0c674840589be8db821fd9aAdam Langley	printf("\nShould read as: 0x324ed0fe 0xf413a203.\n");
686d059297112922cabb0c674840589be8db821fd9aAdam Langley	report(data2, 2);
687d059297112922cabb0c674840589be8db821fd9aAdam Langley	blf_dec(&c, data2, 1);
688d059297112922cabb0c674840589be8db821fd9aAdam Langley	report(data2, 2);
689d059297112922cabb0c674840589be8db821fd9aAdam Langley}
690d059297112922cabb0c674840589be8db821fd9aAdam Langley#endif
691d059297112922cabb0c674840589be8db821fd9aAdam Langley
692d059297112922cabb0c674840589be8db821fd9aAdam Langley#endif /* !defined(HAVE_BCRYPT_PBKDF) && (!defined(HAVE_BLOWFISH_INITSTATE) || \
693d059297112922cabb0c674840589be8db821fd9aAdam Langley    !defined(HAVE_BLOWFISH_EXPAND0STATE) || !defined(HAVE_BLF_ENC)) */
694d059297112922cabb0c674840589be8db821fd9aAdam Langley
695