Mercurial > dropbear
comparison libtomcrypt/src/ciphers/blowfish.c @ 391:00fcf5045160
propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head c1db4398d56c56c6d06ae1e20c1e0d04dbb598ed)
to branch 'au.asn.ucc.matt.dropbear' (head d26d5eb2837f46b56a33fb0e7573aa0201abd4d5)
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Thu, 11 Jan 2007 04:29:08 +0000 |
parents | 0cbe8f6dbf9e |
children | f849a5ca2efc |
comparison
equal
deleted
inserted
replaced
390:d8e44bef7917 | 391:00fcf5045160 |
---|---|
1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis | |
2 * | |
3 * LibTomCrypt is a library that provides various cryptographic | |
4 * algorithms in a highly modular and flexible manner. | |
5 * | |
6 * The library is free for all purposes without any express | |
7 * guarantee it works. | |
8 * | |
9 * Tom St Denis, [email protected], http://libtomcrypt.com | |
10 */ | |
11 /** | |
12 @file blowfish.c | |
13 Implementation of the Blowfish block cipher, Tom St Denis | |
14 */ | |
15 #include "tomcrypt.h" | |
16 | |
17 #ifdef BLOWFISH | |
18 | |
19 const struct ltc_cipher_descriptor blowfish_desc = | |
20 { | |
21 "blowfish", | |
22 0, | |
23 8, 56, 8, 16, | |
24 &blowfish_setup, | |
25 &blowfish_ecb_encrypt, | |
26 &blowfish_ecb_decrypt, | |
27 &blowfish_test, | |
28 &blowfish_done, | |
29 &blowfish_keysize, | |
30 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | |
31 }; | |
32 | |
33 static const ulong32 ORIG_P[16 + 2] = { | |
34 0x243F6A88UL, 0x85A308D3UL, 0x13198A2EUL, 0x03707344UL, | |
35 0xA4093822UL, 0x299F31D0UL, 0x082EFA98UL, 0xEC4E6C89UL, | |
36 0x452821E6UL, 0x38D01377UL, 0xBE5466CFUL, 0x34E90C6CUL, | |
37 0xC0AC29B7UL, 0xC97C50DDUL, 0x3F84D5B5UL, 0xB5470917UL, | |
38 0x9216D5D9UL, 0x8979FB1BUL | |
39 }; | |
40 | |
41 static const ulong32 ORIG_S[4][256] = { | |
42 { 0xD1310BA6UL, 0x98DFB5ACUL, 0x2FFD72DBUL, 0xD01ADFB7UL, | |
43 0xB8E1AFEDUL, 0x6A267E96UL, 0xBA7C9045UL, 0xF12C7F99UL, | |
44 0x24A19947UL, 0xB3916CF7UL, 0x0801F2E2UL, 0x858EFC16UL, | |
45 0x636920D8UL, 0x71574E69UL, 0xA458FEA3UL, 0xF4933D7EUL, | |
46 0x0D95748FUL, 0x728EB658UL, 0x718BCD58UL, 0x82154AEEUL, | |
47 0x7B54A41DUL, 0xC25A59B5UL, 0x9C30D539UL, 0x2AF26013UL, | |
48 0xC5D1B023UL, 0x286085F0UL, 0xCA417918UL, 0xB8DB38EFUL, | |
49 0x8E79DCB0UL, 0x603A180EUL, 0x6C9E0E8BUL, 0xB01E8A3EUL, | |
50 0xD71577C1UL, 0xBD314B27UL, 0x78AF2FDAUL, 0x55605C60UL, | |
51 0xE65525F3UL, 0xAA55AB94UL, 0x57489862UL, 0x63E81440UL, | |
52 0x55CA396AUL, 0x2AAB10B6UL, 0xB4CC5C34UL, 0x1141E8CEUL, | |
53 0xA15486AFUL, 0x7C72E993UL, 0xB3EE1411UL, 0x636FBC2AUL, | |
54 0x2BA9C55DUL, 0x741831F6UL, 0xCE5C3E16UL, 0x9B87931EUL, | |
55 0xAFD6BA33UL, 0x6C24CF5CUL, 0x7A325381UL, 0x28958677UL, | |
56 0x3B8F4898UL, 0x6B4BB9AFUL, 0xC4BFE81BUL, 0x66282193UL, | |
57 0x61D809CCUL, 0xFB21A991UL, 0x487CAC60UL, 0x5DEC8032UL, | |
58 0xEF845D5DUL, 0xE98575B1UL, 0xDC262302UL, 0xEB651B88UL, | |
59 0x23893E81UL, 0xD396ACC5UL, 0x0F6D6FF3UL, 0x83F44239UL, | |
60 0x2E0B4482UL, 0xA4842004UL, 0x69C8F04AUL, 0x9E1F9B5EUL, | |
61 0x21C66842UL, 0xF6E96C9AUL, 0x670C9C61UL, 0xABD388F0UL, | |
62 0x6A51A0D2UL, 0xD8542F68UL, 0x960FA728UL, 0xAB5133A3UL, | |
63 0x6EEF0B6CUL, 0x137A3BE4UL, 0xBA3BF050UL, 0x7EFB2A98UL, | |
64 0xA1F1651DUL, 0x39AF0176UL, 0x66CA593EUL, 0x82430E88UL, | |
65 0x8CEE8619UL, 0x456F9FB4UL, 0x7D84A5C3UL, 0x3B8B5EBEUL, | |
66 0xE06F75D8UL, 0x85C12073UL, 0x401A449FUL, 0x56C16AA6UL, | |
67 0x4ED3AA62UL, 0x363F7706UL, 0x1BFEDF72UL, 0x429B023DUL, | |
68 0x37D0D724UL, 0xD00A1248UL, 0xDB0FEAD3UL, 0x49F1C09BUL, | |
69 0x075372C9UL, 0x80991B7BUL, 0x25D479D8UL, 0xF6E8DEF7UL, | |
70 0xE3FE501AUL, 0xB6794C3BUL, 0x976CE0BDUL, 0x04C006BAUL, | |
71 0xC1A94FB6UL, 0x409F60C4UL, 0x5E5C9EC2UL, 0x196A2463UL, | |
72 0x68FB6FAFUL, 0x3E6C53B5UL, 0x1339B2EBUL, 0x3B52EC6FUL, | |
73 0x6DFC511FUL, 0x9B30952CUL, 0xCC814544UL, 0xAF5EBD09UL, | |
74 0xBEE3D004UL, 0xDE334AFDUL, 0x660F2807UL, 0x192E4BB3UL, | |
75 0xC0CBA857UL, 0x45C8740FUL, 0xD20B5F39UL, 0xB9D3FBDBUL, | |
76 0x5579C0BDUL, 0x1A60320AUL, 0xD6A100C6UL, 0x402C7279UL, | |
77 0x679F25FEUL, 0xFB1FA3CCUL, 0x8EA5E9F8UL, 0xDB3222F8UL, | |
78 0x3C7516DFUL, 0xFD616B15UL, 0x2F501EC8UL, 0xAD0552ABUL, | |
79 0x323DB5FAUL, 0xFD238760UL, 0x53317B48UL, 0x3E00DF82UL, | |
80 0x9E5C57BBUL, 0xCA6F8CA0UL, 0x1A87562EUL, 0xDF1769DBUL, | |
81 0xD542A8F6UL, 0x287EFFC3UL, 0xAC6732C6UL, 0x8C4F5573UL, | |
82 0x695B27B0UL, 0xBBCA58C8UL, 0xE1FFA35DUL, 0xB8F011A0UL, | |
83 0x10FA3D98UL, 0xFD2183B8UL, 0x4AFCB56CUL, 0x2DD1D35BUL, | |
84 0x9A53E479UL, 0xB6F84565UL, 0xD28E49BCUL, 0x4BFB9790UL, | |
85 0xE1DDF2DAUL, 0xA4CB7E33UL, 0x62FB1341UL, 0xCEE4C6E8UL, | |
86 0xEF20CADAUL, 0x36774C01UL, 0xD07E9EFEUL, 0x2BF11FB4UL, | |
87 0x95DBDA4DUL, 0xAE909198UL, 0xEAAD8E71UL, 0x6B93D5A0UL, | |
88 0xD08ED1D0UL, 0xAFC725E0UL, 0x8E3C5B2FUL, 0x8E7594B7UL, | |
89 0x8FF6E2FBUL, 0xF2122B64UL, 0x8888B812UL, 0x900DF01CUL, | |
90 0x4FAD5EA0UL, 0x688FC31CUL, 0xD1CFF191UL, 0xB3A8C1ADUL, | |
91 0x2F2F2218UL, 0xBE0E1777UL, 0xEA752DFEUL, 0x8B021FA1UL, | |
92 0xE5A0CC0FUL, 0xB56F74E8UL, 0x18ACF3D6UL, 0xCE89E299UL, | |
93 0xB4A84FE0UL, 0xFD13E0B7UL, 0x7CC43B81UL, 0xD2ADA8D9UL, | |
94 0x165FA266UL, 0x80957705UL, 0x93CC7314UL, 0x211A1477UL, | |
95 0xE6AD2065UL, 0x77B5FA86UL, 0xC75442F5UL, 0xFB9D35CFUL, | |
96 0xEBCDAF0CUL, 0x7B3E89A0UL, 0xD6411BD3UL, 0xAE1E7E49UL, | |
97 0x00250E2DUL, 0x2071B35EUL, 0x226800BBUL, 0x57B8E0AFUL, | |
98 0x2464369BUL, 0xF009B91EUL, 0x5563911DUL, 0x59DFA6AAUL, | |
99 0x78C14389UL, 0xD95A537FUL, 0x207D5BA2UL, 0x02E5B9C5UL, | |
100 0x83260376UL, 0x6295CFA9UL, 0x11C81968UL, 0x4E734A41UL, | |
101 0xB3472DCAUL, 0x7B14A94AUL, 0x1B510052UL, 0x9A532915UL, | |
102 0xD60F573FUL, 0xBC9BC6E4UL, 0x2B60A476UL, 0x81E67400UL, | |
103 0x08BA6FB5UL, 0x571BE91FUL, 0xF296EC6BUL, 0x2A0DD915UL, | |
104 0xB6636521UL, 0xE7B9F9B6UL, 0xFF34052EUL, 0xC5855664UL, | |
105 0x53B02D5DUL, 0xA99F8FA1UL, 0x08BA4799UL, 0x6E85076AUL }, | |
106 { 0x4B7A70E9UL, 0xB5B32944UL, 0xDB75092EUL, 0xC4192623UL, | |
107 0xAD6EA6B0UL, 0x49A7DF7DUL, 0x9CEE60B8UL, 0x8FEDB266UL, | |
108 0xECAA8C71UL, 0x699A17FFUL, 0x5664526CUL, 0xC2B19EE1UL, | |
109 0x193602A5UL, 0x75094C29UL, 0xA0591340UL, 0xE4183A3EUL, | |
110 0x3F54989AUL, 0x5B429D65UL, 0x6B8FE4D6UL, 0x99F73FD6UL, | |
111 0xA1D29C07UL, 0xEFE830F5UL, 0x4D2D38E6UL, 0xF0255DC1UL, | |
112 0x4CDD2086UL, 0x8470EB26UL, 0x6382E9C6UL, 0x021ECC5EUL, | |
113 0x09686B3FUL, 0x3EBAEFC9UL, 0x3C971814UL, 0x6B6A70A1UL, | |
114 0x687F3584UL, 0x52A0E286UL, 0xB79C5305UL, 0xAA500737UL, | |
115 0x3E07841CUL, 0x7FDEAE5CUL, 0x8E7D44ECUL, 0x5716F2B8UL, | |
116 0xB03ADA37UL, 0xF0500C0DUL, 0xF01C1F04UL, 0x0200B3FFUL, | |
117 0xAE0CF51AUL, 0x3CB574B2UL, 0x25837A58UL, 0xDC0921BDUL, | |
118 0xD19113F9UL, 0x7CA92FF6UL, 0x94324773UL, 0x22F54701UL, | |
119 0x3AE5E581UL, 0x37C2DADCUL, 0xC8B57634UL, 0x9AF3DDA7UL, | |
120 0xA9446146UL, 0x0FD0030EUL, 0xECC8C73EUL, 0xA4751E41UL, | |
121 0xE238CD99UL, 0x3BEA0E2FUL, 0x3280BBA1UL, 0x183EB331UL, | |
122 0x4E548B38UL, 0x4F6DB908UL, 0x6F420D03UL, 0xF60A04BFUL, | |
123 0x2CB81290UL, 0x24977C79UL, 0x5679B072UL, 0xBCAF89AFUL, | |
124 0xDE9A771FUL, 0xD9930810UL, 0xB38BAE12UL, 0xDCCF3F2EUL, | |
125 0x5512721FUL, 0x2E6B7124UL, 0x501ADDE6UL, 0x9F84CD87UL, | |
126 0x7A584718UL, 0x7408DA17UL, 0xBC9F9ABCUL, 0xE94B7D8CUL, | |
127 0xEC7AEC3AUL, 0xDB851DFAUL, 0x63094366UL, 0xC464C3D2UL, | |
128 0xEF1C1847UL, 0x3215D908UL, 0xDD433B37UL, 0x24C2BA16UL, | |
129 0x12A14D43UL, 0x2A65C451UL, 0x50940002UL, 0x133AE4DDUL, | |
130 0x71DFF89EUL, 0x10314E55UL, 0x81AC77D6UL, 0x5F11199BUL, | |
131 0x043556F1UL, 0xD7A3C76BUL, 0x3C11183BUL, 0x5924A509UL, | |
132 0xF28FE6EDUL, 0x97F1FBFAUL, 0x9EBABF2CUL, 0x1E153C6EUL, | |
133 0x86E34570UL, 0xEAE96FB1UL, 0x860E5E0AUL, 0x5A3E2AB3UL, | |
134 0x771FE71CUL, 0x4E3D06FAUL, 0x2965DCB9UL, 0x99E71D0FUL, | |
135 0x803E89D6UL, 0x5266C825UL, 0x2E4CC978UL, 0x9C10B36AUL, | |
136 0xC6150EBAUL, 0x94E2EA78UL, 0xA5FC3C53UL, 0x1E0A2DF4UL, | |
137 0xF2F74EA7UL, 0x361D2B3DUL, 0x1939260FUL, 0x19C27960UL, | |
138 0x5223A708UL, 0xF71312B6UL, 0xEBADFE6EUL, 0xEAC31F66UL, | |
139 0xE3BC4595UL, 0xA67BC883UL, 0xB17F37D1UL, 0x018CFF28UL, | |
140 0xC332DDEFUL, 0xBE6C5AA5UL, 0x65582185UL, 0x68AB9802UL, | |
141 0xEECEA50FUL, 0xDB2F953BUL, 0x2AEF7DADUL, 0x5B6E2F84UL, | |
142 0x1521B628UL, 0x29076170UL, 0xECDD4775UL, 0x619F1510UL, | |
143 0x13CCA830UL, 0xEB61BD96UL, 0x0334FE1EUL, 0xAA0363CFUL, | |
144 0xB5735C90UL, 0x4C70A239UL, 0xD59E9E0BUL, 0xCBAADE14UL, | |
145 0xEECC86BCUL, 0x60622CA7UL, 0x9CAB5CABUL, 0xB2F3846EUL, | |
146 0x648B1EAFUL, 0x19BDF0CAUL, 0xA02369B9UL, 0x655ABB50UL, | |
147 0x40685A32UL, 0x3C2AB4B3UL, 0x319EE9D5UL, 0xC021B8F7UL, | |
148 0x9B540B19UL, 0x875FA099UL, 0x95F7997EUL, 0x623D7DA8UL, | |
149 0xF837889AUL, 0x97E32D77UL, 0x11ED935FUL, 0x16681281UL, | |
150 0x0E358829UL, 0xC7E61FD6UL, 0x96DEDFA1UL, 0x7858BA99UL, | |
151 0x57F584A5UL, 0x1B227263UL, 0x9B83C3FFUL, 0x1AC24696UL, | |
152 0xCDB30AEBUL, 0x532E3054UL, 0x8FD948E4UL, 0x6DBC3128UL, | |
153 0x58EBF2EFUL, 0x34C6FFEAUL, 0xFE28ED61UL, 0xEE7C3C73UL, | |
154 0x5D4A14D9UL, 0xE864B7E3UL, 0x42105D14UL, 0x203E13E0UL, | |
155 0x45EEE2B6UL, 0xA3AAABEAUL, 0xDB6C4F15UL, 0xFACB4FD0UL, | |
156 0xC742F442UL, 0xEF6ABBB5UL, 0x654F3B1DUL, 0x41CD2105UL, | |
157 0xD81E799EUL, 0x86854DC7UL, 0xE44B476AUL, 0x3D816250UL, | |
158 0xCF62A1F2UL, 0x5B8D2646UL, 0xFC8883A0UL, 0xC1C7B6A3UL, | |
159 0x7F1524C3UL, 0x69CB7492UL, 0x47848A0BUL, 0x5692B285UL, | |
160 0x095BBF00UL, 0xAD19489DUL, 0x1462B174UL, 0x23820E00UL, | |
161 0x58428D2AUL, 0x0C55F5EAUL, 0x1DADF43EUL, 0x233F7061UL, | |
162 0x3372F092UL, 0x8D937E41UL, 0xD65FECF1UL, 0x6C223BDBUL, | |
163 0x7CDE3759UL, 0xCBEE7460UL, 0x4085F2A7UL, 0xCE77326EUL, | |
164 0xA6078084UL, 0x19F8509EUL, 0xE8EFD855UL, 0x61D99735UL, | |
165 0xA969A7AAUL, 0xC50C06C2UL, 0x5A04ABFCUL, 0x800BCADCUL, | |
166 0x9E447A2EUL, 0xC3453484UL, 0xFDD56705UL, 0x0E1E9EC9UL, | |
167 0xDB73DBD3UL, 0x105588CDUL, 0x675FDA79UL, 0xE3674340UL, | |
168 0xC5C43465UL, 0x713E38D8UL, 0x3D28F89EUL, 0xF16DFF20UL, | |
169 0x153E21E7UL, 0x8FB03D4AUL, 0xE6E39F2BUL, 0xDB83ADF7UL }, | |
170 { 0xE93D5A68UL, 0x948140F7UL, 0xF64C261CUL, 0x94692934UL, | |
171 0x411520F7UL, 0x7602D4F7UL, 0xBCF46B2EUL, 0xD4A20068UL, | |
172 0xD4082471UL, 0x3320F46AUL, 0x43B7D4B7UL, 0x500061AFUL, | |
173 0x1E39F62EUL, 0x97244546UL, 0x14214F74UL, 0xBF8B8840UL, | |
174 0x4D95FC1DUL, 0x96B591AFUL, 0x70F4DDD3UL, 0x66A02F45UL, | |
175 0xBFBC09ECUL, 0x03BD9785UL, 0x7FAC6DD0UL, 0x31CB8504UL, | |
176 0x96EB27B3UL, 0x55FD3941UL, 0xDA2547E6UL, 0xABCA0A9AUL, | |
177 0x28507825UL, 0x530429F4UL, 0x0A2C86DAUL, 0xE9B66DFBUL, | |
178 0x68DC1462UL, 0xD7486900UL, 0x680EC0A4UL, 0x27A18DEEUL, | |
179 0x4F3FFEA2UL, 0xE887AD8CUL, 0xB58CE006UL, 0x7AF4D6B6UL, | |
180 0xAACE1E7CUL, 0xD3375FECUL, 0xCE78A399UL, 0x406B2A42UL, | |
181 0x20FE9E35UL, 0xD9F385B9UL, 0xEE39D7ABUL, 0x3B124E8BUL, | |
182 0x1DC9FAF7UL, 0x4B6D1856UL, 0x26A36631UL, 0xEAE397B2UL, | |
183 0x3A6EFA74UL, 0xDD5B4332UL, 0x6841E7F7UL, 0xCA7820FBUL, | |
184 0xFB0AF54EUL, 0xD8FEB397UL, 0x454056ACUL, 0xBA489527UL, | |
185 0x55533A3AUL, 0x20838D87UL, 0xFE6BA9B7UL, 0xD096954BUL, | |
186 0x55A867BCUL, 0xA1159A58UL, 0xCCA92963UL, 0x99E1DB33UL, | |
187 0xA62A4A56UL, 0x3F3125F9UL, 0x5EF47E1CUL, 0x9029317CUL, | |
188 0xFDF8E802UL, 0x04272F70UL, 0x80BB155CUL, 0x05282CE3UL, | |
189 0x95C11548UL, 0xE4C66D22UL, 0x48C1133FUL, 0xC70F86DCUL, | |
190 0x07F9C9EEUL, 0x41041F0FUL, 0x404779A4UL, 0x5D886E17UL, | |
191 0x325F51EBUL, 0xD59BC0D1UL, 0xF2BCC18FUL, 0x41113564UL, | |
192 0x257B7834UL, 0x602A9C60UL, 0xDFF8E8A3UL, 0x1F636C1BUL, | |
193 0x0E12B4C2UL, 0x02E1329EUL, 0xAF664FD1UL, 0xCAD18115UL, | |
194 0x6B2395E0UL, 0x333E92E1UL, 0x3B240B62UL, 0xEEBEB922UL, | |
195 0x85B2A20EUL, 0xE6BA0D99UL, 0xDE720C8CUL, 0x2DA2F728UL, | |
196 0xD0127845UL, 0x95B794FDUL, 0x647D0862UL, 0xE7CCF5F0UL, | |
197 0x5449A36FUL, 0x877D48FAUL, 0xC39DFD27UL, 0xF33E8D1EUL, | |
198 0x0A476341UL, 0x992EFF74UL, 0x3A6F6EABUL, 0xF4F8FD37UL, | |
199 0xA812DC60UL, 0xA1EBDDF8UL, 0x991BE14CUL, 0xDB6E6B0DUL, | |
200 0xC67B5510UL, 0x6D672C37UL, 0x2765D43BUL, 0xDCD0E804UL, | |
201 0xF1290DC7UL, 0xCC00FFA3UL, 0xB5390F92UL, 0x690FED0BUL, | |
202 0x667B9FFBUL, 0xCEDB7D9CUL, 0xA091CF0BUL, 0xD9155EA3UL, | |
203 0xBB132F88UL, 0x515BAD24UL, 0x7B9479BFUL, 0x763BD6EBUL, | |
204 0x37392EB3UL, 0xCC115979UL, 0x8026E297UL, 0xF42E312DUL, | |
205 0x6842ADA7UL, 0xC66A2B3BUL, 0x12754CCCUL, 0x782EF11CUL, | |
206 0x6A124237UL, 0xB79251E7UL, 0x06A1BBE6UL, 0x4BFB6350UL, | |
207 0x1A6B1018UL, 0x11CAEDFAUL, 0x3D25BDD8UL, 0xE2E1C3C9UL, | |
208 0x44421659UL, 0x0A121386UL, 0xD90CEC6EUL, 0xD5ABEA2AUL, | |
209 0x64AF674EUL, 0xDA86A85FUL, 0xBEBFE988UL, 0x64E4C3FEUL, | |
210 0x9DBC8057UL, 0xF0F7C086UL, 0x60787BF8UL, 0x6003604DUL, | |
211 0xD1FD8346UL, 0xF6381FB0UL, 0x7745AE04UL, 0xD736FCCCUL, | |
212 0x83426B33UL, 0xF01EAB71UL, 0xB0804187UL, 0x3C005E5FUL, | |
213 0x77A057BEUL, 0xBDE8AE24UL, 0x55464299UL, 0xBF582E61UL, | |
214 0x4E58F48FUL, 0xF2DDFDA2UL, 0xF474EF38UL, 0x8789BDC2UL, | |
215 0x5366F9C3UL, 0xC8B38E74UL, 0xB475F255UL, 0x46FCD9B9UL, | |
216 0x7AEB2661UL, 0x8B1DDF84UL, 0x846A0E79UL, 0x915F95E2UL, | |
217 0x466E598EUL, 0x20B45770UL, 0x8CD55591UL, 0xC902DE4CUL, | |
218 0xB90BACE1UL, 0xBB8205D0UL, 0x11A86248UL, 0x7574A99EUL, | |
219 0xB77F19B6UL, 0xE0A9DC09UL, 0x662D09A1UL, 0xC4324633UL, | |
220 0xE85A1F02UL, 0x09F0BE8CUL, 0x4A99A025UL, 0x1D6EFE10UL, | |
221 0x1AB93D1DUL, 0x0BA5A4DFUL, 0xA186F20FUL, 0x2868F169UL, | |
222 0xDCB7DA83UL, 0x573906FEUL, 0xA1E2CE9BUL, 0x4FCD7F52UL, | |
223 0x50115E01UL, 0xA70683FAUL, 0xA002B5C4UL, 0x0DE6D027UL, | |
224 0x9AF88C27UL, 0x773F8641UL, 0xC3604C06UL, 0x61A806B5UL, | |
225 0xF0177A28UL, 0xC0F586E0UL, 0x006058AAUL, 0x30DC7D62UL, | |
226 0x11E69ED7UL, 0x2338EA63UL, 0x53C2DD94UL, 0xC2C21634UL, | |
227 0xBBCBEE56UL, 0x90BCB6DEUL, 0xEBFC7DA1UL, 0xCE591D76UL, | |
228 0x6F05E409UL, 0x4B7C0188UL, 0x39720A3DUL, 0x7C927C24UL, | |
229 0x86E3725FUL, 0x724D9DB9UL, 0x1AC15BB4UL, 0xD39EB8FCUL, | |
230 0xED545578UL, 0x08FCA5B5UL, 0xD83D7CD3UL, 0x4DAD0FC4UL, | |
231 0x1E50EF5EUL, 0xB161E6F8UL, 0xA28514D9UL, 0x6C51133CUL, | |
232 0x6FD5C7E7UL, 0x56E14EC4UL, 0x362ABFCEUL, 0xDDC6C837UL, | |
233 0xD79A3234UL, 0x92638212UL, 0x670EFA8EUL, 0x406000E0UL }, | |
234 { 0x3A39CE37UL, 0xD3FAF5CFUL, 0xABC27737UL, 0x5AC52D1BUL, | |
235 0x5CB0679EUL, 0x4FA33742UL, 0xD3822740UL, 0x99BC9BBEUL, | |
236 0xD5118E9DUL, 0xBF0F7315UL, 0xD62D1C7EUL, 0xC700C47BUL, | |
237 0xB78C1B6BUL, 0x21A19045UL, 0xB26EB1BEUL, 0x6A366EB4UL, | |
238 0x5748AB2FUL, 0xBC946E79UL, 0xC6A376D2UL, 0x6549C2C8UL, | |
239 0x530FF8EEUL, 0x468DDE7DUL, 0xD5730A1DUL, 0x4CD04DC6UL, | |
240 0x2939BBDBUL, 0xA9BA4650UL, 0xAC9526E8UL, 0xBE5EE304UL, | |
241 0xA1FAD5F0UL, 0x6A2D519AUL, 0x63EF8CE2UL, 0x9A86EE22UL, | |
242 0xC089C2B8UL, 0x43242EF6UL, 0xA51E03AAUL, 0x9CF2D0A4UL, | |
243 0x83C061BAUL, 0x9BE96A4DUL, 0x8FE51550UL, 0xBA645BD6UL, | |
244 0x2826A2F9UL, 0xA73A3AE1UL, 0x4BA99586UL, 0xEF5562E9UL, | |
245 0xC72FEFD3UL, 0xF752F7DAUL, 0x3F046F69UL, 0x77FA0A59UL, | |
246 0x80E4A915UL, 0x87B08601UL, 0x9B09E6ADUL, 0x3B3EE593UL, | |
247 0xE990FD5AUL, 0x9E34D797UL, 0x2CF0B7D9UL, 0x022B8B51UL, | |
248 0x96D5AC3AUL, 0x017DA67DUL, 0xD1CF3ED6UL, 0x7C7D2D28UL, | |
249 0x1F9F25CFUL, 0xADF2B89BUL, 0x5AD6B472UL, 0x5A88F54CUL, | |
250 0xE029AC71UL, 0xE019A5E6UL, 0x47B0ACFDUL, 0xED93FA9BUL, | |
251 0xE8D3C48DUL, 0x283B57CCUL, 0xF8D56629UL, 0x79132E28UL, | |
252 0x785F0191UL, 0xED756055UL, 0xF7960E44UL, 0xE3D35E8CUL, | |
253 0x15056DD4UL, 0x88F46DBAUL, 0x03A16125UL, 0x0564F0BDUL, | |
254 0xC3EB9E15UL, 0x3C9057A2UL, 0x97271AECUL, 0xA93A072AUL, | |
255 0x1B3F6D9BUL, 0x1E6321F5UL, 0xF59C66FBUL, 0x26DCF319UL, | |
256 0x7533D928UL, 0xB155FDF5UL, 0x03563482UL, 0x8ABA3CBBUL, | |
257 0x28517711UL, 0xC20AD9F8UL, 0xABCC5167UL, 0xCCAD925FUL, | |
258 0x4DE81751UL, 0x3830DC8EUL, 0x379D5862UL, 0x9320F991UL, | |
259 0xEA7A90C2UL, 0xFB3E7BCEUL, 0x5121CE64UL, 0x774FBE32UL, | |
260 0xA8B6E37EUL, 0xC3293D46UL, 0x48DE5369UL, 0x6413E680UL, | |
261 0xA2AE0810UL, 0xDD6DB224UL, 0x69852DFDUL, 0x09072166UL, | |
262 0xB39A460AUL, 0x6445C0DDUL, 0x586CDECFUL, 0x1C20C8AEUL, | |
263 0x5BBEF7DDUL, 0x1B588D40UL, 0xCCD2017FUL, 0x6BB4E3BBUL, | |
264 0xDDA26A7EUL, 0x3A59FF45UL, 0x3E350A44UL, 0xBCB4CDD5UL, | |
265 0x72EACEA8UL, 0xFA6484BBUL, 0x8D6612AEUL, 0xBF3C6F47UL, | |
266 0xD29BE463UL, 0x542F5D9EUL, 0xAEC2771BUL, 0xF64E6370UL, | |
267 0x740E0D8DUL, 0xE75B1357UL, 0xF8721671UL, 0xAF537D5DUL, | |
268 0x4040CB08UL, 0x4EB4E2CCUL, 0x34D2466AUL, 0x0115AF84UL, | |
269 0xE1B00428UL, 0x95983A1DUL, 0x06B89FB4UL, 0xCE6EA048UL, | |
270 0x6F3F3B82UL, 0x3520AB82UL, 0x011A1D4BUL, 0x277227F8UL, | |
271 0x611560B1UL, 0xE7933FDCUL, 0xBB3A792BUL, 0x344525BDUL, | |
272 0xA08839E1UL, 0x51CE794BUL, 0x2F32C9B7UL, 0xA01FBAC9UL, | |
273 0xE01CC87EUL, 0xBCC7D1F6UL, 0xCF0111C3UL, 0xA1E8AAC7UL, | |
274 0x1A908749UL, 0xD44FBD9AUL, 0xD0DADECBUL, 0xD50ADA38UL, | |
275 0x0339C32AUL, 0xC6913667UL, 0x8DF9317CUL, 0xE0B12B4FUL, | |
276 0xF79E59B7UL, 0x43F5BB3AUL, 0xF2D519FFUL, 0x27D9459CUL, | |
277 0xBF97222CUL, 0x15E6FC2AUL, 0x0F91FC71UL, 0x9B941525UL, | |
278 0xFAE59361UL, 0xCEB69CEBUL, 0xC2A86459UL, 0x12BAA8D1UL, | |
279 0xB6C1075EUL, 0xE3056A0CUL, 0x10D25065UL, 0xCB03A442UL, | |
280 0xE0EC6E0EUL, 0x1698DB3BUL, 0x4C98A0BEUL, 0x3278E964UL, | |
281 0x9F1F9532UL, 0xE0D392DFUL, 0xD3A0342BUL, 0x8971F21EUL, | |
282 0x1B0A7441UL, 0x4BA3348CUL, 0xC5BE7120UL, 0xC37632D8UL, | |
283 0xDF359F8DUL, 0x9B992F2EUL, 0xE60B6F47UL, 0x0FE3F11DUL, | |
284 0xE54CDA54UL, 0x1EDAD891UL, 0xCE6279CFUL, 0xCD3E7E6FUL, | |
285 0x1618B166UL, 0xFD2C1D05UL, 0x848FD2C5UL, 0xF6FB2299UL, | |
286 0xF523F357UL, 0xA6327623UL, 0x93A83531UL, 0x56CCCD02UL, | |
287 0xACF08162UL, 0x5A75EBB5UL, 0x6E163697UL, 0x88D273CCUL, | |
288 0xDE966292UL, 0x81B949D0UL, 0x4C50901BUL, 0x71C65614UL, | |
289 0xE6C6C7BDUL, 0x327A140AUL, 0x45E1D006UL, 0xC3F27B9AUL, | |
290 0xC9AA53FDUL, 0x62A80F00UL, 0xBB25BFE2UL, 0x35BDD2F6UL, | |
291 0x71126905UL, 0xB2040222UL, 0xB6CBCF7CUL, 0xCD769C2BUL, | |
292 0x53113EC0UL, 0x1640E3D3UL, 0x38ABBD60UL, 0x2547ADF0UL, | |
293 0xBA38209CUL, 0xF746CE76UL, 0x77AFA1C5UL, 0x20756060UL, | |
294 0x85CBFE4EUL, 0x8AE88DD8UL, 0x7AAAF9B0UL, 0x4CF9AA7EUL, | |
295 0x1948C25CUL, 0x02FB8A8CUL, 0x01C36AE4UL, 0xD6EBE1F9UL, | |
296 0x90D4F869UL, 0xA65CDEA0UL, 0x3F09252DUL, 0xC208E69FUL, | |
297 0xB74E6132UL, 0xCE77E25BUL, 0x578FDFE3UL, 0x3AC372E6UL } | |
298 }; | |
299 | |
300 /** | |
301 Initialize the Blowfish block cipher | |
302 @param key The symmetric key you wish to pass | |
303 @param keylen The key length in bytes | |
304 @param num_rounds The number of rounds desired (0 for default) | |
305 @param skey The key in as scheduled by this function. | |
306 @return CRYPT_OK if successful | |
307 */ | |
308 int blowfish_setup(const unsigned char *key, int keylen, int num_rounds, | |
309 symmetric_key *skey) | |
310 { | |
311 ulong32 x, y, z, A; | |
312 unsigned char B[8]; | |
313 | |
314 LTC_ARGCHK(key != NULL); | |
315 LTC_ARGCHK(skey != NULL); | |
316 | |
317 /* check key length */ | |
318 if (keylen < 8 || keylen > 56) { | |
319 return CRYPT_INVALID_KEYSIZE; | |
320 } | |
321 | |
322 /* check rounds */ | |
323 if (num_rounds != 0 && num_rounds != 16) { | |
324 return CRYPT_INVALID_ROUNDS; | |
325 } | |
326 | |
327 /* load in key bytes (Supplied by David Hopwood) */ | |
328 for (x = y = 0; x < 18; x++) { | |
329 A = 0; | |
330 for (z = 0; z < 4; z++) { | |
331 A = (A << 8) | ((ulong32)key[y++] & 255); | |
332 if (y == (ulong32)keylen) { | |
333 y = 0; | |
334 } | |
335 } | |
336 skey->blowfish.K[x] = ORIG_P[x] ^ A; | |
337 } | |
338 | |
339 /* copy sboxes */ | |
340 for (x = 0; x < 4; x++) { | |
341 for (y = 0; y < 256; y++) { | |
342 skey->blowfish.S[x][y] = ORIG_S[x][y]; | |
343 } | |
344 } | |
345 | |
346 /* encrypt K array */ | |
347 for (x = 0; x < 8; x++) { | |
348 B[x] = 0; | |
349 } | |
350 | |
351 for (x = 0; x < 18; x += 2) { | |
352 /* encrypt it */ | |
353 blowfish_ecb_encrypt(B, B, skey); | |
354 /* copy it */ | |
355 LOAD32H(skey->blowfish.K[x], &B[0]); | |
356 LOAD32H(skey->blowfish.K[x+1], &B[4]); | |
357 } | |
358 | |
359 /* encrypt S array */ | |
360 for (x = 0; x < 4; x++) { | |
361 for (y = 0; y < 256; y += 2) { | |
362 /* encrypt it */ | |
363 blowfish_ecb_encrypt(B, B, skey); | |
364 /* copy it */ | |
365 LOAD32H(skey->blowfish.S[x][y], &B[0]); | |
366 LOAD32H(skey->blowfish.S[x][y+1], &B[4]); | |
367 } | |
368 } | |
369 | |
370 #ifdef LTC_CLEAN_STACK | |
371 zeromem(B, sizeof(B)); | |
372 #endif | |
373 | |
374 return CRYPT_OK; | |
375 } | |
376 | |
377 #ifndef __GNUC__ | |
378 #define F(x) ((S1[byte(x,3)] + S2[byte(x,2)]) ^ S3[byte(x,1)]) + S4[byte(x,0)] | |
379 #else | |
380 #define F(x) ((skey->blowfish.S[0][byte(x,3)] + skey->blowfish.S[1][byte(x,2)]) ^ skey->blowfish.S[2][byte(x,1)]) + skey->blowfish.S[3][byte(x,0)] | |
381 #endif | |
382 | |
383 /** | |
384 Encrypts a block of text with Blowfish | |
385 @param pt The input plaintext (8 bytes) | |
386 @param ct The output ciphertext (8 bytes) | |
387 @param skey The key as scheduled | |
388 @return CRYPT_OK if successful | |
389 */ | |
390 #ifdef LTC_CLEAN_STACK | |
391 static int _blowfish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) | |
392 #else | |
393 int blowfish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) | |
394 #endif | |
395 { | |
396 ulong32 L, R; | |
397 int r; | |
398 #ifndef __GNUC__ | |
399 ulong32 *S1, *S2, *S3, *S4; | |
400 #endif | |
401 | |
402 LTC_ARGCHK(pt != NULL); | |
403 LTC_ARGCHK(ct != NULL); | |
404 LTC_ARGCHK(skey != NULL); | |
405 | |
406 #ifndef __GNUC__ | |
407 S1 = skey->blowfish.S[0]; | |
408 S2 = skey->blowfish.S[1]; | |
409 S3 = skey->blowfish.S[2]; | |
410 S4 = skey->blowfish.S[3]; | |
411 #endif | |
412 | |
413 /* load it */ | |
414 LOAD32H(L, &pt[0]); | |
415 LOAD32H(R, &pt[4]); | |
416 | |
417 /* do 16 rounds */ | |
418 for (r = 0; r < 16; ) { | |
419 L ^= skey->blowfish.K[r++]; R ^= F(L); | |
420 R ^= skey->blowfish.K[r++]; L ^= F(R); | |
421 L ^= skey->blowfish.K[r++]; R ^= F(L); | |
422 R ^= skey->blowfish.K[r++]; L ^= F(R); | |
423 } | |
424 | |
425 /* last keying */ | |
426 R ^= skey->blowfish.K[17]; | |
427 L ^= skey->blowfish.K[16]; | |
428 | |
429 /* store */ | |
430 STORE32H(R, &ct[0]); | |
431 STORE32H(L, &ct[4]); | |
432 | |
433 return CRYPT_OK; | |
434 } | |
435 | |
436 #ifdef LTC_CLEAN_STACK | |
437 int blowfish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) | |
438 { | |
439 int err = _blowfish_ecb_encrypt(pt, ct, skey); | |
440 burn_stack(sizeof(ulong32) * 2 + sizeof(int)); | |
441 return err; | |
442 } | |
443 #endif | |
444 | |
445 /** | |
446 Decrypts a block of text with Blowfish | |
447 @param ct The input ciphertext (8 bytes) | |
448 @param pt The output plaintext (8 bytes) | |
449 @param skey The key as scheduled | |
450 @return CRYPT_OK if successful | |
451 */ | |
452 #ifdef LTC_CLEAN_STACK | |
453 static int _blowfish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) | |
454 #else | |
455 int blowfish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) | |
456 #endif | |
457 { | |
458 ulong32 L, R; | |
459 int r; | |
460 #ifndef __GNUC__ | |
461 ulong32 *S1, *S2, *S3, *S4; | |
462 #endif | |
463 | |
464 LTC_ARGCHK(pt != NULL); | |
465 LTC_ARGCHK(ct != NULL); | |
466 LTC_ARGCHK(skey != NULL); | |
467 | |
468 #ifndef __GNUC__ | |
469 S1 = skey->blowfish.S[0]; | |
470 S2 = skey->blowfish.S[1]; | |
471 S3 = skey->blowfish.S[2]; | |
472 S4 = skey->blowfish.S[3]; | |
473 #endif | |
474 | |
475 /* load it */ | |
476 LOAD32H(R, &ct[0]); | |
477 LOAD32H(L, &ct[4]); | |
478 | |
479 /* undo last keying */ | |
480 R ^= skey->blowfish.K[17]; | |
481 L ^= skey->blowfish.K[16]; | |
482 | |
483 /* do 16 rounds */ | |
484 for (r = 15; r > 0; ) { | |
485 L ^= F(R); R ^= skey->blowfish.K[r--]; | |
486 R ^= F(L); L ^= skey->blowfish.K[r--]; | |
487 L ^= F(R); R ^= skey->blowfish.K[r--]; | |
488 R ^= F(L); L ^= skey->blowfish.K[r--]; | |
489 } | |
490 | |
491 /* store */ | |
492 STORE32H(L, &pt[0]); | |
493 STORE32H(R, &pt[4]); | |
494 return CRYPT_OK; | |
495 } | |
496 | |
497 #ifdef LTC_CLEAN_STACK | |
498 int blowfish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) | |
499 { | |
500 int err = _blowfish_ecb_decrypt(ct, pt, skey); | |
501 burn_stack(sizeof(ulong32) * 2 + sizeof(int)); | |
502 return err; | |
503 } | |
504 #endif | |
505 | |
506 | |
507 /** | |
508 Performs a self-test of the Blowfish block cipher | |
509 @return CRYPT_OK if functional, CRYPT_NOP if self-test has been disabled | |
510 */ | |
511 int blowfish_test(void) | |
512 { | |
513 #ifndef LTC_TEST | |
514 return CRYPT_NOP; | |
515 #else | |
516 int err; | |
517 symmetric_key key; | |
518 static const struct { | |
519 unsigned char key[8], pt[8], ct[8]; | |
520 } tests[] = { | |
521 { | |
522 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, | |
523 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, | |
524 { 0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78} | |
525 }, | |
526 { | |
527 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, | |
528 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, | |
529 { 0x51, 0x86, 0x6F, 0xD5, 0xB8, 0x5E, 0xCB, 0x8A} | |
530 }, | |
531 { | |
532 { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, | |
533 { 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, | |
534 { 0x7D, 0x85, 0x6F, 0x9A, 0x61, 0x30, 0x63, 0xF2} | |
535 } | |
536 }; | |
537 unsigned char tmp[2][8]; | |
538 int x, y; | |
539 | |
540 for (x = 0; x < (int)(sizeof(tests) / sizeof(tests[0])); x++) { | |
541 /* setup key */ | |
542 if ((err = blowfish_setup(tests[x].key, 8, 16, &key)) != CRYPT_OK) { | |
543 return err; | |
544 } | |
545 | |
546 /* encrypt and decrypt */ | |
547 blowfish_ecb_encrypt(tests[x].pt, tmp[0], &key); | |
548 blowfish_ecb_decrypt(tmp[0], tmp[1], &key); | |
549 | |
550 /* compare */ | |
551 if ((XMEMCMP(tmp[0], tests[x].ct, 8) != 0) || (XMEMCMP(tmp[1], tests[x].pt, 8) != 0)) { | |
552 return CRYPT_FAIL_TESTVECTOR; | |
553 } | |
554 | |
555 /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */ | |
556 for (y = 0; y < 8; y++) tmp[0][y] = 0; | |
557 for (y = 0; y < 1000; y++) blowfish_ecb_encrypt(tmp[0], tmp[0], &key); | |
558 for (y = 0; y < 1000; y++) blowfish_ecb_decrypt(tmp[0], tmp[0], &key); | |
559 for (y = 0; y < 8; y++) if (tmp[0][y] != 0) return CRYPT_FAIL_TESTVECTOR; | |
560 } | |
561 return CRYPT_OK; | |
562 #endif | |
563 } | |
564 | |
565 /** Terminate the context | |
566 @param skey The scheduled key | |
567 */ | |
568 void blowfish_done(symmetric_key *skey) | |
569 { | |
570 } | |
571 | |
572 /** | |
573 Gets suitable key size | |
574 @param keysize [in/out] The length of the recommended key (in bytes). This function will store the suitable size back in this variable. | |
575 @return CRYPT_OK if the input key size is acceptable. | |
576 */ | |
577 int blowfish_keysize(int *keysize) | |
578 { | |
579 LTC_ARGCHK(keysize != NULL); | |
580 | |
581 if (*keysize < 8) { | |
582 return CRYPT_INVALID_KEYSIZE; | |
583 } else if (*keysize > 56) { | |
584 *keysize = 56; | |
585 } | |
586 return CRYPT_OK; | |
587 } | |
588 | |
589 #endif | |
590 | |
591 | |
592 /* $Source: /cvs/libtom/libtomcrypt/src/ciphers/blowfish.c,v $ */ | |
593 /* $Revision: 1.12 $ */ | |
594 /* $Date: 2006/11/08 23:01:06 $ */ |