diff options
Diffstat (limited to 'lib/libskey/skeysubr.c')
-rw-r--r-- | lib/libskey/skeysubr.c | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/lib/libskey/skeysubr.c b/lib/libskey/skeysubr.c new file mode 100644 index 0000000..8128444 --- /dev/null +++ b/lib/libskey/skeysubr.c @@ -0,0 +1,133 @@ +#include <err.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <termios.h> +#include <signal.h> + +#include "skey.h" +#include "mdx.h" + +/* Crunch a key: + * concatenate the seed and the password, run through MDX and + * collapse to 64 bits. This is defined as the user's starting key. + */ +int +keycrunch(result,seed,passwd) +char *result; /* 8-byte result */ +const char *seed; /* Seed, any length */ +const char *passwd; /* Password, any length */ +{ + char *buf; + MDX_CTX md; + u_long results[4]; + unsigned int buflen; + + buflen = strlen(seed) + strlen(passwd); + if((buf = malloc(buflen+1)) == NULL) + return -1; + strcpy(buf,seed); + strcat(buf,passwd); + + /* Crunch the key through MD[45] */ + sevenbit(buf); + MDXInit(&md); + MDXUpdate(&md,(unsigned char *)buf,buflen); + MDXFinal((unsigned char *)results,&md); + free(buf); + + results[0] ^= results[2]; + results[1] ^= results[3]; + + memcpy(result,(char *)results,8); + + return 0; +} + +/* The one-way function f(). Takes 8 bytes and returns 8 bytes in place */ +void +f(x) +char *x; +{ + MDX_CTX md; + u_long results[4]; + + MDXInit(&md); + MDXUpdate(&md,(unsigned char *)x,8); + MDXFinal((unsigned char *)results,&md); + /* Fold 128 to 64 bits */ + results[0] ^= results[2]; + results[1] ^= results[3]; + + memcpy(x,(char *)results,8); +} + +/* Strip trailing cr/lf from a line of text */ +void +rip(buf) +char *buf; +{ + buf[strcspn(buf, "\r\n")] = 0; +} + +static struct termios saved_ttymode; + +static void interrupt __P((int)); + +static void interrupt(sig) +int sig; +{ + tcsetattr(0, TCSANOW, &saved_ttymode); + err(1, "interrupted by signal %s", sys_siglist[sig]); +} + +char * +readpass(buf,n) +char *buf; +int n; +{ + struct termios noecho_ttymode; + void (*oldsig) __P((int)); + + /* Save normal line editing modes */ + tcgetattr(0, &saved_ttymode); + if ((oldsig = signal(SIGINT, SIG_IGN)) != SIG_IGN) + signal(SIGINT, interrupt); + + /* Turn off echoing */ + tcgetattr(0, &noecho_ttymode); + noecho_ttymode.c_lflag &= ~ECHO; + tcsetattr(0, TCSANOW, &noecho_ttymode); + fgets(buf,n,stdin); + rip(buf); + + /* Restore previous tty modes */ + tcsetattr(0, TCSANOW, &saved_ttymode); + if (oldsig != SIG_IGN) + signal(SIGINT, oldsig); + + /* + after the secret key is taken from the keyboard, the line feed is + written to standard error instead of standard output. That means that + anyone using the program from a terminal won't notice, but capturing + standard output will get the key words without a newline in front of + them. + */ + fprintf(stderr, "\n"); + fflush(stderr); + sevenbit(buf); + + return buf; +} + +void +sevenbit(s) +char *s; +{ + /* make sure there are only 7 bit code in the line*/ + while(*s){ + *s &= 0x7f; + s++; + } +} |