]> git.pond.sub.org Git - eow/blob - static/dojo-release-1.1.1/dojox/encoding/crypto/Blowfish.js
add Dojo 1.1.1
[eow] / static / dojo-release-1.1.1 / dojox / encoding / crypto / Blowfish.js
1 if(!dojo._hasResource["dojox.encoding.crypto.Blowfish"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
2 dojo._hasResource["dojox.encoding.crypto.Blowfish"] = true;
3 dojo.provide("dojox.encoding.crypto.Blowfish");
4
5 dojo.require("dojox.encoding.base64");
6 dojo.require("dojox.encoding.crypto._base");
7
8 /*      Blowfish
9  *      Created based on the C# implementation by Marcus Hahn (http://www.hotpixel.net/)
10  *      Unsigned math based on Paul Johnstone and Peter Wood patches.
11  *      2005-12-08
12  */
13 dojox.encoding.crypto.Blowfish = new function(){
14         //      summary
15         //      Object for doing Blowfish encryption/decryption.
16         var POW2=Math.pow(2,2);
17         var POW3=Math.pow(2,3);
18         var POW4=Math.pow(2,4);
19         var POW8=Math.pow(2,8);
20         var POW16=Math.pow(2,16);
21         var POW24=Math.pow(2,24);
22         var iv=null;    //      CBC mode initialization vector
23         var boxes={
24                 p:[
25                         0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 
26                         0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 
27                         0x9216d5d9, 0x8979fb1b
28                 ],
29                 s0:[
30                         0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
31                         0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
32                         0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
33                         0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
34                         0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
35                         0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
36                         0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
37                         0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
38                         0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
39                         0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
40                         0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 
41                         0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 
42                         0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 
43                         0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
44                         0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
45                         0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
46                         0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 
47                         0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 
48                         0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 
49                         0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 
50                         0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
51                         0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 
52                         0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
53                         0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 
54                         0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
55                         0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
56                         0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
57                         0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
58                         0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
59                         0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
60                         0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
61                         0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a
62                 ],
63                 s1:[
64                         0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
65                         0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
66                         0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
67                         0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
68                         0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
69                         0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
70                         0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
71                         0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 
72                         0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 
73                         0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
74                         0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 
75                         0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
76                         0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 
77                         0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 
78                         0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
79                         0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 
80                         0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
81                         0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 
82                         0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
83                         0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 
84                         0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 
85                         0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 
86                         0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
87                         0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
88                         0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, 
89                         0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
90                         0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
91                         0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
92                         0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
93                         0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
94                         0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
95                         0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7
96                 ],
97                 s2:[
98                         0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
99                         0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
100                         0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
101                         0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
102                         0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
103                         0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
104                         0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
105                         0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
106                         0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
107                         0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
108                         0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
109                         0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
110                         0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
111                         0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
112                         0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
113                         0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
114                         0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
115                         0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
116                         0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
117                         0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
118                         0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 
119                         0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
120                         0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
121                         0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 
122                         0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 
123                         0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 
124                         0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, 
125                         0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
126                         0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
127                         0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 
128                         0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
129                         0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0
130                 ],
131                 s3:[
132                         0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
133                         0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
134                         0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 
135                         0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
136                         0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 
137                         0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 
138                         0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
139                         0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 
140                         0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 
141                         0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 
142                         0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
143                         0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 
144                         0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 
145                         0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 
146                         0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
147                         0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
148                         0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 
149                         0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
150                         0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 
151                         0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 
152                         0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 
153                         0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 
154                         0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
155                         0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 
156                         0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
157                         0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 
158                         0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 
159                         0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 
160                         0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 
161                         0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
162                         0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
163                         0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
164                 ]
165         }
166 ////////////////////////////////////////////////////////////////////////////
167 //      fixes based on patch submitted by Peter Wood (#5791)
168         function add(x,y){
169                 return (((x>>0x10)+(y>>0x10)+(((x&0xffff)+(y&0xffff))>>0x10))<<0x10)|(((x&0xffff)+(y&0xffff))&0xffff);
170         }
171         function xor(x,y){
172                 return (((x>>0x10)^(y>>0x10))<<0x10)|(((x&0xffff)^(y&0xffff))&0xffff);
173         }
174
175         function $(v, box){
176                 var d=box.s3[v&0xff]; v>>=8;
177                 var c=box.s2[v&0xff]; v>>=8;
178                 var b=box.s1[v&0xff]; v>>=8;
179                 var a=box.s0[v&0xff];
180
181                 var r = (((a>>0x10)+(b>>0x10)+(((a&0xffff)+(b&0xffff))>>0x10))<<0x10)|(((a&0xffff)+(b&0xffff))&0xffff);
182                 r = (((r>>0x10)^(c>>0x10))<<0x10)|(((r&0xffff)^(c&0xffff))&0xffff);
183                 return (((r>>0x10)+(d>>0x10)+(((r&0xffff)+(d&0xffff))>>0x10))<<0x10)|(((r&0xffff)+(d&0xffff))&0xffff);
184         }
185 ////////////////////////////////////////////////////////////////////////////
186         function eb(o, box){
187                 //      TODO: see if this can't be made more efficient
188                 var l=o.left;
189                 var r=o.right;
190                 l=xor(l,box.p[0]);
191                 r=xor(r,xor($(l,box),box.p[1]));
192                 l=xor(l,xor($(r,box),box.p[2]));
193                 r=xor(r,xor($(l,box),box.p[3]));
194                 l=xor(l,xor($(r,box),box.p[4]));
195                 r=xor(r,xor($(l,box),box.p[5]));
196                 l=xor(l,xor($(r,box),box.p[6]));
197                 r=xor(r,xor($(l,box),box.p[7]));
198                 l=xor(l,xor($(r,box),box.p[8]));
199                 r=xor(r,xor($(l,box),box.p[9]));
200                 l=xor(l,xor($(r,box),box.p[10]));
201                 r=xor(r,xor($(l,box),box.p[11]));
202                 l=xor(l,xor($(r,box),box.p[12]));
203                 r=xor(r,xor($(l,box),box.p[13]));
204                 l=xor(l,xor($(r,box),box.p[14]));
205                 r=xor(r,xor($(l,box),box.p[15]));
206                 l=xor(l,xor($(r,box),box.p[16]));
207                 o.right=l;
208                 o.left=xor(r,box.p[17]);
209         }
210
211         function db(o, box){
212                 var l=o.left;
213                 var r=o.right;
214                 l=xor(l,box.p[17]);
215                 r=xor(r,xor($(l,box),box.p[16]));
216                 l=xor(l,xor($(r,box),box.p[15]));
217                 r=xor(r,xor($(l,box),box.p[14]));
218                 l=xor(l,xor($(r,box),box.p[13]));
219                 r=xor(r,xor($(l,box),box.p[12]));
220                 l=xor(l,xor($(r,box),box.p[11]));
221                 r=xor(r,xor($(l,box),box.p[10]));
222                 l=xor(l,xor($(r,box),box.p[9]));
223                 r=xor(r,xor($(l,box),box.p[8]));
224                 l=xor(l,xor($(r,box),box.p[7]));
225                 r=xor(r,xor($(l,box),box.p[6]));
226                 l=xor(l,xor($(r,box),box.p[5]));
227                 r=xor(r,xor($(l,box),box.p[4]));
228                 l=xor(l,xor($(r,box),box.p[3]));
229                 r=xor(r,xor($(l,box),box.p[2]));
230                 l=xor(l,xor($(r,box),box.p[1]));
231                 o.right=l;
232                 o.left=xor(r,box.p[0]);
233         }
234
235         //      Note that we aren't caching contexts here; it might take a little longer
236         //      but we should be more secure this way.
237         function init(key){
238                 var k=key;
239                 if(dojo.isString(k)){
240                         k = dojo.map(k.split(""), function(item){
241                                 return item.charCodeAt(0) & 0xff;
242                         });
243                 }
244
245                 //      init the boxes
246                 var pos=0, data=0, res={ left:0, right:0 }, i, j;
247                 var box = { 
248                         p: dojo.map(boxes.p.slice(0), function(item){
249                                 var l=k.length, j;
250                                 for(j=0; j<4; j++){ data=(data*POW8)|k[pos++ % l]; }
251                                 return (((item>>0x10)^(data>>0x10))<<0x10)|(((item&0xffff)^(data&0xffff))&0xffff);
252                         }),
253                         s0:boxes.s0.slice(0), 
254                         s1:boxes.s1.slice(0), 
255                         s2:boxes.s2.slice(0), 
256                         s3:boxes.s3.slice(0) 
257                 };
258
259                 //      encrypt p and the s boxes
260                 for(i=0, l=box.p.length; i<l;){
261                         eb(res, box);
262                         box.p[i++]=res.left, box.p[i++]=res.right;
263                 }
264                 for(i=0; i<4; i++){
265                         for(j=0, l=box["s"+i].length; j<l;){
266                                 eb(res, box);
267                                 box["s"+i][j++]=res.left, box["s"+i][j++]=res.right;
268                         }
269                 }
270                 return box;
271         }
272
273 ////////////////////////////////////////////////////////////////////////////
274 //      PUBLIC FUNCTIONS
275 ////////////////////////////////////////////////////////////////////////////
276         this.getIV=function(/* dojox.encoding.crypto.outputTypes? */ outputType){
277                 //      summary
278                 //      returns the initialization vector in the output format specified by outputType
279                 var out=outputType||dojox.encoding.crypto.outputTypes.Base64;
280                 switch(out){
281                         case dojox.encoding.crypto.outputTypes.Hex:{
282                                 return dojo.map(iv, function(item){
283                                         return item.toString(16);
284                                 }).join("");                    //      string
285                         }
286                         case dojox.encoding.crypto.outputTypes.String:{
287                                 return iv.join("");             //      string
288                         }
289                         case dojox.encoding.crypto.outputTypes.Raw:{
290                                 return iv;                              //      array
291                         }
292                         default:{
293                                 return dojox.encoding.base64.encode(iv);        //       string
294                         }
295                 }
296         };
297
298         this.setIV=function(/* string */data, /* dojox.encoding.crypto.outputTypes? */inputType){
299                 //      summary
300                 //      sets the initialization vector to data (as interpreted as inputType)
301                 var ip=inputType||dojox.encoding.crypto.outputTypes.Base64;
302                 var ba=null;
303                 switch(ip){
304                         case dojox.encoding.crypto.outputTypes.String:{
305                                 ba = dojo.map(data.split(""), function(item){
306                                         return item.charCodeAt(0);
307                                 });
308                                 break;
309                         }
310                         case dojox.encoding.crypto.outputTypes.Hex:{
311                                 ba=[];
312                                 for(var i=0, l=data.length-1; i<l; i+=2){
313                                         ba.push(parseInt(data.substr(i,2), 16));
314                                 }
315                                 break;
316                         }
317                         case dojox.encoding.crypto.outputTypes.Raw:{
318                                 ba=data;
319                                 break;
320                         }
321                         default:{
322                                 ba=dojox.encoding.base64.decode(data);
323                                 break;
324                         }
325                 }
326                 //      make it a pair of words now
327                 iv={};
328                 iv.left=ba[0]*POW24|ba[1]*POW16|ba[2]*POW8|ba[3];
329                 iv.right=ba[4]*POW24|ba[5]*POW16|ba[6]*POW8|ba[7];
330         };
331
332         this.encrypt = function(/* string */plaintext, /* string */key, /* object? */ao){
333                 //      summary
334                 //      encrypts plaintext using key; allows user to specify output type and cipher mode via keyword object "ao"
335                 var out=dojox.encoding.crypto.outputTypes.Base64;
336                 var mode=dojox.encoding.crypto.cipherModes.EBC;
337                 if (ao){
338                         if (ao.outputType) out=ao.outputType;
339                         if (ao.cipherMode) mode=ao.cipherMode;
340                 }
341
342                 var bx = init(key), padding = 8-(plaintext.length&7);
343                 for (var i=0; i<padding; i++){ plaintext+=String.fromCharCode(padding); }
344
345                 var cipher=[], count=plaintext.length >> 3, pos=0, o={}, isCBC=(mode==dojox.encoding.crypto.cipherModes.CBC);
346                 var vector={left:iv.left||null, right:iv.right||null};
347                 for(var i=0; i<count; i++){
348                         o.left=plaintext.charCodeAt(pos)*POW24
349                                 |plaintext.charCodeAt(pos+1)*POW16
350                                 |plaintext.charCodeAt(pos+2)*POW8
351                                 |plaintext.charCodeAt(pos+3);
352                         o.right=plaintext.charCodeAt(pos+4)*POW24
353                                 |plaintext.charCodeAt(pos+5)*POW16
354                                 |plaintext.charCodeAt(pos+6)*POW8
355                                 |plaintext.charCodeAt(pos+7);
356
357                         if(isCBC){
358                                 o.left=(((o.left>>0x10)^(vector.left>>0x10))<<0x10)|(((o.left&0xffff)^(vector.left&0xffff))&0xffff);
359                                 o.right=(((o.right>>0x10)^(vector.right>>0x10))<<0x10)|(((o.right&0xffff)^(vector.right&0xffff))&0xffff);
360                         }
361
362                         eb(o, bx);      //      encrypt the block
363
364                         if(isCBC){
365                                 vector.left=o.left;
366                                 vector.right=o.right;
367                         }
368
369                         cipher.push((o.left>>24)&0xff); 
370                         cipher.push((o.left>>16)&0xff); 
371                         cipher.push((o.left>>8)&0xff);
372                         cipher.push(o.left&0xff);
373                         cipher.push((o.right>>24)&0xff); 
374                         cipher.push((o.right>>16)&0xff); 
375                         cipher.push((o.right>>8)&0xff);
376                         cipher.push(o.right&0xff);
377                         pos+=8;
378                 }
379
380                 switch(out){
381                         case dojox.encoding.crypto.outputTypes.Hex:{
382                                 return dojo.map(cipher, function(item){
383                                         return item.toString(16);
384                                 }).join("");    //      string
385                         }
386                         case dojox.encoding.crypto.outputTypes.String:{
387                                 return cipher.join(""); //      string
388                         }
389                         case dojox.encoding.crypto.outputTypes.Raw:{
390                                 return cipher;  //      array
391                         }
392                         default:{
393                                 return dojox.encoding.base64.encode(cipher);    //      string
394                         }
395                 }
396         };
397
398         this.decrypt = function(/* string */ciphertext, /* string */key, /* object? */ao){
399                 //      summary
400                 //      decrypts ciphertext using key; allows specification of how ciphertext is encoded via ao.
401                 var ip=dojox.encoding.crypto.outputTypes.Base64;
402                 var mode=dojox.encoding.crypto.cipherModes.EBC;
403                 if (ao){
404                         if (ao.outputType) ip=ao.outputType;
405                         if (ao.cipherMode) mode=ao.cipherMode;
406                 }
407                 var bx = init(key);
408                 var pt=[];
409         
410                 var c=null;
411                 switch(ip){
412                         case dojox.encoding.crypto.outputTypes.Hex:{
413                                 c = [];
414                                 for(var i=0, l=ciphertext.length-1; i<l; i+=2){
415                                         c.push(parseInt(ciphertext.substr(i,2), 16));
416                                 }
417                                 break;
418                         }
419                         case dojox.encoding.crypto.outputTypes.String:{
420                                 c = dojo.map(ciphertext.split(""), function(item){
421                                         return item.charCodeAt(0);
422                                 });
423                                 break;
424                         }
425                         case dojox.encoding.crypto.outputTypes.Raw:{
426                                 c=ciphertext;   //      should be a byte array
427                                 break;
428                         }
429                         default:{
430                                 c=dojox.encoding.base64.decode(ciphertext);
431                                 break;
432                         }
433                 }
434
435                 var count=c.length >> 3, pos=0, o={}, isCBC=(mode==dojox.encoding.crypto.cipherModes.CBC);
436                 var vector={left:iv.left||null, right:iv.right||null};
437                 for(var i=0; i<count; i++){
438                         o.left=c[pos]*POW24|c[pos+1]*POW16|c[pos+2]*POW8|c[pos+3];
439                         o.right=c[pos+4]*POW24|c[pos+5]*POW16|c[pos+6]*POW8|c[pos+7];
440
441                         if(isCBC){
442                                 var left=o.left;
443                                 var right=o.right;
444                         }
445
446                         db(o, bx);      //      decrypt the block
447
448                         if(isCBC){
449                                 o.left=(((o.left>>0x10)^(vector.left>>0x10))<<0x10)|(((o.left&0xffff)^(vector.left&0xffff))&0xffff);
450                                 o.right=(((o.right>>0x10)^(vector.right>>0x10))<<0x10)|(((o.right&0xffff)^(vector.right&0xffff))&0xffff);
451                                 vector.left=left;
452                                 vector.right=right;
453                         }
454
455                         pt.push((o.left>>24)&0xff);
456                         pt.push((o.left>>16)&0xff);
457                         pt.push((o.left>>8)&0xff);
458                         pt.push(o.left&0xff);
459                         pt.push((o.right>>24)&0xff);
460                         pt.push((o.right>>16)&0xff);
461                         pt.push((o.right>>8)&0xff);
462                         pt.push(o.right&0xff);
463                         pos+=8;
464                 }
465
466                 //      check for padding, and remove.
467                 if(pt[pt.length-1]==pt[pt.length-2]||pt[pt.length-1]==0x01){
468                         var n=pt[pt.length-1];
469                         pt.splice(pt.length-n, n);
470                 }
471
472                 //      convert to string
473                 return dojo.map(pt, function(item){
474                         return String.fromCharCode(item);
475                 }).join("");    //      string
476         };
477
478         this.setIV("0000000000000000", dojox.encoding.crypto.outputTypes.Hex);
479 }();
480
481 }