Annotation of 43BSDReno/kerberosIV/make_key_perm/make_key_perm.c, revision 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.