/* test2001.c January 3, 1983 2:09 PM */ #include "lark.h" #include "Encrypt.h" #include "env.h" #include "queue.h" extern int Encrypt(), crypt(), encend(), Chav(), wf(); extern int getchar(), putchar(); extern int inbyte(); extern int outbyte(); extern char DesTriples; extern int NumTriples; static int ifastb; struct Queue iwaitq; static int triple; static char ca[8]; static char key[8]; static char plain[160]; static char cypher[160]; static char res[160]; static char sk[8]; static char sp[8]; static char sc[8]; static char tb[8]; static char *kp; static char *dp; static char *cp; static struct ECB iecb[10]; main() { char c; int i; InitOS(); wf("\r2001 test, ? for help.\r"); for (i=0; i<8; i++) key[i] = 0x01; for (i=0; i<160; i++) plain[i] = i; kp = &DesTriples; dp = &DesTriples+8; cp = &DesTriples+16; triple = 0; initiecb(); for (;;) { c = getchar() & 0177; switch (c) { case 'q': { wf("\rQuit!\r"); return; }; case '?': { help(); break; }; case 'o': { once(); break; }; case 's': { fast(); break; }; case 't': { itrip(); break; }; case 'p': { sdma(); break; }; case '1': { ionce(); break; }; case '2': { ifast(); break; }; default: wf("\r unknown command\r"); }; }; /* end of forever loop */ }; static initiecb() { int i; for (i=0; i<10; i += 1) { iecb[i].kp = key; iecb[i].srcp = plain; iecb[i].dstp = cypher; }; for (i=0; i<10; i += 1) { iecb[i].count = 160; iecb[i].encrypt = true; iecb[i].proc = 0; iecb[i].item = i; }; }; static islowproc(p) int *p; { *p = true; }; static ionce() { int flag; flag = false; iecb[0].proc = (int) &islowproc; iecb[0].item = (int) &flag; Encrypt(&iecb[0]); while(!flag && !Chav()) Block(); getchar(); wfcr(); }; static ifastproc(n) int n; { Enqueue(&iwaitq, &iecb[n]); }; static ifast() { struct ECB *p; int i, count; initiecb(); InitQueue(&iwaitq); ifastb = true; for (i=0; i<10; i+=1) { iecb[i].item = i; iecb[i].proc = (int) &ifastproc; Encrypt(&iecb[i]); }; for (;;) { if (Chav()) break; p = Dequeue(&iwaitq); if (p) { Encrypt(p); count += 1; if (count > 100) { putchar('.'); count = 0; }; }; }; getchar(); wfcr(); }; static itrip() { triple = ( triple + 1 ) % NumTriples; wf1("triple = %d\n", triple); }; static fast() { wf("\rNon-DMA test, type char to stop\r"); while (!Chav()) nodma(); getchar(); }; static once() { nodma(); wf("once\r"); }; static nodma() { int i, idx, go, once, res; for (i=0;i<(NumTriples*2);i++) { idx = (i % NumTriples) * 24; if (i<=6) res = descypher(1, kp+idx, dp+idx, cp+idx); else res = descypher(0, kp+idx, cp+idx, dp+idx); switch (res) { case 1: wf(" KR "); break; case 2: wf(" KPE "); break; case 3: wf(" DIR "); break; case 4: wf(" DOR "); break; case 5: wf(" err "); break; default: putchar('.'); break; }; }; }; static help() { wf("\rq: quit, o: nodma, ?: help\r"); wf("p: print diffs, s: no-dma fast\r"); wf("1: interrupt once, 2: interrupt fast\r"); }; static sdma() { int i, idx, flag; struct ECB sbe, sbd; idx = (triple % NumTriples) * 24; triple = (triple + 1) % NumTriples; for (i = 0; i < 8; i += 1) { sk[i] = kp[idx+i]; sp[i] = dp[idx+i]; sc[i] = cp[idx+i]; }; sbe.kp = sk; sbe.srcp = sp; sbe.dstp = tb; sbe.count = 8; sbe.encrypt = true; sbe.proc = (int) &islowproc; sbe.item = (int) &flag; sbd.kp = sk; sbd.srcp = sc; sbd.dstp = tb; sbd.count = 8; sbd.encrypt = false; sbd.proc = (int) &islowproc; sbd.item = (int) &flag; flag = false; Encrypt(&sbe); while (!flag && !Chav()) Block(); for (i = 0; i < 8; i += 1) { if (sc[i] != tb[i]) { wf("encrypt was: "); printary(tb); wf("should be: "); printary(sc); wf("\r"); break; }; }; flag = false; Encrypt(&sbe); while (!flag && !Chav()) Block(); for (i = 0; i < 8; i += 1) { if (sc[i] != tb[i]) { wf("decrypt was: "); printary(tb); wf("should be: "); printary(sp); wf("\r"); break; }; }; }; static printary(p) char *p; { int i; for (i=0; i<8; i+=1) { wf1("%02x ", p[i] & 0xff); }; }; /* programmed encryption */ /* encrypts and checks against cyphertext */ static descypher(enc, k, p, c) int enc; char *k, *p, *c; { int i, ecmd; if (enc) ecmd = 0; else ecmd = 8; outbyte(encctl,ecmd); /* reset */ outbyte(encctl,ecmd+2); /* activate */ if ((inbyte(encctl)&0x10) == 0) return (1); putblk(encdata, k, 8); if ((inbyte(encctl)&0x20) != 0) return (2); if ((inbyte(encctl)&0x40) == 0) return (3); putblk(encdata, p, 8); /* wait a decent interval */ for (i=0;i<10;i++); if ((inbyte(encctl)&0x80) == 0) return (4); getblk(encdata, ca, 8); for (i=0;i<8;i++) { if (ca[i] != *c++) return(5); }; return (0); }; static putblk(port,data,count) int port; char *data; int count; { while(count--) outbyte(port, *data++); }; static getblk(port,data,count) int port; char *data; int count; { while(count--) { *data++ = inbyte(port); }; }; /* November 2, 1982 11:02 AM bring up to date */