diff options
Diffstat (limited to 'lib/librpcsvc/xcrypt.c')
-rw-r--r-- | lib/librpcsvc/xcrypt.c | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/lib/librpcsvc/xcrypt.c b/lib/librpcsvc/xcrypt.c new file mode 100644 index 0000000..3635bd8 --- /dev/null +++ b/lib/librpcsvc/xcrypt.c @@ -0,0 +1,192 @@ +/* + * Sun RPC is a product of Sun Microsystems, Inc. and is provided for + * unrestricted use provided that this legend is included on all tape + * media and as a part of the software program in whole or part. Users + * may copy or modify Sun RPC without charge, but are not authorized + * to license or distribute it to anyone else except as part of a product or + * program developed by the user. + * + * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE + * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun RPC is provided with no support and without any obligation on the + * part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ +/* + * Hex encryption/decryption and utility routines + * + * Copyright (C) 1986, Sun Microsystems, Inc. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/cdefs.h> +#include <rpc/des_crypt.h> + +#ifndef lint +/*from: static char sccsid[] = "@(#)xcrypt.c 2.2 88/08/10 4.0 RPCSRC"; */ +static const char rcsid[] = "$Id: xcrypt.c,v 1.1 1996/11/12 02:36:12 wpaul Exp $"; +#endif + +static char hex[]; /* forward */ +static char hexval __P(( char )); +static void bin2hex __P(( int, unsigned char *, char * )); +static void hex2bin __P(( int, char *, char * )); +void passwd2des __P(( char *, char * )); + +/* + * Encrypt a secret key given passwd + * The secret key is passed and returned in hex notation. + * Its length must be a multiple of 16 hex digits (64 bits). + */ +int +xencrypt(secret, passwd) + char *secret; + char *passwd; +{ + char key[8]; + char ivec[8]; + char *buf; + int err; + int len; + + len = strlen(secret) / 2; + buf = malloc((unsigned)len); + + hex2bin(len, secret, buf); + passwd2des(passwd, key); + bzero(ivec, 8); + + err = cbc_crypt(key, buf, len, DES_ENCRYPT | DES_HW, ivec); + if (DES_FAILED(err)) { + free(buf); + return (0); + } + bin2hex(len, (unsigned char *) buf, secret); + free(buf); + return (1); +} + +/* + * Decrypt secret key using passwd + * The secret key is passed and returned in hex notation. + * Once again, the length is a multiple of 16 hex digits + */ +int +xdecrypt(secret, passwd) + char *secret; + char *passwd; +{ + char key[8]; + char ivec[8]; + char *buf; + int err; + int len; + + len = strlen(secret) / 2; + buf = malloc((unsigned)len); + + hex2bin(len, secret, buf); + passwd2des(passwd, key); + bzero(ivec, 8); + + err = cbc_crypt(key, buf, len, DES_DECRYPT | DES_HW, ivec); + if (DES_FAILED(err)) { + free(buf); + return (0); + } + bin2hex(len, (unsigned char *) buf, secret); + free(buf); + return (1); +} + + +/* + * Turn password into DES key + */ +void +passwd2des(pw, key) + char *pw; + char *key; +{ + int i; + + bzero(key, 8); + for (i = 0; *pw; i = (i+1)%8) { + key[i] ^= *pw++ << 1; + } + des_setparity(key); +} + + + +/* + * Hex to binary conversion + */ +static void +hex2bin(len, hexnum, binnum) + int len; + char *hexnum; + char *binnum; +{ + int i; + + for (i = 0; i < len; i++) { + *binnum++ = 16 * hexval(hexnum[2*i]) + hexval(hexnum[2*i+1]); + } +} + +/* + * Binary to hex conversion + */ +static void +bin2hex(len, binnum, hexnum) + int len; + unsigned char *binnum; + char *hexnum; +{ + int i; + unsigned val; + + for (i = 0; i < len; i++) { + val = binnum[i]; + hexnum[i*2] = hex[val >> 4]; + hexnum[i*2+1] = hex[val & 0xf]; + } + hexnum[len*2] = 0; +} + +static char hex[16] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', +}; + +static char +hexval(c) + char c; +{ + if (c >= '0' && c <= '9') { + return (c - '0'); + } else if (c >= 'a' && c <= 'z') { + return (c - 'a' + 10); + } else if (c >= 'A' && c <= 'Z') { + return (c - 'A' + 10); + } else { + return (-1); + } +} |