OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2007 KISA(Korea Information Security Agency). All rights reserv
ed. | 2 * Copyright (c) 2007 KISA(Korea Information Security Agency). All rights reserv
ed. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Neither the name of author nor the names of its contributors may | 9 * 2. Neither the name of author nor the names of its contributors may |
10 * be used to endorse or promote products derived from this software | 10 * be used to endorse or promote products derived from this software |
(...skipping 17 matching lines...) Expand all Loading... |
28 #include <stdio.h> | 28 #include <stdio.h> |
29 #include <stdlib.h> | 29 #include <stdlib.h> |
30 #include <string.h> | 30 #include <string.h> |
31 #ifdef WIN32 | 31 #ifdef WIN32 |
32 #include <memory.h> | 32 #include <memory.h> |
33 #endif | 33 #endif |
34 | 34 |
35 #include <openssl/seed.h> | 35 #include <openssl/seed.h> |
36 #include "seed_locl.h" | 36 #include "seed_locl.h" |
37 | 37 |
38 static seed_word SS[4][256] = {»{ | 38 static const seed_word SS[4][256] = {» { |
39 0x2989a1a8, 0x05858184, 0x16c6d2d4, 0x13c3d3d0, 0x14445054, 0x1d0d111c,
0x2c8ca0ac, 0x25052124, | 39 0x2989a1a8, 0x05858184, 0x16c6d2d4, 0x13c3d3d0, 0x14445054, 0x1d0d111c,
0x2c8ca0ac, 0x25052124, |
40 0x1d4d515c, 0x03434340, 0x18081018, 0x1e0e121c, 0x11415150, 0x3cccf0fc,
0x0acac2c8, 0x23436360, | 40 0x1d4d515c, 0x03434340, 0x18081018, 0x1e0e121c, 0x11415150, 0x3cccf0fc,
0x0acac2c8, 0x23436360, |
41 0x28082028, 0x04444044, 0x20002020, 0x1d8d919c, 0x20c0e0e0, 0x22c2e2e0,
0x08c8c0c8, 0x17071314, | 41 0x28082028, 0x04444044, 0x20002020, 0x1d8d919c, 0x20c0e0e0, 0x22c2e2e0,
0x08c8c0c8, 0x17071314, |
42 0x2585a1a4, 0x0f8f838c, 0x03030300, 0x3b4b7378, 0x3b8bb3b8, 0x13031310,
0x12c2d2d0, 0x2ecee2ec, | 42 0x2585a1a4, 0x0f8f838c, 0x03030300, 0x3b4b7378, 0x3b8bb3b8, 0x13031310,
0x12c2d2d0, 0x2ecee2ec, |
43 0x30407070, 0x0c8c808c, 0x3f0f333c, 0x2888a0a8, 0x32023230, 0x1dcdd1dc,
0x36c6f2f4, 0x34447074, | 43 0x30407070, 0x0c8c808c, 0x3f0f333c, 0x2888a0a8, 0x32023230, 0x1dcdd1dc,
0x36c6f2f4, 0x34447074, |
44 0x2ccce0ec, 0x15859194, 0x0b0b0308, 0x17475354, 0x1c4c505c, 0x1b4b5358,
0x3d8db1bc, 0x01010100, | 44 0x2ccce0ec, 0x15859194, 0x0b0b0308, 0x17475354, 0x1c4c505c, 0x1b4b5358,
0x3d8db1bc, 0x01010100, |
45 0x24042024, 0x1c0c101c, 0x33437370, 0x18889098, 0x10001010, 0x0cccc0cc,
0x32c2f2f0, 0x19c9d1d8, | 45 0x24042024, 0x1c0c101c, 0x33437370, 0x18889098, 0x10001010, 0x0cccc0cc,
0x32c2f2f0, 0x19c9d1d8, |
46 0x2c0c202c, 0x27c7e3e4, 0x32427270, 0x03838380, 0x1b8b9398, 0x11c1d1d0,
0x06868284, 0x09c9c1c8, | 46 0x2c0c202c, 0x27c7e3e4, 0x32427270, 0x03838380, 0x1b8b9398, 0x11c1d1d0,
0x06868284, 0x09c9c1c8, |
47 0x20406060, 0x10405050, 0x2383a3a0, 0x2bcbe3e8, 0x0d0d010c, 0x3686b2b4,
0x1e8e929c, 0x0f4f434c, | 47 0x20406060, 0x10405050, 0x2383a3a0, 0x2bcbe3e8, 0x0d0d010c, 0x3686b2b4,
0x1e8e929c, 0x0f4f434c, |
48 0x3787b3b4, 0x1a4a5258, 0x06c6c2c4, 0x38487078, 0x2686a2a4, 0x12021210,
0x2f8fa3ac, 0x15c5d1d4, | 48 0x3787b3b4, 0x1a4a5258, 0x06c6c2c4, 0x38487078, 0x2686a2a4, 0x12021210,
0x2f8fa3ac, 0x15c5d1d4, |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 #define KC7 0x1bbcdccf | 180 #define KC7 0x1bbcdccf |
181 #define KC8 0x3779b99e | 181 #define KC8 0x3779b99e |
182 #define KC9 0x6ef3733c | 182 #define KC9 0x6ef3733c |
183 #define KC10 0xdde6e678 | 183 #define KC10 0xdde6e678 |
184 #define KC11 0xbbcdccf1 | 184 #define KC11 0xbbcdccf1 |
185 #define KC12 0x779b99e3 | 185 #define KC12 0x779b99e3 |
186 #define KC13 0xef3733c6 | 186 #define KC13 0xef3733c6 |
187 #define KC14 0xde6e678d | 187 #define KC14 0xde6e678d |
188 #define KC15 0xbcdccf1b | 188 #define KC15 0xbcdccf1b |
189 | 189 |
| 190 #if defined(OPENSSL_SMALL_FOOTPRINT) |
| 191 static const seed_word KC[] = { |
| 192 KC0, KC1, KC2, KC3, KC4, KC5, KC6, KC7, |
| 193 KC8, KC9, KC10, KC11, KC12, KC13, KC14, KC15 }; |
| 194 #endif |
190 | 195 |
191 void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], SEED_KEY_SCHEDULE
*ks) | 196 void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], SEED_KEY_SCHEDULE
*ks) |
192 { | 197 { |
193 seed_word x1, x2, x3, x4; | 198 seed_word x1, x2, x3, x4; |
194 seed_word t0, t1; | 199 seed_word t0, t1; |
195 | 200 |
196 char2word(rawkey , x1); | 201 char2word(rawkey , x1); |
197 char2word(rawkey+4 , x2); | 202 char2word(rawkey+4 , x2); |
198 char2word(rawkey+8 , x3); | 203 char2word(rawkey+8 , x3); |
199 char2word(rawkey+12, x4); | 204 char2word(rawkey+12, x4); |
200 | 205 |
201 t0 = (x1 + x3 - KC0) & 0xffffffff; | 206 t0 = (x1 + x3 - KC0) & 0xffffffff; |
202 t1 = (x2 - x4 + KC0) & 0xffffffff; KEYUPDATE_TEMP(t0
, t1, &ks->data[0]); | 207 t1 = (x2 - x4 + KC0) & 0xffffffff; KEYUPDATE_TEMP(t0
, t1, &ks->data[0]); |
203 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC1); KEYUPDATE_TEMP(t0
, t1, &ks->data[2]); | 208 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC1); KEYUPDATE_TEMP(t0
, t1, &ks->data[2]); |
| 209 |
| 210 #if !defined(OPENSSL_SMALL_FOOTPRINT) |
204 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC2); KEYUPDATE_TEMP(t0
, t1, &ks->data[4]); | 211 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC2); KEYUPDATE_TEMP(t0
, t1, &ks->data[4]); |
205 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC3); KEYUPDATE_TEMP(t0
, t1, &ks->data[6]); | 212 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC3); KEYUPDATE_TEMP(t0
, t1, &ks->data[6]); |
206 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC4); KEYUPDATE_TEMP(t0
, t1, &ks->data[8]); | 213 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC4); KEYUPDATE_TEMP(t0
, t1, &ks->data[8]); |
207 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC5); KEYUPDATE_TEMP(t0
, t1, &ks->data[10]); | 214 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC5); KEYUPDATE_TEMP(t0
, t1, &ks->data[10]); |
208 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC6); KEYUPDATE_TEMP(t0
, t1, &ks->data[12]); | 215 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC6); KEYUPDATE_TEMP(t0
, t1, &ks->data[12]); |
209 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC7); KEYUPDATE_TEMP(t0
, t1, &ks->data[14]); | 216 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC7); KEYUPDATE_TEMP(t0
, t1, &ks->data[14]); |
210 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC8); KEYUPDATE_TEMP(t0
, t1, &ks->data[16]); | 217 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC8); KEYUPDATE_TEMP(t0
, t1, &ks->data[16]); |
211 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC9); KEYUPDATE_TEMP(t0
, t1, &ks->data[18]); | 218 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC9); KEYUPDATE_TEMP(t0
, t1, &ks->data[18]); |
212 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC10); KEYUPDATE_TEMP(t0
, t1, &ks->data[20]); | 219 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC10); KEYUPDATE_TEMP(t0
, t1, &ks->data[20]); |
213 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC11); KEYUPDATE_TEMP(t0
, t1, &ks->data[22]); | 220 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC11); KEYUPDATE_TEMP(t0
, t1, &ks->data[22]); |
214 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC12); KEYUPDATE_TEMP(t0
, t1, &ks->data[24]); | 221 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC12); KEYUPDATE_TEMP(t0
, t1, &ks->data[24]); |
215 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC13); KEYUPDATE_TEMP(t0
, t1, &ks->data[26]); | 222 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC13); KEYUPDATE_TEMP(t0
, t1, &ks->data[26]); |
216 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC14); KEYUPDATE_TEMP(t0
, t1, &ks->data[28]); | 223 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC14); KEYUPDATE_TEMP(t0
, t1, &ks->data[28]); |
217 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC15); KEYUPDATE_TEMP(t0
, t1, &ks->data[30]); | 224 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC15); KEYUPDATE_TEMP(t0
, t1, &ks->data[30]); |
| 225 #else |
| 226 { |
| 227 int i; |
| 228 for (i=2; i<16; i+=2) { |
| 229 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC[i]); |
| 230 KEYUPDATE_TEMP(t0, t1, &ks->data[i*2]); |
| 231 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC[i+1]); |
| 232 KEYUPDATE_TEMP(t0, t1, &ks->data[i*2+2]); |
| 233 } |
| 234 } |
| 235 #endif |
218 } | 236 } |
219 | 237 |
220 void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_B
LOCK_SIZE], const SEED_KEY_SCHEDULE *ks) | 238 void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_B
LOCK_SIZE], const SEED_KEY_SCHEDULE *ks) |
221 { | 239 { |
222 seed_word x1, x2, x3, x4; | 240 seed_word x1, x2, x3, x4; |
223 seed_word t0, t1; | 241 seed_word t0, t1; |
224 | 242 |
225 char2word(s, x1); | 243 char2word(s, x1); |
226 char2word(s+4, x2); | 244 char2word(s+4, x2); |
227 char2word(s+8, x3); | 245 char2word(s+8, x3); |
228 char2word(s+12, x4); | 246 char2word(s+12, x4); |
229 » | 247 |
| 248 #if !defined(OPENSSL_SMALL_FOOTPRINT)» |
230 E_SEED(t0, t1, x1, x2, x3, x4, 0); | 249 E_SEED(t0, t1, x1, x2, x3, x4, 0); |
231 E_SEED(t0, t1, x3, x4, x1, x2, 2); | 250 E_SEED(t0, t1, x3, x4, x1, x2, 2); |
232 E_SEED(t0, t1, x1, x2, x3, x4, 4); | 251 E_SEED(t0, t1, x1, x2, x3, x4, 4); |
233 E_SEED(t0, t1, x3, x4, x1, x2, 6); | 252 E_SEED(t0, t1, x3, x4, x1, x2, 6); |
234 E_SEED(t0, t1, x1, x2, x3, x4, 8); | 253 E_SEED(t0, t1, x1, x2, x3, x4, 8); |
235 E_SEED(t0, t1, x3, x4, x1, x2, 10); | 254 E_SEED(t0, t1, x3, x4, x1, x2, 10); |
236 E_SEED(t0, t1, x1, x2, x3, x4, 12); | 255 E_SEED(t0, t1, x1, x2, x3, x4, 12); |
237 E_SEED(t0, t1, x3, x4, x1, x2, 14); | 256 E_SEED(t0, t1, x3, x4, x1, x2, 14); |
238 E_SEED(t0, t1, x1, x2, x3, x4, 16); | 257 E_SEED(t0, t1, x1, x2, x3, x4, 16); |
239 E_SEED(t0, t1, x3, x4, x1, x2, 18); | 258 E_SEED(t0, t1, x3, x4, x1, x2, 18); |
240 E_SEED(t0, t1, x1, x2, x3, x4, 20); | 259 E_SEED(t0, t1, x1, x2, x3, x4, 20); |
241 E_SEED(t0, t1, x3, x4, x1, x2, 22); | 260 E_SEED(t0, t1, x3, x4, x1, x2, 22); |
242 E_SEED(t0, t1, x1, x2, x3, x4, 24); | 261 E_SEED(t0, t1, x1, x2, x3, x4, 24); |
243 E_SEED(t0, t1, x3, x4, x1, x2, 26); | 262 E_SEED(t0, t1, x3, x4, x1, x2, 26); |
244 E_SEED(t0, t1, x1, x2, x3, x4, 28); | 263 E_SEED(t0, t1, x1, x2, x3, x4, 28); |
245 E_SEED(t0, t1, x3, x4, x1, x2, 30); | 264 E_SEED(t0, t1, x3, x4, x1, x2, 30); |
| 265 #else |
| 266 { |
| 267 int i; |
| 268 for (i=0;i<30;i+=4) { |
| 269 E_SEED(t0,t1,x1,x2,x3,x4,i); |
| 270 E_SEED(t0,t1,x3,x4,x1,x2,i+2); |
| 271 } |
| 272 } |
| 273 #endif |
246 | 274 |
247 word2char(x3, d); | 275 word2char(x3, d); |
248 word2char(x4, d+4); | 276 word2char(x4, d+4); |
249 word2char(x1, d+8); | 277 word2char(x1, d+8); |
250 word2char(x2, d+12); | 278 word2char(x2, d+12); |
251 } | 279 } |
252 | 280 |
253 void SEED_decrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_B
LOCK_SIZE], const SEED_KEY_SCHEDULE *ks) | 281 void SEED_decrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_B
LOCK_SIZE], const SEED_KEY_SCHEDULE *ks) |
254 { | 282 { |
255 seed_word x1, x2, x3, x4; | 283 seed_word x1, x2, x3, x4; |
256 seed_word t0, t1; | 284 seed_word t0, t1; |
257 | 285 |
258 char2word(s, x1); | 286 char2word(s, x1); |
259 char2word(s+4, x2); | 287 char2word(s+4, x2); |
260 char2word(s+8, x3); | 288 char2word(s+8, x3); |
261 char2word(s+12, x4); | 289 char2word(s+12, x4); |
262 » | 290 |
| 291 #if !defined(OPENSSL_SMALL_FOOTPRINT) |
263 E_SEED(t0, t1, x1, x2, x3, x4, 30); | 292 E_SEED(t0, t1, x1, x2, x3, x4, 30); |
264 E_SEED(t0, t1, x3, x4, x1, x2, 28); | 293 E_SEED(t0, t1, x3, x4, x1, x2, 28); |
265 E_SEED(t0, t1, x1, x2, x3, x4, 26); | 294 E_SEED(t0, t1, x1, x2, x3, x4, 26); |
266 E_SEED(t0, t1, x3, x4, x1, x2, 24); | 295 E_SEED(t0, t1, x3, x4, x1, x2, 24); |
267 E_SEED(t0, t1, x1, x2, x3, x4, 22); | 296 E_SEED(t0, t1, x1, x2, x3, x4, 22); |
268 E_SEED(t0, t1, x3, x4, x1, x2, 20); | 297 E_SEED(t0, t1, x3, x4, x1, x2, 20); |
269 E_SEED(t0, t1, x1, x2, x3, x4, 18); | 298 E_SEED(t0, t1, x1, x2, x3, x4, 18); |
270 E_SEED(t0, t1, x3, x4, x1, x2, 16); | 299 E_SEED(t0, t1, x3, x4, x1, x2, 16); |
271 E_SEED(t0, t1, x1, x2, x3, x4, 14); | 300 E_SEED(t0, t1, x1, x2, x3, x4, 14); |
272 E_SEED(t0, t1, x3, x4, x1, x2, 12); | 301 E_SEED(t0, t1, x3, x4, x1, x2, 12); |
273 E_SEED(t0, t1, x1, x2, x3, x4, 10); | 302 E_SEED(t0, t1, x1, x2, x3, x4, 10); |
274 E_SEED(t0, t1, x3, x4, x1, x2, 8); | 303 E_SEED(t0, t1, x3, x4, x1, x2, 8); |
275 E_SEED(t0, t1, x1, x2, x3, x4, 6); | 304 E_SEED(t0, t1, x1, x2, x3, x4, 6); |
276 E_SEED(t0, t1, x3, x4, x1, x2, 4); | 305 E_SEED(t0, t1, x3, x4, x1, x2, 4); |
277 E_SEED(t0, t1, x1, x2, x3, x4, 2); | 306 E_SEED(t0, t1, x1, x2, x3, x4, 2); |
278 E_SEED(t0, t1, x3, x4, x1, x2, 0); | 307 E_SEED(t0, t1, x3, x4, x1, x2, 0); |
| 308 #else |
| 309 { |
| 310 int i; |
| 311 for (i=30; i>0; i-=4) { |
| 312 E_SEED(t0, t1, x1, x2, x3, x4, i); |
| 313 E_SEED(t0, t1, x3, x4, x1, x2, i-2); |
| 314 |
| 315 } |
| 316 } |
| 317 #endif |
279 | 318 |
280 word2char(x3, d); | 319 word2char(x3, d); |
281 word2char(x4, d+4); | 320 word2char(x4, d+4); |
282 word2char(x1, d+8); | 321 word2char(x1, d+8); |
283 word2char(x2, d+12); | 322 word2char(x2, d+12); |
284 } | 323 } |
285 | 324 |
286 #endif /* OPENSSL_NO_SEED */ | 325 #endif /* OPENSSL_NO_SEED */ |
OLD | NEW |