/* * netkey on unix (excluding linux) * * usage: netkey * * compile: * cc -o netkey netkey.c * but if you feel ugly to use system("stty -echo"), * cc -DBOYD -o netkey netkey.c * * coded by * Kenar ( Kenji Arisawa ) * E-mail: arisawa@aichi-u.ac.jp */ #include #define DESKEYLEN 7 #define NAMELEN 22 #ifdef BOYD #define echo(mode) ttyecho(0,mode) /* * Here's some posix code for mangling tty echo * (for those who feel that way inclined): * Horrible system dependent tty routines, * - boyd@france3.FR (Boyd Roberts) - * * Thanks * -Kenar- */ #include /* * Is echo on? */ int ttyechoing(int fd) { struct termios t; if (tcgetattr(fd, &t) == -1) return -1; return (t.c_lflag & ECHO) != 0; } /* * Turn echo off/on? */ int ttyecho(int fd, int on) { struct termios t; if (tcgetattr(fd, &t) == -1) return -1; if (on) t.c_lflag |= ECHO; else t.c_lflag &= ~ECHO; return tcsetattr(fd, TCSADRAIN, &t); } #else char *shcmd[2] = { "stty -echo", "stty echo;echo" }; #define echo(mode) system(shcmd[mode]) #endif typedef unsigned char uchar; uchar a[8] = { 128, 64, 32, 16, 8, 4, 2, 1 }; /* get bit status at the bit position n of string s uchar s[8] int n: 0 .. 63 */ int strbit(uchar *s, int n) { int q,m; q = n / 8; m = n % 8; return (s[q] & a[m]?1:0); } /* uchar s[8]: 8 bits DES subblock for unix return: 8 bits DES subblock for plan9 */ uchar s2b(uchar *s) { int i; uchar x; x = 0; for(i = 0; i < 8; i++) if(s[i]) x |= a[i]; return x; } /* uchar s[8]: 8 bits DES subblock for unix uchar x: 8 bits DES subblock for plan9 */ void b2s(uchar x, uchar *s) { int i; memset(s,0,8); for(i = 0; i < 8; i++) if(x & a[i]) s[i] = 1; } /* uchar s[64] --- unix style DES block uchar x[8] --- plan9 style DES block */ void blk2str(uchar *x, uchar *s) { int i; for(i = 0; i < 8; i++) b2s(x[i],&s[8*i]); } /* uchar s[64] --- unix style DES block uchar x[8] --- plan9 style DES block */ void str2blk(uchar *s, uchar *x) { int i; for(i = 0; i < 8; i++) x[i] = s2b(&s[8*i]); } /* Plan9 style encrypt for DES cypher block equivalent to encrypt(key,t,8) on plan9 uchar key[7] --- deskey uchar t[8] --- target(des cypher block) */ void des(uchar *key, uchar *t) { int i,j; uchar s[64],u[64]; for(j = 0; j < 8; j++){ for(i = 0; i < 7; i++) s[8*j + i] = strbit(key, 7*j + i); s[8*j + 7] = 0; } setkey(s); blk2str(t,u); encrypt(u,0); /* encrypt */ str2blk(u,t); } /* imported from plan9 - slitely modified - uchar p[NAMELEN] --- password uchar key[DESKEYLEN] --- DES key */ int pass2key(uchar *p, uchar *key) { uchar buf[NAMELEN], *t; int i, n; n = strlen(p); if(n >= NAMELEN) n = NAMELEN-1; memset(buf, ' ', 8); t = buf; strncpy((char*)t, p, n); t[n] = 0; memset(key, 0, DESKEYLEN); for(;;){ for(i = 0; i < DESKEYLEN; i++) key[i] = (t[i] >> i) + (t[i+1] << (8 - (i+1))); if(n <= 8) return 1; n -= 8; t += 8; if(n < 8){ t -= 8 - n; n = 8; } des(key, t); /* encrypt(key,t,8) on plan9 */ } return 1; /* not reached */ } void getns(char *s, int size) { char *p; fgets(s, size, stdin); p = strchr(s,'\n'); if(p) *p = 0; } main() { uchar buf[80]; uchar key[DESKEYLEN]; int i; echo(0); fprintf(stderr,"password: "); getns(buf,sizeof buf); pass2key(buf,key); echo(1); for(;;){ memset(buf,0,8); fprintf(stderr,"challenge: "); getns(buf, sizeof buf); if(strlen(buf) == 0) break; buf[7] = 0; des(key,buf); printf("response: "); for(i = 0; i < 4; i++) printf("%02x",buf[i]); puts(""); } }