Annotation of researchv10no/cmd/descrypt/io.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *     Machine Independent Input/Output Routines
        !             3:  *     D.P.Mitchell  83/06/08.
        !             4:  */
        !             5: 
        !             6: #include <stdio.h>
        !             7: #include "crypt.h"
        !             8: #define MAGIC 0xe48d
        !             9: 
        !            10: extern Block random;
        !            11: extern int permutation[];
        !            12: extern int pflag;
        !            13: 
        !            14: /*
        !            15:  *     Traffic-encryption layer (plaintext source)
        !            16:  */
        !            17: int
        !            18: p_source(output)
        !            19: register Block *output;
        !            20: {
        !            21:        static int state = FIRST8;
        !            22:        static long nblocks;
        !            23:        static long rand;
        !            24:        register c;
        !            25:        register n;
        !            26:        int all_junk;
        !            27: 
        !            28:        output->left  = 0;
        !            29:        output->right = 0;
        !            30:        all_junk = 1;
        !            31:        for (n = 0; n < 64; n += 8) {
        !            32:                switch (state) {
        !            33:                case FIRST8:
        !            34:                        make_sum(&random);
        !            35:                        *output = random;
        !            36:                        state = GETCHAR;
        !            37:                        nblocks = 1;
        !            38:                        return 1;
        !            39:                case GETCHAR:
        !            40:                        all_junk = 0;
        !            41:                        c = getchar();
        !            42:                        if (c == EOF) {
        !            43:                                state = ENDTEXT;
        !            44:                                c = ETX;
        !            45:                                break;
        !            46:                        }
        !            47:                        if (c == ETX) {
        !            48:                                state = REPEATETX;
        !            49:                                break;
        !            50:                        }
        !            51:                        break;
        !            52:                case REPEATETX:
        !            53:                        all_junk = 0;
        !            54:                        state = GETCHAR;
        !            55:                        c = ETX;
        !            56:                        break;
        !            57:                case ENDTEXT:
        !            58:                        state = PADJUNK;
        !            59:                        rand = NEXT(random.left);
        !            60:                        for (;;) {
        !            61:                                c = NEXT(rand);
        !            62:                                if (((c >> 24) & 0377) != ETX)
        !            63:                                        break;
        !            64:                                rand = NEXT(rand);
        !            65:                        }
        !            66:                case PADJUNK:
        !            67:                        if (all_junk && nblocks % SUPERSIZE == 0)
        !            68:                                return 0;
        !            69:                        rand = NEXT(rand);
        !            70:                        c = (rand >> 24) & 0377;
        !            71:                        break;
        !            72:                }
        !            73:                if (n > 31)
        !            74:                        output->right |= c << (n & 31);
        !            75:                else
        !            76:                        output->left  |= c << (n & 31);
        !            77:        }
        !            78:        nblocks++;
        !            79:        return 1;
        !            80: }
        !            81: 
        !            82: /*
        !            83:  *     traffic-decryption layer (plaintext sink)
        !            84:  */
        !            85: p_sink(input)
        !            86: register Block *input;
        !            87: {
        !            88:        static int state = FIRST8;
        !            89:        register c;
        !            90:        register n;
        !            91: 
        !            92:        for (n = 0; n < 64; n += 8) {
        !            93:                if (n > 31)
        !            94:                        c = (input->right >> (n & 31)) & 0377;
        !            95:                else
        !            96:                        c = (input->left  >> (n & 31)) & 0377;
        !            97:                switch (state) {
        !            98:                case FIRST8:
        !            99:                        check_sum(input);
        !           100:                        state = PUTCHAR;
        !           101:                        return;
        !           102:                case PUTCHAR:
        !           103:                        if (c == ETX) {
        !           104:                                state = FOUNDETX;
        !           105:                                break;
        !           106:                        }
        !           107:                        putchar(c);
        !           108:                        break;
        !           109:                case FOUNDETX:
        !           110:                        if (c == ETX) {
        !           111:                                state = PUTCHAR;
        !           112:                                putchar(ETX);
        !           113:                                break;
        !           114:                        }
        !           115:                        state = ENDTEXT;
        !           116:                        break;
        !           117:                case ENDTEXT:
        !           118:                        break;
        !           119:                }
        !           120:        }
        !           121: }
        !           122: 
        !           123: /*
        !           124:  *     permutation-decryption layer (ciphertext source)
        !           125:  */
        !           126: int
        !           127: c_source(output)
        !           128: Block *output;
        !           129: {
        !           130:        register long n;
        !           131:        register int *ip;
        !           132:        static int c_buffer[128];
        !           133:        static index = 128;
        !           134: 
        !           135:        if (index > 127) {
        !           136:                if (pflag) {
        !           137:                        if (!in_alpha(c_buffer))
        !           138:                                return 0;
        !           139:                } else {
        !           140:                        for (n = 0; n < 128; n++)
        !           141:                                if ((c_buffer[permutation[n]] = getchar()) == EOF)
        !           142:                                        return 0;
        !           143:                }
        !           144:                index = 0;
        !           145:        }
        !           146:        ip = &c_buffer[index];
        !           147:        n  = *ip++;
        !           148:        n |= *ip++ << 8;
        !           149:        n |= *ip++ << 16;
        !           150:        n |= *ip++ << 24;
        !           151:        output->left = n;
        !           152:        n  = *ip++;
        !           153:        n |= *ip++ << 8;
        !           154:        n |= *ip++ << 16;
        !           155:        n |= *ip << 24;
        !           156:        output->right = n;
        !           157:        index += 8;
        !           158:        return 1;
        !           159: }
        !           160: 
        !           161: /*
        !           162:  *     permutation-encryption layer (ciphertext sink)
        !           163:  */
        !           164: c_sink(input)
        !           165: Block *input;
        !           166: {
        !           167:        register long n;
        !           168:        register int *ip;
        !           169:        static int c_buffer[128];
        !           170:        static int index = 0;
        !           171: 
        !           172:        ip = &c_buffer[index];
        !           173:        n = input->left;
        !           174:        *ip++ = n & 0xff;
        !           175:        *ip++ = (n >> 8) & 0xff;
        !           176:        *ip++ = (n >> 16) & 0xff;
        !           177:        *ip++ = (n >> 24) & 0xff;
        !           178:        n = input->right;
        !           179:        *ip++ = n & 0xff;
        !           180:        *ip++ = (n >> 8) & 0xff;
        !           181:        *ip++ = (n >> 16) & 0xff;
        !           182:        *ip   = (n >> 24) & 0xff;
        !           183:        index += 8;
        !           184:        if (index > 127) {
        !           185:                if (pflag)
        !           186:                        out_alpha(c_buffer);
        !           187:                else {
        !           188:                        for (n = 0; n < 128; n++)
        !           189:                                putchar(c_buffer[permutation[n]]);
        !           190:                }
        !           191:                index = 0;
        !           192:        }
        !           193: }
        !           194: 
        !           195: make_sum(block)
        !           196: Block *block;
        !           197: {
        !           198:        long a, b, c;
        !           199:        long sum;
        !           200: 
        !           201:        a = block->right & 0xffff;
        !           202:        b = (block->right >> 16) & 0xffff;
        !           203:        c = block->left  & 0xffff;
        !           204:        sum = (MAGIC + 13*a + 23*b + 31*c) & 0xffff;
        !           205:        block->left = (sum << 16) | c;
        !           206: }
        !           207: 
        !           208: check_sum(block)
        !           209: Block *block;
        !           210: {
        !           211:        long a, b, c, d;
        !           212:        long sum;
        !           213: 
        !           214:        a = block->right & 0xffff;
        !           215:        b = (block->right >> 16) & 0xffff;
        !           216:        c = block->left  & 0xffff;
        !           217:        d = (block->left  >> 16) & 0xffff;
        !           218:        sum = (MAGIC + 13*a + 23*b + 31*c) & 0xffff;
        !           219:        if (sum != d) {
        !           220:                fprintf(stderr, "Wrong key\n");
        !           221:                exit(1);
        !           222:        }
        !           223: }

unix.superglobalmegacorp.com

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