source: Dev/trunk/src/client/dojox/encoding/crypto/Blowfish.js @ 512

Last change on this file since 512 was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 22.2 KB
Line 
1define([
2        "dojo/_base/lang",      // dojo.isString
3        "dojo/_base/array",     // dojo.map
4        "../base64",
5        "./_base"
6], function(lang, arrayUtil, base64, crypto){
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 */
13crypto.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(lang.isString(k)){
240                        k = arrayUtil.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, l;
247                var box = {
248                        p: arrayUtil.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||crypto.outputTypes.Base64;
280                switch(out){
281                        case crypto.outputTypes.Hex:{
282                                return arrayUtil.map(iv, function(item){
283                                        return (item<=0xf?'0':'')+item.toString(16);
284                                }).join("");                    //      string
285                        }
286                        case crypto.outputTypes.String:{
287                                return iv.join("");             //      string
288                        }
289                        case crypto.outputTypes.Raw:{
290                                return iv;                              //      array
291                        }
292                        default:{
293                                return 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||crypto.outputTypes.Base64;
302                var ba=null;
303                switch(ip){
304                        case crypto.outputTypes.String:{
305                                ba = arrayUtil.map(data.split(""), function(item){
306                                        return item.charCodeAt(0);
307                                });
308                                break;
309                        }
310                        case 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 crypto.outputTypes.Raw:{
318                                ba=data;
319                                break;
320                        }
321                        default:{
322                                ba=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=crypto.outputTypes.Base64;
336                var mode=crypto.cipherModes.ECB;
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==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 crypto.outputTypes.Hex:{
382                                return arrayUtil.map(cipher, function(item){
383                                        return (item<=0xf?'0':'')+item.toString(16);
384                                }).join("");    //      string
385                        }
386                        case crypto.outputTypes.String:{
387                                return cipher.join(""); //      string
388                        }
389                        case crypto.outputTypes.Raw:{
390                                return cipher;  //      array
391                        }
392                        default:{
393                                return 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=crypto.outputTypes.Base64;
402                var mode=crypto.cipherModes.ECB;
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 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 crypto.outputTypes.String:{
420                                c = arrayUtil.map(ciphertext.split(""), function(item){
421                                        return item.charCodeAt(0);
422                                });
423                                break;
424                        }
425                        case crypto.outputTypes.Raw:{
426                                c=ciphertext;   //      should be a byte array
427                                break;
428                        }
429                        default:{
430                                c=base64.decode(ciphertext);
431                                break;
432                        }
433                }
434
435                var count=c.length >> 3, pos=0, o={}, isCBC=(mode==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 arrayUtil.map(pt, function(item){
474                        return String.fromCharCode(item);
475                }).join("");    //      string
476        };
477
478        this.setIV("0000000000000000", crypto.outputTypes.Hex);
479}();
480
481
482return crypto.Blowfish;
483});
Note: See TracBrowser for help on using the repository browser.