1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* crypto/des/des.c */
2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * All rights reserved.
4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This package is an SSL implementation written
6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * by Eric Young (eay@cryptsoft.com).
7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The implementation was written so as to conform with Netscapes SSL.
8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This library is free for commercial and non-commercial use as long as
10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the following conditions are aheared to.  The following conditions
11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * apply to all code found in this distribution, be it the RC4, RSA,
12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * included with this distribution is covered by the same copyright terms
14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Copyright remains Eric Young's, and as such any Copyright notices in
17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the code are not to be removed.
18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * If this package is used in a product, Eric Young should be given attribution
19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * as the author of the parts of the library used.
20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This can be in the form of a textual message at program startup or
21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * in documentation (online or textual) provided with the package.
22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Redistribution and use in source and binary forms, with or without
24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * modification, are permitted provided that the following conditions
25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * are met:
26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 1. Redistributions of source code must retain the copyright
27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    notice, this list of conditions and the following disclaimer.
28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 2. Redistributions in binary form must reproduce the above copyright
29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    notice, this list of conditions and the following disclaimer in the
30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    documentation and/or other materials provided with the distribution.
31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 3. All advertising materials mentioning features or use of this software
32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    must display the following acknowledgement:
33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    "This product includes cryptographic software written by
34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *     Eric Young (eay@cryptsoft.com)"
35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    The word 'cryptographic' can be left out if the rouines from the library
36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    being used are not cryptographic related :-).
37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 4. If you include any Windows specific code (or a derivative thereof) from
38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    the apps directory (application code) you must include an acknowledgement:
39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * SUCH DAMAGE.
52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The licence and distribution terms for any publically available version or
54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * derivative of this code cannot be changed.  i.e. this code cannot simply be
55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * copied and put under another distribution licence
56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * [including the GNU Public Licence.]
57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */
58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdio.h>
60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdlib.h>
61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <string.h>
62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/opensslconf.h>
63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_SYS_MSDOS
64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_SYS_VMS
65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include OPENSSL_UNISTD
66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else /* OPENSSL_SYS_VMS */
67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef __DECC
68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <unistd.h>
69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else /* not __DECC */
70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <math.h>
71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif /* __DECC */
72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif /* OPENSSL_SYS_VMS */
73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else /* OPENSSL_SYS_MSDOS */
74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <io.h>
75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <time.h>
78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "des_ver.h"
79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef OPENSSL_SYS_VMS
81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <types.h>
82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stat.h>
83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else
84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef _IRIX
85c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <sys/types.h>
86c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
87c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <sys/stat.h>
88c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
89c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/des.h>
90c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/rand.h>
91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/ui_compat.h>
92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid usage(void);
94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid doencryption(void);
95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint uufwrite(unsigned char *data, int size, unsigned int num, FILE *fp);
96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid uufwriteEnd(FILE *fp);
97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint uufread(unsigned char *out,int size,unsigned int num,FILE *fp);
98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint uuencode(unsigned char *in,int num,unsigned char *out);
99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint uudecode(unsigned char *in,int num,unsigned char *out);
100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid DES_3cbc_encrypt(DES_cblock *input,DES_cblock *output,long length,
101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_key_schedule sk1,DES_key_schedule sk2,
102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_cblock *ivec1,DES_cblock *ivec2,int enc);
103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef OPENSSL_SYS_VMS
104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define EXIT(a) exit(a&0x10000000L)
105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else
106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define EXIT(a) exit(a)
107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define BUFSIZE (8*1024)
110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define VERIFY  1
111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define KEYSIZ	8
112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define KEYSIZB 1024 /* should hit tty line limit first :-) */
113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgchar key[KEYSIZB+1];
114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint do_encrypt,longk=0;
115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgFILE *DES_IN,*DES_OUT,*CKSUM_OUT;
116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgchar uuname[200];
117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgunsigned char uubuf[50];
118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint uubufnum=0;
119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define INUUBUFN	(45*100)
120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define OUTUUBUF	(65*100)
121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgunsigned char b[OUTUUBUF];
122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgunsigned char bb[300];
123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgDES_cblock cksum={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgchar cksumname[200]="";
125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
126c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint vflag,cflag,eflag,dflag,kflag,bflag,fflag,sflag,uflag,flag3,hflag,error;
127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
128c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint main(int argc, char **argv)
129c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
130c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i;
131c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	struct stat ins,outs;
132c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *p;
133c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *in=NULL,*out=NULL;
134c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
135c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	vflag=cflag=eflag=dflag=kflag=hflag=bflag=fflag=sflag=uflag=flag3=0;
136c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	error=0;
137c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	memset(key,0,sizeof(key));
138c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
139c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for (i=1; i<argc; i++)
140c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
141c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		p=argv[i];
142c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if ((p[0] == '-') && (p[1] != '\0'))
143c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
144c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			p++;
145c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			while (*p)
146c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
147c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				switch (*(p++))
148c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
149c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case '3':
150c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					flag3=1;
151c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					longk=1;
152c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
153c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 'c':
154c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					cflag=1;
155c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					strncpy(cksumname,p,200);
156c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					cksumname[sizeof(cksumname)-1]='\0';
157c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					p+=strlen(cksumname);
158c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
159c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 'C':
160c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					cflag=1;
161c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					longk=1;
162c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					strncpy(cksumname,p,200);
163c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					cksumname[sizeof(cksumname)-1]='\0';
164c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					p+=strlen(cksumname);
165c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
166c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 'e':
167c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					eflag=1;
168c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
169c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 'v':
170c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					vflag=1;
171c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
172c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 'E':
173c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					eflag=1;
174c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					longk=1;
175c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
176c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 'd':
177c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					dflag=1;
178c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
179c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 'D':
180c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					dflag=1;
181c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					longk=1;
182c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
183c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 'b':
184c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					bflag=1;
185c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
186c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 'f':
187c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					fflag=1;
188c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
189c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 's':
190c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					sflag=1;
191c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
192c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 'u':
193c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					uflag=1;
194c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					strncpy(uuname,p,200);
195c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					uuname[sizeof(uuname)-1]='\0';
196c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					p+=strlen(uuname);
197c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
198c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 'h':
199c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					hflag=1;
200c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
201c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 'k':
202c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					kflag=1;
203c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					if ((i+1) == argc)
204c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						{
205c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						fputs("must have a key with the -k option\n",stderr);
206c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						error=1;
207c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						}
208c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					else
209c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						{
210c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						int j;
211c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
212c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						i++;
213c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						strncpy(key,argv[i],KEYSIZB);
214c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						for (j=strlen(argv[i])-1; j>=0; j--)
215c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org							argv[i][j]='\0';
216c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						}
217c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
218c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				default:
219c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					fprintf(stderr,"'%c' unknown flag\n",p[-1]);
220c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					error=1;
221c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
222c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
223c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
224c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
225c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
226c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
227c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (in == NULL)
228c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				in=argv[i];
229c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (out == NULL)
230c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				out=argv[i];
231c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else
232c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				error=1;
233c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
234c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
235c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (error) usage();
236c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* We either
237c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * do checksum or
238c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * do encrypt or
239c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * do decrypt or
240c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * do decrypt then ckecksum or
241c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * do checksum then encrypt
242c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 */
243c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (((eflag+dflag) == 1) || cflag)
244c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
245c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (eflag) do_encrypt=DES_ENCRYPT;
246c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (dflag) do_encrypt=DES_DECRYPT;
247c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
248c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
249c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
250c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (vflag)
251c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
252c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef _Windows
253c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			fprintf(stderr,"des(1) built with %s\n",libdes_version);
254c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
255c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			EXIT(1);
256c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
257c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else usage();
258c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
259c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
260c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef _Windows
261c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (vflag) fprintf(stderr,"des(1) built with %s\n",libdes_version);
262c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
263c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (	(in != NULL) &&
264c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		(out != NULL) &&
265c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_SYS_MSDOS
266c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		(stat(in,&ins) != -1) &&
267c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		(stat(out,&outs) != -1) &&
268c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		(ins.st_dev == outs.st_dev) &&
269c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		(ins.st_ino == outs.st_ino))
270c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else /* OPENSSL_SYS_MSDOS */
271c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		(strcmp(in,out) == 0))
272c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
273c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
274c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			fputs("input and output file are the same\n",stderr);
275c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			EXIT(3);
276c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
277c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
278c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!kflag)
279c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (des_read_pw_string(key,KEYSIZB+1,"Enter key:",eflag?VERIFY:0))
280c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
281c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			fputs("password error\n",stderr);
282c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			EXIT(2);
283c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
284c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
285c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (in == NULL)
286c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		DES_IN=stdin;
287c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else if ((DES_IN=fopen(in,"r")) == NULL)
288c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
289c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		perror("opening input file");
290c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		EXIT(4);
291c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
292c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
293c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	CKSUM_OUT=stdout;
294c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (out == NULL)
295c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
296c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		DES_OUT=stdout;
297c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		CKSUM_OUT=stderr;
298c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
299c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else if ((DES_OUT=fopen(out,"w")) == NULL)
300c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
301c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		perror("opening output file");
302c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		EXIT(5);
303c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
304c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
305c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef OPENSSL_SYS_MSDOS
306c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* This should set the file to binary mode. */
307c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
308c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <fcntl.h>
309c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!(uflag && dflag))
310c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		setmode(fileno(DES_IN),O_BINARY);
311c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!(uflag && eflag))
312c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		setmode(fileno(DES_OUT),O_BINARY);
313c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
314c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
315c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
316c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	doencryption();
317c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	fclose(DES_IN);
318c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	fclose(DES_OUT);
319c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	EXIT(0);
320c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
321c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
322c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid usage(void)
323c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
324c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char **u;
325c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	static const char *Usage[]={
326c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"des <options> [input-file [output-file]]",
327c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"options:",
328c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"-v         : des(1) version number",
329c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"-e         : encrypt using SunOS compatible user key to DES key conversion.",
330c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"-E         : encrypt ",
331c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"-d         : decrypt using SunOS compatible user key to DES key conversion.",
332c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"-D         : decrypt ",
333c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"-c[ckname] : generate a cbc_cksum using SunOS compatible user key to",
334c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"             DES key conversion and output to ckname (stdout default,",
335c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"             stderr if data being output on stdout).  The checksum is",
336c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"             generated before encryption and after decryption if used",
337c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"             in conjunction with -[eEdD].",
338c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"-C[ckname] : generate a cbc_cksum as for -c but compatible with -[ED].",
339c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"-k key     : use key 'key'",
340c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"-h         : the key that is entered will be a hexadecimal number",
341c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"             that is used directly as the des key",
342c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"-u[uuname] : input file is uudecoded if -[dD] or output uuencoded data if -[eE]",
343c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"             (uuname is the filename to put in the uuencode header).",
344c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"-b         : encrypt using DES in ecb encryption mode, the default is cbc mode.",
345c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"-3         : encrypt using triple DES encryption.  This uses 2 keys",
346c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"             generated from the input key.  If the input key is less",
347c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"             than 8 characters long, this is equivalent to normal",
348c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"             encryption.  Default is triple cbc, -b makes it triple ecb.",
349c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgNULL
350c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org};
351c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for (u=(char **)Usage; *u; u++)
352c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
353c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		fputs(*u,stderr);
354c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		fputc('\n',stderr);
355c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
356c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
357c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	EXIT(1);
358c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
359c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
360c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid doencryption(void)
361c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
362c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef _LIBC
363c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	extern unsigned long time();
364c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
365c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
366c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register int i;
367c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_key_schedule ks,ks2;
368c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_cblock iv,iv2;
369c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *p;
370c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int num=0,j,k,l,rem,ll,len,last,ex=0;
371c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_cblock kk,k2;
372c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	FILE *O;
373c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int Exit=0;
374c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_SYS_MSDOS
375c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	static unsigned char buf[BUFSIZE+8],obuf[BUFSIZE+8];
376c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else
377c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	static unsigned char *buf=NULL,*obuf=NULL;
378c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
379c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (buf == NULL)
380c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
381c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (    (( buf=OPENSSL_malloc(BUFSIZE+8)) == NULL) ||
382c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			((obuf=OPENSSL_malloc(BUFSIZE+8)) == NULL))
383c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
384c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			fputs("Not enough memory\n",stderr);
385c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			Exit=10;
386c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto problems;
387c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
388c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
389c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
390c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
391c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (hflag)
392c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
393c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		j=(flag3?16:8);
394c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		p=key;
395c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (i=0; i<j; i++)
396c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
397c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			k=0;
398c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if ((*p <= '9') && (*p >= '0'))
399c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				k=(*p-'0')<<4;
400c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if ((*p <= 'f') && (*p >= 'a'))
401c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				k=(*p-'a'+10)<<4;
402c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if ((*p <= 'F') && (*p >= 'A'))
403c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				k=(*p-'A'+10)<<4;
404c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else
405c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
406c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				fputs("Bad hex key\n",stderr);
407c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				Exit=9;
408c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				goto problems;
409c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
410c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			p++;
411c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if ((*p <= '9') && (*p >= '0'))
412c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				k|=(*p-'0');
413c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if ((*p <= 'f') && (*p >= 'a'))
414c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				k|=(*p-'a'+10);
415c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if ((*p <= 'F') && (*p >= 'A'))
416c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				k|=(*p-'A'+10);
417c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else
418c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
419c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				fputs("Bad hex key\n",stderr);
420c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				Exit=9;
421c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				goto problems;
422c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
423c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			p++;
424c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (i < 8)
425c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				kk[i]=k;
426c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else
427c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				k2[i-8]=k;
428c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
429c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		DES_set_key_unchecked(&k2,&ks2);
430c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		OPENSSL_cleanse(k2,sizeof(k2));
431c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
432c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else if (longk || flag3)
433c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
434c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (flag3)
435c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
436c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			DES_string_to_2keys(key,&kk,&k2);
437c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			DES_set_key_unchecked(&k2,&ks2);
438c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			OPENSSL_cleanse(k2,sizeof(k2));
439c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
440c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
441c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			DES_string_to_key(key,&kk);
442c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
443c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
444c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (i=0; i<KEYSIZ; i++)
445c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
446c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			l=0;
447c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			k=key[i];
448c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			for (j=0; j<8; j++)
449c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
450c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (k&1) l++;
451c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				k>>=1;
452c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
453c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (l & 1)
454c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				kk[i]=key[i]&0x7f;
455c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else
456c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				kk[i]=key[i]|0x80;
457c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
458c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
459c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_set_key_unchecked(&kk,&ks);
460c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_cleanse(key,sizeof(key));
461c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_cleanse(kk,sizeof(kk));
462c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* woops - A bug that does not showup under unix :-( */
463c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	memset(iv,0,sizeof(iv));
464c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	memset(iv2,0,sizeof(iv2));
465c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
466c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	l=1;
467c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	rem=0;
468c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* first read */
469c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (eflag || (!dflag && cflag))
470c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
471c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (;;)
472c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
473c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			num=l=fread(&(buf[rem]),1,BUFSIZE,DES_IN);
474c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			l+=rem;
475c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			num+=rem;
476c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (l < 0)
477c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
478c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				perror("read error");
479c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				Exit=6;
480c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				goto problems;
481c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
482c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
483c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			rem=l%8;
484c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			len=l-rem;
485c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (feof(DES_IN))
486c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
487c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				for (i=7-rem; i>0; i--)
488c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					RAND_pseudo_bytes(buf + l++, 1);
489c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				buf[l++]=rem;
490c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				ex=1;
491c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				len+=rem;
492c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
493c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else
494c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				l-=rem;
495c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
496c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (cflag)
497c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
498c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				DES_cbc_cksum(buf,&cksum,
499c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					(long)len,&ks,&cksum);
500c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (!eflag)
501c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
502c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					if (feof(DES_IN)) break;
503c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					else continue;
504c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
505c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
506c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
507c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (bflag && !flag3)
508c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				for (i=0; i<l; i+=8)
509c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					DES_ecb_encrypt(
510c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						(DES_cblock *)&(buf[i]),
511c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						(DES_cblock *)&(obuf[i]),
512c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						&ks,do_encrypt);
513c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (flag3 && bflag)
514c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				for (i=0; i<l; i+=8)
515c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					DES_ecb2_encrypt(
516c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						(DES_cblock *)&(buf[i]),
517c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						(DES_cblock *)&(obuf[i]),
518c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						&ks,&ks2,do_encrypt);
519c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (flag3 && !bflag)
520c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
521c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				char tmpbuf[8];
522c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
523c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (rem) memcpy(tmpbuf,&(buf[l]),
524c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					(unsigned int)rem);
525c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				DES_3cbc_encrypt(
526c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					(DES_cblock *)buf,(DES_cblock *)obuf,
527c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					(long)l,ks,ks2,&iv,
528c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					&iv2,do_encrypt);
529c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (rem) memcpy(&(buf[l]),tmpbuf,
530c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					(unsigned int)rem);
531c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
532c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else
533c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
534c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				DES_cbc_encrypt(
535c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					buf,obuf,
536c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					(long)l,&ks,&iv,do_encrypt);
537c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (l >= 8) memcpy(iv,&(obuf[l-8]),8);
538c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
539c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (rem) memcpy(buf,&(buf[l]),(unsigned int)rem);
540c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
541c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			i=0;
542c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			while (i < l)
543c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
544c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (uflag)
545c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					j=uufwrite(obuf,1,(unsigned int)l-i,
546c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						DES_OUT);
547c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				else
548c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					j=fwrite(obuf,1,(unsigned int)l-i,
549c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						DES_OUT);
550c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (j == -1)
551c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
552c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					perror("Write error");
553c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					Exit=7;
554c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					goto problems;
555c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
556c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				i+=j;
557c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
558c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (feof(DES_IN))
559c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
560c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (uflag) uufwriteEnd(DES_OUT);
561c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				break;
562c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
563c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
564c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
565c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else /* decrypt */
566c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
567c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ex=1;
568c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (;;)
569c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
570c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (ex) {
571c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (uflag)
572c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					l=uufread(buf,1,BUFSIZE,DES_IN);
573c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				else
574c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					l=fread(buf,1,BUFSIZE,DES_IN);
575c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				ex=0;
576c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				rem=l%8;
577c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				l-=rem;
578c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
579c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (l < 0)
580c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
581c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				perror("read error");
582c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				Exit=6;
583c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				goto problems;
584c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
585c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
586c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (bflag && !flag3)
587c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				for (i=0; i<l; i+=8)
588c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					DES_ecb_encrypt(
589c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						(DES_cblock *)&(buf[i]),
590c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						(DES_cblock *)&(obuf[i]),
591c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						&ks,do_encrypt);
592c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (flag3 && bflag)
593c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				for (i=0; i<l; i+=8)
594c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					DES_ecb2_encrypt(
595c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						(DES_cblock *)&(buf[i]),
596c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						(DES_cblock *)&(obuf[i]),
597c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						&ks,&ks2,do_encrypt);
598c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (flag3 && !bflag)
599c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
600c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				DES_3cbc_encrypt(
601c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					(DES_cblock *)buf,(DES_cblock *)obuf,
602c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					(long)l,ks,ks2,&iv,
603c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					&iv2,do_encrypt);
604c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
605c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else
606c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
607c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				DES_cbc_encrypt(
608c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					buf,obuf,
609c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				 	(long)l,&ks,&iv,do_encrypt);
610c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (l >= 8) memcpy(iv,&(buf[l-8]),8);
611c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
612c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
613c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (uflag)
614c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				ll=uufread(&(buf[rem]),1,BUFSIZE,DES_IN);
615c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else
616c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				ll=fread(&(buf[rem]),1,BUFSIZE,DES_IN);
617c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ll+=rem;
618c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			rem=ll%8;
619c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ll-=rem;
620c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (feof(DES_IN) && (ll == 0))
621c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
622c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				last=obuf[l-1];
623c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
624c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if ((last > 7) || (last < 0))
625c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
626c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					fputs("The file was not decrypted correctly.\n",
627c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						stderr);
628c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					Exit=8;
629c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					last=0;
630c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
631c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				l=l-8+last;
632c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
633c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			i=0;
634c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (cflag) DES_cbc_cksum(obuf,
635c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				(DES_cblock *)cksum,(long)l/8*8,&ks,
636c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				(DES_cblock *)cksum);
637c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			while (i != l)
638c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
639c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				j=fwrite(obuf,1,(unsigned int)l-i,DES_OUT);
640c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (j == -1)
641c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
642c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					perror("Write error");
643c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					Exit=7;
644c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					goto problems;
645c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
646c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				i+=j;
647c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
648c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			l=ll;
649c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if ((l == 0) && feof(DES_IN)) break;
650c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
651c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
652c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (cflag)
653c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
654c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		l=0;
655c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (cksumname[0] != '\0')
656c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
657c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if ((O=fopen(cksumname,"w")) != NULL)
658c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
659c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				CKSUM_OUT=O;
660c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				l=1;
661c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
662c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
663c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (i=0; i<8; i++)
664c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			fprintf(CKSUM_OUT,"%02X",cksum[i]);
665c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		fprintf(CKSUM_OUT,"\n");
666c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (l) fclose(CKSUM_OUT);
667c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
668c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgproblems:
669c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_cleanse(buf,sizeof(buf));
670c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_cleanse(obuf,sizeof(obuf));
671c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_cleanse(&ks,sizeof(ks));
672c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_cleanse(&ks2,sizeof(ks2));
673c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_cleanse(iv,sizeof(iv));
674c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_cleanse(iv2,sizeof(iv2));
675c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_cleanse(kk,sizeof(kk));
676c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_cleanse(k2,sizeof(k2));
677c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_cleanse(uubuf,sizeof(uubuf));
678c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_cleanse(b,sizeof(b));
679c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_cleanse(bb,sizeof(bb));
680c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_cleanse(cksum,sizeof(cksum));
681c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (Exit) EXIT(Exit);
682c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
683c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
684c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/*    We ignore this parameter but it should be > ~50 I believe    */
685c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint uufwrite(unsigned char *data, int size, unsigned int num, FILE *fp)
686c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
687c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i,j,left,rem,ret=num;
688c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	static int start=1;
689c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
690c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (start)
691c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
692c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		fprintf(fp,"begin 600 %s\n",
693c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			(uuname[0] == '\0')?"text.d":uuname);
694c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		start=0;
695c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
696c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
697c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (uubufnum)
698c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
699c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (uubufnum+num < 45)
700c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
701c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			memcpy(&(uubuf[uubufnum]),data,(unsigned int)num);
702c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			uubufnum+=num;
703c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			return(num);
704c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
705c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
706c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
707c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			i=45-uubufnum;
708c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			memcpy(&(uubuf[uubufnum]),data,(unsigned int)i);
709c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			j=uuencode((unsigned char *)uubuf,45,b);
710c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			fwrite(b,1,(unsigned int)j,fp);
711c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			uubufnum=0;
712c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			data+=i;
713c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			num-=i;
714c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
715c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
716c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
717c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for (i=0; i<(((int)num)-INUUBUFN); i+=INUUBUFN)
718c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
719c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		j=uuencode(&(data[i]),INUUBUFN,b);
720c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		fwrite(b,1,(unsigned int)j,fp);
721c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
722c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	rem=(num-i)%45;
723c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	left=(num-i-rem);
724c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (left)
725c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
726c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		j=uuencode(&(data[i]),left,b);
727c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		fwrite(b,1,(unsigned int)j,fp);
728c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		i+=left;
729c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
730c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (i != num)
731c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
732c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		memcpy(uubuf,&(data[i]),(unsigned int)rem);
733c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		uubufnum=rem;
734c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
735c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return(ret);
736c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
737c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
738c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid uufwriteEnd(FILE *fp)
739c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
740c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int j;
741c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	static const char *end=" \nend\n";
742c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
743c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (uubufnum != 0)
744c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
745c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		uubuf[uubufnum]='\0';
746c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		uubuf[uubufnum+1]='\0';
747c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		uubuf[uubufnum+2]='\0';
748c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		j=uuencode(uubuf,uubufnum,b);
749c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		fwrite(b,1,(unsigned int)j,fp);
750c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
751c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	fwrite(end,1,strlen(end),fp);
752c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
753c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
754c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* int size:  should always be > ~ 60; I actually ignore this parameter :-)    */
755c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint uufread(unsigned char *out, int size, unsigned int num, FILE *fp)
756c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
757c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i,j,tot;
758c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	static int done=0;
759c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	static int valid=0;
760c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	static int start=1;
761c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
762c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (start)
763c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
764c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (;;)
765c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
766c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			b[0]='\0';
767c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			fgets((char *)b,300,fp);
768c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (b[0] == '\0')
769c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
770c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				fprintf(stderr,"no 'begin' found in uuencoded input\n");
771c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				return(-1);
772c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
773c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (strncmp((char *)b,"begin ",6) == 0) break;
774c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
775c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		start=0;
776c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
777c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (done) return(0);
778c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	tot=0;
779c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (valid)
780c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
781c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		memcpy(out,bb,(unsigned int)valid);
782c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		tot=valid;
783c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		valid=0;
784c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
785c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for (;;)
786c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
787c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		b[0]='\0';
788c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		fgets((char *)b,300,fp);
789c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (b[0] == '\0') break;
790c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		i=strlen((char *)b);
791c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if ((b[0] == 'e') && (b[1] == 'n') && (b[2] == 'd'))
792c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
793c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			done=1;
794c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			while (!feof(fp))
795c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
796c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				fgets((char *)b,300,fp);
797c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
798c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			break;
799c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
800c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		i=uudecode(b,i,bb);
801c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (i < 0) break;
802c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if ((i+tot+8) > num)
803c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
804c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			/* num to copy to make it a multiple of 8 */
805c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			j=(num/8*8)-tot-8;
806c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			memcpy(&(out[tot]),bb,(unsigned int)j);
807c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tot+=j;
808c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			memcpy(bb,&(bb[j]),(unsigned int)i-j);
809c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			valid=i-j;
810c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			break;
811c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
812c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		memcpy(&(out[tot]),bb,(unsigned int)i);
813c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		tot+=i;
814c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
815c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return(tot);
816c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
817c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
818c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define ccc2l(c,l)      (l =((DES_LONG)(*((c)++)))<<16, \
819c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			 l|=((DES_LONG)(*((c)++)))<< 8, \
820c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 	 l|=((DES_LONG)(*((c)++))))
821c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
822c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define l2ccc(l,c)      (*((c)++)=(unsigned char)(((l)>>16)&0xff), \
823c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                    *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
824c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                    *((c)++)=(unsigned char)(((l)    )&0xff))
825c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
826c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
827c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint uuencode(unsigned char *in, int num, unsigned char *out)
828c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
829c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int j,i,n,tot=0;
830c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_LONG l;
831c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register unsigned char *p;
832c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	p=out;
833c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
834c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for (j=0; j<num; j+=45)
835c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
836c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (j+45 > num)
837c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			i=(num-j);
838c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else	i=45;
839c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		*(p++)=i+' ';
840c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (n=0; n<i; n+=3)
841c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
842c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ccc2l(in,l);
843c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			*(p++)=((l>>18)&0x3f)+' ';
844c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			*(p++)=((l>>12)&0x3f)+' ';
845c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			*(p++)=((l>> 6)&0x3f)+' ';
846c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			*(p++)=((l    )&0x3f)+' ';
847c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tot+=4;
848c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
849c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		*(p++)='\n';
850c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		tot+=2;
851c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
852c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	*p='\0';
853c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	l=0;
854c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return(tot);
855c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
856c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
857c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint uudecode(unsigned char *in, int num, unsigned char *out)
858c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
859c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int j,i,k;
860c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned int n=0,space=0;
861c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_LONG l;
862c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_LONG w,x,y,z;
863c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned int blank=(unsigned int)'\n'-' ';
864c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
865c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for (j=0; j<num; )
866c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
867c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		n= *(in++)-' ';
868c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (n == blank)
869c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
870c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			n=0;
871c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			in--;
872c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
873c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (n > 60)
874c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
875c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			fprintf(stderr,"uuencoded line length too long\n");
876c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			return(-1);
877c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
878c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		j++;
879c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
880c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (i=0; i<n; j+=4,i+=3)
881c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
882c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			/* the following is for cases where spaces are
883c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			 * removed from lines.
884c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			 */
885c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (space)
886c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
887c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				w=x=y=z=0;
888c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
889c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else
890c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
891c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				w= *(in++)-' ';
892c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				x= *(in++)-' ';
893c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				y= *(in++)-' ';
894c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				z= *(in++)-' ';
895c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
896c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if ((w > 63) || (x > 63) || (y > 63) || (z > 63))
897c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
898c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				k=0;
899c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (w == blank) k=1;
900c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (x == blank) k=2;
901c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (y == blank) k=3;
902c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (z == blank) k=4;
903c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				space=1;
904c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				switch (k) {
905c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 1:	w=0; in--;
906c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 2: x=0; in--;
907c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 3: y=0; in--;
908c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 4: z=0; in--;
909c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
910c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				case 0:
911c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					space=0;
912c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					fprintf(stderr,"bad uuencoded data values\n");
913c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					w=x=y=z=0;
914c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					return(-1);
915c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					break;
916c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
917c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
918c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			l=(w<<18)|(x<<12)|(y<< 6)|(z    );
919c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			l2ccc(l,out);
920c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
921c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (*(in++) != '\n')
922c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
923c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			fprintf(stderr,"missing nl in uuencoded line\n");
924c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			w=x=y=z=0;
925c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			return(-1);
926c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
927c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		j++;
928c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
929c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	*out='\0';
930c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	w=x=y=z=0;
931c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return(n);
932c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
933