File Coverage

blib/lib/Crypt/Blowfish_PP.pm
Criterion Covered Total %
statement 90 92 97.8
branch 18 20 90.0
condition 1 3 33.3
subroutine 8 10 80.0
pod 3 8 37.5
total 120 133 90.2


line stmt bran cond sub pod time code
1             # This is Crypt/Blowfish_PP.pm which is an implementation of Bruce Schneier's
2             # blowfish cryptographic algorithm. I will write some proper docs when I get
3             # time....
4             # code is (c) copyright Matthew Byng-Maddick 2000-2001, and
5             # some bits are copyright Bruce Schneier. For more information see his website
6             # at http://www.counterpane.com/
7              
8             =head1 NAME
9              
10             B - Blowfish encryption algorithm implemented purely in Perl
11              
12             =head1 SYNOPSIS
13              
14             C;
15              
16             $blowfish=new Crypt::Blowfish_PP($key);
17              
18             $ciphertextBlock=$blowfish->encrypt($plaintextBlock);
19              
20             $plaintextBlock=$blowfish->decrypt($ciphertextBlock);
21              
22             =head1 DESCRIPTION
23              
24             The B module provides for users to use the Blowfish encryption
25             algorithm in perl. The implementation is entirely Object Oriented, as there is
26             quite a lot of context inherent in making blowfish as fast as it is. The key is
27             anywhere between 64 and 448 bits (8 and 56 bytes), and should be passed as a
28             packed string. The transformation itself is a 16-round Feistel Network, and
29             operates on a 64 bit block.
30              
31             Object methods for the Crypt::Blowfish_PP module:
32              
33             =cut
34             package Crypt::Blowfish_PP;
35              
36 1     1   1000 use strict;
  1         2  
  1         47  
37 1     1   6 use vars qw($VERSION);
  1         2  
  1         3267  
38              
39             $VERSION="1.12";
40              
41             =head2 B(I)
42              
43             The B() method initialises a blowfish object with the key that is passed.
44             This is the slow part of doing a blowfish encryption or decryption, as it
45             initialises the 18 p-boxes and the 1024 s-boxes that are used for the algorithm.
46             It will return undef if the key is not of a valid length.
47              
48             =cut
49              
50             sub new
51             {
52 1     1 1 35 my $pack=shift;
53 1         2 my $key=shift;
54 1 50       4 return undef if(!defined($key));
55 1         123 my %h=(
56             p_boxes =>
57             [
58             0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
59             0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
60             0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
61             0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
62             0x9216d5d9, 0x8979fb1b
63             ],
64             s_boxes =>
65             [
66             [
67             0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
68             0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
69             0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
70             0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
71             0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
72             0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
73             0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
74             0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
75             0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
76             0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
77             0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
78             0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
79             0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
80             0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
81             0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
82             0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
83             0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
84             0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
85             0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
86             0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
87             0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
88             0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
89             0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
90             0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
91             0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
92             0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
93             0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
94             0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
95             0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
96             0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
97             0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
98             0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
99             0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
100             0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
101             0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
102             0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
103             0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
104             0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
105             0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
106             0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
107             0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
108             0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
109             0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
110             0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
111             0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
112             0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
113             0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
114             0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
115             0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
116             0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
117             0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
118             0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
119             0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
120             0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
121             0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
122             0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
123             0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
124             0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
125             0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
126             0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
127             0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
128             0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
129             0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
130             0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a
131             ],
132             [
133             0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
134             0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
135             0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
136             0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
137             0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
138             0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
139             0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
140             0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
141             0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
142             0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
143             0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
144             0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
145             0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
146             0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
147             0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
148             0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
149             0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
150             0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
151             0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
152             0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
153             0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
154             0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
155             0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
156             0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
157             0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
158             0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
159             0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
160             0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
161             0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
162             0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
163             0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
164             0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
165             0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
166             0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
167             0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
168             0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
169             0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
170             0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
171             0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
172             0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
173             0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
174             0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
175             0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
176             0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
177             0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
178             0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
179             0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
180             0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
181             0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
182             0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
183             0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
184             0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
185             0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
186             0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
187             0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
188             0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
189             0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
190             0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
191             0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
192             0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
193             0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
194             0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
195             0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
196             0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7
197             ],
198             [
199             0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
200             0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
201             0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
202             0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
203             0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
204             0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
205             0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
206             0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
207             0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
208             0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
209             0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
210             0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
211             0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
212             0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
213             0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
214             0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
215             0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
216             0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
217             0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
218             0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
219             0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
220             0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
221             0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
222             0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
223             0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
224             0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
225             0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
226             0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
227             0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
228             0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
229             0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
230             0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
231             0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
232             0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
233             0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
234             0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
235             0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
236             0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
237             0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
238             0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
239             0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
240             0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
241             0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
242             0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
243             0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
244             0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
245             0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
246             0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
247             0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
248             0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
249             0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
250             0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
251             0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
252             0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
253             0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
254             0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
255             0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
256             0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
257             0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
258             0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
259             0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
260             0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
261             0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
262             0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0
263             ],
264             [
265             0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
266             0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
267             0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
268             0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
269             0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
270             0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
271             0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
272             0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
273             0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
274             0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
275             0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
276             0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
277             0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
278             0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
279             0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
280             0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
281             0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
282             0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
283             0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
284             0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
285             0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
286             0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
287             0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
288             0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
289             0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
290             0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
291             0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
292             0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
293             0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
294             0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
295             0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
296             0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
297             0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
298             0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
299             0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
300             0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
301             0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
302             0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
303             0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
304             0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
305             0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
306             0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
307             0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
308             0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
309             0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
310             0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
311             0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
312             0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
313             0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
314             0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
315             0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
316             0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
317             0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
318             0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
319             0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
320             0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
321             0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
322             0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
323             0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
324             0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
325             0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
326             0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
327             0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
328             0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
329             ]
330             ]
331             );
332 1         4 my $keylen=length($key);
333 1 50 33     8 return undef if(($keylen < 8) || ($keylen > 56));
334 1         9 my @keybytes=split//,$key;
335 1         4 my $b;
336 1         3 for $b (@keybytes)
337             {
338 8         17 $b=unpack("C",$b);
339             }
340 1         3 my $j=0;
341 1         2 my $i=0;
342 1         3 my($l,$r)=(0,0);
343              
344             # BEGIN PROCESS OF SETTING UP S & P-BOXES FOR THE KEY
345 1         4 for ($i=0;$i<18;$i++)
346             {
347 18         38 my $temp= ($keybytes[$j]<<24) +
348             ($keybytes[($j+1)%($keylen)]<<16) +
349             ($keybytes[($j+2)%($keylen)]<<8) +
350             ($keybytes[($j+3)%($keylen)]) ;
351 18         22 $h{"p_boxes"}->[$i]^=$temp;
352 18         39 $j=($j+4)%($keylen);
353             }
354 1         4 for ($i=0;$i<18;$i+=2)
355             {
356 9         16 ($l,$r)=crypt_block(\%h,$l,$r,0);
357 9         15 $h{"p_boxes"}->[$i]=$l;
358 9         22 $h{"p_boxes"}->[$i+1]=$r;
359             }
360 1         3 for $i (0..3)
361             {
362 4         10 for($j=0;$j<256;$j+=2)
363             {
364 512         2595 ($l,$r)=crypt_block(\%h,$l,$r,0);
365 512         1605 $h{"s_boxes"}->[$i]->[$j]=$l;
366 512         1491 $h{"s_boxes"}->[$i]->[$j+1]=$r;
367             }
368             }
369             # S-BOXES AND P-BOXES NOW SET UP, NEED NO LONGER CARE
370             # ABOUT ACTUAL KEY
371 1         17 return bless \%h, $pack;
372             }
373              
374             sub F
375             {
376 8400     8400 0 14718 my $S0=$_[0]->{"s_boxes"}->[0]->[($_[1]&0xFF000000)>>24];
377 8400         14392 my $S1=$_[0]->{"s_boxes"}->[1]->[($_[1]&0x00FF0000)>>16];
378 8400         12944 my $S2=$_[0]->{"s_boxes"}->[2]->[($_[1]&0x0000FF00)>>8];
379 8400         12716 my $S3=$_[0]->{"s_boxes"}->[3]->[($_[1]&0x000000FF)];
380             # this is horrid, but otherwise Perl overflows. :(
381 8400 100       13674 if($S0>$S1)
382             {
383 4085 100       9358 $S0=$S0-4294967296 if($S0>2147483647);
384             }
385             else
386             {
387 4315 100       8619 $S1=$S1-4294967296 if($S1>2147483647);
388             }
389 8400         11327 my $F=($S0+$S1);
390 8400 100       14242 $F+=4294967296 if($F<0);
391 8400         12717 $F^=$S2;
392 8400 100       13198 if($F>$S3)
393             {
394 3982 100       12432 $F=$F-4294967296 if($F>2147483647);
395             }
396             else
397             {
398 4418 100       8422 $S3=$S3-4294967296 if($S3>2147483647);
399             }
400 8400         9445 $F+=$S3;
401 8400         15783 $F&=0xFFFFFFFF;
402 8400         24033 return $F;
403             }
404              
405             sub ROUND
406             {
407 8400     8400 0 30311 return($_[1],($_[2]^($_[0]->{"p_boxes"}->[$_[3]]))^F($_[0],$_[1]));
408             }
409              
410             sub crypt_block
411             {
412 525     525 0 632 my $self=shift;
413 525         604 my $l=shift;
414 525         523 my $r=shift;
415 525         477 my $d=shift;
416 525 100       819 if(!$d)
417             {
418 523         873 $l^=$self->{"p_boxes"}->[0];
419 523         464 my $i;
420 523         758 for $i (1..16)
421             {
422 8368         13949 ($r,$l)=ROUND($self,$l,$r,$i);
423             }
424 523         1192 $r^=$self->{"p_boxes"}->[17];
425             }
426             else
427             {
428 2         4 $l^=$self->{"p_boxes"}->[17];
429 2         3 my $i;
430 2         6 for $i (1..16)
431             {
432 32         58 ($r,$l)=ROUND($self,$l,$r,17-$i);
433             }
434 2         5 $r^=$self->{"p_boxes"}->[0];
435             }
436 525         1102 return($r,$l);
437             }
438              
439             =head2 B(I)
440              
441             The B() method uses the initialised blowfish object to encrypt 8 bytes
442             of data of the string passed to it. It returns the encrypted block.
443              
444             =cut
445              
446             sub encrypt
447             {
448 2     2 1 25 my($self)=shift;
449 2         4 my($block)=shift;
450 2         15 my(@block)=split//,$block;
451 2         5 map{$_=unpack("C",$_)}@block;
  16         29  
452             # I'm not sure what endianness these are.... so hey.
453 2         4 my($l)=$block[3]|($block[2]<<8)|($block[1]<<16)|($block[0]<<24);
454 2         5 my($r)=$block[7]|($block[6]<<8)|($block[5]<<16)|($block[4]<<24);
455            
456 2         48 ($l,$r)=crypt_block($self,$l,$r,0);
457              
458 2         10 @block=(
459             $l>>24,($l>>16)&0xFF,($l>>8)&0xFF,$l&0xFF,
460             $r>>24,($r>>16)&0xFF,($r>>8)&0xFF,$r&0xFF
461             );
462 2         28 map{$_=pack("C",$_)}@block;
  16         31  
463 2         10 return join"",@block;
464             }
465              
466             =head2 B(I)
467              
468             The B() method uses the initialised blowfish object to decrypt 8 bytes
469             of data of the string passed to it. It returns the decrypted block.
470              
471             =cut
472              
473             sub decrypt
474             {
475 2     2 1 29 my($self)=shift;
476 2         3 my($block)=shift;
477 2         12 my(@block)=split//,$block;
478 2         4 map{$_=unpack("C",$_)}@block;
  16         25  
479 2         5 my($l)=$block[3]|($block[2]<<8)|($block[1]<<16)|($block[0]<<24);
480 2         3 my($r)=$block[7]|($block[6]<<8)|($block[5]<<16)|($block[4]<<24);
481            
482 2         5 ($l,$r)=crypt_block($self,$l,$r,1);
483              
484 2         23 @block=(
485             $l>>24,($l>>16)&0xFF,($l>>8)&0xFF,$l&0xFF,
486             $r>>24,($r>>16)&0xFF,($r>>8)&0xFF,$r&0xFF
487             );
488 2         5 map{$_=pack("C",$_)}@block;
  16         30  
489 2         8 return join"",@block;
490             }
491              
492             sub blocksize
493             {
494 0     0 0   return 8;
495             }
496              
497             sub keysize
498             {
499 0     0 0   return 56;
500             }
501              
502             =head1 COMMENTS
503              
504             This is probably crap software, but hey, its for general use. I'm happy to patch
505             it with other people's code... :)
506              
507             If you want speed, then see the Crypt::Blowfish module.
508              
509             =head1 AUTHOR
510              
511             Matthew Byng-Maddick >
512              
513             =head1 SEE ALSO
514              
515             http://www.counterpane.com/,L
516              
517             =cut
518              
519             1;