Annotation of researchv10no/cmd/cvcrypt.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Routine to convert old style encrypted files into new (1983) format.
                      3:  *
                      4:  * cvcrypt [-r] oldfile newfile
                      5:  *
                      6:  * Prompts for key.
                      7:  * -r option converts from new to old.
                      8:  *
                      9: */
                     10: 
                     11: #include <stdio.h>
                     12: 
                     13: #define BSIZE 1024
                     14: 
                     15: char *getpass();
                     16: char iobuf[BSIZE];
                     17: char perm[1024];
                     18: 
                     19: main(argc, argv)
                     20: int argc;
                     21: char *argv[];
                     22: {
                     23:        int ninbuf;
                     24:        long count;
                     25:        int fdi, fdo;
                     26:        int reverse = 0;
                     27:        int i;
                     28:        int warning = 0;
                     29: 
                     30:        if((argv[1][0] == '-') && (argv[1][1] == 'r')){
                     31:                reverse = 1;
                     32:                argc--;
                     33:                argv++;
                     34:        }
                     35: 
                     36:        if (argc  != 3){
                     37:                fprintf(stderr, "Usage: %s [-r] oldfile newfile\n", argv[0]);
                     38:                exit(1);
                     39:        }else{
                     40:                crinit(getpass("Enter key:"), perm);
                     41:        }
                     42: 
                     43:        fdi = open(argv[1], 0);
                     44:        if(fdi <0){
                     45:                fprintf(stderr, "Cannot open %s for reading.\n", argv[1]);
                     46:                exit(1);
                     47:        }
                     48:        fdo = open(argv[2], 1);
                     49:        if(fdo  != -1){
                     50:                fprintf(stderr, "File %s already exists.\n", argv[2]);
                     51:                exit(1);
                     52:        }
                     53:        fdo = creat(argv[2], 0666);
                     54:        if(fdo < 0){
                     55:                fprintf(stderr, "Cannot open %s for writing.\n", argv[2]);
                     56:                exit(1);
                     57:        }
                     58: 
                     59:        count = 0;
                     60:        while(1){
                     61:                ninbuf = read(fdi, iobuf, BSIZE);
                     62:                if(ninbuf == 0) exit(0);
                     63:                if(ninbuf < 0){
                     64:                        error("crypt: read error.\n");
                     65:                        exit(1);
                     66:                }
                     67:                if(reverse == 0){
                     68:                        ocrblock(perm, iobuf, ninbuf, count);
                     69:                }else{
                     70:                        crblock(perm, iobuf, ninbuf, count);
                     71:                }
                     72:                if(warning == 0){
                     73:                        for(i=0; i<ninbuf; i++){
                     74:                                if((iobuf[i] & 0200) != 0){
                     75:                                        warning = 1;
                     76:                                        fprintf(stderr, "Wrong key or non-ascii file; conversion continued.\n");
                     77:                                        break;
                     78:                                }
                     79:                        }
                     80:                }
                     81:                if(reverse == 0){
                     82:                        crblock(perm, iobuf, ninbuf, count);
                     83:                }else{
                     84:                        ocrblock(perm, iobuf, ninbuf, count);
                     85:                }
                     86:                count += ninbuf;
                     87:                if(write(fdo, iobuf, ninbuf) != ninbuf){
                     88:                        error("crypt: write error.\n");
                     89:                        exit(1);
                     90:                }
                     91:        }
                     92: }
                     93: 
                     94: crblock(permp, buf, nchar, startn)
                     95: char *permp;
                     96: char *buf;
                     97: long startn;
                     98: {
                     99:        register char *p1;
                    100:        int n1;
                    101:        int n2;
                    102:        int n3;
                    103:        register char *t1, *t2, *t3;
                    104:        char *t4;
                    105: 
                    106:        t1 = permp;
                    107:        t2 = &permp[256];
                    108:        t3 = &permp[512];
                    109:        t4 = &permp[768];
                    110: 
                    111:        n1 = startn&0377;
                    112:        n2 = (startn>>8)&0377;
                    113:        p1 = buf;
                    114:        while(nchar--) {
                    115:                n3 = t4[n1];
                    116:                *p1 = t2[(t3[(t1[(*p1+n3)&0377]+n2)&0377]-n2)&0377]-n3;
                    117:                n1++;
                    118:                if(n1==256){
                    119:                        n1 = 0;
                    120:                        n2++;
                    121:                        if(n2==256) n2 = 0;
                    122:                }
                    123:                p1++;
                    124:        }
                    125: }
                    126: 
                    127: 
                    128: /*
                    129:  * Besides initializing the encryption machine, this routine
                    130:  * returns 0 if the key is null, and 1 if it is non-null.
                    131:  */
                    132: crinit(keyp, permp)
                    133: char   *keyp, *permp;
                    134: {
                    135:        register char *t1, *t2, *t3;
                    136:        char *t4;
                    137:        register i;
                    138:        int ic, k, temp, pf[2];
                    139:        unsigned random;
                    140:        char buf[13];
                    141:        long seed;
                    142: 
                    143:        t1 = permp;
                    144:        t2 = &permp[256];
                    145:        t3 = &permp[512];
                    146:        t4 = &permp[768];
                    147:        if(*keyp == 0)
                    148:                return(0);
                    149:        strncpy(buf, keyp, 8);
                    150:        while (*keyp)
                    151:                *keyp++ = '\0';
                    152:        buf[8] = buf[0];
                    153:        buf[9] = buf[1];
                    154:        if (pipe(pf)<0)
                    155:                pf[0] = pf[1] = -1;
                    156:        if (fork()==0) {
                    157:                close(0);
                    158:                close(1);
                    159:                dup(pf[0]);
                    160:                dup(pf[1]);
                    161:                execl("/usr/lib/makekey", "-", 0);
                    162:                execl("/lib/makekey", "-", 0);
                    163:                exit(1);
                    164:        }
                    165:        write(pf[1], buf, 10);
                    166:        if (wait((int *)NULL)==-1 || read(pf[0], buf, 13)!=13)
                    167:                error("crypt: cannot generate key");
                    168:        close(pf[0]);
                    169:        close(pf[1]);
                    170:        seed = 123;
                    171:        for (i=0; i<13; i++)
                    172:                seed = seed*buf[i] + i;
                    173:        for(i=0;i<256;i++){
                    174:                t1[i] = i;
                    175:                t3[i] = 0;
                    176:        }
                    177:        for(i=0; i<256; i++) {
                    178:                seed = 5*seed + buf[i%13];
                    179:                random = seed % 65521;
                    180:                k = 256-1 - i;
                    181:                ic = (random&0377) % (k+1);
                    182:                random >>= 8;
                    183:                temp = t1[k];
                    184:                t1[k] = t1[ic];
                    185:                t1[ic] = temp;
                    186:                if(t3[k]!=0) continue;
                    187:                ic = (random&0377) % k;
                    188:                while(t3[ic]!=0) ic = (ic+1) % k;
                    189:                t3[k] = ic;
                    190:                t3[ic] = k;
                    191:        }
                    192:        for(i=0; i<256; i++){
                    193:                t2[t1[i]&0377] = i;
                    194:                t4[i] = (t1[i] + t3[i]) & 0377;
                    195:        }
                    196:        return(1);
                    197: }
                    198: 
                    199: 
                    200: error(s)
                    201: char *s;
                    202: {
                    203:                fprintf(stderr, s);
                    204: }
                    205: ocrblock(permp, buf, nchar, startn)
                    206: char *permp;
                    207: char *buf;
                    208: long startn;
                    209: {
                    210:        register char *p1;
                    211:        int n1;
                    212:        int n2;
                    213:        int n3;
                    214:        register char *t1, *t2, *t3;
                    215:        char *t4;
                    216: 
                    217:        t1 = permp;
                    218:        t2 = &permp[256];
                    219:        t3 = &permp[512];
                    220:        t4 = &permp[768];
                    221: 
                    222:        n1 = startn&0377;
                    223:        n2 = (startn>>8)&0377;
                    224:        p1 = buf;
                    225:        while(nchar--) {
                    226:                *p1 = t2[(t3[(t1[(*p1+n1)&0377]+n2)&0377]-n2)&0377]-n1;
                    227:                n1++;
                    228:                if(n1==256){
                    229:                        n1 = 0;
                    230:                        n2++;
                    231:                        if(n2==256) n2 = 0;
                    232:                }
                    233:                p1++;
                    234:        }
                    235: }

unix.superglobalmegacorp.com

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