Annotation of researchv10no/games/des/encrypt.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *     data encryption and decryption program
        !             3:  */
        !             4: #include <stdio.h>
        !             5: 
        !             6: typedef union {
        !             7:        long words[2];
        !             8:        char bytes[8];
        !             9: } block;
        !            10: extern long keys_L[], keys_H[];
        !            11: 
        !            12: main(argc, argv)
        !            13: char *argv[];
        !            14: {
        !            15:        static block key;
        !            16:        static block icv;
        !            17:        static block in;
        !            18:        register char *cp;
        !            19:        register c;
        !            20:        register i;
        !            21:        char *cpretry;
        !            22:        static char buf[512];
        !            23:        extern char *getpass();
        !            24: 
        !            25:        /*
        !            26:         *      generate key by crunching user supplied string.
        !            27:         */
        !            28:        if (argc > 2) {
        !            29:                fprintf(stderr, "usage: %s key <stdin >stdout\n", argv[0]);
        !            30:                exit(1);
        !            31:        }
        !            32:        if (argc == 2) {
        !            33:                strncpy(buf, argv[1], 512);
        !            34:                cp = argv[1];
        !            35:                while (*cp)
        !            36:                        *cp++ = '\0';
        !            37:                cp = buf;
        !            38:        }
        !            39:        else {
        !            40:                for (cp=cpretry=(char*)NULL; ;) {
        !            41:                        cp = getpass("Enter Key: ");
        !            42:                        cp = (char*)strcpy(buf,cp);
        !            43:                        cpretry = getpass("Reenter Key for Verification: ");
        !            44:                        if (strcmp(cp,cpretry))
        !            45:                                fprintf(stderr,"Sorry, keys don't match.\n");
        !            46:                        else {
        !            47:                                while (*cpretry) *cpretry++ = '\0';
        !            48:                                break;
        !            49:                        }
        !            50:                }
        !            51:        }
        !            52:        key.words[0] = 0;       /* modification April 28, 1982 */
        !            53:        key.words[1] = 0;
        !            54:        compkeys("canofbugs", 0);
        !            55:        for (i = 0; *cp; i = ++i & 07) {
        !            56:                key.bytes[i & 07] ^= *cp;
        !            57:                *cp++ = '\0';
        !            58:                if (i == 07)
        !            59:                        des(&key, &key);
        !            60:        }
        !            61:        des(&key, &key);
        !            62:        /*
        !            63:         *      set initial chaining value
        !            64:         */
        !            65:        des("numbersoup", &icv);
        !            66:        cp = argv[0];
        !            67:        for (i = strlen(cp); i >= 0; --i)
        !            68:                if (cp[i] == '/')
        !            69:                        break;
        !            70:        cp += i + 1;
        !            71:        i = 0;
        !            72:        if (strcmp(cp, "encrypt") == 0) {
        !            73:                compkeys(&key, 0);
        !            74:                while (i = fread(key.bytes, 1, 8, stdin)) {
        !            75:                        if (i != 8)
        !            76:                                des(&icv, &icv);
        !            77:                        icv.words[0] ^= key.words[0];
        !            78:                        icv.words[1] ^= key.words[1];
        !            79:                        if (i == 8)
        !            80:                                des(&icv, &icv);
        !            81:                        fwrite(icv.bytes, 1, i, stdout);
        !            82:                }
        !            83:        } else if (strcmp(cp, "decrypt") == 0) {
        !            84:                compkeys(&key, 1);
        !            85:                while (i = fread(in.bytes, 1, 8, stdin)) {
        !            86:                        if (i == 8) {
        !            87:                                des(&in, &key);
        !            88:                                icv.words[0] ^= key.words[0];
        !            89:                                icv.words[1] ^= key.words[1];
        !            90:                        } else {
        !            91:                                keyreverse();
        !            92:                                des(&icv, &icv);
        !            93:                                icv.words[0] ^= in.words[0];
        !            94:                                icv.words[1] ^= in.words[1];
        !            95:                        }
        !            96:                        fwrite(icv.bytes, 1, i, stdout);
        !            97:                        icv.words[0] = in.words[0];
        !            98:                        icv.words[1] = in.words[1];
        !            99:                }
        !           100:        } else {
        !           101:                fprintf(stderr, "zeroth argument must be 'encrypt' or 'decrypt'\n");
        !           102:                exit(1);
        !           103:        }
        !           104: }
        !           105: keyreverse()
        !           106: {
        !           107:        register i;
        !           108:        register j;
        !           109: 
        !           110:        for (i = 0; i < 8; i++) {
        !           111:                j = keys_L[i];
        !           112:                keys_L[i] = keys_L[15-i];
        !           113:                keys_L[15-i] = j;
        !           114:                j = keys_H[i];
        !           115:                keys_H[i] = keys_H[15-i];
        !           116:                keys_H[15-i] = j;
        !           117:        }
        !           118: }

unix.superglobalmegacorp.com

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