| 1 | # blowfish.tcl - |
|---|
| 2 | # |
|---|
| 3 | # Pure-Tcl implementation of the Blowfish algorithm. |
|---|
| 4 | # |
|---|
| 5 | # See http://www.schneier.com/blowfish.html for information about the |
|---|
| 6 | # Blowfish algorithm. |
|---|
| 7 | # |
|---|
| 8 | # The implementation is derived from Paul Kocher's implementation, |
|---|
| 9 | # available at http://www.schneier.com/blowfish-download.html |
|---|
| 10 | # |
|---|
| 11 | # Copyright (C) 2004 Frank Pilhofer |
|---|
| 12 | # Copyright (C) 2004 Pat Thoyts <patthoyts@users.sourceforge.net> |
|---|
| 13 | # |
|---|
| 14 | # ------------------------------------------------------------------------- |
|---|
| 15 | # See the file "license.terms" for information on usage and redistribution |
|---|
| 16 | # of this file, and for a DISCLAIMER OF ALL WARRANTIES. |
|---|
| 17 | # ------------------------------------------------------------------------- |
|---|
| 18 | # |
|---|
| 19 | |
|---|
| 20 | package require Tcl 8.2 |
|---|
| 21 | |
|---|
| 22 | namespace eval blowfish { |
|---|
| 23 | variable version 1.0.3 |
|---|
| 24 | variable rcsid {$Id: blowfish.tcl,v 1.9 2007/08/20 19:36:49 andreas_kupries Exp $} |
|---|
| 25 | variable uid ; if {![info exists uid]} { set uid 0 } |
|---|
| 26 | variable accel |
|---|
| 27 | array set accel {trf 0} |
|---|
| 28 | |
|---|
| 29 | namespace export blowfish |
|---|
| 30 | |
|---|
| 31 | variable ORIG_P { |
|---|
| 32 | 0x243F6A88 0x85A308D3 0x13198A2E 0x03707344 |
|---|
| 33 | 0xA4093822 0x299F31D0 0x082EFA98 0xEC4E6C89 |
|---|
| 34 | 0x452821E6 0x38D01377 0xBE5466CF 0x34E90C6C |
|---|
| 35 | 0xC0AC29B7 0xC97C50DD 0x3F84D5B5 0xB5470917 |
|---|
| 36 | 0x9216D5D9 0x8979FB1B |
|---|
| 37 | } |
|---|
| 38 | |
|---|
| 39 | variable ORIG_S { |
|---|
| 40 | 0xD1310BA6 0x98DFB5AC 0x2FFD72DB 0xD01ADFB7 |
|---|
| 41 | 0xB8E1AFED 0x6A267E96 0xBA7C9045 0xF12C7F99 |
|---|
| 42 | 0x24A19947 0xB3916CF7 0x0801F2E2 0x858EFC16 |
|---|
| 43 | 0x636920D8 0x71574E69 0xA458FEA3 0xF4933D7E |
|---|
| 44 | 0x0D95748F 0x728EB658 0x718BCD58 0x82154AEE |
|---|
| 45 | 0x7B54A41D 0xC25A59B5 0x9C30D539 0x2AF26013 |
|---|
| 46 | 0xC5D1B023 0x286085F0 0xCA417918 0xB8DB38EF |
|---|
| 47 | 0x8E79DCB0 0x603A180E 0x6C9E0E8B 0xB01E8A3E |
|---|
| 48 | 0xD71577C1 0xBD314B27 0x78AF2FDA 0x55605C60 |
|---|
| 49 | 0xE65525F3 0xAA55AB94 0x57489862 0x63E81440 |
|---|
| 50 | 0x55CA396A 0x2AAB10B6 0xB4CC5C34 0x1141E8CE |
|---|
| 51 | 0xA15486AF 0x7C72E993 0xB3EE1411 0x636FBC2A |
|---|
| 52 | 0x2BA9C55D 0x741831F6 0xCE5C3E16 0x9B87931E |
|---|
| 53 | 0xAFD6BA33 0x6C24CF5C 0x7A325381 0x28958677 |
|---|
| 54 | 0x3B8F4898 0x6B4BB9AF 0xC4BFE81B 0x66282193 |
|---|
| 55 | 0x61D809CC 0xFB21A991 0x487CAC60 0x5DEC8032 |
|---|
| 56 | 0xEF845D5D 0xE98575B1 0xDC262302 0xEB651B88 |
|---|
| 57 | 0x23893E81 0xD396ACC5 0x0F6D6FF3 0x83F44239 |
|---|
| 58 | 0x2E0B4482 0xA4842004 0x69C8F04A 0x9E1F9B5E |
|---|
| 59 | 0x21C66842 0xF6E96C9A 0x670C9C61 0xABD388F0 |
|---|
| 60 | 0x6A51A0D2 0xD8542F68 0x960FA728 0xAB5133A3 |
|---|
| 61 | 0x6EEF0B6C 0x137A3BE4 0xBA3BF050 0x7EFB2A98 |
|---|
| 62 | 0xA1F1651D 0x39AF0176 0x66CA593E 0x82430E88 |
|---|
| 63 | 0x8CEE8619 0x456F9FB4 0x7D84A5C3 0x3B8B5EBE |
|---|
| 64 | 0xE06F75D8 0x85C12073 0x401A449F 0x56C16AA6 |
|---|
| 65 | 0x4ED3AA62 0x363F7706 0x1BFEDF72 0x429B023D |
|---|
| 66 | 0x37D0D724 0xD00A1248 0xDB0FEAD3 0x49F1C09B |
|---|
| 67 | 0x075372C9 0x80991B7B 0x25D479D8 0xF6E8DEF7 |
|---|
| 68 | 0xE3FE501A 0xB6794C3B 0x976CE0BD 0x04C006BA |
|---|
| 69 | 0xC1A94FB6 0x409F60C4 0x5E5C9EC2 0x196A2463 |
|---|
| 70 | 0x68FB6FAF 0x3E6C53B5 0x1339B2EB 0x3B52EC6F |
|---|
| 71 | 0x6DFC511F 0x9B30952C 0xCC814544 0xAF5EBD09 |
|---|
| 72 | 0xBEE3D004 0xDE334AFD 0x660F2807 0x192E4BB3 |
|---|
| 73 | 0xC0CBA857 0x45C8740F 0xD20B5F39 0xB9D3FBDB |
|---|
| 74 | 0x5579C0BD 0x1A60320A 0xD6A100C6 0x402C7279 |
|---|
| 75 | 0x679F25FE 0xFB1FA3CC 0x8EA5E9F8 0xDB3222F8 |
|---|
| 76 | 0x3C7516DF 0xFD616B15 0x2F501EC8 0xAD0552AB |
|---|
| 77 | 0x323DB5FA 0xFD238760 0x53317B48 0x3E00DF82 |
|---|
| 78 | 0x9E5C57BB 0xCA6F8CA0 0x1A87562E 0xDF1769DB |
|---|
| 79 | 0xD542A8F6 0x287EFFC3 0xAC6732C6 0x8C4F5573 |
|---|
| 80 | 0x695B27B0 0xBBCA58C8 0xE1FFA35D 0xB8F011A0 |
|---|
| 81 | 0x10FA3D98 0xFD2183B8 0x4AFCB56C 0x2DD1D35B |
|---|
| 82 | 0x9A53E479 0xB6F84565 0xD28E49BC 0x4BFB9790 |
|---|
| 83 | 0xE1DDF2DA 0xA4CB7E33 0x62FB1341 0xCEE4C6E8 |
|---|
| 84 | 0xEF20CADA 0x36774C01 0xD07E9EFE 0x2BF11FB4 |
|---|
| 85 | 0x95DBDA4D 0xAE909198 0xEAAD8E71 0x6B93D5A0 |
|---|
| 86 | 0xD08ED1D0 0xAFC725E0 0x8E3C5B2F 0x8E7594B7 |
|---|
| 87 | 0x8FF6E2FB 0xF2122B64 0x8888B812 0x900DF01C |
|---|
| 88 | 0x4FAD5EA0 0x688FC31C 0xD1CFF191 0xB3A8C1AD |
|---|
| 89 | 0x2F2F2218 0xBE0E1777 0xEA752DFE 0x8B021FA1 |
|---|
| 90 | 0xE5A0CC0F 0xB56F74E8 0x18ACF3D6 0xCE89E299 |
|---|
| 91 | 0xB4A84FE0 0xFD13E0B7 0x7CC43B81 0xD2ADA8D9 |
|---|
| 92 | 0x165FA266 0x80957705 0x93CC7314 0x211A1477 |
|---|
| 93 | 0xE6AD2065 0x77B5FA86 0xC75442F5 0xFB9D35CF |
|---|
| 94 | 0xEBCDAF0C 0x7B3E89A0 0xD6411BD3 0xAE1E7E49 |
|---|
| 95 | 0x00250E2D 0x2071B35E 0x226800BB 0x57B8E0AF |
|---|
| 96 | 0x2464369B 0xF009B91E 0x5563911D 0x59DFA6AA |
|---|
| 97 | 0x78C14389 0xD95A537F 0x207D5BA2 0x02E5B9C5 |
|---|
| 98 | 0x83260376 0x6295CFA9 0x11C81968 0x4E734A41 |
|---|
| 99 | 0xB3472DCA 0x7B14A94A 0x1B510052 0x9A532915 |
|---|
| 100 | 0xD60F573F 0xBC9BC6E4 0x2B60A476 0x81E67400 |
|---|
| 101 | 0x08BA6FB5 0x571BE91F 0xF296EC6B 0x2A0DD915 |
|---|
| 102 | 0xB6636521 0xE7B9F9B6 0xFF34052E 0xC5855664 |
|---|
| 103 | 0x53B02D5D 0xA99F8FA1 0x08BA4799 0x6E85076A |
|---|
| 104 | 0x4B7A70E9 0xB5B32944 0xDB75092E 0xC4192623 |
|---|
| 105 | 0xAD6EA6B0 0x49A7DF7D 0x9CEE60B8 0x8FEDB266 |
|---|
| 106 | 0xECAA8C71 0x699A17FF 0x5664526C 0xC2B19EE1 |
|---|
| 107 | 0x193602A5 0x75094C29 0xA0591340 0xE4183A3E |
|---|
| 108 | 0x3F54989A 0x5B429D65 0x6B8FE4D6 0x99F73FD6 |
|---|
| 109 | 0xA1D29C07 0xEFE830F5 0x4D2D38E6 0xF0255DC1 |
|---|
| 110 | 0x4CDD2086 0x8470EB26 0x6382E9C6 0x021ECC5E |
|---|
| 111 | 0x09686B3F 0x3EBAEFC9 0x3C971814 0x6B6A70A1 |
|---|
| 112 | 0x687F3584 0x52A0E286 0xB79C5305 0xAA500737 |
|---|
| 113 | 0x3E07841C 0x7FDEAE5C 0x8E7D44EC 0x5716F2B8 |
|---|
| 114 | 0xB03ADA37 0xF0500C0D 0xF01C1F04 0x0200B3FF |
|---|
| 115 | 0xAE0CF51A 0x3CB574B2 0x25837A58 0xDC0921BD |
|---|
| 116 | 0xD19113F9 0x7CA92FF6 0x94324773 0x22F54701 |
|---|
| 117 | 0x3AE5E581 0x37C2DADC 0xC8B57634 0x9AF3DDA7 |
|---|
| 118 | 0xA9446146 0x0FD0030E 0xECC8C73E 0xA4751E41 |
|---|
| 119 | 0xE238CD99 0x3BEA0E2F 0x3280BBA1 0x183EB331 |
|---|
| 120 | 0x4E548B38 0x4F6DB908 0x6F420D03 0xF60A04BF |
|---|
| 121 | 0x2CB81290 0x24977C79 0x5679B072 0xBCAF89AF |
|---|
| 122 | 0xDE9A771F 0xD9930810 0xB38BAE12 0xDCCF3F2E |
|---|
| 123 | 0x5512721F 0x2E6B7124 0x501ADDE6 0x9F84CD87 |
|---|
| 124 | 0x7A584718 0x7408DA17 0xBC9F9ABC 0xE94B7D8C |
|---|
| 125 | 0xEC7AEC3A 0xDB851DFA 0x63094366 0xC464C3D2 |
|---|
| 126 | 0xEF1C1847 0x3215D908 0xDD433B37 0x24C2BA16 |
|---|
| 127 | 0x12A14D43 0x2A65C451 0x50940002 0x133AE4DD |
|---|
| 128 | 0x71DFF89E 0x10314E55 0x81AC77D6 0x5F11199B |
|---|
| 129 | 0x043556F1 0xD7A3C76B 0x3C11183B 0x5924A509 |
|---|
| 130 | 0xF28FE6ED 0x97F1FBFA 0x9EBABF2C 0x1E153C6E |
|---|
| 131 | 0x86E34570 0xEAE96FB1 0x860E5E0A 0x5A3E2AB3 |
|---|
| 132 | 0x771FE71C 0x4E3D06FA 0x2965DCB9 0x99E71D0F |
|---|
| 133 | 0x803E89D6 0x5266C825 0x2E4CC978 0x9C10B36A |
|---|
| 134 | 0xC6150EBA 0x94E2EA78 0xA5FC3C53 0x1E0A2DF4 |
|---|
| 135 | 0xF2F74EA7 0x361D2B3D 0x1939260F 0x19C27960 |
|---|
| 136 | 0x5223A708 0xF71312B6 0xEBADFE6E 0xEAC31F66 |
|---|
| 137 | 0xE3BC4595 0xA67BC883 0xB17F37D1 0x018CFF28 |
|---|
| 138 | 0xC332DDEF 0xBE6C5AA5 0x65582185 0x68AB9802 |
|---|
| 139 | 0xEECEA50F 0xDB2F953B 0x2AEF7DAD 0x5B6E2F84 |
|---|
| 140 | 0x1521B628 0x29076170 0xECDD4775 0x619F1510 |
|---|
| 141 | 0x13CCA830 0xEB61BD96 0x0334FE1E 0xAA0363CF |
|---|
| 142 | 0xB5735C90 0x4C70A239 0xD59E9E0B 0xCBAADE14 |
|---|
| 143 | 0xEECC86BC 0x60622CA7 0x9CAB5CAB 0xB2F3846E |
|---|
| 144 | 0x648B1EAF 0x19BDF0CA 0xA02369B9 0x655ABB50 |
|---|
| 145 | 0x40685A32 0x3C2AB4B3 0x319EE9D5 0xC021B8F7 |
|---|
| 146 | 0x9B540B19 0x875FA099 0x95F7997E 0x623D7DA8 |
|---|
| 147 | 0xF837889A 0x97E32D77 0x11ED935F 0x16681281 |
|---|
| 148 | 0x0E358829 0xC7E61FD6 0x96DEDFA1 0x7858BA99 |
|---|
| 149 | 0x57F584A5 0x1B227263 0x9B83C3FF 0x1AC24696 |
|---|
| 150 | 0xCDB30AEB 0x532E3054 0x8FD948E4 0x6DBC3128 |
|---|
| 151 | 0x58EBF2EF 0x34C6FFEA 0xFE28ED61 0xEE7C3C73 |
|---|
| 152 | 0x5D4A14D9 0xE864B7E3 0x42105D14 0x203E13E0 |
|---|
| 153 | 0x45EEE2B6 0xA3AAABEA 0xDB6C4F15 0xFACB4FD0 |
|---|
| 154 | 0xC742F442 0xEF6ABBB5 0x654F3B1D 0x41CD2105 |
|---|
| 155 | 0xD81E799E 0x86854DC7 0xE44B476A 0x3D816250 |
|---|
| 156 | 0xCF62A1F2 0x5B8D2646 0xFC8883A0 0xC1C7B6A3 |
|---|
| 157 | 0x7F1524C3 0x69CB7492 0x47848A0B 0x5692B285 |
|---|
| 158 | 0x095BBF00 0xAD19489D 0x1462B174 0x23820E00 |
|---|
| 159 | 0x58428D2A 0x0C55F5EA 0x1DADF43E 0x233F7061 |
|---|
| 160 | 0x3372F092 0x8D937E41 0xD65FECF1 0x6C223BDB |
|---|
| 161 | 0x7CDE3759 0xCBEE7460 0x4085F2A7 0xCE77326E |
|---|
| 162 | 0xA6078084 0x19F8509E 0xE8EFD855 0x61D99735 |
|---|
| 163 | 0xA969A7AA 0xC50C06C2 0x5A04ABFC 0x800BCADC |
|---|
| 164 | 0x9E447A2E 0xC3453484 0xFDD56705 0x0E1E9EC9 |
|---|
| 165 | 0xDB73DBD3 0x105588CD 0x675FDA79 0xE3674340 |
|---|
| 166 | 0xC5C43465 0x713E38D8 0x3D28F89E 0xF16DFF20 |
|---|
| 167 | 0x153E21E7 0x8FB03D4A 0xE6E39F2B 0xDB83ADF7 |
|---|
| 168 | 0xE93D5A68 0x948140F7 0xF64C261C 0x94692934 |
|---|
| 169 | 0x411520F7 0x7602D4F7 0xBCF46B2E 0xD4A20068 |
|---|
| 170 | 0xD4082471 0x3320F46A 0x43B7D4B7 0x500061AF |
|---|
| 171 | 0x1E39F62E 0x97244546 0x14214F74 0xBF8B8840 |
|---|
| 172 | 0x4D95FC1D 0x96B591AF 0x70F4DDD3 0x66A02F45 |
|---|
| 173 | 0xBFBC09EC 0x03BD9785 0x7FAC6DD0 0x31CB8504 |
|---|
| 174 | 0x96EB27B3 0x55FD3941 0xDA2547E6 0xABCA0A9A |
|---|
| 175 | 0x28507825 0x530429F4 0x0A2C86DA 0xE9B66DFB |
|---|
| 176 | 0x68DC1462 0xD7486900 0x680EC0A4 0x27A18DEE |
|---|
| 177 | 0x4F3FFEA2 0xE887AD8C 0xB58CE006 0x7AF4D6B6 |
|---|
| 178 | 0xAACE1E7C 0xD3375FEC 0xCE78A399 0x406B2A42 |
|---|
| 179 | 0x20FE9E35 0xD9F385B9 0xEE39D7AB 0x3B124E8B |
|---|
| 180 | 0x1DC9FAF7 0x4B6D1856 0x26A36631 0xEAE397B2 |
|---|
| 181 | 0x3A6EFA74 0xDD5B4332 0x6841E7F7 0xCA7820FB |
|---|
| 182 | 0xFB0AF54E 0xD8FEB397 0x454056AC 0xBA489527 |
|---|
| 183 | 0x55533A3A 0x20838D87 0xFE6BA9B7 0xD096954B |
|---|
| 184 | 0x55A867BC 0xA1159A58 0xCCA92963 0x99E1DB33 |
|---|
| 185 | 0xA62A4A56 0x3F3125F9 0x5EF47E1C 0x9029317C |
|---|
| 186 | 0xFDF8E802 0x04272F70 0x80BB155C 0x05282CE3 |
|---|
| 187 | 0x95C11548 0xE4C66D22 0x48C1133F 0xC70F86DC |
|---|
| 188 | 0x07F9C9EE 0x41041F0F 0x404779A4 0x5D886E17 |
|---|
| 189 | 0x325F51EB 0xD59BC0D1 0xF2BCC18F 0x41113564 |
|---|
| 190 | 0x257B7834 0x602A9C60 0xDFF8E8A3 0x1F636C1B |
|---|
| 191 | 0x0E12B4C2 0x02E1329E 0xAF664FD1 0xCAD18115 |
|---|
| 192 | 0x6B2395E0 0x333E92E1 0x3B240B62 0xEEBEB922 |
|---|
| 193 | 0x85B2A20E 0xE6BA0D99 0xDE720C8C 0x2DA2F728 |
|---|
| 194 | 0xD0127845 0x95B794FD 0x647D0862 0xE7CCF5F0 |
|---|
| 195 | 0x5449A36F 0x877D48FA 0xC39DFD27 0xF33E8D1E |
|---|
| 196 | 0x0A476341 0x992EFF74 0x3A6F6EAB 0xF4F8FD37 |
|---|
| 197 | 0xA812DC60 0xA1EBDDF8 0x991BE14C 0xDB6E6B0D |
|---|
| 198 | 0xC67B5510 0x6D672C37 0x2765D43B 0xDCD0E804 |
|---|
| 199 | 0xF1290DC7 0xCC00FFA3 0xB5390F92 0x690FED0B |
|---|
| 200 | 0x667B9FFB 0xCEDB7D9C 0xA091CF0B 0xD9155EA3 |
|---|
| 201 | 0xBB132F88 0x515BAD24 0x7B9479BF 0x763BD6EB |
|---|
| 202 | 0x37392EB3 0xCC115979 0x8026E297 0xF42E312D |
|---|
| 203 | 0x6842ADA7 0xC66A2B3B 0x12754CCC 0x782EF11C |
|---|
| 204 | 0x6A124237 0xB79251E7 0x06A1BBE6 0x4BFB6350 |
|---|
| 205 | 0x1A6B1018 0x11CAEDFA 0x3D25BDD8 0xE2E1C3C9 |
|---|
| 206 | 0x44421659 0x0A121386 0xD90CEC6E 0xD5ABEA2A |
|---|
| 207 | 0x64AF674E 0xDA86A85F 0xBEBFE988 0x64E4C3FE |
|---|
| 208 | 0x9DBC8057 0xF0F7C086 0x60787BF8 0x6003604D |
|---|
| 209 | 0xD1FD8346 0xF6381FB0 0x7745AE04 0xD736FCCC |
|---|
| 210 | 0x83426B33 0xF01EAB71 0xB0804187 0x3C005E5F |
|---|
| 211 | 0x77A057BE 0xBDE8AE24 0x55464299 0xBF582E61 |
|---|
| 212 | 0x4E58F48F 0xF2DDFDA2 0xF474EF38 0x8789BDC2 |
|---|
| 213 | 0x5366F9C3 0xC8B38E74 0xB475F255 0x46FCD9B9 |
|---|
| 214 | 0x7AEB2661 0x8B1DDF84 0x846A0E79 0x915F95E2 |
|---|
| 215 | 0x466E598E 0x20B45770 0x8CD55591 0xC902DE4C |
|---|
| 216 | 0xB90BACE1 0xBB8205D0 0x11A86248 0x7574A99E |
|---|
| 217 | 0xB77F19B6 0xE0A9DC09 0x662D09A1 0xC4324633 |
|---|
| 218 | 0xE85A1F02 0x09F0BE8C 0x4A99A025 0x1D6EFE10 |
|---|
| 219 | 0x1AB93D1D 0x0BA5A4DF 0xA186F20F 0x2868F169 |
|---|
| 220 | 0xDCB7DA83 0x573906FE 0xA1E2CE9B 0x4FCD7F52 |
|---|
| 221 | 0x50115E01 0xA70683FA 0xA002B5C4 0x0DE6D027 |
|---|
| 222 | 0x9AF88C27 0x773F8641 0xC3604C06 0x61A806B5 |
|---|
| 223 | 0xF0177A28 0xC0F586E0 0x006058AA 0x30DC7D62 |
|---|
| 224 | 0x11E69ED7 0x2338EA63 0x53C2DD94 0xC2C21634 |
|---|
| 225 | 0xBBCBEE56 0x90BCB6DE 0xEBFC7DA1 0xCE591D76 |
|---|
| 226 | 0x6F05E409 0x4B7C0188 0x39720A3D 0x7C927C24 |
|---|
| 227 | 0x86E3725F 0x724D9DB9 0x1AC15BB4 0xD39EB8FC |
|---|
| 228 | 0xED545578 0x08FCA5B5 0xD83D7CD3 0x4DAD0FC4 |
|---|
| 229 | 0x1E50EF5E 0xB161E6F8 0xA28514D9 0x6C51133C |
|---|
| 230 | 0x6FD5C7E7 0x56E14EC4 0x362ABFCE 0xDDC6C837 |
|---|
| 231 | 0xD79A3234 0x92638212 0x670EFA8E 0x406000E0 |
|---|
| 232 | 0x3A39CE37 0xD3FAF5CF 0xABC27737 0x5AC52D1B |
|---|
| 233 | 0x5CB0679E 0x4FA33742 0xD3822740 0x99BC9BBE |
|---|
| 234 | 0xD5118E9D 0xBF0F7315 0xD62D1C7E 0xC700C47B |
|---|
| 235 | 0xB78C1B6B 0x21A19045 0xB26EB1BE 0x6A366EB4 |
|---|
| 236 | 0x5748AB2F 0xBC946E79 0xC6A376D2 0x6549C2C8 |
|---|
| 237 | 0x530FF8EE 0x468DDE7D 0xD5730A1D 0x4CD04DC6 |
|---|
| 238 | 0x2939BBDB 0xA9BA4650 0xAC9526E8 0xBE5EE304 |
|---|
| 239 | 0xA1FAD5F0 0x6A2D519A 0x63EF8CE2 0x9A86EE22 |
|---|
| 240 | 0xC089C2B8 0x43242EF6 0xA51E03AA 0x9CF2D0A4 |
|---|
| 241 | 0x83C061BA 0x9BE96A4D 0x8FE51550 0xBA645BD6 |
|---|
| 242 | 0x2826A2F9 0xA73A3AE1 0x4BA99586 0xEF5562E9 |
|---|
| 243 | 0xC72FEFD3 0xF752F7DA 0x3F046F69 0x77FA0A59 |
|---|
| 244 | 0x80E4A915 0x87B08601 0x9B09E6AD 0x3B3EE593 |
|---|
| 245 | 0xE990FD5A 0x9E34D797 0x2CF0B7D9 0x022B8B51 |
|---|
| 246 | 0x96D5AC3A 0x017DA67D 0xD1CF3ED6 0x7C7D2D28 |
|---|
| 247 | 0x1F9F25CF 0xADF2B89B 0x5AD6B472 0x5A88F54C |
|---|
| 248 | 0xE029AC71 0xE019A5E6 0x47B0ACFD 0xED93FA9B |
|---|
| 249 | 0xE8D3C48D 0x283B57CC 0xF8D56629 0x79132E28 |
|---|
| 250 | 0x785F0191 0xED756055 0xF7960E44 0xE3D35E8C |
|---|
| 251 | 0x15056DD4 0x88F46DBA 0x03A16125 0x0564F0BD |
|---|
| 252 | 0xC3EB9E15 0x3C9057A2 0x97271AEC 0xA93A072A |
|---|
| 253 | 0x1B3F6D9B 0x1E6321F5 0xF59C66FB 0x26DCF319 |
|---|
| 254 | 0x7533D928 0xB155FDF5 0x03563482 0x8ABA3CBB |
|---|
| 255 | 0x28517711 0xC20AD9F8 0xABCC5167 0xCCAD925F |
|---|
| 256 | 0x4DE81751 0x3830DC8E 0x379D5862 0x9320F991 |
|---|
| 257 | 0xEA7A90C2 0xFB3E7BCE 0x5121CE64 0x774FBE32 |
|---|
| 258 | 0xA8B6E37E 0xC3293D46 0x48DE5369 0x6413E680 |
|---|
| 259 | 0xA2AE0810 0xDD6DB224 0x69852DFD 0x09072166 |
|---|
| 260 | 0xB39A460A 0x6445C0DD 0x586CDECF 0x1C20C8AE |
|---|
| 261 | 0x5BBEF7DD 0x1B588D40 0xCCD2017F 0x6BB4E3BB |
|---|
| 262 | 0xDDA26A7E 0x3A59FF45 0x3E350A44 0xBCB4CDD5 |
|---|
| 263 | 0x72EACEA8 0xFA6484BB 0x8D6612AE 0xBF3C6F47 |
|---|
| 264 | 0xD29BE463 0x542F5D9E 0xAEC2771B 0xF64E6370 |
|---|
| 265 | 0x740E0D8D 0xE75B1357 0xF8721671 0xAF537D5D |
|---|
| 266 | 0x4040CB08 0x4EB4E2CC 0x34D2466A 0x0115AF84 |
|---|
| 267 | 0xE1B00428 0x95983A1D 0x06B89FB4 0xCE6EA048 |
|---|
| 268 | 0x6F3F3B82 0x3520AB82 0x011A1D4B 0x277227F8 |
|---|
| 269 | 0x611560B1 0xE7933FDC 0xBB3A792B 0x344525BD |
|---|
| 270 | 0xA08839E1 0x51CE794B 0x2F32C9B7 0xA01FBAC9 |
|---|
| 271 | 0xE01CC87E 0xBCC7D1F6 0xCF0111C3 0xA1E8AAC7 |
|---|
| 272 | 0x1A908749 0xD44FBD9A 0xD0DADECB 0xD50ADA38 |
|---|
| 273 | 0x0339C32A 0xC6913667 0x8DF9317C 0xE0B12B4F |
|---|
| 274 | 0xF79E59B7 0x43F5BB3A 0xF2D519FF 0x27D9459C |
|---|
| 275 | 0xBF97222C 0x15E6FC2A 0x0F91FC71 0x9B941525 |
|---|
| 276 | 0xFAE59361 0xCEB69CEB 0xC2A86459 0x12BAA8D1 |
|---|
| 277 | 0xB6C1075E 0xE3056A0C 0x10D25065 0xCB03A442 |
|---|
| 278 | 0xE0EC6E0E 0x1698DB3B 0x4C98A0BE 0x3278E964 |
|---|
| 279 | 0x9F1F9532 0xE0D392DF 0xD3A0342B 0x8971F21E |
|---|
| 280 | 0x1B0A7441 0x4BA3348C 0xC5BE7120 0xC37632D8 |
|---|
| 281 | 0xDF359F8D 0x9B992F2E 0xE60B6F47 0x0FE3F11D |
|---|
| 282 | 0xE54CDA54 0x1EDAD891 0xCE6279CF 0xCD3E7E6F |
|---|
| 283 | 0x1618B166 0xFD2C1D05 0x848FD2C5 0xF6FB2299 |
|---|
| 284 | 0xF523F357 0xA6327623 0x93A83531 0x56CCCD02 |
|---|
| 285 | 0xACF08162 0x5A75EBB5 0x6E163697 0x88D273CC |
|---|
| 286 | 0xDE966292 0x81B949D0 0x4C50901B 0x71C65614 |
|---|
| 287 | 0xE6C6C7BD 0x327A140A 0x45E1D006 0xC3F27B9A |
|---|
| 288 | 0xC9AA53FD 0x62A80F00 0xBB25BFE2 0x35BDD2F6 |
|---|
| 289 | 0x71126905 0xB2040222 0xB6CBCF7C 0xCD769C2B |
|---|
| 290 | 0x53113EC0 0x1640E3D3 0x38ABBD60 0x2547ADF0 |
|---|
| 291 | 0xBA38209C 0xF746CE76 0x77AFA1C5 0x20756060 |
|---|
| 292 | 0x85CBFE4E 0x8AE88DD8 0x7AAAF9B0 0x4CF9AA7E |
|---|
| 293 | 0x1948C25C 0x02FB8A8C 0x01C36AE4 0xD6EBE1F9 |
|---|
| 294 | 0x90D4F869 0xA65CDEA0 0x3F09252D 0xC208E69F |
|---|
| 295 | 0xB74E6132 0xCE77E25B 0x578FDFE3 0x3AC372E6 |
|---|
| 296 | } |
|---|
| 297 | } |
|---|
| 298 | |
|---|
| 299 | proc ::blowfish::intEncrypt {P S xl xr} { |
|---|
| 300 | for {set i 0} {$i < 16} {incr i} { |
|---|
| 301 | set xl [expr {$xl ^ [lindex $P $i]}] |
|---|
| 302 | |
|---|
| 303 | set S0a [lindex $S [expr { ($xl >> 24) & 0xff}]] |
|---|
| 304 | set S1b [lindex $S [expr {(($xl >> 16) & 0xff) + 256}]] |
|---|
| 305 | set S2c [lindex $S [expr {(($xl >> 8) & 0xff) + 512}]] |
|---|
| 306 | set S3d [lindex $S [expr { ($xl & 0xff) + 768}]] |
|---|
| 307 | set xr [expr {(((($S0a + $S1b) ^ $S2c) + $S3d) & 0xffffffff) ^ $xr}] |
|---|
| 308 | |
|---|
| 309 | set temp $xl ; set xl $xr ; set xr $temp |
|---|
| 310 | } |
|---|
| 311 | |
|---|
| 312 | set temp $xl ; set xl $xr ; set xr $temp |
|---|
| 313 | return [list [expr {$xl ^ [lindex $P 17]}] [expr {$xr ^ [lindex $P 16]}]] |
|---|
| 314 | } |
|---|
| 315 | |
|---|
| 316 | proc ::blowfish::intDecrypt {P S xl xr} { |
|---|
| 317 | for {set i 17} {$i > 1} {incr i -1} { |
|---|
| 318 | set xl [expr {$xl ^ [lindex $P $i]}] |
|---|
| 319 | |
|---|
| 320 | set S0a [lindex $S [expr { ($xl >> 24) & 0xff}]] |
|---|
| 321 | set S1b [lindex $S [expr {(($xl >> 16) & 0xff) + 256}]] |
|---|
| 322 | set S2c [lindex $S [expr {(($xl >> 8) & 0xff) + 512}]] |
|---|
| 323 | set S3d [lindex $S [expr { ($xl & 0xff) + 768}]] |
|---|
| 324 | set xr [expr {(((($S0a + $S1b) ^ $S2c) + $S3d) & 0xffffffff) ^ $xr}] |
|---|
| 325 | |
|---|
| 326 | set temp $xl ; set xl $xr ; set xr $temp |
|---|
| 327 | } |
|---|
| 328 | |
|---|
| 329 | set temp $xl ; set xl $xr ; set xr $temp |
|---|
| 330 | return [list [expr {$xl ^ [lindex $P 0]}] [expr {$xr ^ [lindex $P 1]}]] |
|---|
| 331 | } |
|---|
| 332 | |
|---|
| 333 | proc ::blowfish::Init {mode key iv} { |
|---|
| 334 | variable ORIG_S |
|---|
| 335 | variable ORIG_P |
|---|
| 336 | variable uid |
|---|
| 337 | |
|---|
| 338 | set S $ORIG_S |
|---|
| 339 | set P [list] |
|---|
| 340 | |
|---|
| 341 | set kl [string length $key] |
|---|
| 342 | binary scan $key c* kc |
|---|
| 343 | |
|---|
| 344 | set j 0 |
|---|
| 345 | for {set i 0} {$i < 18} {incr i} { |
|---|
| 346 | set data 0 |
|---|
| 347 | for {set k 0} {$k < 4} {incr k} { |
|---|
| 348 | set data [expr {(($data << 8) | ([lindex $kc $j] & 0xff)) & 0xffffffff}] |
|---|
| 349 | if {[incr j] >= $kl} { |
|---|
| 350 | set j 0 |
|---|
| 351 | } |
|---|
| 352 | } |
|---|
| 353 | set OPi [lindex $ORIG_P $i] |
|---|
| 354 | lappend P [expr {$OPi ^ $data}] |
|---|
| 355 | } |
|---|
| 356 | |
|---|
| 357 | set datal 0 |
|---|
| 358 | set datar 0 |
|---|
| 359 | |
|---|
| 360 | for {set i 0} {$i < 18} {incr i} { |
|---|
| 361 | set ed [intEncrypt $P $S $datal $datar] |
|---|
| 362 | set datal [lindex $ed 0] |
|---|
| 363 | set datar [lindex $ed 1] |
|---|
| 364 | set P [lreplace $P $i [incr i] $datal $datar] |
|---|
| 365 | } |
|---|
| 366 | |
|---|
| 367 | for {set i 0} {$i < 4} {incr i} { |
|---|
| 368 | for {set j 0} {$j < 256} {incr j 2} { |
|---|
| 369 | set ed [intEncrypt $P $S $datal $datar] |
|---|
| 370 | set datal [lindex $ed 0] |
|---|
| 371 | set datar [lindex $ed 1] |
|---|
| 372 | set t [expr {$i * 256 + $j}] |
|---|
| 373 | set S [lreplace $S $t [incr t] $datal $datar] |
|---|
| 374 | } |
|---|
| 375 | } |
|---|
| 376 | |
|---|
| 377 | set token [namespace current]::[incr uid] |
|---|
| 378 | variable $token |
|---|
| 379 | upvar #0 $token state |
|---|
| 380 | array set state [list P $P S $S M $mode I $iv] |
|---|
| 381 | return $token |
|---|
| 382 | } |
|---|
| 383 | |
|---|
| 384 | proc ::blowfish::Reset {token iv} { |
|---|
| 385 | upvar #0 $token state |
|---|
| 386 | set state(I) $iv |
|---|
| 387 | return |
|---|
| 388 | } |
|---|
| 389 | |
|---|
| 390 | proc ::blowfish::Final {token} { |
|---|
| 391 | # PRAGMA: nocheck |
|---|
| 392 | variable $token |
|---|
| 393 | unset $token |
|---|
| 394 | } |
|---|
| 395 | |
|---|
| 396 | proc ::blowfish::EncryptBlock {token block} { |
|---|
| 397 | upvar #0 $token state |
|---|
| 398 | if {[binary scan $block II xl xr] != 2} { |
|---|
| 399 | error "block must be 8 bytes" |
|---|
| 400 | } |
|---|
| 401 | set xl [expr {$xl & 0xffffffff}] |
|---|
| 402 | set xr [expr {$xr & 0xffffffff}] |
|---|
| 403 | set d [intEncrypt $state(P) $state(S) $xl $xr] |
|---|
| 404 | return [binary format I2 $d] |
|---|
| 405 | } |
|---|
| 406 | |
|---|
| 407 | proc ::blowfish::Encrypt {Key data} { |
|---|
| 408 | upvar #0 $Key state |
|---|
| 409 | set P $state(P) |
|---|
| 410 | set S $state(S) |
|---|
| 411 | set cbc_mode [string equal "cbc" $state(M)] |
|---|
| 412 | |
|---|
| 413 | if {[binary scan $state(I) II s0 s1] != 2} { |
|---|
| 414 | return -code error "invalid initialization vector: must be 8 bytes" |
|---|
| 415 | } |
|---|
| 416 | |
|---|
| 417 | set len [string length $data] |
|---|
| 418 | if {($len % 8) != 0} { |
|---|
| 419 | return -code error "invalid block size: blocks must be 8 bytes" |
|---|
| 420 | } |
|---|
| 421 | |
|---|
| 422 | set s0 [expr {$s0 & 0xffffffff}] |
|---|
| 423 | set s1 [expr {$s1 & 0xffffffff}] |
|---|
| 424 | |
|---|
| 425 | set result "" |
|---|
| 426 | for {set i 0} {$i < $len} {incr i 8} { |
|---|
| 427 | if {[binary scan $data @[set i]II xl xr] != 2} { |
|---|
| 428 | return -code error "oops" |
|---|
| 429 | } |
|---|
| 430 | if {$cbc_mode} { |
|---|
| 431 | set xl [expr {($xl & 0xffffffff) ^ $s0}] |
|---|
| 432 | set xr [expr {($xr & 0xffffffff) ^ $s1}] |
|---|
| 433 | } |
|---|
| 434 | set d [intEncrypt $P $S $xl $xr] |
|---|
| 435 | if {$cbc_mode} { |
|---|
| 436 | set s0 [lindex $d 0] |
|---|
| 437 | set s1 [lindex $d 1] |
|---|
| 438 | } |
|---|
| 439 | append result [binary format I2 $d] |
|---|
| 440 | } |
|---|
| 441 | if {$cbc_mode} { |
|---|
| 442 | set state(I) [binary format II $s0 $s1] |
|---|
| 443 | } |
|---|
| 444 | return $result |
|---|
| 445 | } |
|---|
| 446 | |
|---|
| 447 | proc ::blowfish::DecryptBlock {Key block} { |
|---|
| 448 | upvar #0 $Key state |
|---|
| 449 | if {[binary scan $block II xl xr] != 2} { |
|---|
| 450 | return -code error "invalid block size: block must be 8 bytes" |
|---|
| 451 | } |
|---|
| 452 | set xl [expr {$xl & 0xffffffff}] |
|---|
| 453 | set xr [expr {$xr & 0xffffffff}] |
|---|
| 454 | set d [intDecrypt $state(P) $state(S) $xl $xr] |
|---|
| 455 | return [binary format I2 $d] |
|---|
| 456 | } |
|---|
| 457 | |
|---|
| 458 | proc ::blowfish::Decrypt {token data} { |
|---|
| 459 | upvar #0 $token state |
|---|
| 460 | set P $state(P) |
|---|
| 461 | set S $state(S) |
|---|
| 462 | set cbc_mode [string equal "cbc" $state(M)] |
|---|
| 463 | |
|---|
| 464 | if {[binary scan $state(I) II s0 s1] != 2} { |
|---|
| 465 | return -code error "initialization vector must be 8 bytes" |
|---|
| 466 | } |
|---|
| 467 | |
|---|
| 468 | set len [string length $data] |
|---|
| 469 | if {($len % 8) != 0} { |
|---|
| 470 | return -code error "block size invalid" |
|---|
| 471 | } |
|---|
| 472 | |
|---|
| 473 | set s0 [expr {$s0 & 0xffffffff}] |
|---|
| 474 | set s1 [expr {$s1 & 0xffffffff}] |
|---|
| 475 | |
|---|
| 476 | set result "" |
|---|
| 477 | for {set i 0} {$i < $len} {incr i 8} { |
|---|
| 478 | if {[binary scan $data @[set i]II xl xr] != 2} { |
|---|
| 479 | error "oops" |
|---|
| 480 | } |
|---|
| 481 | set xl [expr {$xl & 0xffffffff}] |
|---|
| 482 | set xr [expr {$xr & 0xffffffff}] |
|---|
| 483 | set d [intDecrypt $P $S $xl $xr] |
|---|
| 484 | if {$cbc_mode} { |
|---|
| 485 | set d0 [lindex $d 0] |
|---|
| 486 | set d1 [lindex $d 1] |
|---|
| 487 | set c0 [expr {$d0 ^ $s0}] |
|---|
| 488 | set c1 [expr {$d1 ^ $s1}] |
|---|
| 489 | set s0 $xl |
|---|
| 490 | set s1 $xr |
|---|
| 491 | append result [binary format II $c0 $c1] |
|---|
| 492 | } else { |
|---|
| 493 | append result [binary format I2 $d] |
|---|
| 494 | } |
|---|
| 495 | } |
|---|
| 496 | if {$cbc_mode} { |
|---|
| 497 | set state(I) [binary format II $s0 $s1] |
|---|
| 498 | } |
|---|
| 499 | return $result |
|---|
| 500 | } |
|---|
| 501 | |
|---|
| 502 | |
|---|
| 503 | # ------------------------------------------------------------------------- |
|---|
| 504 | # Fileevent handler for chunked file reading. |
|---|
| 505 | # |
|---|
| 506 | proc ::blowfish::Chunk {Key in {out {}} {chunksize 4096} {pad \0}} { |
|---|
| 507 | upvar #0 $Key state |
|---|
| 508 | |
|---|
| 509 | if {[eof $in]} { |
|---|
| 510 | fileevent $in readable {} |
|---|
| 511 | set state(reading) 0 |
|---|
| 512 | } |
|---|
| 513 | |
|---|
| 514 | set data [read $in $chunksize] |
|---|
| 515 | # FIX ME: we should ony pad after eof |
|---|
| 516 | if {[string length $pad] > 0} { |
|---|
| 517 | set data [Pad $data 8] |
|---|
| 518 | } |
|---|
| 519 | |
|---|
| 520 | if {$out == {}} { |
|---|
| 521 | append state(output) [$state(cmd) $Key $data] |
|---|
| 522 | } else { |
|---|
| 523 | puts -nonewline $out [$state(cmd) $Key $data] |
|---|
| 524 | } |
|---|
| 525 | } |
|---|
| 526 | |
|---|
| 527 | # ------------------------------------------------------------------------- |
|---|
| 528 | |
|---|
| 529 | # LoadAccelerator -- |
|---|
| 530 | # |
|---|
| 531 | # This package can make use of a number of compiled extensions to |
|---|
| 532 | # accelerate the digest computation. This procedure manages the |
|---|
| 533 | # use of these extensions within the package. During normal usage |
|---|
| 534 | # this should not be called, but the test package manipulates the |
|---|
| 535 | # list of enabled accelerators. |
|---|
| 536 | # |
|---|
| 537 | proc ::blowfish::LoadAccelerator {name} { |
|---|
| 538 | variable accel |
|---|
| 539 | set r 0 |
|---|
| 540 | switch -exact -- $name { |
|---|
| 541 | trf { |
|---|
| 542 | if {![catch {package require Trfcrypt}]} { |
|---|
| 543 | set block [string repeat \0 8] |
|---|
| 544 | set r [expr {![catch {::blowfish -dir enc -mode ecb -key $block $block} msg]}] |
|---|
| 545 | } |
|---|
| 546 | } |
|---|
| 547 | default { |
|---|
| 548 | return -code error "invalid accelerator package:\ |
|---|
| 549 | must be one of [join [array names accel] {, }]" |
|---|
| 550 | } |
|---|
| 551 | } |
|---|
| 552 | set accel($name) $r |
|---|
| 553 | } |
|---|
| 554 | |
|---|
| 555 | # ------------------------------------------------------------------------- |
|---|
| 556 | |
|---|
| 557 | proc ::blowfish::Hex {data} { |
|---|
| 558 | binary scan $data H* r |
|---|
| 559 | return $r |
|---|
| 560 | } |
|---|
| 561 | |
|---|
| 562 | proc ::blowfish::SetOneOf {lst item} { |
|---|
| 563 | set ndx [lsearch -glob $lst "${item}*"] |
|---|
| 564 | if {$ndx == -1} { |
|---|
| 565 | set err [join $lst ", "] |
|---|
| 566 | return -code error "invalid mode \"$item\": must be one of $err" |
|---|
| 567 | } |
|---|
| 568 | return [lindex $lst $ndx] |
|---|
| 569 | } |
|---|
| 570 | |
|---|
| 571 | proc ::blowfish::CheckSize {what size thing} { |
|---|
| 572 | if {[string length $thing] != $size} { |
|---|
| 573 | return -code error "invalid value for $what: must be $size bytes long" |
|---|
| 574 | } |
|---|
| 575 | return $thing |
|---|
| 576 | } |
|---|
| 577 | |
|---|
| 578 | proc ::blowfish::CheckPad {char} { |
|---|
| 579 | if {[string length $char] > 1} { |
|---|
| 580 | return -code error "invalid value: should be a char or empty string" |
|---|
| 581 | } |
|---|
| 582 | return $char |
|---|
| 583 | } |
|---|
| 584 | |
|---|
| 585 | proc ::blowfish::Pad {data blocksize {fill \0}} { |
|---|
| 586 | set len [string length $data] |
|---|
| 587 | if {$len == 0} { |
|---|
| 588 | set data [string repeat $fill $blocksize] |
|---|
| 589 | } elseif {($len % $blocksize) != 0} { |
|---|
| 590 | set pad [expr {$blocksize - ($len % $blocksize)}] |
|---|
| 591 | append data [string repeat $fill $pad] |
|---|
| 592 | } |
|---|
| 593 | return $data |
|---|
| 594 | } |
|---|
| 595 | |
|---|
| 596 | # Description: |
|---|
| 597 | # Pop the nth element off a list. Used in options processing. |
|---|
| 598 | # |
|---|
| 599 | proc ::blowfish::Pop {varname {nth 0}} { |
|---|
| 600 | upvar $varname args |
|---|
| 601 | set r [lindex $args $nth] |
|---|
| 602 | set args [lreplace $args $nth $nth] |
|---|
| 603 | return $r |
|---|
| 604 | } |
|---|
| 605 | |
|---|
| 606 | proc ::blowfish::blowfish {args} { |
|---|
| 607 | variable accel |
|---|
| 608 | array set opts {-dir encrypt -mode cbc -key {} -in {} -out {} -hex 0 -pad \0} |
|---|
| 609 | set opts(-chunksize) 4096 |
|---|
| 610 | set opts(-iv) [string repeat \0 8] |
|---|
| 611 | set modes {ecb cbc} |
|---|
| 612 | set dirs {encrypt decrypt} |
|---|
| 613 | while {[string match -* [set option [lindex $args 0]]]} { |
|---|
| 614 | switch -exact -- $option { |
|---|
| 615 | -mode { set opts(-mode) [SetOneOf $modes [Pop args 1]] } |
|---|
| 616 | -dir { set opts(-dir) [SetOneOf $dirs [Pop args 1]] } |
|---|
| 617 | -iv { set opts(-iv) [CheckSize -iv 8 [Pop args 1]] } |
|---|
| 618 | -key { set opts(-key) [Pop args 1] } |
|---|
| 619 | -in { set opts(-in) [Pop args 1] } |
|---|
| 620 | -out { set opts(-out) [Pop args 1] } |
|---|
| 621 | -chunksize { set opts(-chunksize) [Pop args 1] } |
|---|
| 622 | -hex { set opts(-hex) 1 } |
|---|
| 623 | -pad { set opts(-pad) [CheckPad [Pop args 1]] } |
|---|
| 624 | -- { Pop args; break } |
|---|
| 625 | default { |
|---|
| 626 | if {[string length $opts(-in)] == 0 && [llength $args] == 1} break |
|---|
| 627 | set err [join [lsort [array names opts]] ", "] |
|---|
| 628 | return -code error "bad option \"$option\":\ |
|---|
| 629 | must be one of $err" |
|---|
| 630 | } |
|---|
| 631 | } |
|---|
| 632 | Pop args |
|---|
| 633 | } |
|---|
| 634 | |
|---|
| 635 | if {$opts(-key) == {}} { |
|---|
| 636 | return -code error "no key provided: the -key option is required" |
|---|
| 637 | } |
|---|
| 638 | |
|---|
| 639 | set r {} |
|---|
| 640 | if {$opts(-in) == {}} { |
|---|
| 641 | |
|---|
| 642 | if {[llength $args] != 1} { |
|---|
| 643 | return -code error "wrong \# args:\ |
|---|
| 644 | should be \"blowfish ?options...? -key keydata plaintext\"" |
|---|
| 645 | } |
|---|
| 646 | |
|---|
| 647 | set data [lindex $args 0] |
|---|
| 648 | if {[string length $opts(-pad)] > 0} { |
|---|
| 649 | set data [Pad [lindex $args 0] 8 $opts(-pad)] |
|---|
| 650 | } |
|---|
| 651 | if {$accel(trf)} { |
|---|
| 652 | set r [::blowfish -dir $opts(-dir) -mode $opts(-mode) \ |
|---|
| 653 | -key $opts(-key) -iv $opts(-iv) -- $data] |
|---|
| 654 | } else { |
|---|
| 655 | set Key [Init $opts(-mode) $opts(-key) $opts(-iv)] |
|---|
| 656 | if {[string equal $opts(-dir) "encrypt"]} { |
|---|
| 657 | set r [Encrypt $Key $data] |
|---|
| 658 | } else { |
|---|
| 659 | set r [Decrypt $Key $data] |
|---|
| 660 | } |
|---|
| 661 | Final $Key |
|---|
| 662 | } |
|---|
| 663 | |
|---|
| 664 | if {$opts(-out) != {}} { |
|---|
| 665 | puts -nonewline $opts(-out) $r |
|---|
| 666 | set r {} |
|---|
| 667 | } |
|---|
| 668 | |
|---|
| 669 | } else { |
|---|
| 670 | |
|---|
| 671 | if {[llength $args] != 0} { |
|---|
| 672 | return -code error "wrong \# args:\ |
|---|
| 673 | should be \"blowfish ?options...? -key keydata -in channel\"" |
|---|
| 674 | } |
|---|
| 675 | |
|---|
| 676 | set Key [Init $opts(-mode) $opts(-key) $opts(-iv)] |
|---|
| 677 | upvar $Key state |
|---|
| 678 | set state(reading) 1 |
|---|
| 679 | if {[string equal $opts(-dir) "encrypt"]} { |
|---|
| 680 | set state(cmd) Encrypt |
|---|
| 681 | } else { |
|---|
| 682 | set state(cmd) Decrypt |
|---|
| 683 | } |
|---|
| 684 | set state(output) "" |
|---|
| 685 | fileevent $opts(-in) readable \ |
|---|
| 686 | [list [namespace origin Chunk] \ |
|---|
| 687 | $Key $opts(-in) $opts(-out) $opts(-chunksize) $opts(-pad)] |
|---|
| 688 | if {[info commands ::tkwait] != {}} { |
|---|
| 689 | tkwait variable [subst $Key](reading) |
|---|
| 690 | } else { |
|---|
| 691 | vwait [subst $Key](reading) |
|---|
| 692 | } |
|---|
| 693 | if {$opts(-out) == {}} { |
|---|
| 694 | set r $state(output) |
|---|
| 695 | } |
|---|
| 696 | Final $Key |
|---|
| 697 | |
|---|
| 698 | } |
|---|
| 699 | |
|---|
| 700 | if {$opts(-hex)} { |
|---|
| 701 | set r [Hex $r] |
|---|
| 702 | } |
|---|
| 703 | return $r |
|---|
| 704 | } |
|---|
| 705 | |
|---|
| 706 | # ------------------------------------------------------------------------- |
|---|
| 707 | |
|---|
| 708 | # Try and load a compiled extension to help. |
|---|
| 709 | namespace eval ::blowfish { |
|---|
| 710 | variable e; foreach e {trf} { if {[LoadAccelerator $e]} { break } } |
|---|
| 711 | } |
|---|
| 712 | |
|---|
| 713 | package provide blowfish $::blowfish::version |
|---|
| 714 | |
|---|
| 715 | # ------------------------------------------------------------------------- |
|---|
| 716 | # |
|---|
| 717 | # Local Variables: |
|---|
| 718 | # mode: tcl |
|---|
| 719 | # indent-tabs-mode: nil |
|---|
| 720 | # End: |
|---|