Develop and Download Open Source Software

Browse Subversion Repository

Contents of /branches/mty-makai/mty.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 29 - (show annotations) (download) (as text)
Mon Mar 19 04:56:09 2007 UTC (17 years ago) by chapuni
Original Path: mty/mty.c
File MIME type: text/x-csrc
File size: 22345 byte(s)
@14における、[64:65]のクリアは、ループ回す必要がないね。という些細な変更。
1 /***********************************************************************
2 *
3 * file: mty.c
4 *
5 * ‚Ü‚ A‘Ň‚Ä‰ŽB
6 *
7 * $Id$
8 *
9 */
10
11 #include <assert.h>
12 #include <ctype.h>
13 #include <errno.h>
14 #include <malloc.h>
15 #include <limits.h>
16 #include <stdarg.h>
17 #include <stddef.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <time.h>
22
23 #if defined(WIN32)
24
25 #include <windows.h>
26 #include <sys/timeb.h>
27
28 #elif defined(__GNUC__)
29
30 #include <sys/mman.h>
31 #include <sys/time.h>
32
33 #endif
34
35 #include "config.h"
36 #include "crypt64.h"
37 #include "dt4.h"
38 #include "expr.h"
39 #include "translate.h"
40
41 #define N_I (sizeof(WS_T) / sizeof(uint32_t))
42 #define N_ALU (sizeof(WS_T) / sizeof(ALU_T))
43 #define ALU_BITS (CHAR_BIT * sizeof(ALU_T))
44
45 /* ŒŽ“]’u PC1 */
46 static int const tr_pc1[8][7] =
47 {
48 { 8, 16, 24, 56, 52, 44, 36},
49 { 7, 15, 23, 55, 51, 43, 35},
50 { 6, 14, 22, 54, 50, 42, 34},
51 { 5, 13, 21, 53, 49, 41, 33},
52 { 4, 12, 20, 28, 48, 40, 32},
53 { 3, 11, 19, 27, 47, 39, 31},
54 { 2, 10, 18, 26, 46, 38, 30},
55 { 1, 9, 17, 25, 45, 37, 29},
56 };
57
58 /* LRĹI“]’u */
59 static int const tr_fp[64 + 2] =
60 {
61 39, 7, 47, 15, 55, 23, 63, 31,
62 38, 6, 46, 14, 54, 22, 62, 30,
63 37, 5, 45, 13, 53, 21, 61, 29,
64 36, 4, 44, 12, 52, 20, 60, 28,
65 35, 3, 43, 11, 51, 19, 59, 27,
66 34, 2, 42, 10, 50, 18, 58, 26,
67 33, 1, 41, 9, 49, 17, 57, 25,
68 32, 0, 40, 8, 48, 16, 56, 24,
69 64, 64,
70 };
71
72 /* ŒŽƒVƒtƒgƒXƒPƒWƒ…[ƒ‹
73 KEY::k[2] ‚đćґň‚É—p‚˘‚ÄŽć‚čo‚ľ‚ĚŠČ‘f‰ť‚đ}‚é */
74 static int ks_ls[] =
75 {
76 1, 1, 2, -1,
77 2, -1, 2, -1,
78 2, -1, 2, -1,
79 2, -1, 1, 2,
80 -1, 2, -1, 2,
81 -1, 2, -1, 2,
82 -1, 2, -1, 1 - 28,
83 };
84
85 /* 1ƒrƒbƒg•Ş */
86 typedef union SLICE
87 {
88 uint32_t i[N_I]; /* 32-bit initializer */
89 ALU_T a[N_ALU]; /* C ‚Ĺˆľ‚˘‚₡‚˘ƒTƒCƒY */
90 WS_T w; /* ƒGƒ“ƒR[ƒh‚Ĺˆľ‚¤ƒTƒCƒY */
91 } SLICE;
92
93 /* crypt64() ‚Ş‹ň‚¤ƒpƒ‰ƒ[ƒ^ */
94 struct PARAM
95 {
96 SLICE lr[2][32];
97 SLICE t[32];
98 SLICE hit[10][64];
99 SLICE hiti[10][26];
100 };
101
102 /* ŒŽ‚ÍLR ‚ƁA‚ť‚ĚƒRƒs[‚Ş•K—v
103 KEY::k[0] LR
104 KEY::k[1] LR‚ĚƒRƒs[(č—]‚đČ‚­‚˝‚ß)
105 KEY::k[2][0][i].a[0] ŽŸŒŽ‚Ö‚Ě‘•Ş */
106 struct KEY
107 {
108 SLICE k[2][2][28];
109 SLICE ks[28];
110 };
111
112 /* ŒŽ•śŽš—ń */
113 unsigned char key[8 + 8];
114 unsigned char okey[8 + 8];
115
116 /* ŒŽƒNƒ‰ƒX */
117 struct
118 {
119 unsigned cls;
120 unsigned map[256];
121 } kcls[8 + 8];
122
123
124 /* Šg’ŁŒŽƒNƒ‰ƒX */
125 #define KCLS_DT0 64
126 #define KCLS_DT1 128
127 #define KCLS_K2 256
128
129 #if USE_DT
130 /* ŒŽƒLƒ—pŽŤ‘ƒCƒ“ƒfƒNƒX */
131 struct DT *kd[8 + 8];
132
133 /* ŽŤ‘ƒCƒ“ƒfƒNƒX */
134 struct DT *dtidx[0x100 + 1];
135 #endif
136
137 /* Žw’肳‚ę‚˝ƒNƒ‰ƒX‚Ć“ü‚Á‚Ä‚˘‚éƒL[‚Š‚çAclassify ‚đs‚¤ */
138 void
139 key_make_map(int n)
140 {
141 int i, j;
142 unsigned c = kcls[n].map[key[n]];
143
144 if (3 <= n && n < 7 && kd[n - 3])
145 {
146 /* ŽŤ‘‚ĚƒPƒc‚Ě•śŽšBŒă‚ë‚Ƀiƒjƒ„ƒ‰ƒLƒƒƒ‰ƒNƒ^‚Ş—ˆ‚é */
147 c = kd[n - 3]->c[0];
148 if ((0x81 <= c && c <= 0x9F)
149 || (0xE0 <= c && c <= 0xFC))
150 c = KCLS_K2;
151 else
152 c = (cp932[256 * key[n]]
153 | cp932[256 * (key[n] ^ 0x80)]);
154 #if DEBUG>=1
155 printf("*n=%d, key=%02X, cls=%04X\n",
156 n,
157 key[n],
158 c);
159 #endif
160 }
161 else if (2 <= n && n < 6 && kd[n - 2])
162 {
163 return;
164 }
165 else if (1 <= n && n < 5 && kd[n - 1])
166 {
167 return;
168 }
169 else if (1 <= n && n < 5 && !kd[n - 1]
170 //&& (c & KCLS_K2)
171 && (c & KCLS_DT1))
172 {
173 /* ŠżŽš2•śŽš‚đE‚Á‚Ä‚˘‚Ť‚܂ */
174 #if DEBUG>=1
175 printf("(%d)%02X %02X(%02X:%02X:%02X:%02X)\n",
176 n, key[n - 1], key[n],
177 cp932[(256 * key[n - 1] + key[n])],
178 cp932[(256 * key[n - 1] + key[n]) ^ 0x0080],
179 cp932[(256 * key[n - 1] + key[n]) ^ 0x8000],
180 cp932[(256 * key[n - 1] + key[n]) ^ 0x8080]);
181 #endif
182 if (n != 1 && n != 2
183 && (cp932[(256 * key[n - 1] + key[n]) ^ 0x0080] & KCLS_DT1))
184 key[n] ^= 0x80;
185 else if (n != 2 && n != 3
186 && (cp932[(256 * key[n - 1] + key[n]) ^ 0x8000] & KCLS_DT1))
187 key[n - 1] ^= 0x80;
188 else if (n > 3 && (cp932[(256 * key[n - 1] + key[n]) ^ 0x8080] & KCLS_DT1))
189 key[n - 1] ^= 0x80, key[n] ^= 0x80;
190 if (cp932[256 * key[n - 1] + key[n]] & KCLS_DT1)
191 {
192 for (kd[n - 1] = dtidx[key[n - 1]];
193 kd[n - 1]->c[1] != key[n];
194 kd[n - 1]++)
195 assert(kd[n - 1]->c[0] == key[n - 1]);
196 #if DEBUG>=1
197 printf("(%02X%02X:%02X%02X)%c%c%c%c\n",
198 kd[n - 1]->c[0],
199 kd[n - 1]->c[1],
200 kd[n - 1]->c[2],
201 kd[n - 1]->c[3],
202 kd[n - 1]->c[0],
203 kd[n - 1]->c[1],
204 kd[n - 1]->c[2],
205 kd[n - 1]->c[3]);
206 #endif
207 return;
208 }
209 }
210 else if (n < 4 && (c & KCLS_DT0) && kd[n] == NULL)
211 {
212 /* ƒJƒ^ƒJƒi–„‚ߍž‚Ý‚˘‚Ť‚Ü‚ˇ */
213 assert(kd[n] == NULL);
214 #if DEBUG>=1
215 printf("n=%d, key=%02X\n", n, key[n]);
216 #endif
217 kd[n] = dtidx[key[n]];
218 if (!kd[n]
219 && !(n == 1 || n == 2)
220 && dtidx[key[n] ^ 0x80])
221 {
222 key[n] ^= 0x80;
223 kd[n] = dtidx[key[n]];
224 }
225 if (kd[n])
226 return;
227 }
228 else
229 {
230 kd[n] = NULL;
231 }
232
233 /* ĹŒă‚Ě•”•Ş‚Í class map ‚đśŹ‚ˇ‚é•K—vƒiƒV */
234 if (n >= 6)
235 return;
236
237 for (i = 0; i < 256; i++)
238 {
239 unsigned bm = 0;
240 #if 1
241 if (c & KCLS_K1)
242 {
243 if (cp932[256 * key[n] + i] & KCLS_K1)
244 bm |= KCLS_K2 | (cp932[256 * key[n] + i] & KCLS_DT1);
245 if (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_K1)
246 bm |= KCLS_K2 | (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_DT1);
247 #if 0
248 bm |= ((cp932[256 * key[n] + i] & KCLS_K1)
249 || (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_K1)
250 ? KCLS_K2 : 0);
251 #endif
252 }
253 if (c & (KCLS_AN | KCLS_KA | KCLS_K2))
254 for (j = 0; j < 256; j++)
255 {
256 bm |= cp932[256 * i + j] & (KCLS_AN | KCLS_KA | KCLS_K1
257 | KCLS_DT0);
258 #if 0
259 if (j >= 127 && !(n == 0 || n == 1))
260 break;
261 #endif
262 }
263 kcls[n + 1].map[i] = bm;
264 #endif
265 if (i >= 128 && !(n == 0 || n == 1))
266 kcls[n + 1].map[i - 128] |= kcls[n + 1].map[i];
267 }
268
269 if (n < 6)
270 kcls[n + 1].map[0x00] = kcls[n + 1].map[0x80] = 0;
271 if (n == 6)
272 kcls[7].map[0x00] |= KCLS_AN;
273 }
274
275 unsigned
276 dt_get(int kdn,
277 int xn,
278 int n,
279 int ch)
280 {
281 int i;
282 #if DEBUG>=1
283 printf("*dt_get(%d)%c%c%c%c(%02X%02X:%02X%02X)->ch=%d",
284 n,
285 kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
286 kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
287 ch);
288 #endif
289 /* ‚Ü‚¸‚͐”‚Ś‚é */
290 for (i = 0;
291 kd[kdn][i].c[xn] == kd[kdn]->c[xn];
292 i++)
293 ;
294 assert(i > 0);
295 kd[kdn] += ch % i;
296 #if DEBUG>=1
297 printf("/%d\n dt_get: %c%c%c%c(%02X%02X:%02X%02X)->ch=%d\n",
298 i,
299 kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
300 kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
301 ch);
302 #endif
303 return kd[kdn]->c[n];
304 }
305
306 /* ƒ}ƒbƒv‚Š‚ç•śŽš‚đE‚Á‚ăZƒbƒg */
307 unsigned
308 key_set(int n, unsigned ch)
309 {
310 int cnt = 0, i;
311
312 if (3 <= n && n < 7 && kd[n - 3])
313 {
314 return dt_get(n - 3, 2, 3, ch);
315 return kd[n - 3]->c[3];
316 }
317 else if (2 <= n && n < 6 && kd[n - 2])
318 {
319 return dt_get(n - 2, 1, 2, ch);
320 return kd[n - 2]->c[2];
321 }
322 else if (1 <= n && n < 5 && kd[n - 1])
323 {
324 return dt_get(n - 1, 0, 1, ch);
325 return kd[n - 1]->c[1];
326 }
327
328 #if DEBUG>=3
329 if (cnt == 0)
330 {
331 printf("n=%d, ch=%d, (n-1)=%02X\n", n, ch, key[n - 1]);
332 int j;
333 for (i = 0; i < 16; i++)
334 {
335 printf("map[0x%02X] =", 16 * i);
336 for (j = 0; j < 16; j++)
337 printf(" %03X", kcls[n].map[16 * i + j]);
338 printf("\n");
339 }
340 }
341 #endif
342 for (i = 0; i < 256; i++)
343 {
344 if (kcls[n].map[i])
345 {
346 if (ch-- == 0)
347 return i;
348 cnt++;
349 }
350 if (n != 1 && n != 2 && i >= 127)
351 break;
352 }
353 /* ŒŠ‚Â‚Š‚ç‚ȂЂÁ‚˝‚Ě‚Ĺ‚ŕ‚˘‚Á‚Ř‚ń */
354 assert(cnt > 0);
355 ch %= cnt;
356 for (i = 0; i < 256; i++)
357 if (kcls[n].map[i])
358 {
359 if (ch-- == 0)
360 return i;
361 }
362 assert(!"not matched");
363 return 0;
364 }
365
366 /* bitwise key ‚đƒZƒbƒg */
367 static
368 void
369 key_set64(struct KEY *key64,
370 int n,
371 unsigned k,
372 unsigned vk,
373 unsigned sk)
374 {
375 int i, j;
376 if (!((vk | sk) & 0x7F))
377 return;
378
379 for (i = 0; i < 7; i++)
380 {
381 if (n == 7 && i < N_STRIDE) continue;
382 if (sk & (1 << i))
383 {
384 /* ƒZƒbƒg */
385 int o = tr_pc1[n][6 - i] - 1;
386 if (o < 28)
387 {
388 assert(o >= 0);
389 for (j = 0; j < N_ALU; j++)
390 key64->k[0][0][o].a[j]
391 = key64->k[0][1][o].a[j]
392 = -!!(k & (1 << i));
393 }
394 else
395 {
396 assert(o >= 28);
397 assert(o < 56);
398 for (j = 0; j < N_ALU; j++)
399 key64->k[1][0][o - 28].a[j]
400 = key64->k[1][1][o - 28].a[j]
401 = -!!(k & (1 << i));
402 }
403 }
404 else if (vk & (1 << i))
405 {
406 /* ”˝“] */
407 int o = tr_pc1[n][6 - i] - 1;
408 if (o < 28)
409 {
410 assert(o >= 0);
411 for (j = 0; j < N_ALU; j++)
412 key64->k[0][0][o].a[j]
413 = key64->k[0][1][o].a[j]
414 = ~key64->k[0][0][o].a[j];
415 }
416 else
417 {
418 assert(o >= 28);
419 assert(o < 56);
420 for (j = 0; j < N_ALU; j++)
421 key64->k[1][0][o - 28].a[j]
422 = key64->k[1][1][o - 28].a[j]
423 = ~key64->k[1][0][o - 28].a[j];
424 }
425 }
426 }
427 }
428
429 /* Žw’肳‚ę‚˝ƒNƒ‰ƒX‚ĚŠJŽn’l‚ÉƒŠƒZƒbƒg
430 ’ź‘O‚Ě•śŽš‚ĚƒNƒ‰ƒX‚É”›‚ç‚ę‚é */
431 int
432 key_reset(int n)
433 {
434 if (n >= 8)
435 return 1;
436 if (n == 7)
437 {
438 key[7] = 0;
439 return 1;
440 }
441
442 /* 0-2 •śŽš–ڂ̓‰ƒ“ƒ_ƒ€‚ÉŒˆ‚ß‚é
443 3 •śŽš–ÚˆČ~‚͏‰Šú’l‚É */
444 if (n >= 3)
445 key[n] = key_set(n, 0);
446 else
447 key[n] = key_set(n, rand());
448
449 #if DEBUG>=3
450 printf("key[%d]=%02X ncls=%04X\n", n, key[n], kcls[n].map[key[n]]);
451 #endif
452
453 /* ƒZƒbƒg‚ł‚ę‚˝•śŽš‚đŒł‚ÉAŽŸƒLƒƒƒ‰‚Ě•śŽšƒNƒ‰ƒX‚đŒˆ‚ß‚é */
454 key_make_map(n);
455
456 return key_reset(n + 1);
457 }
458
459 /* Žw’肳‚ę‚˝ŒŽ‹óŠÔ‚Ě’†‚ŁAƒL[‚đ‚ЂƂi‚ß‚é
460 ˆŔ‘S‚ɃCƒ“ƒNƒŠƒƒ“ƒg‚Ĺ‚Ť‚˝ę‡ true ‚đ•Ô‚ˇ */
461 static
462 int
463 key_inc(int n)
464 {
465 if (n >= 8)
466 return 0;
467 else if (n == 7)
468 {
469 /* ĹŒă‚ĚƒoƒCƒg */
470 key[7] = (key[7] + (1 << N_STRIDE)) & 0x7F;
471 if (key[7]) return 1;
472 else return 0;
473 }
474 else if (key_inc(n + 1)
475 /*
476 && key_inc(n + 1)
477 && key_inc(n + 1)
478 && key_inc(n + 1)*/
479 )
480 return 1;
481
482 /* Salt ‚̓Cƒ“ƒNƒŠƒƒ“ƒg‚ľ‚Č‚˘–ń‘Ђɂˇ‚é */
483 if (n == 1 || n == 2)
484 return 1;
485
486 #if DEBUG>=3
487 printf("key_inc(n=%d,ck=%02X)\n", n, key[n]);
488 #endif
489
490 /* ŽŤ‘Œę‚̓Cƒ“ƒNƒŠƒƒ“ƒg‚ľ‚Ä‚˘‚˘–ń‘Ђɂˇ‚é */
491 if (3 <= n && n < 7 && kd[n - 3])
492 {
493 if ((key[n - 3] & 0x7F) == ((kd[n - 3] + 1)->c[0] & 0x7F)
494 && (key[n - 2] & 0x7F) == ((kd[n - 3] + 1)->c[1] & 0x7F)
495 && (key[n - 1] & 0x7F) == ((kd[n - 3] + 1)->c[2] & 0x7F))
496 {
497 memcpy(&key[n - 3], &(++kd[n - 3])->c[0], 4);
498 #if DEBUG>=2
499 printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",
500 kd[n - 3]->c[0], kd[n - 3]->c[1], kd[n - 3]->c[2], kd[n - 3]->c[3],
501 kd[n - 3]->c[0], kd[n - 3]->c[1], kd[n - 3]->c[2], kd[n - 3]->c[3]);
502 #endif
503 return 1;
504 }
505 else
506 {
507 return 0;
508 }
509 }
510 else if (2 <= n && n < 6 && kd[n - 2])
511 {
512 if ((key[n - 2] & 0x7F) == ((kd[n - 2] + 1)->c[0] & 0x7F)
513 && (key[n - 1] & 0x7F) == ((kd[n - 2] + 1)->c[1] & 0x7F))
514 {
515 memcpy(&key[n - 2], &(++kd[n - 2])->c[0], 4);
516 #if DEBUG>=2
517 printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",
518 kd[n - 2]->c[0], kd[n - 2]->c[1], kd[n - 2]->c[2], kd[n - 2]->c[3],
519 kd[n - 2]->c[0], kd[n - 2]->c[1], kd[n - 2]->c[2], kd[n - 2]->c[3]);
520 #endif
521 return 1;
522 }
523 else
524 {
525 return 0;
526 }
527 if (kd[n - 2]->c[0] == key[n - 2])
528 return 1;
529 else
530 return 0;
531 }
532 else if (1 <= n && n < 5 && kd[n - 1])
533 {
534 unsigned c2 = kd[n - 1]->c[0];
535 if ((0x81 <= c2 && c2 <= 0x9F)
536 || (0xE0 <= c2 && c2 <= 0xFC))
537 {
538 kd[n - 1] = NULL;
539 #if 0
540 if (!(n == 1 && n == 2))
541 key[n] &= 0x7F;
542 if (!(n == 2 && n == 3))
543 key[n - 1] &= 0x7F;
544 #endif
545 key_make_map(n - 1);
546 }
547 else if ((key[n - 1] & 0x7F) == ((kd[n - 1] + 1)->c[0] & 0x7F))
548 {
549 memcpy(&key[n - 1], &(++kd[n - 1])->c[0], 4);
550 #if DEBUG>=2
551 printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",
552 kd[n - 1]->c[0], kd[n - 1]->c[1], kd[n - 1]->c[2], kd[n - 1]->c[3],
553 kd[n - 1]->c[0], kd[n - 1]->c[1], kd[n - 1]->c[2], kd[n - 1]->c[3]);
554 #endif
555 return 1;
556 }
557 else
558 {
559 return 0;
560 }
561 #if 0
562 if (kd[n - 1]->c[0] == key[n - 1])
563 return 1;
564 else
565 return 0;
566 #endif
567 }
568 else if (n < 4 && kd[n])
569 {
570 if (0 && kd[n]->c[0] == key[n])
571 return 1;
572 kd[n] = NULL;
573 #if 0
574 if (!(n == 1 || n == 2))
575 key[n] &= 0x7F;
576 #endif
577 }
578
579 /* ŽŔŰ‚É‘‚₾‚Ă݂é */
580 assert(n >= 3);
581 for (;;)
582 {
583 if (n <= 3
584 && !(key[n] & 0x80)
585 && kcls[n].map[key[n] ^ 0x80] & (KCLS_DT0))
586 {
587 /* ”źŠpƒJƒ^ƒJƒi‚Ě1ƒoƒCƒg–Ú */
588 key[n] ^= 0x80;
589 }
590 else
591 {
592 key[n] = (key[n] & 0x7F) + 1;
593 if (key[n] >= 0x80)
594 return 0;
595 }
596
597 if (kcls[n].map[key[n]])
598 {
599 key_make_map(n);
600 key_reset(n + 1);
601 return 1;
602 }
603 }
604 while (++key[n] < 0x80)
605 {
606 if (kcls[n].map[key[n]])
607 {
608 key_make_map(n);
609 key_reset(n + 1);
610 return 1;
611 }
612 }
613 return 0;
614 }
615
616 /* ŒŽ‚đŠŽ‘S‚ÉƒŠƒZƒbƒg‚ˇ‚é
617 Salt‚ŕƒZƒbƒg‚ľ’ꂎ */
618 static
619 void
620 key_init()
621 {
622 int i, j;
623
624 #if USE_DT
625 /* ŽŤ‘‚đAƒCƒ“ƒfƒNƒX‚đě‚č‚Č‚Ş‚çƒ}ƒbƒv‚ɂ͂߂ą‚ń‚ŐŔ‚­
626 ŽŤ‘‚̓R[ƒh‡¸‡‚É•Ŕ‚ń‚Ĺ‚é‚ŕ‚̂Ƃˇ‚é */
627 for (i = 0; i < dtcnt; i++)
628 {
629 unsigned c = dt[i].c[0];
630
631 assert(dt[i].c[0]
632 && dt[i].c[1]
633 && dt[i].c[2]
634 && dt[i].c[3]);
635
636 /* BSD ŽI‚Ĺ‚ľ‚É‚ť‚¤‚Č•śŽš‚ÍŽc”O‚Č‚Ş‚çœŠO */
637 assert((dt[i].c[0] & 0x7F)
638 && (dt[i].c[1] & 0x7F)
639 && (dt[i].c[2] & 0x7F)
640 && (dt[i].c[3] & 0x7F));
641
642 /* ƒCƒ“ƒfƒNƒX */
643 if (!dtidx[c])
644 dtidx[c] = &dt[i];
645
646 if ((0x81 <= c && c <= 0x9F)
647 || (0xE0 <= c && c <= 0xFC))
648 {
649 /* ‘SŠp‚Ȃ̂ŁA2ƒoƒCƒg‚Ť‚Ü‚Á‚˝Žž“_‚Ĺ—§‚Ä‚é */
650 cp932[256 * c + dt[i].c[1]] |= KCLS_DT1;
651 }
652 else if (0xA1 <= c && c <= 0xDF)
653 {
654 /* ”źŠpƒJƒi */
655 for (j = 0; j < 256; j++)
656 cp932[256 * c + j] |= KCLS_DT0;
657 }
658 }
659 /* ƒPƒcA‚ż‚¤‚Š”Ôl */
660 dtidx[0x100] = &dt[i];
661 #endif
662
663 key[8] = 0;
664
665 /* ‰Šúƒ}ƒbƒv‚đ‘g‚Ţ */
666 for (i = 0; i < 256; i++)
667 {
668 unsigned bm = 0;
669 kcls[0].map[i] = 0;
670 for (j = 0; j < 256; j++)
671 bm |= cp932[256 * i + j];
672 kcls[0].map[i] = bm & (KCLS_AN | KCLS_KA | KCLS_K1
673 | KCLS_DT0
674 );
675 if (i >= 128)
676 kcls[0].map[i - 128] |= kcls[0].map[i];
677 }
678
679 key_reset(0);
680 }
681
682 /***************************************************************
683 *
684 * Salt ‚ĚƒZƒbƒg
685 * ƒIƒyƒ‰ƒ“ƒh‚ĚƒIƒtƒZƒbƒg‚đ‘‚ŤŠˇ‚ڂĉń‚Á‚Ä‚é‚̂ŒˆÓ
686 *
687 */
688
689 #if N_STRIDE == 6
690 #define C(c,i,j,o) (*(int8_t *)((c) + (loo - crypt64_sta) + los[6 * (i) + (j) + (o)]))
691 #elif N_STRIDE == 7
692 #define C(c,i,j,o) (*(int32_t *)((c) + (loo - crypt64_sta) + los[6 * (i) + (j) + (o)]))
693 #endif
694
695 void
696 set_salt(signed char *code,
697 unsigned char const *k)
698 {
699 int i, j;
700
701 for (i = 0; i < 2; i++)
702 {
703 unsigned s = k[1 + i] & 255;
704 if (s > 'z')
705 s = 0;
706 else if (s >= 'a')
707 s = s - 'a' + 2 + 10 + 26;
708 else if (s >= 'A')
709 s = s - 'A' + 2 + 10;
710 else if (s >= '.')
711 s = s - '.';
712 else
713 s = 0;
714
715 #if DEBUG>=1
716 printf("Salt %d:%3o\n", i, s & 63);
717 #endif
718 for (j = 0; j < 6; j++)
719 {
720 #if DEBUG>=2
721 //printf("Salt %d:%d %+3d:%+3d",
722 printf("Salt %d:%d %08lX:%08lX",
723 i, j,
724 C(code, i, j, 0),
725 C(code, i, j, 24));
726 #endif
727 if (s & (1 << j))
728 {
729 C(code, i, j, 0) = sizeof(WS_T) * (((4 * i + j + 15) & 31) - 16);
730 C(code, i, j, 24) = sizeof(WS_T) * (((4 * i + j - 1) & 31) - 16);
731 }
732 else
733 {
734 C(code, i, j, 0) = sizeof(WS_T) * (((4 * i + j - 1) & 31) - 16);
735 C(code, i, j, 24) = sizeof(WS_T) * (((4 * i + j + 15) & 31) - 16);
736 }
737 C(code, i, j, 12) = sizeof(WS_T) * (((4 * i + j + 7) & 31) - 16);
738 C(code, i, j, 36) = sizeof(WS_T) * (((4 * i + j + 23) & 31) - 16);
739 #if DEBUG>=2
740 //printf(" => %+3d:%+3d\n",
741 printf(" => %08lX:%08lX\n",
742 C(code, i, j, 0),
743 C(code, i, j, 24));
744 #endif
745 }
746 }
747 }
748
749 static
750 unsigned
751 usec()
752 {
753 #if !defined(WIN32)
754 struct timeval tv;
755 gettimeofday(&tv, NULL);
756 return 100 * tv.tv_sec + (tv.tv_usec / 10000);
757 #else
758 struct timeb tm;
759 ftime(&tm);
760 return 100 * tm.time + tm.millitm / 10;
761 #endif
762 }
763
764 static
765 int
766 log_printf(FILE *ofp, char const *fmt, ...)
767 {
768 int r;
769 va_list ap;
770 va_start(ap, fmt);
771 vfprintf(stdout, fmt, ap);
772 r = vfprintf(ofp, fmt, ap);
773 va_end(ap);
774 if (r > 0)
775 return r;
776 perror("log_printf");
777 exit(errno);
778 }
779
780 /***************************************************************
781 *
782 * ƒƒCƒ“ƒ‹[ƒv‚Ć‚Š
783 *
784 */
785
786 /* ’萔€ */
787 #if N_STRIDE == 7
788 static SLICE const sk6[N_STRIDE] =
789 {
790 {0xAAAAAAAAUL, 0xAAAAAAAAUL, 0xAAAAAAAAUL, 0xAAAAAAAAUL},
791 {0xCCCCCCCCUL, 0xCCCCCCCCUL, 0xCCCCCCCCUL, 0xCCCCCCCCUL},
792 {0xF0F0F0F0UL, 0xF0F0F0F0UL, 0xF0F0F0F0UL, 0xF0F0F0F0UL},
793 {0xFF00FF00UL, 0xFF00FF00UL, 0xFF00FF00UL, 0xFF00FF00UL},
794 {0xFFFF0000UL, 0xFFFF0000UL, 0xFFFF0000UL, 0xFFFF0000UL},
795 {0x00000000UL, 0xFFFFFFFFUL, 0x00000000UL, 0xFFFFFFFFUL},
796 {0x00000000UL, 0x00000000UL, 0xFFFFFFFFUL, 0xFFFFFFFFUL},
797 };
798 #elif N_STRIDE == 6
799 static SLICE const sk6[N_STRIDE] =
800 {
801 {0xAAAAAAAAUL, 0xAAAAAAAAUL},
802 {0xCCCCCCCCUL, 0xCCCCCCCCUL},
803 {0xF0F0F0F0UL, 0xF0F0F0F0UL},
804 {0xFF00FF00UL, 0xFF00FF00UL},
805 {0xFFFF0000UL, 0xFFFF0000UL},
806 {0x00000000UL, 0xFFFFFFFFUL},
807 };
808 #endif
809
810 #ifdef WIN32
811 typedef int (__fastcall *CRYPT64_PP)(ALU_T const *k, ALU_T *lr);
812 #endif
813
814 ALIGN_PREFIX(16) struct KEY key64 ALIGN_SUFFIX(16);
815 ALIGN_PREFIX(16) struct PARAM param64 ALIGN_SUFFIX(16);
816
817 int
818 main(int argc, char *argv[])
819 {
820 int i, j;
821 int mincnt;
822 signed char *code = NULL;
823 FILE *ofp;
824 int n_iter;
825 int cr;
826
827 #define N_TS 4
828 struct
829 {
830 unsigned t;
831 int c;
832 } ts[N_TS];
833
834 #ifdef WIN32
835 HANDLE h;
836 #endif
837
838 #ifndef __GNUC__
839 CRYPT64_PP d_crypt64;
840 #endif
841
842 #if 0
843 if (argc < 2)
844 {
845 fprintf(stderr, "ŽŽ‚Ť‚Ú‚ń‚Ę\n");
846 return 1;
847 }
848 #endif
849
850 assert((1 << N_STRIDE) == N_ALU * ALU_BITS);
851
852 /* t[16] ‚́A“ŕ•”‰‰ŽZ‚ĹŽg—p‚ˇ‚éAall 1 ‚Ş“ü‚Á‚Ä‚˘‚é */
853 for (i = 0; i < N_ALU; i++)
854 param64.t[16].a[i] = -1;
855
856 /* ŒĹ’čƒL[‚ĚƒRƒs[ */
857 for (i = 0; i < N_STRIDE; i++)
858 {
859 int o = tr_pc1[7][6 - i] - 1;
860 if (o < 28)
861 {
862 key64.k[0][0][o] = key64.k[0][1][o] = sk6[i];
863 }
864 else
865 {
866 o -= 28;
867 key64.k[1][0][o] = key64.k[1][1][o] = sk6[i];
868 }
869 }
870
871 /* ƒL[ƒXƒPƒWƒ…[ƒ‹‚đ‚ą‚ą‚ɉŸ‚ľž‚߂è‚­
872 ]—ˆ‚Í crypt64.S “ŕ‚ĹŠŽŒ‹‚ˇ‚é‚悤‚Ɉř‚˘‚Ä‚˘‚˝ */
873 for (i = 0; i < 28; i++)
874 key64.ks[i].a[0] = sizeof(WS_T) * ks_ls[i];
875
876 /* Salt‚đ‰Á–Ą‚ľ‚Č‚˘ę‡‚́AƒR[ƒh—Ěˆć‚đ
877 writable —Ěˆć‚É“WŠJ‚ľ‚Č‚­‚Ä‚ŕ‚悢B
878 [XXX] OS‚É‚ć‚Á‚ẮA‘ž&ŽŔs‰Â”\—Ěˆć‚đę—p‚ĚƒT[ƒ”ƒBƒX‚Ĺ
879 Žć“ž‚ľ‚Ȃ݂ę‚΂Ȃç‚Č‚˘‚ŕ‚Ě‚ŕ‚ ‚邊‚ŕ‚ľ‚ę‚Č‚˘‚̂ŁA’ˆÓ */
880 #ifdef WIN32
881 h = CreateFileMapping(INVALID_HANDLE_VALUE,
882 NULL,
883 PAGE_EXECUTE_READWRITE,
884 0, 0x20000000,
885 NULL);
886 #ifndef FILE_MAP_EXECUTE
887 #define FILE_MAP_EXECUTE SECTION_MAP_EXECUTE /* XXX cygwin */
888 #endif
889 if (SUCCEEDED(h))
890 code = (signed char *)MapViewOfFile(h,
891 FILE_MAP_EXECUTE | FILE_MAP_WRITE,
892 0, 0x10000000,
893 0);
894 #else
895 code = (signed char *)mmap(NULL,
896 0x10000000,
897 PROT_EXEC | PROT_READ | PROT_WRITE,
898 MAP_PRIVATE | MAP_ANON,
899 1, /* fd */
900 0);
901 if ((void *)code == MAP_FAILED)
902 code =NULL;
903 #endif
904
905 /* ƒƒ‚ƒŠ‚ŞŠm•ۂłŤ‚Ä‚˘‚Č‚˘ę‡‚Ě‚˘‚ń‚ż‚Ť‘΍ô */
906 if (code == NULL)
907 code = (signed char *)malloc(crypt64_end - crypt64_sta + 1024 * 1024);
908 assert(code != NULL);
909
910 /* Prologue ‚đ“WŠJ */
911 memcpy(code, crypt64_sta, crypt64_end - crypt64_sta);
912 #ifndef __GNUC__
913 d_crypt64 = (CRYPT64_PP)code;
914 #endif
915 memcpy(expr_parse(code + (crypt64_end - crypt64_sta),
916 1024 * 1024 - (crypt64_ep_end - crypt64_ep),
917 argv[1]),
918 crypt64_ep,
919 crypt64_ep_end - crypt64_ep);
920
921 /* ƒL[‚̏‰Šú‰ť */
922 srand(time(NULL));
923 key_init();
924 set_salt(code, key);
925 for (i = 0; i < 8; i++)
926 key_set64(&key64, i, okey[i] = key[i], 0, 0x7F);
927
928 #if DEBUG>=1
929 printf("key=%p param=%p\n", &key64, &param64);
930 #endif
931 assert(!((ptrdiff_t)&key64 & (sizeof(WS_T) - 1)));
932 assert(!((ptrdiff_t)&param64 & (sizeof(WS_T) - 1)));
933
934 if ((ofp = fopen("log.txt", "at")) == NULL)
935 {
936 perror("log.txt");
937 return errno;
938 }
939
940 setvbuf(ofp, NULL, _IONBF, BUFSIZ); /* XXX MSVCRT ‚Ĺ‚Í _IOLBF ‚ŞŠú‘Ň’Ę‚č‚É“Žě‚ľ‚Č‚˘ */
941
942 for (i = 0; i < N_TS; i++)
943 ts[i].t = ts[i].c = 0;
944
945 mincnt = 0x7FFFFFFF;
946 n_iter = 0;
947 cr = 0;
948 /* ’Tőƒ‹[ƒv‚ž‚ź‚Á‚Ć */
949 for (;;)
950 {
951 int32_t cnt;
952 int k, kk;
953
954 /* ŒŽ‚ĚƒZƒbƒg */
955 for (i = 0; i < 8; i++)
956 {
957 key_set64(&key64, i, key[i], key[i] ^ okey[i], 0);
958 okey[i] = key[i];
959 }
960
961 /* ŒÄ‚Ô!
962 LR ‰Šú‰ť‚́AƒTƒuƒ‚ƒWƒ…[ƒ‹“ŕ‚ōs‚¤‚ׂľ
963 FASTCALL ‚ɏ€‚ś‚˝ŒÄ‚яo‚ľ‚Ě‚˝‚߁A
964 ƒzƒ“ƒg‚Í‚˘‚낢‚냌ƒWƒXƒ^‚Ş”j‰ó‚ł‚ę‚éƒnƒYc‚Č‚ń‚ž‚ށB */
965 #ifdef __GNUC__
966 asm volatile("call *%3"
967 : "=a"(cnt)
968 : "c"(key64.k), "d"(param64.lr),
969 "m"(code)
970 //"m"(crypt64_sta)
971 : CRYPT64_CLOBBER "memory");
972 #else
973 cnt = (*d_crypt64)(key64.k[0][0][0].a, param64.lr[0][0].a);
974 #endif
975 if (mincnt > cnt && cnt > 0)
976 {
977 mincnt = cnt;
978 if (cr)
979 fprintf(stderr, "\n");
980 cr = 0;
981 fprintf(stderr, "cycle=%d\n", (int)cnt);
982 }
983
984 /* ƒqƒbƒg‚ľ‚˝‚Ć‚Ť‚̏ˆ— */
985 for (kk = 0; kk < N_ALU; kk++)
986 {
987 ALU_T t;
988
989 t = param64.t[31].a[kk];
990 if (!t)
991 continue;
992
993 for (k = 0; k < ALU_BITS; k++)
994 {
995 char hash[16];
996 unsigned char buf[32];
997
998 if (!(t & ((ALU_T)1 << k)))
999 continue;
1000
1001 /* XXX Žč”˛‚Ť‚Ě‚˝‚߁Aƒ[ƒN‚ɂ͂ݏo‚Ä‚˘‚é 2 ƒrƒbƒg‚đ‚ą‚ą‚Ĺ—Ž‚Ć‚ˇ
1002 ƒqƒbƒg‚ˇ‚é‚˝‚Ń‚Éç’ˇ‚ɍs‚í‚ę‚邪A‹C‚É‚ľ‚Ă͂˘‚Š‚ń */
1003 param64.t[0].a[kk] = param64.t[1].a[kk] = 0;
1004 for (i = 1; i < 11; i++)
1005 {
1006 unsigned c = 0;
1007 for (j = 0; j < 6; j++)
1008 c = (c << 1) | !!(param64.lr[0][tr_fp[6 * i + j]].a[kk] & ((ALU_T)1 << k));
1009 hash[i - 1] = c["./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"];
1010 }
1011 hash[10] = 0;
1012
1013 memcpy(buf, key, 32);
1014 buf[8] = buf[9] = 0;
1015 buf[7] = (buf[7] & -(1 << N_STRIDE) & 0x7F) + ALU_BITS * kk + k;
1016 if (translate(buf, 0, 1))
1017 {
1018 if (cr)
1019 fprintf(stderr, "\n");
1020 cr = 0;
1021 log_printf(ofp,
1022 "Ÿ%s #%-10.10s(%02X %02X %02X %02X %02X %02X %02X %02X/%02X)\n",
1023 hash,
1024 buf,
1025 buf[0], buf[1], buf[2], buf[3],
1026 buf[4], buf[5], buf[6], buf[7],
1027 buf[8]);
1028 }
1029 else
1030 {
1031 #if DEBUG>=1
1032 if (cr)
1033 fprintf(stderr, "\n");
1034 cr = 0;
1035 log_printf(ofp,
1036 "Ÿ%s (%02X %02X %02X %02X %02X %02X %02X %02X )\n",
1037 hash,
1038 buf[0], buf[1], buf[2], buf[3],
1039 buf[4], buf[5], buf[6], buf[7]);
1040 #endif
1041 }
1042 }
1043 }
1044
1045 if (++n_iter - ts[0].c >= 8192)
1046 {
1047 int t = usec();
1048 if (ts[N_TS - 1].c)
1049 {
1050 int a = (100 << N_STRIDE) * (n_iter - ts[N_TS - 1].c) / (t - ts[N_TS - 1].t);
1051 fprintf(stderr,
1052 "%8d.%03d(ktrips/sec)\r",
1053 a / 1000,
1054 a % 1000);
1055 cr++;
1056 }
1057 for (i = N_TS - 1; i >= 1; i--)
1058 ts[i] = ts[i - 1];
1059 ts[0].c = n_iter;
1060 ts[0].t = t;
1061 for (i = 1; i < N_TS; i++)
1062 if (ts[i].c)
1063 break;
1064 else
1065 ts[i] = ts[i - 1];
1066 }
1067 #if 1
1068 if (!key_inc(3))
1069 {
1070 #if DEBUG>=2
1071 printf("********************************\n");
1072 #endif
1073 key_reset(0);
1074 set_salt(code, key);
1075 for (i = 0; i < 8; i++)
1076 key_set64(&key64, i, okey[i] = key[i], 0, 0x7F);
1077 }
1078 #endif
1079 }
1080
1081 return 0;
1082 }
1083
1084 /*
1085 * Local Variables:
1086 * tab-width: 4
1087 * End:
1088 *
1089 * EOF */

Properties

Name Value
svn:eol-style native

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26