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