Annotation of 42BSD/lib/libc/net/ruserpass.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1982 Regents of the University of California */
                      2: 
                      3: static char sccsid[] = "@(#)ruserpass.c 4.2 10/10/82";
                      4: 
                      5: #include <stdio.h>
                      6: #include <utmp.h>
                      7: #include <ctype.h>
                      8: #include <sys/types.h>
                      9: #include <sys/stat.h>
                     10: #include <errno.h>
                     11: 
                     12: char   *renvlook(), *malloc(), *index(), *getenv(), *getpass(), *getlogin();
                     13: struct utmp *getutmp();
                     14: static FILE *cfile;
                     15: 
                     16: ruserpass(host, aname, apass)
                     17:        char *host, **aname, **apass;
                     18: {
                     19: 
                     20:        renv(host, aname, apass);
                     21:        if (*aname == 0 || *apass == 0)
                     22:                rnetrc(host, aname, apass);
                     23:        if (*aname == 0) {
                     24:                char *myname = getlogin();
                     25:                *aname = malloc(16);
                     26:                printf("Name (%s:%s): ", host, myname);
                     27:                fflush(stdout);
                     28:                if (read(2, *aname, 16) <= 0)
                     29:                        exit(1);
                     30:                if ((*aname)[0] == '\n')
                     31:                        *aname = myname;
                     32:                else
                     33:                        if (index(*aname, '\n'))
                     34:                                *index(*aname, '\n') = 0;
                     35:        }
                     36:        if (*aname && *apass == 0) {
                     37:                printf("Password (%s:%s): ", host, *aname);
                     38:                fflush(stdout);
                     39:                *apass = getpass("");
                     40:        }
                     41: }
                     42: 
                     43: static
                     44: renv(host, aname, apass)
                     45:        char *host, **aname, **apass;
                     46: {
                     47:        register char *cp;
                     48:        char *stemp, fgetlogin, *comma;
                     49: 
                     50:        cp = renvlook(host);
                     51:        if (cp == NULL)
                     52:                return;
                     53:        if (!isalpha(cp[0]))
                     54:                return;
                     55:        comma = index(cp, ',');
                     56:        if (comma == 0)
                     57:                return;
                     58:        if (*aname == 0) {
                     59:                *aname = malloc(comma - cp + 1);
                     60:                strncpy(*aname, cp, comma - cp);
                     61:        } else
                     62:                if (strncmp(*aname, cp, comma - cp))
                     63:                        return;
                     64:        comma++;
                     65:        cp = malloc(strlen(comma)+1);
                     66:        strcpy(cp, comma);
                     67:        *apass = malloc(16);
                     68:        mkpwclear(cp, host[0], *apass);
                     69: }
                     70: 
                     71: static
                     72: char *
                     73: renvlook(host)
                     74:        char *host;
                     75: {
                     76:        register char *cp, **env;
                     77:        extern char **environ;
                     78: 
                     79:        env = environ;
                     80:        for (env = environ; *env != NULL; env++)
                     81:                if (!strncmp(*env, "MACH", 4)) {
                     82:                        cp = index(*env, '=');
                     83:                        if (cp == 0)
                     84:                                continue;
                     85:                        if (strncmp(*env+4, host, cp-(*env+4)))
                     86:                                continue;
                     87:                        return (cp+1);
                     88:                }
                     89:        return (NULL);
                     90: }
                     91: 
                     92: #define        DEFAULT 1
                     93: #define        LOGIN   2
                     94: #define        PASSWD  3
                     95: #define        NOTIFY  4
                     96: #define        WRITE   5
                     97: #define        YES     6
                     98: #define        NO      7
                     99: #define        COMMAND 8
                    100: #define        FORCE   9
                    101: #define        ID      10
                    102: #define        MACHINE 11
                    103: 
                    104: static char tokval[100];
                    105: 
                    106: static struct toktab {
                    107:        char *tokstr;
                    108:        int tval;
                    109: } toktab[]= {
                    110:        "default",      DEFAULT,
                    111:        "login",        LOGIN,
                    112:        "password",     PASSWD,
                    113:        "notify",       NOTIFY,
                    114:        "write",        WRITE,
                    115:        "yes",          YES,
                    116:        "y",            YES,
                    117:        "no",           NO,
                    118:        "n",            NO,
                    119:        "command",      COMMAND,
                    120:        "force",        FORCE,
                    121:        "machine",      MACHINE,
                    122:        0,              0
                    123: };
                    124: 
                    125: static
                    126: rnetrc(host, aname, apass)
                    127:        char *host, **aname, **apass;
                    128: {
                    129:        char *hdir, buf[BUFSIZ];
                    130:        int t;
                    131:        struct stat stb;
                    132:        extern int errno;
                    133: 
                    134:        hdir = getenv("HOME");
                    135:        if (hdir == NULL)
                    136:                hdir = ".";
                    137:        sprintf(buf, "%s/.netrc", hdir);
                    138:        cfile = fopen(buf, "r");
                    139:        if (cfile == NULL) {
                    140:                if (errno != ENOENT)
                    141:                        perror(buf);
                    142:                return;
                    143:        }
                    144: next:
                    145:        while ((t = token())) switch(t) {
                    146: 
                    147:        case DEFAULT:
                    148:                (void) token();
                    149:                continue;
                    150: 
                    151:        case MACHINE:
                    152:                if (token() != ID || strcmp(host, tokval))
                    153:                        continue;
                    154:                while ((t = token()) && t != MACHINE) switch(t) {
                    155: 
                    156:                case LOGIN:
                    157:                        if (token())
                    158:                                if (*aname == 0) { 
                    159:                                        *aname = malloc(strlen(tokval) + 1);
                    160:                                        strcpy(*aname, tokval);
                    161:                                } else {
                    162:                                        if (strcmp(*aname, tokval))
                    163:                                                goto next;
                    164:                                }
                    165:                        break;
                    166:                case PASSWD:
                    167:                        if (fstat(fileno(cfile), &stb) >= 0
                    168:                            && (stb.st_mode & 077) != 0) {
                    169:        fprintf(stderr, "Error - .netrc file not correct mode.\n");
                    170:        fprintf(stderr, "Remove password or correct mode.\n");
                    171:                                exit(1);
                    172:                        }
                    173:                        if (token() && *apass == 0) {
                    174:                                *apass = malloc(strlen(tokval) + 1);
                    175:                                strcpy(*apass, tokval);
                    176:                        }
                    177:                        break;
                    178:                case COMMAND:
                    179:                case NOTIFY:
                    180:                case WRITE:
                    181:                case FORCE:
                    182:                        (void) token();
                    183:                        break;
                    184:                default:
                    185:        fprintf(stderr, "Unknown .netrc option %s\n", tokval);
                    186:                        break;
                    187:                }
                    188:                goto done;
                    189:        }
                    190: done:
                    191:        fclose(cfile);
                    192: }
                    193: 
                    194: static
                    195: token()
                    196: {
                    197:        char *cp;
                    198:        int c;
                    199:        struct toktab *t;
                    200: 
                    201:        if (feof(cfile))
                    202:                return (0);
                    203:        while ((c = getc(cfile)) != EOF &&
                    204:            (c == '\n' || c == '\t' || c == ' ' || c == ','))
                    205:                continue;
                    206:        if (c == EOF)
                    207:                return (0);
                    208:        cp = tokval;
                    209:        if (c == '"') {
                    210:                while ((c = getc(cfile)) != EOF && c != '"') {
                    211:                        if (c == '\\')
                    212:                                c = getc(cfile);
                    213:                        *cp++ = c;
                    214:                }
                    215:        } else {
                    216:                *cp++ = c;
                    217:                while ((c = getc(cfile)) != EOF
                    218:                    && c != '\n' && c != '\t' && c != ' ' && c != ',') {
                    219:                        if (c == '\\')
                    220:                                c = getc(cfile);
                    221:                        *cp++ = c;
                    222:                }
                    223:        }
                    224:        *cp = 0;
                    225:        if (tokval[0] == 0)
                    226:                return (0);
                    227:        for (t = toktab; t->tokstr; t++)
                    228:                if (!strcmp(t->tokstr, tokval))
                    229:                        return (t->tval);
                    230:        return (ID);
                    231: }
                    232: /* rest is nbs.c stolen from berknet */
                    233: 
                    234: char *deblknot(), *deblkclr();
                    235: char *nbs8decrypt(), *nbs8encrypt();
                    236: static char    E[48];
                    237: 
                    238: /*
                    239:  * The E bit-selection table.
                    240:  */
                    241: static char    e[] = {
                    242:        32, 1, 2, 3, 4, 5,
                    243:         4, 5, 6, 7, 8, 9,
                    244:         8, 9,10,11,12,13,
                    245:        12,13,14,15,16,17,
                    246:        16,17,18,19,20,21,
                    247:        20,21,22,23,24,25,
                    248:        24,25,26,27,28,29,
                    249:        28,29,30,31,32, 1,
                    250: };
                    251: static
                    252: char *nbsencrypt(str,key,result)
                    253:   char *result;
                    254:   char *str, *key; {
                    255:        static char buf[20],oldbuf[20];
                    256:        register int j;
                    257:        result[0] = 0;
                    258:        strcpy(oldbuf,key);
                    259:        while(*str){
                    260:                for(j=0;j<10;j++)buf[j] = 0;
                    261:                for(j=0;j<8 && *str;j++)buf[j] = *str++;
                    262:                strcat(result,nbs8encrypt(buf,oldbuf));
                    263:                strcat(result,"$");
                    264:                strcpy(oldbuf,buf);
                    265:                }
                    266:        return(result);
                    267:        }
                    268: static
                    269: char *nbsdecrypt(cpt,key,result)
                    270:   char *result;
                    271:   char *cpt,*key; {
                    272:        char *s;
                    273:        char c,oldbuf[20];
                    274:        result[0] = 0;
                    275:        strcpy(oldbuf,key);
                    276:        while(*cpt){
                    277:                for(s = cpt;*s && *s != '$';s++);
                    278:                c = *s;
                    279:                *s = 0;
                    280:                strcpy(oldbuf,nbs8decrypt(cpt,oldbuf));
                    281:                strcat(result,oldbuf);
                    282:                if(c == 0)break;
                    283:                cpt = s + 1;
                    284:                }
                    285:        return(result);
                    286:        }
                    287: 
                    288: static
                    289: char *nbs8encrypt(str,key)
                    290: char *str, *key; {
                    291:        static char keyblk[100], blk[100];
                    292:        register int i;
                    293: 
                    294:        enblkclr(keyblk,key);
                    295:        nbssetkey(keyblk);
                    296: 
                    297:        for(i=0;i<48;i++) E[i] = e[i];
                    298:        enblkclr(blk,str);
                    299:        blkencrypt(blk,0);                      /* forward dir */
                    300: 
                    301:        return(deblknot(blk));
                    302: }
                    303: 
                    304: static
                    305: char *nbs8decrypt(crp,key)
                    306: char *crp, *key; {
                    307:        static char keyblk[100], blk[100];
                    308:        register int i;
                    309: 
                    310:        enblkclr(keyblk,key);
                    311:        nbssetkey(keyblk);
                    312: 
                    313:        for(i=0;i<48;i++) E[i] = e[i];
                    314:        enblknot(blk,crp);
                    315:        blkencrypt(blk,1);                      /* backward dir */
                    316: 
                    317:        return(deblkclr(blk));
                    318: }
                    319: 
                    320: static
                    321: enblkclr(blk,str)              /* ignores top bit of chars in string str */
                    322: char *blk,*str; {
                    323:        register int i,j;
                    324:        char c;
                    325:        for(i=0;i<70;i++)blk[i] = 0;
                    326:        for(i=0; (c= *str) && i<64; str++){
                    327:                for(j=0; j<7; j++, i++)
                    328:                        blk[i] = (c>>(6-j)) & 01;
                    329:                i++;
                    330:                }
                    331:        }
                    332: 
                    333: static
                    334: char *deblkclr(blk)
                    335: char *blk; {
                    336:        register int i,j;
                    337:        char c;
                    338:        static char iobuf[30];
                    339:        for(i=0; i<10; i++){
                    340:                c = 0;
                    341:                for(j=0; j<7; j++){
                    342:                        c <<= 1;
                    343:                        c |= blk[8*i+j];
                    344:                        }
                    345:                iobuf[i] = c;
                    346:        }
                    347:        iobuf[i] = 0;
                    348:        return(iobuf);
                    349:        }
                    350: 
                    351: static
                    352: enblknot(blk,crp)
                    353: char *blk;
                    354: char *crp; {
                    355:        register int i,j;
                    356:        char c;
                    357:        for(i=0;i<70;i++)blk[i] = 0;
                    358:        for(i=0; (c= *crp) && i<64; crp++){
                    359:                if(c>'Z') c -= 6;
                    360:                if(c>'9') c -= 7;
                    361:                c -= '.';
                    362:                for(j=0; j<6; j++, i++)
                    363:                        blk[i] = (c>>(5-j)) & 01;
                    364:                }
                    365:        }
                    366: 
                    367: static
                    368: char *deblknot(blk)
                    369: char *blk; {
                    370:        register int i,j;
                    371:        char c;
                    372:        static char iobuf[30];
                    373:        for(i=0; i<11; i++){
                    374:                c = 0;
                    375:                for(j=0; j<6; j++){
                    376:                        c <<= 1;
                    377:                        c |= blk[6*i+j];
                    378:                        }
                    379:                c += '.';
                    380:                if(c > '9')c += 7;
                    381:                if(c > 'Z')c += 6;
                    382:                iobuf[i] = c;
                    383:        }
                    384:        iobuf[i] = 0;
                    385:        return(iobuf);
                    386: }
                    387: 
                    388: /*
                    389:  * This program implements the
                    390:  * Proposed Federal Information Processing
                    391:  *  Data Encryption Standard.
                    392:  * See Federal Register, March 17, 1975 (40FR12134)
                    393:  */
                    394: 
                    395: /*
                    396:  * Initial permutation,
                    397:  */
                    398: static char    IP[] = {
                    399:        58,50,42,34,26,18,10, 2,
                    400:        60,52,44,36,28,20,12, 4,
                    401:        62,54,46,38,30,22,14, 6,
                    402:        64,56,48,40,32,24,16, 8,
                    403:        57,49,41,33,25,17, 9, 1,
                    404:        59,51,43,35,27,19,11, 3,
                    405:        61,53,45,37,29,21,13, 5,
                    406:        63,55,47,39,31,23,15, 7,
                    407: };
                    408: 
                    409: /*
                    410:  * Final permutation, FP = IP^(-1)
                    411:  */
                    412: static char    FP[] = {
                    413:        40, 8,48,16,56,24,64,32,
                    414:        39, 7,47,15,55,23,63,31,
                    415:        38, 6,46,14,54,22,62,30,
                    416:        37, 5,45,13,53,21,61,29,
                    417:        36, 4,44,12,52,20,60,28,
                    418:        35, 3,43,11,51,19,59,27,
                    419:        34, 2,42,10,50,18,58,26,
                    420:        33, 1,41, 9,49,17,57,25,
                    421: };
                    422: 
                    423: /*
                    424:  * Permuted-choice 1 from the key bits
                    425:  * to yield C and D.
                    426:  * Note that bits 8,16... are left out:
                    427:  * They are intended for a parity check.
                    428:  */
                    429: static char    PC1_C[] = {
                    430:        57,49,41,33,25,17, 9,
                    431:         1,58,50,42,34,26,18,
                    432:        10, 2,59,51,43,35,27,
                    433:        19,11, 3,60,52,44,36,
                    434: };
                    435: 
                    436: static char    PC1_D[] = {
                    437:        63,55,47,39,31,23,15,
                    438:         7,62,54,46,38,30,22,
                    439:        14, 6,61,53,45,37,29,
                    440:        21,13, 5,28,20,12, 4,
                    441: };
                    442: 
                    443: /*
                    444:  * Sequence of shifts used for the key schedule.
                    445: */
                    446: static char    shifts[] = {
                    447:        1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,
                    448: };
                    449: 
                    450: /*
                    451:  * Permuted-choice 2, to pick out the bits from
                    452:  * the CD array that generate the key schedule.
                    453:  */
                    454: static char    PC2_C[] = {
                    455:        14,17,11,24, 1, 5,
                    456:         3,28,15, 6,21,10,
                    457:        23,19,12, 4,26, 8,
                    458:        16, 7,27,20,13, 2,
                    459: };
                    460: 
                    461: static char    PC2_D[] = {
                    462:        41,52,31,37,47,55,
                    463:        30,40,51,45,33,48,
                    464:        44,49,39,56,34,53,
                    465:        46,42,50,36,29,32,
                    466: };
                    467: 
                    468: /*
                    469:  * The C and D arrays used to calculate the key schedule.
                    470:  */
                    471: 
                    472: static char    C[28];
                    473: static char    D[28];
                    474: /*
                    475:  * The key schedule.
                    476:  * Generated from the key.
                    477:  */
                    478: static char    KS[16][48];
                    479: 
                    480: /*
                    481:  * Set up the key schedule from the key.
                    482:  */
                    483: 
                    484: static
                    485: nbssetkey(key)
                    486: char *key;
                    487: {
                    488:        register i, j, k;
                    489:        int t;
                    490: 
                    491:        /*
                    492:         * First, generate C and D by permuting
                    493:         * the key.  The low order bit of each
                    494:         * 8-bit char is not used, so C and D are only 28
                    495:         * bits apiece.
                    496:         */
                    497:        for (i=0; i<28; i++) {
                    498:                C[i] = key[PC1_C[i]-1];
                    499:                D[i] = key[PC1_D[i]-1];
                    500:        }
                    501:        /*
                    502:         * To generate Ki, rotate C and D according
                    503:         * to schedule and pick up a permutation
                    504:         * using PC2.
                    505:         */
                    506:        for (i=0; i<16; i++) {
                    507:                /*
                    508:                 * rotate.
                    509:                 */
                    510:                for (k=0; k<shifts[i]; k++) {
                    511:                        t = C[0];
                    512:                        for (j=0; j<28-1; j++)
                    513:                                C[j] = C[j+1];
                    514:                        C[27] = t;
                    515:                        t = D[0];
                    516:                        for (j=0; j<28-1; j++)
                    517:                                D[j] = D[j+1];
                    518:                        D[27] = t;
                    519:                }
                    520:                /*
                    521:                 * get Ki. Note C and D are concatenated.
                    522:                 */
                    523:                for (j=0; j<24; j++) {
                    524:                        KS[i][j] = C[PC2_C[j]-1];
                    525:                        KS[i][j+24] = D[PC2_D[j]-28-1];
                    526:                }
                    527:        }
                    528: }
                    529: 
                    530: 
                    531: /*
                    532:  * The 8 selection functions.
                    533:  * For some reason, they give a 0-origin
                    534:  * index, unlike everything else.
                    535:  */
                    536: static char    S[8][64] = {
                    537:        14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
                    538:         0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
                    539:         4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,
                    540:        15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13,
                    541: 
                    542:        15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,
                    543:         3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,
                    544:         0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,
                    545:        13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9,
                    546: 
                    547:        10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,
                    548:        13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,
                    549:        13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,
                    550:         1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12,
                    551: 
                    552:         7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,
                    553:        13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,
                    554:        10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,
                    555:         3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14,
                    556: 
                    557:         2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,
                    558:        14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,
                    559:         4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,
                    560:        11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3,
                    561: 
                    562:        12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,
                    563:        10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8,
                    564:         9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,
                    565:         4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13,
                    566: 
                    567:         4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,
                    568:        13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6,
                    569:         1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2,
                    570:         6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12,
                    571: 
                    572:        13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,
                    573:         1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,
                    574:         7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,
                    575:         2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11,
                    576: };
                    577: 
                    578: /*
                    579:  * P is a permutation on the selected combination
                    580:  * of the current L and key.
                    581:  */
                    582: static char    P[] = {
                    583:        16, 7,20,21,
                    584:        29,12,28,17,
                    585:         1,15,23,26,
                    586:         5,18,31,10,
                    587:         2, 8,24,14,
                    588:        32,27, 3, 9,
                    589:        19,13,30, 6,
                    590:        22,11, 4,25,
                    591: };
                    592: 
                    593: /*
                    594:  * The current block, divided into 2 halves.
                    595:  */
                    596: static char    L[32], R[32];
                    597: static char    tempL[32];
                    598: static char    f[32];
                    599: 
                    600: /*
                    601:  * The combination of the key and the input, before selection.
                    602:  */
                    603: static char    preS[48];
                    604: 
                    605: /*
                    606:  * The payoff: encrypt a block.
                    607:  */
                    608: 
                    609: static
                    610: blkencrypt(block, edflag)
                    611: char *block;
                    612: {
                    613:        int i, ii;
                    614:        register t, j, k;
                    615: 
                    616:        /*
                    617:         * First, permute the bits in the input
                    618:         */
                    619:        for (j=0; j<64; j++)
                    620:                L[j] = block[IP[j]-1];
                    621:        /*
                    622:         * Perform an encryption operation 16 times.
                    623:         */
                    624:        for (ii=0; ii<16; ii++) {
                    625:                /*
                    626:                 * Set direction
                    627:                 */
                    628:                if (edflag)
                    629:                        i = 15-ii;
                    630:                else
                    631:                        i = ii;
                    632:                /*
                    633:                 * Save the R array,
                    634:                 * which will be the new L.
                    635:                 */
                    636:                for (j=0; j<32; j++)
                    637:                        tempL[j] = R[j];
                    638:                /*
                    639:                 * Expand R to 48 bits using the E selector;
                    640:                 * exclusive-or with the current key bits.
                    641:                 */
                    642:                for (j=0; j<48; j++)
                    643:                        preS[j] = R[E[j]-1] ^ KS[i][j];
                    644:                /*
                    645:                 * The pre-select bits are now considered
                    646:                 * in 8 groups of 6 bits each.
                    647:                 * The 8 selection functions map these
                    648:                 * 6-bit quantities into 4-bit quantities
                    649:                 * and the results permuted
                    650:                 * to make an f(R, K).
                    651:                 * The indexing into the selection functions
                    652:                 * is peculiar; it could be simplified by
                    653:                 * rewriting the tables.
                    654:                 */
                    655:                for (j=0; j<8; j++) {
                    656:                        t = 6*j;
                    657:                        k = S[j][(preS[t+0]<<5)+
                    658:                                (preS[t+1]<<3)+
                    659:                                (preS[t+2]<<2)+
                    660:                                (preS[t+3]<<1)+
                    661:                                (preS[t+4]<<0)+
                    662:                                (preS[t+5]<<4)];
                    663:                        t = 4*j;
                    664:                        f[t+0] = (k>>3)&01;
                    665:                        f[t+1] = (k>>2)&01;
                    666:                        f[t+2] = (k>>1)&01;
                    667:                        f[t+3] = (k>>0)&01;
                    668:                }
                    669:                /*
                    670:                 * The new R is L ^ f(R, K).
                    671:                 * The f here has to be permuted first, though.
                    672:                 */
                    673:                for (j=0; j<32; j++)
                    674:                        R[j] = L[j] ^ f[P[j]-1];
                    675:                /*
                    676:                 * Finally, the new L (the original R)
                    677:                 * is copied back.
                    678:                 */
                    679:                for (j=0; j<32; j++)
                    680:                        L[j] = tempL[j];
                    681:        }
                    682:        /*
                    683:         * The output L and R are reversed.
                    684:         */
                    685:        for (j=0; j<32; j++) {
                    686:                t = L[j];
                    687:                L[j] = R[j];
                    688:                R[j] = t;
                    689:        }
                    690:        /*
                    691:         * The final output
                    692:         * gets the inverse permutation of the very original.
                    693:         */
                    694:        for (j=0; j<64; j++)
                    695:                block[j] = L[FP[j]-1];
                    696: }
                    697: /*
                    698:        getutmp()
                    699:        return a pointer to the system utmp structure associated with
                    700:        terminal sttyname, e.g. "/dev/tty3"
                    701:        Is version independent-- will work on v6 systems
                    702:        return NULL if error
                    703: */
                    704: static
                    705: struct utmp *getutmp(sttyname)
                    706: char *sttyname;
                    707: {
                    708:        static struct utmp utmpstr;
                    709:        FILE *fdutmp;
                    710: 
                    711:        if(sttyname == NULL || sttyname[0] == 0)return(NULL);
                    712: 
                    713:        fdutmp = fopen("/etc/utmp","r");
                    714:        if(fdutmp == NULL)return(NULL);
                    715: 
                    716:        while(fread(&utmpstr,1,sizeof utmpstr,fdutmp) == sizeof utmpstr)
                    717:                if(strcmp(utmpstr.ut_line,sttyname+5) == 0){
                    718:                        fclose(fdutmp);
                    719:                        return(&utmpstr);
                    720:                }
                    721:        fclose(fdutmp);
                    722:        return(NULL);
                    723: }
                    724: 
                    725: static
                    726: sreverse(sto, sfrom)
                    727:        register char *sto, *sfrom;
                    728: {
                    729:        register int i;
                    730: 
                    731:        i = strlen(sfrom);
                    732:        while (i >= 0)
                    733:                *sto++ = sfrom[i--];
                    734: }
                    735: 
                    736: static
                    737: char *mkenvkey(mch)
                    738:        char mch;
                    739: {
                    740:        static char skey[40];
                    741:        register struct utmp *putmp;
                    742:        char stemp[40], stemp1[40], sttyname[30];
                    743:        register char *sk,*p;
                    744: 
                    745:        if (isatty(2))
                    746:                strcpy(sttyname,ttyname(2));
                    747:        else if (isatty(0))
                    748:                strcpy(sttyname,ttyname(0));
                    749:        else if (isatty(1))
                    750:                strcpy(sttyname,ttyname(1));
                    751:        else
                    752:                return (NULL);
                    753:        putmp = getutmp(sttyname);
                    754:        if (putmp == NULL)
                    755:                return (NULL);
                    756:        sk = skey;
                    757:        p = putmp->ut_line;
                    758:        while (*p)
                    759:                *sk++ = *p++;
                    760:        *sk++ = mch;
                    761:        sprintf(stemp, "%ld", putmp->ut_time);
                    762:        sreverse(stemp1, stemp);
                    763:        p = stemp1;
                    764:        while (*p)
                    765:                *sk++ = *p++;
                    766:        *sk = 0;
                    767:        return (skey);
                    768: }
                    769: 
                    770: mkpwunclear(spasswd,mch,sencpasswd)
                    771:        char mch, *spasswd, *sencpasswd;
                    772: {
                    773:        register char *skey;
                    774: 
                    775:        if (spasswd[0] == 0) {
                    776:                sencpasswd[0] = 0;
                    777:                return;
                    778:        }
                    779:        skey = mkenvkey(mch);
                    780:        if (skey == NULL) {
                    781:                fprintf(stderr, "Can't make key\n");
                    782:                exit(1);
                    783:        }
                    784:        nbsencrypt(spasswd, skey, sencpasswd);
                    785: }
                    786: 
                    787: mkpwclear(sencpasswd,mch,spasswd)
                    788:        char mch, *spasswd, *sencpasswd;
                    789: {
                    790:        register char *skey;
                    791: 
                    792:        if (sencpasswd[0] == 0) {
                    793:                spasswd[0] = 0;
                    794:                return;
                    795:        }
                    796:        skey = mkenvkey(mch);
                    797:        if (skey == NULL) {
                    798:                fprintf(stderr, "Can't make key\n");
                    799:                exit(1);
                    800:        }
                    801:        nbsdecrypt(sencpasswd, skey, spasswd);
                    802: }

unix.superglobalmegacorp.com

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