| 627 |
|
|
| 628 |
/*************************************************************** |
/*************************************************************** |
| 629 |
* |
* |
| 630 |
|
* 固定キーの生成 |
| 631 |
|
* |
| 632 |
|
* 一見 Big Endian に非対応のように見えるだろうが |
| 633 |
|
* 随所でに散らばっている kludge により |
| 634 |
|
* ALU_T が 64 ビットである限り、これで問題なく動く。 |
| 635 |
|
* |
| 636 |
|
*/ |
| 637 |
|
|
| 638 |
|
static |
| 639 |
|
void |
| 640 |
|
key_init_sk(struct KEY *key) |
| 641 |
|
{ |
| 642 |
|
int i, j; |
| 643 |
|
int o; |
| 644 |
|
uint64_t m; |
| 645 |
|
|
| 646 |
|
for (i = 5, m = 0xFFFFFFFF00000000ULL; |
| 647 |
|
i >= 0; |
| 648 |
|
m ^= (m >> (1 << --i))) |
| 649 |
|
{ |
| 650 |
|
o = tr_pc1[7][6 - i] - 1; |
| 651 |
|
printf("%d:%d->%2d: %08X%08X\n", |
| 652 |
|
N_Q, i, o, |
| 653 |
|
(unsigned)(m >> 32), |
| 654 |
|
(unsigned)m); |
| 655 |
|
for (j = 0; j < N_Q; j++) |
| 656 |
|
if (o < 28) |
| 657 |
|
key->k[0][0][o ].q[j] = key->k[0][1][o ].q[j] = m; |
| 658 |
|
else |
| 659 |
|
key->k[1][0][o - 28].q[j] = key->k[1][1][o - 28].q[j] = m; |
| 660 |
|
} |
| 661 |
|
#if N_STRIDE==7 |
| 662 |
|
/* bit 6 は Little Endian として扱う */ |
| 663 |
|
o = 0; |
| 664 |
|
assert(tr_pc1[7][0] - 1 == o); |
| 665 |
|
assert(N_Q == 2); |
| 666 |
|
key->k[0][0][o].q[0] = key->k[0][1][o].q[0] = 0x0000000000000000ULL; |
| 667 |
|
key->k[0][0][o].q[1] = key->k[0][1][o].q[1] = 0xFFFFFFFFFFFFFFFFULL; |
| 668 |
|
#endif |
| 669 |
|
} |
| 670 |
|
|
| 671 |
|
/*************************************************************** |
| 672 |
|
* |
| 673 |
* Salt のセット |
* Salt のセット |
| 674 |
* オペランドのオフセットを書き換えて回ってるので注意 |
* オペランドのオフセットを書き換えて回ってるので注意 |
| 675 |
* |
* |
| 783 |
* |
* |
| 784 |
*/ |
*/ |
| 785 |
|
|
|
/* 定数項 */ |
|
|
#if N_STRIDE == 7 |
|
|
static SLICE const sk6[N_STRIDE] = |
|
|
{ |
|
|
{0xAAAAAAAAUL, 0xAAAAAAAAUL, 0xAAAAAAAAUL, 0xAAAAAAAAUL}, |
|
|
{0xCCCCCCCCUL, 0xCCCCCCCCUL, 0xCCCCCCCCUL, 0xCCCCCCCCUL}, |
|
|
{0xF0F0F0F0UL, 0xF0F0F0F0UL, 0xF0F0F0F0UL, 0xF0F0F0F0UL}, |
|
|
{0xFF00FF00UL, 0xFF00FF00UL, 0xFF00FF00UL, 0xFF00FF00UL}, |
|
|
{0xFFFF0000UL, 0xFFFF0000UL, 0xFFFF0000UL, 0xFFFF0000UL}, |
|
|
{0x00000000UL, 0xFFFFFFFFUL, 0x00000000UL, 0xFFFFFFFFUL}, |
|
|
{0x00000000UL, 0x00000000UL, 0xFFFFFFFFUL, 0xFFFFFFFFUL}, |
|
|
}; |
|
|
#elif N_STRIDE == 6 |
|
|
static SLICE const sk6[N_STRIDE] = |
|
|
{ |
|
|
{0xAAAAAAAAUL, 0xAAAAAAAAUL}, |
|
|
{0xCCCCCCCCUL, 0xCCCCCCCCUL}, |
|
|
{0xF0F0F0F0UL, 0xF0F0F0F0UL}, |
|
|
{0xFF00FF00UL, 0xFF00FF00UL}, |
|
|
{0xFFFF0000UL, 0xFFFF0000UL}, |
|
|
{0x00000000UL, 0xFFFFFFFFUL}, |
|
|
}; |
|
|
#endif |
|
|
|
|
| 786 |
ALIGN_PREFIX(16) struct KEY key64 ALIGN_SUFFIX(16); |
ALIGN_PREFIX(16) struct KEY key64 ALIGN_SUFFIX(16); |
| 787 |
ALIGN_PREFIX(16) struct PARAM param64 ALIGN_SUFFIX(16); |
ALIGN_PREFIX(16) struct PARAM param64 ALIGN_SUFFIX(16); |
| 788 |
|
|
| 834 |
for (i = 0; i < N_ALU; i++) |
for (i = 0; i < N_ALU; i++) |
| 835 |
param64.t[T_INV].a[i] = -1; |
param64.t[T_INV].a[i] = -1; |
| 836 |
|
|
| 837 |
/* 固定キーのコピー */ |
/* 固定キーの生成 */ |
| 838 |
for (i = 0; i < N_STRIDE; i++) |
key_init_sk(&key64); |
|
{ |
|
|
int o = tr_pc1[7][6 - i] - 1; |
|
|
if (o < 28) |
|
|
{ |
|
|
key64.k[0][0][o] = key64.k[0][1][o] = sk6[i]; |
|
|
} |
|
|
else |
|
|
{ |
|
|
o -= 28; |
|
|
key64.k[1][0][o] = key64.k[1][1][o] = sk6[i]; |
|
|
} |
|
|
} |
|
| 839 |
|
|
| 840 |
/* キースケジュールをここに押し込めておく |
/* キースケジュールをここに押し込めておく |
| 841 |
従来は crypt64.S 内で完結するように引いていた */ |
従来は crypt64.S 内で完結するように引いていた */ |