Annotation of coherent/b/lib/libc/gen/crypt.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Crypt subroutines - which use the
        !             3:  * DES (Data Encryption Standard)
        !             4:  * as published in National Bureau of Standards,
        !             5:  * "Encryption Algorithm for Computer Data Encryption",
        !             6:  * Vol. 40, No. 52, March 17, p.. 12134-12139.
        !             7:  * (Reprinted in Cryptologia, Vol. I, No. 3, July 1977).
        !             8:  */
        !             9: 
        !            10: #include <stdio.h>
        !            11: #include <string.h>
        !            12: 
        !            13: #define        NBPC    8               /* Bits in a char */
        !            14: #define        NIB     64              /* Input bits in a unit */
        !            15: #define        NKB     64              /* Number of key bits */
        !            16: #define        NUKB    56              /* Number of used key bits */
        !            17: #define        NOKB    48              /* Number out from each key iteration */
        !            18: #define        NITER   16              /* Number of iterations of S-functions */
        !            19: #define        NSBOX   8               /* Number of S-boxes */
        !            20: #define        NSCSET  64              /* Number in small character set */
        !            21: 
        !            22: /*
        !            23:  * Table of Initial permutation of each 64 bit entity.
        !            24:  */
        !            25: static char    IP[NIB] = {
        !            26:        57, 49, 41, 33, 25, 17, 9, 1,
        !            27:        59, 51, 43, 35, 27, 19, 11, 3,
        !            28:        61, 53, 45, 37, 29, 21, 13, 5,
        !            29:        63, 55, 47, 39, 31, 23, 15, 7,
        !            30:        56, 48, 40, 32, 24, 16, 8, 0,
        !            31:        58, 50, 42, 34, 26, 18, 10, 2,
        !            32:        60, 52, 44, 36, 28, 20, 12, 4,
        !            33:        62, 54, 46, 38, 30, 22, 14, 6
        !            34: };
        !            35: 
        !            36: /*
        !            37:  * Inverted intial permutation ( IP -1)
        !            38:  */
        !            39: static char    IP1[NIB] = {
        !            40:        39, 7, 47, 15, 55, 23, 63, 31,
        !            41:        38, 6, 46, 14, 54, 22, 62, 30,
        !            42:        37, 5, 45, 13, 53, 21, 61, 29,
        !            43:        36, 4, 44, 12, 52, 20, 60, 28,
        !            44:        35, 3, 43, 11, 51, 19, 59, 27,
        !            45:        34, 2, 42, 10, 50, 18, 58, 26,
        !            46:        33, 1, 41, 9, 49, 17, 57, 25,
        !            47:        32, 0, 40, 8, 48, 16, 56, 24
        !            48: };
        !            49: 
        !            50: /*
        !            51:  * E bit-selection table
        !            52:  */
        !            53: static char    E[NOKB] = {
        !            54:        31, 0, 1, 2, 3, 4,
        !            55:        3, 4, 5, 6, 7, 8,
        !            56:        7, 8, 9, 10, 11, 12,
        !            57:        11, 12, 13, 14, 15, 16,
        !            58:        15, 16, 17, 18, 19, 20,
        !            59:        19, 20, 21, 22, 23, 24,
        !            60:        23, 24, 25, 26, 27, 28,
        !            61:        27, 28, 29, 30, 31, 0
        !            62: };
        !            63: 
        !            64: /*
        !            65:  * A saved copy of the E-table for
        !            66:  * crypt to perturb.
        !            67:  */
        !            68: static char    saveE[NOKB] = {
        !            69:        31, 0, 1, 2, 3, 4,
        !            70:        3, 4, 5, 6, 7, 8,
        !            71:        7, 8, 9, 10, 11, 12,
        !            72:        11, 12, 13, 14, 15, 16,
        !            73:        15, 16, 17, 18, 19, 20,
        !            74:        19, 20, 21, 22, 23, 24,
        !            75:        23, 24, 25, 26, 27, 28,
        !            76:        27, 28, 29, 30, 31, 0
        !            77: };
        !            78: 
        !            79: /*
        !            80:  * Permutation of 32-bits onto 32 bits
        !            81:  * known as "P"
        !            82:  */
        !            83: static char    P[NIB/2] = {
        !            84:        15, 6, 19, 20,
        !            85:        28, 11, 27, 16,
        !            86:        0, 14, 22, 25,
        !            87:        4, 17, 30, 9,
        !            88:        1, 7, 23, 13,
        !            89:        31, 26, 2, 8,
        !            90:        18, 12, 29, 5,
        !            91:        21, 10, 3, 24
        !            92: };
        !            93: 
        !            94: /*
        !            95:  * The following are the 8 S-box functions
        !            96:  * (S1, S2, S3, S4, ..., S8)
        !            97:  * Each turns a 6-bit quantity into a four bit number.
        !            98:  */
        !            99: static char    Sboxes[NSBOX][4][16] = {
        !           100:        /* S1 */
        !           101:                14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
        !           102:                0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
        !           103:                4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
        !           104:                15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
        !           105:        /* S2 */
        !           106:                15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
        !           107:                3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
        !           108:                0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
        !           109:                13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
        !           110:        /* S3 */
        !           111:                10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
        !           112:                13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
        !           113:                13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
        !           114:                1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
        !           115:        /* S4 */
        !           116:                7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
        !           117:                13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
        !           118:                10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
        !           119:                3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
        !           120:        /* S5 */
        !           121:                2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
        !           122:                14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
        !           123:                4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
        !           124:                11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
        !           125:        /* S6 */
        !           126:                12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
        !           127:                10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
        !           128:                9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
        !           129:                4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
        !           130:        /* S7 */
        !           131:                4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
        !           132:                13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
        !           133:                1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
        !           134:                6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
        !           135:        /* S8 */
        !           136:                13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
        !           137:                1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
        !           138:                7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
        !           139:                2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
        !           140: };
        !           141: 
        !           142: /*
        !           143:  * Permuted choice tables
        !           144:  * PC-1 is used for first iteration of KS
        !           145:  * and PC-2 is used therafter.
        !           146:  */
        !           147: static char    PC1[NUKB] = {
        !           148:        56, 48, 40, 32, 24, 16, 8,
        !           149:        0, 57, 49, 41, 33, 25, 17,
        !           150:        9, 1, 58, 50, 42, 34, 26,
        !           151:        18, 10, 2, 59, 51, 43, 35,
        !           152:        /* Division between Co and Do */
        !           153:        62, 54, 46, 38, 30, 22, 14,
        !           154:        6, 61, 53, 45, 37, 29, 21,
        !           155:        13, 5, 60, 52, 44, 36, 28,
        !           156:        20, 12, 4, 27, 19, 11, 3
        !           157: };
        !           158: 
        !           159: static char    PC2[NOKB] = {
        !           160:        13, 16, 10, 23, 0, 4,
        !           161:        2, 27, 14, 5, 20, 9,
        !           162:        22, 18, 11, 3, 25, 7,
        !           163:        15, 6, 26, 19, 12, 1,
        !           164:        40, 51, 30, 36, 46, 54,
        !           165:        29, 39, 50, 44, 32, 47,
        !           166:        43, 48, 38, 55, 33, 52,
        !           167:        45, 41, 49, 35, 28, 31
        !           168: };
        !           169: 
        !           170: /*
        !           171:  * Left shift table
        !           172:  */
        !           173: static char    shifts[NITER] = {
        !           174:        1, 1, 2, 2, 2, 2, 2, 2,
        !           175:        1, 2, 2, 2, 2, 2, 2, 1
        !           176: };
        !           177: 
        !           178: /*
        !           179:  * Table to map a 6-bit integer onto the
        !           180:  * smaller than ascii character set
        !           181:  * ([a-zA-Z0-9./]).
        !           182:  */
        !           183: static char    maptab[NSCSET] = {
        !           184:        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
        !           185:        'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
        !           186:        'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
        !           187:        'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F',
        !           188:        'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
        !           189:        'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
        !           190:        'W', 'X', 'Y', 'Z', '0', '1', '2', '3',
        !           191:        '4', '5', '6', '7', '8', '9', '.', '/'
        !           192: };
        !           193: 
        !           194: static char    Ki[NITER][NOKB];
        !           195: 
        !           196: /*
        !           197:  * Encrypt the block (one bit per byte)
        !           198:  * using the (broken) DES algorithm.
        !           199:  * The `edflag' is zero for encrypt,
        !           200:  * non-zero for decrypt.
        !           201:  */
        !           202: encrypt(block, edflag)
        !           203: char block[NIB];
        !           204: {
        !           205:        char block1[NIB], block2[NIB];
        !           206: 
        !           207:        permute(block, block1, IP, NIB);
        !           208:        cypher(block1, block2, edflag);
        !           209:        permute(block2, block, IP1, NIB);
        !           210: }
        !           211: 
        !           212: /*
        !           213:  * Setkey takes an array of NIB (64)
        !           214:  * bytes called `key', each of which
        !           215:  * contains one bit of the desired key.
        !           216:  * This uses the DES Key Schedule (KS) function
        !           217:  * to iteratively produce each of the NITER (16)
        !           218:  * Ki's from the original key.
        !           219:  */
        !           220: setkey(key)
        !           221: char key[NKB];
        !           222: {
        !           223:        char cd[NUKB];
        !           224:        register ni;
        !           225: 
        !           226:        permute(key, cd, PC1, NUKB);
        !           227:        for (ni=0; ni<NITER; ni++) {
        !           228:                lrot(cd, shifts[ni], NUKB/2);
        !           229:                lrot(&cd[NUKB/2], shifts[ni], NUKB/2);
        !           230:                permute(cd, &Ki[ni][0], PC2, NOKB);
        !           231:        }
        !           232: }
        !           233: 
        !           234: /*
        !           235:  * Crypt - the password encryption routine.
        !           236:  * The key here, is the user's typed password
        !           237:  * and the second is a 2-character salt in
        !           238:  * the set "[a-zA-Z0-9./]".  The salt
        !           239:  * changes the E-table in one of 4096 ways
        !           240:  * to frustrate the use of hardware to crack
        !           241:  * the DES code.
        !           242:  */
        !           243: char *
        !           244: crypt(key, salt)
        !           245: char *key, *salt;
        !           246: {
        !           247:        int sixbit;
        !           248:        char stuff[NIB];
        !           249:        char bkey[NKB];
        !           250:        static char passwd[16];
        !           251:        register char *cp, *bp;
        !           252:        register i;
        !           253: 
        !           254:        perturb(salt);
        !           255:        cp = key;
        !           256:        bp = bkey;
        !           257:        while (*cp!='\0' && bp<&bkey[NKB/NBPC])
        !           258:                *bp++ = *cp++;
        !           259:        while (bp < &bkey[NKB/NBPC])
        !           260:                *bp++ = '\0';
        !           261:        unpack(bkey, NKB);
        !           262:        setkey(bkey);
        !           263:        memcpy(stuff, "Password", NIB/NBPC);
        !           264:        unpack(stuff, NIB);
        !           265:        encrypt(stuff, 0);
        !           266:        cp = passwd;
        !           267:        *cp++ = salt[0];
        !           268:        *cp++ = salt[1];
        !           269:        bp = stuff;
        !           270:        i = sixbit = 0;
        !           271:        while (i < NIB) {
        !           272:                sixbit = (sixbit<<1) + *bp++;
        !           273:                if ((i++%6) == 6-1) {
        !           274:                        *cp++ = maptab[sixbit];
        !           275:                        sixbit = 0;
        !           276:                }
        !           277:        }
        !           278:        *cp++ = maptab[sixbit];
        !           279:        *cp = '\0';
        !           280:        return (passwd);
        !           281: }
        !           282: 
        !           283: /*
        !           284:  * Perturb the E-table based on 2 6-bit characters
        !           285:  * in the salt.  It produces a random permutation for
        !           286:  * the E-table.
        !           287:  */
        !           288: static
        !           289: perturb(salt)
        !           290: char salt[2];
        !           291: {
        !           292:        register char *cp;
        !           293:        register i1, i2;
        !           294:        int salti;
        !           295: 
        !           296:        salti = 01<<8 | 01;
        !           297:        i1 = salt[0];
        !           298:        i2 = salt[1];
        !           299:        for (cp = maptab; cp < &maptab[NSCSET]; cp++) {
        !           300:                if (i1 == *cp)
        !           301:                        salti |= (cp-maptab)<<1;
        !           302:                if (i2 == *cp)
        !           303:                        salti |= (cp-maptab)<<9;
        !           304:        }
        !           305:        srand(salti);
        !           306:        /*
        !           307:         * Make new E-table, from the saved E-table
        !           308:         * with random junk added to it (mod NOKB).
        !           309:         */
        !           310:        for (i1 = 0; i1 < NOKB; i1++)
        !           311:                E[i1] = (saveE[i1] + (rand()>>6)) % (NIB/2);
        !           312: }
        !           313: 
        !           314: /*
        !           315:  * Permute incoming bits into outgoing
        !           316:  * chunk with permutation table (`ptab').
        !           317:  * `nbites' is the number of bits to
        !           318:  * produce from the transformation.
        !           319:  */
        !           320: static
        !           321: permute(ibits, obits, ptab, nbits)
        !           322: register char *ibits;
        !           323: register char *obits;
        !           324: char *ptab;
        !           325: {
        !           326:        register bitno;
        !           327: 
        !           328:        for (bitno = 0; bitno<nbits; bitno++)
        !           329:                *obits++ = ibits[ptab[bitno]];
        !           330: }
        !           331: 
        !           332: /*
        !           333:  * The intermediate cypher function
        !           334:  * It does a chunk of NIB (64) bits
        !           335:  * through the NITER (16) iterations
        !           336:  * of the cypher function `f'.
        !           337:  */
        !           338: static
        !           339: cypher(ibits, obits, edflag)
        !           340: int edflag;
        !           341: char ibits[NIB];
        !           342: char obits[NIB];
        !           343: {
        !           344:        char t1bits[NOKB];
        !           345:        char t2bits[NIB/2];
        !           346:        char left[NIB/2], right[NIB/2];
        !           347:        register int n;
        !           348:        register int i;
        !           349: 
        !           350:        memcpy(left, ibits, NIB/2);
        !           351:        memcpy(right, &ibits[NIB/2], NIB/2);
        !           352:        for (n=0; n<NITER; n++) {
        !           353:                /*
        !           354:                 * L' = R
        !           355:                 * R' = L + f(R,K)
        !           356:                 */
        !           357:                permute(right, t1bits, E, NOKB);
        !           358:                i = edflag ? NITER-1-n : n;
        !           359:                m2add(t1bits, &Ki[i][0], t1bits, NOKB);
        !           360:                dosboxes(t1bits, t2bits);
        !           361:                permute(t2bits, t1bits, P, NIB/2);
        !           362:                m2add(t1bits, left, t2bits, NIB/2);
        !           363:                memcpy(left, right, NIB/2);
        !           364:                memcpy(right, t2bits, NIB/2);
        !           365:        }
        !           366:        memcpy(obits, right, NIB/2);
        !           367:        memcpy(&obits[NIB/2], left, NIB/2);
        !           368: }
        !           369: 
        !           370: /*
        !           371:  * Rotate (what DES calls shift) left
        !           372:  * `nbits' `bits' by `ns' places.
        !           373:  * The shift count is assumed less than
        !           374:  * NBPC (8).
        !           375:  */
        !           376: static
        !           377: lrot(bits, ns, nbits)
        !           378: char *bits;
        !           379: {
        !           380:        register i, nb;
        !           381:        register char *bp;
        !           382:        int byte;
        !           383: 
        !           384:        for (i=0; i<ns; i++) {
        !           385:                bp = bits;
        !           386:                byte = *bp;
        !           387:                nb = nbits-1;
        !           388:                do {
        !           389:                        bp[0] = bp[1];
        !           390:                        bp++;
        !           391:                } while (--nb);
        !           392:                *bp = byte;
        !           393:        }
        !           394: }
        !           395: 
        !           396: /*
        !           397:  * Modulo 2 addition of bit vectors
        !           398:  * `i1' and `i2' into `o'.
        !           399:  * `nbits' is the number of bits in
        !           400:  * each vector
        !           401:  */
        !           402: static
        !           403: m2add(i1, i2, o, nbits)
        !           404: register char *i1, *i2;
        !           405: register nbits;
        !           406: register char *o;
        !           407: {
        !           408:        do {
        !           409:                *o++ = *i1++ ^ *i2++;
        !           410:        } while (--nbits);
        !           411: }
        !           412: 
        !           413: /*
        !           414:  * Implement the "S-boxes"
        !           415:  * Transforming from ibits (NOKB or 48 bits)
        !           416:  * to obits (NIB/2 or 32 bits).
        !           417:  * For each of these boxes, there is a
        !           418:  * 6-bit chunk of the input with the row being
        !           419:  * the first and last of these and the column
        !           420:  * being the middle 4 bits.
        !           421:  */
        !           422: static
        !           423: dosboxes(ibits, obits)
        !           424: char ibits[NOKB];
        !           425: char obits[NIB/2];
        !           426: {
        !           427:        register row, col;
        !           428:        register boxno;
        !           429:        int tempout;
        !           430: 
        !           431:        tempout = 0;
        !           432:        for (boxno=0; boxno < NSBOX; boxno++) {
        !           433:                row = col = 0;
        !           434:                row = row<<1 | *ibits++;
        !           435:                col = col<<1 | *ibits++;
        !           436:                col = col<<1 | *ibits++;
        !           437:                col = col<<1 | *ibits++;
        !           438:                col = col<<1 | *ibits++;
        !           439:                row = row<<1 | *ibits++;
        !           440:                tempout = (tempout<<4) | Sboxes[boxno][row][col];
        !           441:                for (col=0; col<4; col++) {
        !           442:                        *obits++ = (tempout>>3) & 01;
        !           443:                        tempout <<= 1;
        !           444:                }
        !           445:        }
        !           446: }
        !           447: 
        !           448: /*
        !           449:  * Unpack byte vector into bit vector
        !           450:  */
        !           451: static
        !           452: unpack(bytes, nbits)
        !           453: char *bytes;
        !           454: unsigned nbits;
        !           455: {
        !           456:        register char *bitp;
        !           457:        register char *bp;
        !           458:        register i;
        !           459:        int byte;
        !           460: 
        !           461:        bitp = &bytes[nbits];
        !           462:        bp = &bytes[(nbits+NBPC-1)/NBPC];
        !           463:        for (i=nbits; i>0; i--) {
        !           464:                if ((i % NBPC) == 0)
        !           465:                        byte = *--bp;
        !           466:                *--bitp = byte&01;
        !           467:                byte >>= 1;
        !           468:        }
        !           469: }
        !           470: 
        !           471: /*
        !           472:  * Pack bit vector into byte data.
        !           473:  */
        !           474: static
        !           475: pack(bp, nbits)
        !           476: register char *bp;
        !           477: unsigned nbits;
        !           478: {
        !           479:        register i;
        !           480:        register char *bitp;
        !           481:        int byte;
        !           482: 
        !           483:        byte = 0;
        !           484:        bitp = bp;
        !           485:        for (i=0; i<nbits; i++) {
        !           486:                byte = byte<<1 | *bitp++;
        !           487:                if ((i%NBPC) == NBPC-1) {
        !           488:                        *bp++ = byte;
        !           489:                        byte = 0;
        !           490:                }
        !           491:        }
        !           492: }

unix.superglobalmegacorp.com

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