Blame src/external/blowfish.c

Packit Service 31306d
/* $OpenBSD: blowfish.c,v 1.18 2004/11/02 17:23:26 hshoexer Exp $ */
Packit Service 31306d
/*
Packit Service 31306d
 * Blowfish block cipher for OpenBSD
Packit Service 31306d
 * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
Packit Service 31306d
 * All rights reserved.
Packit Service 31306d
 *
Packit Service 31306d
 * Implementation advice by David Mazieres <dm@lcs.mit.edu>.
Packit Service 31306d
 *
Packit Service 31306d
 * Redistribution and use in source and binary forms, with or without
Packit Service 31306d
 * modification, are permitted provided that the following conditions
Packit Service 31306d
 * are met:
Packit Service 31306d
 * 1. Redistributions of source code must retain the above copyright
Packit Service 31306d
 *    notice, this list of conditions and the following disclaimer.
Packit Service 31306d
 * 2. Redistributions in binary form must reproduce the above copyright
Packit Service 31306d
 *    notice, this list of conditions and the following disclaimer in the
Packit Service 31306d
 *    documentation and/or other materials provided with the distribution.
Packit Service 31306d
 * 3. All advertising materials mentioning features or use of this software
Packit Service 31306d
 *    must display the following acknowledgement:
Packit Service 31306d
 *      This product includes software developed by Niels Provos.
Packit Service 31306d
 * 4. The name of the author may not be used to endorse or promote products
Packit Service 31306d
 *    derived from this software without specific prior written permission.
Packit Service 31306d
 *
Packit Service 31306d
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
Packit Service 31306d
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
Packit Service 31306d
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
Packit Service 31306d
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
Packit Service 31306d
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
Packit Service 31306d
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 31306d
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 31306d
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 31306d
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
Packit Service 31306d
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 31306d
 */
Packit Service 31306d
Packit Service 31306d
/*
Packit Service 31306d
 * This code is derived from section 14.3 and the given source
Packit Service 31306d
 * in section V of Applied Cryptography, second edition.
Packit Service 31306d
 * Blowfish is an unpatented fast block cipher designed by
Packit Service 31306d
 * Bruce Schneier.
Packit Service 31306d
 */
Packit Service 31306d
Packit Service 31306d
Packit Service 31306d
#if !defined(HAVE_BCRYPT_PBKDF) && (!defined(HAVE_BLOWFISH_INITSTATE) || \
Packit Service 31306d
    !defined(HAVE_BLOWFISH_EXPAND0STATE) || !defined(HAVE_BLF_ENC))
Packit Service 31306d
Packit Service 31306d
#if 0
Packit Service 31306d
#include <stdio.h>		/* used for debugging */
Packit Service 31306d
#include <string.h>
Packit Service 31306d
#endif
Packit Service 31306d
Packit Service 31306d
#include <sys/types.h>
Packit Service 31306d
#include <stdint.h>
Packit Service 31306d
Packit Service 31306d
#include "libssh/blf.h"
Packit Service 31306d
Packit Service 31306d
#undef inline
Packit Service 31306d
#ifdef __GNUC__
Packit Service 31306d
#define inline __inline
Packit Service 31306d
#else				/* !__GNUC__ */
Packit Service 31306d
#define inline
Packit Service 31306d
#endif				/* !__GNUC__ */
Packit Service 31306d
Packit Service 31306d
/* Function for Feistel Networks */
Packit Service 31306d
Packit Service 31306d
#define F(s, x) ((((s)[        (((x)>>24)&0xFF)]  \
Packit Service 31306d
		 + (s)[0x100 + (((x)>>16)&0xFF)]) \
Packit Service 31306d
		 ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \
Packit Service 31306d
		 + (s)[0x300 + ( (x)     &0xFF)])
Packit Service 31306d
Packit Service 31306d
#define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n])
Packit Service 31306d
Packit Service 31306d
void
Packit Service 31306d
Blowfish_encipher(ssh_blf_ctx *c, uint32_t *xl, uint32_t *xr)
Packit Service 31306d
{
Packit Service 31306d
	uint32_t Xl;
Packit Service 31306d
	uint32_t Xr;
Packit Service 31306d
	uint32_t *s = c->S[0];
Packit Service 31306d
	uint32_t *p = c->P;
Packit Service 31306d
Packit Service 31306d
	Xl = *xl;
Packit Service 31306d
	Xr = *xr;
Packit Service 31306d
Packit Service 31306d
	Xl ^= p[0];
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2);
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4);
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6);
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8);
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10);
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12);
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14);
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16);
Packit Service 31306d
Packit Service 31306d
	*xl = Xr ^ p[17];
Packit Service 31306d
	*xr = Xl;
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
void
Packit Service 31306d
Blowfish_decipher(ssh_blf_ctx *c, uint32_t *xl, uint32_t *xr)
Packit Service 31306d
{
Packit Service 31306d
	uint32_t Xl;
Packit Service 31306d
	uint32_t Xr;
Packit Service 31306d
	uint32_t *s = c->S[0];
Packit Service 31306d
	uint32_t *p = c->P;
Packit Service 31306d
Packit Service 31306d
	Xl = *xl;
Packit Service 31306d
	Xr = *xr;
Packit Service 31306d
Packit Service 31306d
	Xl ^= p[17];
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15);
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13);
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11);
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9);
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7);
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5);
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3);
Packit Service 31306d
	BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1);
Packit Service 31306d
Packit Service 31306d
	*xl = Xr ^ p[0];
Packit Service 31306d
	*xr = Xl;
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
void
Packit Service 31306d
Blowfish_initstate(ssh_blf_ctx *c)
Packit Service 31306d
{
Packit Service 31306d
	/* P-box and S-box tables initialized with digits of Pi */
Packit Service 31306d
Packit Service 31306d
	static const ssh_blf_ctx initstate =
Packit Service 31306d
	{ {
Packit Service 31306d
		{
Packit Service 31306d
			0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
Packit Service 31306d
			0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
Packit Service 31306d
			0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
Packit Service 31306d
			0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
Packit Service 31306d
			0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
Packit Service 31306d
			0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
Packit Service 31306d
			0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
Packit Service 31306d
			0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
Packit Service 31306d
			0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
Packit Service 31306d
			0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
Packit Service 31306d
			0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
Packit Service 31306d
			0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
Packit Service 31306d
			0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
Packit Service 31306d
			0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
Packit Service 31306d
			0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
Packit Service 31306d
			0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
Packit Service 31306d
			0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
Packit Service 31306d
			0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
Packit Service 31306d
			0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
Packit Service 31306d
			0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
Packit Service 31306d
			0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
Packit Service 31306d
			0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
Packit Service 31306d
			0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
Packit Service 31306d
			0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
Packit Service 31306d
			0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
Packit Service 31306d
			0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
Packit Service 31306d
			0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
Packit Service 31306d
			0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
Packit Service 31306d
			0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
Packit Service 31306d
			0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
Packit Service 31306d
			0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
Packit Service 31306d
			0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
Packit Service 31306d
			0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
Packit Service 31306d
			0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
Packit Service 31306d
			0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
Packit Service 31306d
			0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
Packit Service 31306d
			0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
Packit Service 31306d
			0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
Packit Service 31306d
			0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
Packit Service 31306d
			0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
Packit Service 31306d
			0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
Packit Service 31306d
			0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
Packit Service 31306d
			0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
Packit Service 31306d
			0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
Packit Service 31306d
			0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
Packit Service 31306d
			0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
Packit Service 31306d
			0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
Packit Service 31306d
			0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
Packit Service 31306d
			0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
Packit Service 31306d
			0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
Packit Service 31306d
			0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
Packit Service 31306d
			0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
Packit Service 31306d
			0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
Packit Service 31306d
			0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
Packit Service 31306d
			0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
Packit Service 31306d
			0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
Packit Service 31306d
			0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
Packit Service 31306d
			0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
Packit Service 31306d
			0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
Packit Service 31306d
			0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
Packit Service 31306d
			0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
Packit Service 31306d
			0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
Packit Service 31306d
			0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
Packit Service 31306d
		0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a},
Packit Service 31306d
		{
Packit Service 31306d
			0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
Packit Service 31306d
			0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
Packit Service 31306d
			0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
Packit Service 31306d
			0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
Packit Service 31306d
			0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
Packit Service 31306d
			0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
Packit Service 31306d
			0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
Packit Service 31306d
			0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
Packit Service 31306d
			0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
Packit Service 31306d
			0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
Packit Service 31306d
			0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
Packit Service 31306d
			0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
Packit Service 31306d
			0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
Packit Service 31306d
			0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
Packit Service 31306d
			0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
Packit Service 31306d
			0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
Packit Service 31306d
			0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
Packit Service 31306d
			0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
Packit Service 31306d
			0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
Packit Service 31306d
			0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
Packit Service 31306d
			0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
Packit Service 31306d
			0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
Packit Service 31306d
			0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
Packit Service 31306d
			0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
Packit Service 31306d
			0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
Packit Service 31306d
			0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
Packit Service 31306d
			0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
Packit Service 31306d
			0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
Packit Service 31306d
			0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
Packit Service 31306d
			0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
Packit Service 31306d
			0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
Packit Service 31306d
			0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
Packit Service 31306d
			0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
Packit Service 31306d
			0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
Packit Service 31306d
			0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
Packit Service 31306d
			0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
Packit Service 31306d
			0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
Packit Service 31306d
			0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
Packit Service 31306d
			0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
Packit Service 31306d
			0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
Packit Service 31306d
			0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
Packit Service 31306d
			0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
Packit Service 31306d
			0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
Packit Service 31306d
			0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
Packit Service 31306d
			0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
Packit Service 31306d
			0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
Packit Service 31306d
			0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
Packit Service 31306d
			0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
Packit Service 31306d
			0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
Packit Service 31306d
			0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
Packit Service 31306d
			0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
Packit Service 31306d
			0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
Packit Service 31306d
			0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
Packit Service 31306d
			0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
Packit Service 31306d
			0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
Packit Service 31306d
			0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
Packit Service 31306d
			0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
Packit Service 31306d
			0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
Packit Service 31306d
			0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
Packit Service 31306d
			0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
Packit Service 31306d
			0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
Packit Service 31306d
			0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
Packit Service 31306d
			0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
Packit Service 31306d
		0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7},
Packit Service 31306d
		{
Packit Service 31306d
			0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
Packit Service 31306d
			0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
Packit Service 31306d
			0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
Packit Service 31306d
			0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
Packit Service 31306d
			0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
Packit Service 31306d
			0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
Packit Service 31306d
			0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
Packit Service 31306d
			0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
Packit Service 31306d
			0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
Packit Service 31306d
			0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
Packit Service 31306d
			0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
Packit Service 31306d
			0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
Packit Service 31306d
			0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
Packit Service 31306d
			0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
Packit Service 31306d
			0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
Packit Service 31306d
			0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
Packit Service 31306d
			0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
Packit Service 31306d
			0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
Packit Service 31306d
			0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
Packit Service 31306d
			0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
Packit Service 31306d
			0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
Packit Service 31306d
			0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
Packit Service 31306d
			0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
Packit Service 31306d
			0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
Packit Service 31306d
			0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
Packit Service 31306d
			0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
Packit Service 31306d
			0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
Packit Service 31306d
			0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
Packit Service 31306d
			0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
Packit Service 31306d
			0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
Packit Service 31306d
			0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
Packit Service 31306d
			0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
Packit Service 31306d
			0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
Packit Service 31306d
			0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
Packit Service 31306d
			0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
Packit Service 31306d
			0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
Packit Service 31306d
			0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
Packit Service 31306d
			0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
Packit Service 31306d
			0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
Packit Service 31306d
			0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
Packit Service 31306d
			0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
Packit Service 31306d
			0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
Packit Service 31306d
			0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
Packit Service 31306d
			0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
Packit Service 31306d
			0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
Packit Service 31306d
			0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
Packit Service 31306d
			0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
Packit Service 31306d
			0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
Packit Service 31306d
			0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
Packit Service 31306d
			0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
Packit Service 31306d
			0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
Packit Service 31306d
			0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
Packit Service 31306d
			0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
Packit Service 31306d
			0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
Packit Service 31306d
			0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
Packit Service 31306d
			0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
Packit Service 31306d
			0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
Packit Service 31306d
			0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
Packit Service 31306d
			0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
Packit Service 31306d
			0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
Packit Service 31306d
			0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
Packit Service 31306d
			0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
Packit Service 31306d
			0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
Packit Service 31306d
		0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0},
Packit Service 31306d
		{
Packit Service 31306d
			0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
Packit Service 31306d
			0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
Packit Service 31306d
			0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
Packit Service 31306d
			0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
Packit Service 31306d
			0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
Packit Service 31306d
			0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
Packit Service 31306d
			0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
Packit Service 31306d
			0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
Packit Service 31306d
			0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
Packit Service 31306d
			0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
Packit Service 31306d
			0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
Packit Service 31306d
			0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
Packit Service 31306d
			0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
Packit Service 31306d
			0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
Packit Service 31306d
			0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
Packit Service 31306d
			0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
Packit Service 31306d
			0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
Packit Service 31306d
			0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
Packit Service 31306d
			0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
Packit Service 31306d
			0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
Packit Service 31306d
			0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
Packit Service 31306d
			0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
Packit Service 31306d
			0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
Packit Service 31306d
			0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
Packit Service 31306d
			0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
Packit Service 31306d
			0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
Packit Service 31306d
			0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
Packit Service 31306d
			0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
Packit Service 31306d
			0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
Packit Service 31306d
			0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
Packit Service 31306d
			0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
Packit Service 31306d
			0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
Packit Service 31306d
			0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
Packit Service 31306d
			0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
Packit Service 31306d
			0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
Packit Service 31306d
			0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
Packit Service 31306d
			0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
Packit Service 31306d
			0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
Packit Service 31306d
			0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
Packit Service 31306d
			0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
Packit Service 31306d
			0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
Packit Service 31306d
			0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
Packit Service 31306d
			0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
Packit Service 31306d
			0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
Packit Service 31306d
			0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
Packit Service 31306d
			0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
Packit Service 31306d
			0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
Packit Service 31306d
			0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
Packit Service 31306d
			0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
Packit Service 31306d
			0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
Packit Service 31306d
			0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
Packit Service 31306d
			0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
Packit Service 31306d
			0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
Packit Service 31306d
			0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
Packit Service 31306d
			0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
Packit Service 31306d
			0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
Packit Service 31306d
			0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
Packit Service 31306d
			0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
Packit Service 31306d
			0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
Packit Service 31306d
			0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
Packit Service 31306d
			0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
Packit Service 31306d
			0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
Packit Service 31306d
			0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
Packit Service 31306d
		0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}
Packit Service 31306d
	},
Packit Service 31306d
	{
Packit Service 31306d
		0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
Packit Service 31306d
		0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
Packit Service 31306d
		0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
Packit Service 31306d
		0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
Packit Service 31306d
		0x9216d5d9, 0x8979fb1b
Packit Service 31306d
	} };
Packit Service 31306d
Packit Service 31306d
	*c = initstate;
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
uint32_t
Packit Service 31306d
Blowfish_stream2word(const uint8_t *data, uint16_t databytes,
Packit Service 31306d
    uint16_t *current)
Packit Service 31306d
{
Packit Service 31306d
	uint8_t i;
Packit Service 31306d
	uint16_t j;
Packit Service 31306d
	uint32_t temp;
Packit Service 31306d
Packit Service 31306d
	temp = 0x00000000;
Packit Service 31306d
	j = *current;
Packit Service 31306d
Packit Service 31306d
	for (i = 0; i < 4; i++, j++) {
Packit Service 31306d
		if (j >= databytes)
Packit Service 31306d
			j = 0;
Packit Service 31306d
		temp = (temp << 8) | data[j];
Packit Service 31306d
	}
Packit Service 31306d
Packit Service 31306d
	*current = j;
Packit Service 31306d
	return temp;
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
void
Packit Service 31306d
Blowfish_expand0state(ssh_blf_ctx *c, const uint8_t *key, uint16_t keybytes)
Packit Service 31306d
{
Packit Service 31306d
	uint16_t i;
Packit Service 31306d
	uint16_t j;
Packit Service 31306d
	uint16_t k;
Packit Service 31306d
	uint32_t temp;
Packit Service 31306d
	uint32_t datal;
Packit Service 31306d
	uint32_t datar;
Packit Service 31306d
Packit Service 31306d
	j = 0;
Packit Service 31306d
	for (i = 0; i < BLF_N + 2; i++) {
Packit Service 31306d
		/* Extract 4 int8 to 1 int32 from keystream */
Packit Service 31306d
		temp = Blowfish_stream2word(key, keybytes, &j);
Packit Service 31306d
		c->P[i] = c->P[i] ^ temp;
Packit Service 31306d
	}
Packit Service 31306d
Packit Service 31306d
	j = 0;
Packit Service 31306d
	datal = 0x00000000;
Packit Service 31306d
	datar = 0x00000000;
Packit Service 31306d
	for (i = 0; i < BLF_N + 2; i += 2) {
Packit Service 31306d
		Blowfish_encipher(c, &datal, &datar);
Packit Service 31306d
Packit Service 31306d
		c->P[i] = datal;
Packit Service 31306d
		c->P[i + 1] = datar;
Packit Service 31306d
	}
Packit Service 31306d
Packit Service 31306d
	for (i = 0; i < 4; i++) {
Packit Service 31306d
		for (k = 0; k < 256; k += 2) {
Packit Service 31306d
			Blowfish_encipher(c, &datal, &datar);
Packit Service 31306d
Packit Service 31306d
			c->S[i][k] = datal;
Packit Service 31306d
			c->S[i][k + 1] = datar;
Packit Service 31306d
		}
Packit Service 31306d
	}
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
Packit Service 31306d
void
Packit Service 31306d
Blowfish_expandstate(ssh_blf_ctx *c, const uint8_t *data, uint16_t databytes,
Packit Service 31306d
    const uint8_t *key, uint16_t keybytes)
Packit Service 31306d
{
Packit Service 31306d
	uint16_t i;
Packit Service 31306d
	uint16_t j;
Packit Service 31306d
	uint16_t k;
Packit Service 31306d
	uint32_t temp;
Packit Service 31306d
	uint32_t datal;
Packit Service 31306d
	uint32_t datar;
Packit Service 31306d
Packit Service 31306d
	j = 0;
Packit Service 31306d
	for (i = 0; i < BLF_N + 2; i++) {
Packit Service 31306d
		/* Extract 4 int8 to 1 int32 from keystream */
Packit Service 31306d
		temp = Blowfish_stream2word(key, keybytes, &j);
Packit Service 31306d
		c->P[i] = c->P[i] ^ temp;
Packit Service 31306d
	}
Packit Service 31306d
Packit Service 31306d
	j = 0;
Packit Service 31306d
	datal = 0x00000000;
Packit Service 31306d
	datar = 0x00000000;
Packit Service 31306d
	for (i = 0; i < BLF_N + 2; i += 2) {
Packit Service 31306d
		datal ^= Blowfish_stream2word(data, databytes, &j);
Packit Service 31306d
		datar ^= Blowfish_stream2word(data, databytes, &j);
Packit Service 31306d
		Blowfish_encipher(c, &datal, &datar);
Packit Service 31306d
Packit Service 31306d
		c->P[i] = datal;
Packit Service 31306d
		c->P[i + 1] = datar;
Packit Service 31306d
	}
Packit Service 31306d
Packit Service 31306d
	for (i = 0; i < 4; i++) {
Packit Service 31306d
		for (k = 0; k < 256; k += 2) {
Packit Service 31306d
			datal ^= Blowfish_stream2word(data, databytes, &j);
Packit Service 31306d
			datar ^= Blowfish_stream2word(data, databytes, &j);
Packit Service 31306d
			Blowfish_encipher(c, &datal, &datar);
Packit Service 31306d
Packit Service 31306d
			c->S[i][k] = datal;
Packit Service 31306d
			c->S[i][k + 1] = datar;
Packit Service 31306d
		}
Packit Service 31306d
	}
Packit Service 31306d
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
void
Packit Service 31306d
ssh_blf_key(ssh_blf_ctx *c, const uint8_t *k, uint16_t len)
Packit Service 31306d
{
Packit Service 31306d
	/* Initialize S-boxes and subkeys with Pi */
Packit Service 31306d
	Blowfish_initstate(c);
Packit Service 31306d
Packit Service 31306d
	/* Transform S-boxes and subkeys with key */
Packit Service 31306d
	Blowfish_expand0state(c, k, len);
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
void
Packit Service 31306d
ssh_blf_enc(ssh_blf_ctx *c, uint32_t *data, uint16_t blocks)
Packit Service 31306d
{
Packit Service 31306d
	uint32_t *d;
Packit Service 31306d
	uint16_t i;
Packit Service 31306d
Packit Service 31306d
	d = data;
Packit Service 31306d
	for (i = 0; i < blocks; i++) {
Packit Service 31306d
		Blowfish_encipher(c, d, d + 1);
Packit Service 31306d
		d += 2;
Packit Service 31306d
	}
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
void
Packit Service 31306d
ssh_blf_dec(ssh_blf_ctx *c, uint32_t *data, uint16_t blocks)
Packit Service 31306d
{
Packit Service 31306d
	uint32_t *d;
Packit Service 31306d
	uint16_t i;
Packit Service 31306d
Packit Service 31306d
	d = data;
Packit Service 31306d
	for (i = 0; i < blocks; i++) {
Packit Service 31306d
		Blowfish_decipher(c, d, d + 1);
Packit Service 31306d
		d += 2;
Packit Service 31306d
	}
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
void
Packit Service 31306d
ssh_blf_ecb_encrypt(ssh_blf_ctx *c, uint8_t *data, uint32_t len)
Packit Service 31306d
{
Packit Service 31306d
	uint32_t l, r;
Packit Service 31306d
	uint32_t i;
Packit Service 31306d
Packit Service 31306d
	for (i = 0; i < len; i += 8) {
Packit Service 31306d
		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
Packit Service 31306d
		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
Packit Service 31306d
		Blowfish_encipher(c, &l, &r);
Packit Service 31306d
		data[0] = l >> 24 & 0xff;
Packit Service 31306d
		data[1] = l >> 16 & 0xff;
Packit Service 31306d
		data[2] = l >> 8 & 0xff;
Packit Service 31306d
		data[3] = l & 0xff;
Packit Service 31306d
		data[4] = r >> 24 & 0xff;
Packit Service 31306d
		data[5] = r >> 16 & 0xff;
Packit Service 31306d
		data[6] = r >> 8 & 0xff;
Packit Service 31306d
		data[7] = r & 0xff;
Packit Service 31306d
		data += 8;
Packit Service 31306d
	}
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
void
Packit Service 31306d
ssh_blf_ecb_decrypt(ssh_blf_ctx *c, uint8_t *data, uint32_t len)
Packit Service 31306d
{
Packit Service 31306d
	uint32_t l, r;
Packit Service 31306d
	uint32_t i;
Packit Service 31306d
Packit Service 31306d
	for (i = 0; i < len; i += 8) {
Packit Service 31306d
		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
Packit Service 31306d
		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
Packit Service 31306d
		Blowfish_decipher(c, &l, &r);
Packit Service 31306d
		data[0] = l >> 24 & 0xff;
Packit Service 31306d
		data[1] = l >> 16 & 0xff;
Packit Service 31306d
		data[2] = l >> 8 & 0xff;
Packit Service 31306d
		data[3] = l & 0xff;
Packit Service 31306d
		data[4] = r >> 24 & 0xff;
Packit Service 31306d
		data[5] = r >> 16 & 0xff;
Packit Service 31306d
		data[6] = r >> 8 & 0xff;
Packit Service 31306d
		data[7] = r & 0xff;
Packit Service 31306d
		data += 8;
Packit Service 31306d
	}
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
void
Packit Service 31306d
ssh_blf_cbc_encrypt(ssh_blf_ctx *c, uint8_t *iv, uint8_t *data, uint32_t len)
Packit Service 31306d
{
Packit Service 31306d
	uint32_t l, r;
Packit Service 31306d
	uint32_t i, j;
Packit Service 31306d
Packit Service 31306d
	for (i = 0; i < len; i += 8) {
Packit Service 31306d
		for (j = 0; j < 8; j++)
Packit Service 31306d
			data[j] ^= iv[j];
Packit Service 31306d
		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
Packit Service 31306d
		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
Packit Service 31306d
		Blowfish_encipher(c, &l, &r);
Packit Service 31306d
		data[0] = l >> 24 & 0xff;
Packit Service 31306d
		data[1] = l >> 16 & 0xff;
Packit Service 31306d
		data[2] = l >> 8 & 0xff;
Packit Service 31306d
		data[3] = l & 0xff;
Packit Service 31306d
		data[4] = r >> 24 & 0xff;
Packit Service 31306d
		data[5] = r >> 16 & 0xff;
Packit Service 31306d
		data[6] = r >> 8 & 0xff;
Packit Service 31306d
		data[7] = r & 0xff;
Packit Service 31306d
		iv = data;
Packit Service 31306d
		data += 8;
Packit Service 31306d
	}
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
void
Packit Service 31306d
ssh_blf_cbc_decrypt(ssh_blf_ctx *c, uint8_t *iva, uint8_t *data, uint32_t len)
Packit Service 31306d
{
Packit Service 31306d
	uint32_t l, r;
Packit Service 31306d
	uint8_t *iv;
Packit Service 31306d
	uint32_t i, j;
Packit Service 31306d
Packit Service 31306d
	iv = data + len - 16;
Packit Service 31306d
	data = data + len - 8;
Packit Service 31306d
	for (i = len - 8; i >= 8; i -= 8) {
Packit Service 31306d
		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
Packit Service 31306d
		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
Packit Service 31306d
		Blowfish_decipher(c, &l, &r);
Packit Service 31306d
		data[0] = l >> 24 & 0xff;
Packit Service 31306d
		data[1] = l >> 16 & 0xff;
Packit Service 31306d
		data[2] = l >> 8 & 0xff;
Packit Service 31306d
		data[3] = l & 0xff;
Packit Service 31306d
		data[4] = r >> 24 & 0xff;
Packit Service 31306d
		data[5] = r >> 16 & 0xff;
Packit Service 31306d
		data[6] = r >> 8 & 0xff;
Packit Service 31306d
		data[7] = r & 0xff;
Packit Service 31306d
		for (j = 0; j < 8; j++)
Packit Service 31306d
			data[j] ^= iv[j];
Packit Service 31306d
		iv -= 8;
Packit Service 31306d
		data -= 8;
Packit Service 31306d
	}
Packit Service 31306d
	l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
Packit Service 31306d
	r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
Packit Service 31306d
	Blowfish_decipher(c, &l, &r);
Packit Service 31306d
	data[0] = l >> 24 & 0xff;
Packit Service 31306d
	data[1] = l >> 16 & 0xff;
Packit Service 31306d
	data[2] = l >> 8 & 0xff;
Packit Service 31306d
	data[3] = l & 0xff;
Packit Service 31306d
	data[4] = r >> 24 & 0xff;
Packit Service 31306d
	data[5] = r >> 16 & 0xff;
Packit Service 31306d
	data[6] = r >> 8 & 0xff;
Packit Service 31306d
	data[7] = r & 0xff;
Packit Service 31306d
	for (j = 0; j < 8; j++)
Packit Service 31306d
		data[j] ^= iva[j];
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
#if 0
Packit Service 31306d
void
Packit Service 31306d
report(uint32_t data[], uint16_t len)
Packit Service 31306d
{
Packit Service 31306d
	uint16_t i;
Packit Service 31306d
	for (i = 0; i < len; i += 2)
Packit Service 31306d
		printf("Block %0hd: %08lx %08lx.\n",
Packit Service 31306d
		    i / 2, data[i], data[i + 1]);
Packit Service 31306d
}
Packit Service 31306d
void
Packit Service 31306d
main(void)
Packit Service 31306d
{
Packit Service 31306d
Packit Service 31306d
	ssh_blf_ctx c;
Packit Service 31306d
	char    key[] = "AAAAA";
Packit Service 31306d
	char    key2[] = "abcdefghijklmnopqrstuvwxyz";
Packit Service 31306d
Packit Service 31306d
	uint32_t data[10];
Packit Service 31306d
	uint32_t data2[] =
Packit Service 31306d
	{0x424c4f57l, 0x46495348l};
Packit Service 31306d
Packit Service 31306d
	uint16_t i;
Packit Service 31306d
Packit Service 31306d
	/* First test */
Packit Service 31306d
	for (i = 0; i < 10; i++)
Packit Service 31306d
		data[i] = i;
Packit Service 31306d
Packit Service 31306d
	ssh_blf_key(&c, (uint8_t *) key, 5);
Packit Service 31306d
	ssh_blf_enc(&c, data, 5);
Packit Service 31306d
	ssh_blf_dec(&c, data, 1);
Packit Service 31306d
	ssh_blf_dec(&c, data + 2, 4);
Packit Service 31306d
	printf("Should read as 0 - 9.\n");
Packit Service 31306d
	report(data, 10);
Packit Service 31306d
Packit Service 31306d
	/* Second test */
Packit Service 31306d
	ssh_blf_key(&c, (uint8_t *) key2, strlen(key2));
Packit Service 31306d
	ssh_blf_enc(&c, data2, 1);
Packit Service 31306d
	printf("\nShould read as: 0x324ed0fe 0xf413a203.\n");
Packit Service 31306d
	report(data2, 2);
Packit Service 31306d
	ssh_blf_dec(&c, data2, 1);
Packit Service 31306d
	report(data2, 2);
Packit Service 31306d
}
Packit Service 31306d
#endif
Packit Service 31306d
Packit Service 31306d
#endif /* !defined(HAVE_BCRYPT_PBKDF) && (!defined(HAVE_BLOWFISH_INITSTATE) || \
Packit Service 31306d
    !defined(HAVE_BLOWFISH_EXPAND0STATE) || !defined(HAVE_BLF_ENC)) */