|
|
1.1 ! root 1: /* ! 2: * DES Key Setup ! 3: * D.P.Mitchell 83/06/30. ! 4: */ ! 5: ! 6: #include "crypt.h" ! 7: ! 8: int subkeys[128]; ! 9: ! 10: int pc1_c[] = { ! 11: 57,49,41,33,25,17, 9, ! 12: 1,58,50,42,34,26,18, ! 13: 10, 2,59,51,43,35,27, ! 14: 19,11, 3,60,52,44,36, ! 15: }; ! 16: ! 17: int pc1_d[] = { ! 18: 63,55,47,39,31,23,15, ! 19: 7,62,54,46,38,30,22, ! 20: 14, 6,61,53,45,37,29, ! 21: 21,13, 5,28,20,12, 4, ! 22: }; ! 23: ! 24: int shifts[] = { ! 25: 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1, ! 26: }; ! 27: ! 28: int pc2_c[] = { ! 29: 14,17,11,24, 1, 5, ! 30: 3,28,15, 6,21,10, ! 31: 23,19,12, 4,26, 8, ! 32: 16, 7,27,20,13, 2, ! 33: }; ! 34: ! 35: int pc2_d[] = { ! 36: 41,52,31,37,47,55, ! 37: 30,40,51,45,33,48, ! 38: 44,49,39,56,34,53, ! 39: 46,42,50,36,29,32, ! 40: }; ! 41: ! 42: key_setup(key, decrypting) ! 43: Block *key; ! 44: int decrypting; ! 45: { ! 46: register round, j, k; ! 47: register int *kl, *kh; ! 48: int temp; ! 49: int c[28], d[28]; ! 50: int keybits[64]; ! 51: ! 52: /* ! 53: * unpack 64-bit key block ! 54: */ ! 55: for (j = 0; j < 64; j++) ! 56: if (j > 31) ! 57: keybits[j] = ((key->right & (1 << (j - 32))) != 0); ! 58: else ! 59: keybits[j] = ((key->left & (1 << j)) != 0); ! 60: /* ! 61: * first permuted choice of 56 bits ! 62: */ ! 63: for (j = 0; j < 28; j++) { ! 64: c[j] = keybits[pc1_c[j]-1]; ! 65: d[j] = keybits[pc1_d[j]-1]; ! 66: } ! 67: /* ! 68: * funny rotation of the 28-bit halves ! 69: */ ! 70: for (round = 0; round < 16; round++) { ! 71: for (k = 0; k < shifts[round]; k++) { ! 72: temp = c[0]; ! 73: for (j = 0; j < 27; j++) ! 74: c[j] = c[j + 1]; ! 75: c[27] = temp; ! 76: temp = d[0]; ! 77: for (j = 0; j < 27; j++) ! 78: d[j] = d[j + 1]; ! 79: d[27] = temp; ! 80: } ! 81: /* ! 82: * second permuted choice of 48 bits ! 83: */ ! 84: if (decrypting) { ! 85: kl = &subkeys[8 * (15 - round)]; ! 86: kh = &subkeys[8 * (15 - round) + 4]; ! 87: } else { ! 88: kl = &subkeys[8 * round]; ! 89: kh = &subkeys[8 * round + 4]; ! 90: } ! 91: for (j = 0; j < 24; j += 6) { ! 92: *kl++ = c[pc2_c[j + 0] - 1] ! 93: + (c[pc2_c[j + 1] - 1] << 1) ! 94: + (c[pc2_c[j + 2] - 1] << 2) ! 95: + (c[pc2_c[j + 3] - 1] << 3) ! 96: + (c[pc2_c[j + 4] - 1] << 4) ! 97: + (c[pc2_c[j + 5] - 1] << 5); ! 98: *kh++ = d[pc2_d[j + 0] - 29] ! 99: + (d[pc2_d[j + 1] - 29] << 1) ! 100: + (d[pc2_d[j + 2] - 29] << 2) ! 101: + (d[pc2_d[j + 3] - 29] << 3) ! 102: + (d[pc2_d[j + 4] - 29] << 4) ! 103: + (d[pc2_d[j + 5] - 29] << 5); ! 104: } ! 105: } ! 106: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.