Annotation of coherent/d/bin/crypt.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: 
                      3: unsigned int seed1, seed2;
                      4: unsigned char rotor[256];
                      5: unsigned char deck[256];
                      6: char key[12];
                      7: char padkey[] = {
                      8:        003, 022, 006, 007, 034,
                      9:        023, 031, 001, 027, 036
                     10: };
                     11: char   *getpass();
                     12: char   *crypt();
                     13: 
                     14: main(ac, av)
                     15: int ac;
                     16: char *av[];
                     17: {
                     18:        getkey(ac, av);
                     19:        pervertkey();
                     20:        makerotor();
                     21:        cryptext();
                     22:        return (0);
                     23: }
                     24: 
                     25: /*
                     26:  * Get the password and destroy all traces in the system.
                     27:  */
                     28: getkey(ac, av)
                     29: int ac;
                     30: char *av[];
                     31: {
                     32:        register char *ps;
                     33:        register int i;
                     34: 
                     35:        if (ac == 2)
                     36:                ps = av[1];
                     37:        else if (ac == 1) {
                     38:                ps = getpass("Password? ");
                     39:                if (*ps == '\0')
                     40:                        derror("Empty password not allowed.");
                     41:        }
                     42:        else
                     43:                derror("USAGE: crypt [password]");
                     44:        for (i = 0; i < 10  &&  (key[i] = *ps) != '\0'; ++i)
                     45:                *ps++ = '\0';
                     46:        while (*ps)
                     47:                *ps++ = '\0';
                     48: }
                     49: 
                     50: /*
                     51:  * Pad key to 10 chars, coerce the last two into `salt' range [./0-9A-Za-z].
                     52:  * Feed this to crypt(3), and copy the last 11 chars of the result into key.
                     53:  */
                     54: pervertkey()
                     55: {
                     56:        register char *cp;
                     57:        register char *kp = key;
                     58: 
                     59:        strncat(key, padkey, 10 - strlen(key));
                     60:        key[10] = legal(key[9]);
                     61:        key[9] = legal(key[8]);
                     62:        key[11] = key[8] = '\0';
                     63:        cp = crypt(&key[0], &key[9]);
                     64:        cp += 2;
                     65:        while ((*kp++ = *cp++) != 0)
                     66:                ;
                     67: }
                     68: 
                     69: /*
                     70:  * Coerce a char into a legal salt character if it is not.
                     71:  */
                     72: legal(c)
                     73: register int c;
                     74: {
                     75:        if (c < 12)
                     76:                return (c + '.');
                     77:        else if (c < 38)
                     78:                return (c - 12 + 'A');
                     79:        else if (c < '.')
                     80:                return (c - 38 + 'a');
                     81:        else if ('9' < c &&  c < 'A')
                     82:                return ('o' + 1 - ('A' - c));
                     83:        else if ('Z' < c  &&  c < 'a')
                     84:                return ('u' + 1 - ('a' - c));
                     85:        else if (c > 'z')
                     86:                return ('z' + 1 - (0200 - c));
                     87:        else
                     88:                return (c);
                     89: }
                     90: 
                     91: 
                     92: /*
                     93:  * Makerotor() uses key to initialize two seeds for rand(). Seed1 is used to
                     94:  *     build the rotor. Seed2 initializes the `random' sequence of offsets.
                     95:  */
                     96: makerotor()
                     97: {
                     98:        register int i, j;
                     99:        register unsigned char uc;
                    100: 
                    101:        /* Initialize seeds. */
                    102:        for (i = 0; i < 6; ++i) {
                    103:                seed1 = (++seed1) * key[i];
                    104:                seed2 = (++seed2) * key[i + 5];
                    105:        }
                    106: 
                    107:        /* Initialize and shuffle deck. */
                    108:        srand(seed1);
                    109:        for (i = 0; i < 256; ++i)
                    110:                deck[i] = i;
                    111:        for (i = 0; i < 256; ++i) {
                    112:                j = i + rand() % (256 - i);
                    113:                uc = deck[i];
                    114:                deck[i] = deck[j];
                    115:                deck[j] = uc;
                    116:        }
                    117: 
                    118:        /* Initialize rotor. */
                    119:        for (i = 0; i < 256; i+=2) {
                    120:                rotor[deck[i]] = deck[i + 1];
                    121:                rotor[deck[i + 1]] = deck[i];
                    122:        }
                    123: }
                    124: 
                    125: cryptext()
                    126: {
                    127:        register int c, j;
                    128: 
                    129:        srand(seed2);
                    130:        while ((c = getchar()) != EOF) {
                    131:                j = rand() % 256;
                    132:                putchar((rotor[(c + j) % 256] + 256 - j) % 256);
                    133:        }
                    134: }
                    135: 
                    136: derror(s)
                    137: register char *s;
                    138: {
                    139:        fprintf(stderr, "%s\n", s);
                    140:        exit(1);
                    141: }
                    142: 

unix.superglobalmegacorp.com

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