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