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