Annotation of 43BSDReno/kerberosIV/make_key_perm/make_key_perm.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * $Source: /mit/kerberos/src/lib/des/RCS/make_key_perm.c,v $
                      3:  * $Author: jtkohl $
                      4:  * $Locker:  $
                      5:  *
                      6:  * Copyright 1988 by the Massachusetts Institute of Technology.
                      7:  *
                      8:  * For copying and distribution information, please see the file
                      9:  * <mit-copyright.h>.
                     10:  *
                     11:  * This routine calculates an effective Key schedule set of
                     12:  * permutations for des.  Beginning with the pre-defined key schedule
                     13:  * algorithm, it reduces it to a set of 16 permutations upon the
                     14:  * initial key.  Only needs to execute once to produce a header file.
                     15:  * Note that we subtract one from the values ouput to fix up for C
                     16:  * subscripts starting at 0.
                     17:  */
                     18: 
                     19: #include <mit-copyright.h>
                     20: #include <stdio.h>
                     21: #include <errno.h>
                     22: #include "des_internal.h"
                     23: 
                     24: #ifndef lint
                     25: static char rcsid[]=
                     26:     "$Header: make_key_perm.c,v 4.9 88/11/15 11:29:40 jtkohl Exp $";
                     27: #endif /* lint */
                     28: 
                     29: char *progname;
                     30: extern char *errmsg();
                     31: extern int errno;
                     32: extern long swap_bit_pos_1();
                     33: extern long swap_bit_pos_0();
                     34: int sflag;
                     35: int vflag;
                     36: int dflag;
                     37: int pid;
                     38: int child_status;
                     39: 
                     40: int key_position[64+1];
                     41: int C[28+1];
                     42: int D[28+1];
                     43: int C_temp, D_temp;
                     44: 
                     45: /*
                     46:  *  CONVENTIONS for numbering the bits
                     47:  *  bit 0 ==> lsb
                     48:  *  L starts at bit 0
                     49:  *  R starts at bit 64
                     50:  *
                     51:  *  BEWARE-- some stuff starts at 0, some at 1;  perhaps some bugs still?
                     52:  */
                     53: 
                     54: /*
                     55:  * Sequence of shifts used for the key schedule.
                     56:  */
                     57: int const shift[16+1] = { 0,
                     58:     1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,
                     59: };
                     60: 
                     61: int const pc_1[64+1] = { 0,
                     62: 
                     63:     57,49,41,33,25,17, 9,
                     64:      1,58,50,42,34,26,18,
                     65:     10, 2,59,51,43,35,27,
                     66:     19,11, 3,60,52,44,36,
                     67: 
                     68:     63,55,47,39,31,23,15,
                     69:      7,62,54,46,38,30,22,
                     70:     14, 6,61,53,45,37,29,
                     71:     21,13, 5,28,20,12, 4,
                     72: };
                     73: 
                     74: 
                     75: /*
                     76:  * Permuted-choice 2, to pick out the bits from
                     77:  * the CD array that generate the key schedule.
                     78:  */
                     79: int const pc_2[48+1] = { 0,
                     80: 
                     81:     14,17,11,24, 1, 5,
                     82:      3,28,15, 6,21,10,
                     83:     23,19,12, 4,26, 8,
                     84:     16, 7,27,20,13, 2,
                     85: 
                     86:     41,52,31,37,47,55,
                     87:     30,40,51,45,33,48,
                     88:     44,49,39,56,34,53,
                     89:     46,42,50,36,29,32,
                     90: };
                     91: 
                     92: int ks_perm[16+1][48+1];
                     93: 
                     94: int des_debug;
                     95: 
                     96: gen(stream)
                     97:     FILE *stream;
                     98: {
                     99:     /*  Local Declarations */
                    100:     register i, j, iter;
                    101: 
                    102:     /*
                    103:      * initialize the key_position array s.t. key_position[i] = i;
                    104:      * that is, each element is equal to its starting position.
                    105:      *
                    106:      * Also adjust for the bit order within bytes.
                    107:      */
                    108: 
                    109:     for (i=0; i<65; i++)
                    110:         key_position[i]= swap_bit_pos_1(i);
                    111: 
                    112:     fprintf(stream,"static int const key_perm[16][48] = {\n");
                    113: 
                    114:     /*
                    115:      * apply pc_1 to initial key_position to create C[0] and D[0]
                    116:      * Start at pc_1[1], not pc_1[0]
                    117:      */
                    118:     for (i=1; i<=28; i++) {
                    119:         C[i] = key_position[pc_1[i]];
                    120:         D[i] = key_position[pc_1[i+28]];
                    121:     }
                    122: 
                    123:     /*
                    124:      * major loop over the 16 iterations
                    125:      * start at iter = 1, not zero.
                    126:      */
                    127:     for (iter = 1; iter <= 16; iter++) {
                    128:         if (des_debug) {
                    129:             /*  for debugging */
                    130:             printf(
                    131:                     "/* DEBUG-- start iteration = %d  shifts = %d",
                    132:                     iter, shift[iter]);
                    133:             printf("\nC array");
                    134:             for (i = 1; i <=4 ; i++) {
                    135:                 printf("\n");
                    136:                 for (j = 1; j<=7; j++)
                    137:                     printf("%d, ",C[(i-1)*7+j]);
                    138:             }
                    139:             printf("\n\nD array");
                    140:             for (i = 1; i <=4 ; i++) {
                    141:                 printf("\n");
                    142:                 for (j = 1; j<=7; j++)
                    143:                     printf("%d, ",D[(i-1)*7+j]);
                    144:             }
                    145:             printf("\n */");
                    146:             fflush(stdout);
                    147:         }
                    148: 
                    149:         /* apply the appropriate left shifts */
                    150:         for (i = 1; i <= shift[iter]; i++) {
                    151:             C_temp = C[1];
                    152:             D_temp = D[1];
                    153:             for (j =1; j<=27; j++) {
                    154:                 C[j] = C[j+1];
                    155:                 D[j] = D[j+1];
                    156:             }
                    157:             C[j] = C_temp;
                    158:             D[j] = D_temp;
                    159:         }
                    160: 
                    161: 
                    162:         if (des_debug) {
                    163:             /* for debugging */
                    164:             printf("/* DEBUG:\n");
                    165:             printf(" * after shifts, iteration = %d  shifts = %d",
                    166:                     iter, shift[iter]);
                    167:             printf("\nC array");
                    168:             for (i = 1; i <=4 ; i++) {
                    169:                 printf("\n");
                    170:                 for (j = 1; j<=7; j++)
                    171:                     printf("%d, ",C[(i-1)*7+j]);
                    172:             }
                    173:             printf("\n\nD array");
                    174:             for (i = 1; i <=4 ; i++) {
                    175:                 printf("\n");
                    176:                 for (j = 1; j<=7; j++)
                    177:                     printf("%d, ",D[(i-1)*7+j]);
                    178:             }
                    179:             printf("\n */");
                    180:             fflush(stdout);
                    181:         }
                    182: 
                    183:         /*
                    184:          * apply pc_2
                    185:          * Start at pc_2[1], not pc_2[0]
                    186:          *
                    187:          * Start stuffing ks_perm[1][1], not ks_perm[0][0]
                    188:          *
                    189:          * Adjust ks_perm for bit order if needed.
                    190:          */
                    191:         for (i = 1; i <= 48; i++) {
                    192:             if (pc_2[i] <= 28)
                    193:                 ks_perm[iter][(i)] = C[pc_2[i]];
                    194:             else
                    195:                 ks_perm[iter][(i)] = D[pc_2[i]-28];
                    196:         }
                    197: 
                    198:         /* now output the resulting key permutation */
                    199:         fprintf(stream, "    /* ks permutation iteration = %2d */",
                    200:                 iter);
                    201:         for (i = 1; i <= 6; i++) {
                    202:             fprintf(stream, "\n    ");
                    203:             for (j = 1; j <= 8; j++) {
                    204:                 /*
                    205:                  * IMPORTANT -- subtract one from value to adjust to a
                    206:                  * zero-based subscript for key
                    207:                  */
                    208:                 fprintf(stream, "%d", ks_perm[iter][(i-1)*8+j]-1);
                    209:                 /* omit last comma */
                    210:                 if ((j != 8) || (i != 6) || (iter != 16)) {
                    211:                     fprintf(stream,", ");
                    212:                 }
                    213:             }
                    214:         }
                    215:     }
                    216:     fprintf(stream,"\n};\n");
                    217: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.