1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/des/des.c */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com).
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL.
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to.  The following conditions
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA,
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed.
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used.
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package.
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    documentation and/or other materials provided with the distribution.
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    must display the following acknowledgement:
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes cryptographic software written by
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *     Eric Young (eay@cryptsoft.com)"
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    The word 'cryptographic' can be left out if the rouines from the library
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    being used are not cryptographic related :-).
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the apps directory (application code) you must include an acknowledgement:
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE.
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed.  i.e. this code cannot simply be
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.]
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h>
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h>
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/opensslconf.h>
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_SYS_MSDOS
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_SYS_VMS
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include OPENSSL_UNISTD
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else /* OPENSSL_SYS_VMS */
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef __DECC
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <unistd.h>
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else /* not __DECC */
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <math.h>
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* __DECC */
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* OPENSSL_SYS_VMS */
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else /* OPENSSL_SYS_MSDOS */
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <io.h>
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <time.h>
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "des_ver.h"
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <types.h>
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stat.h>
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef _IRIX
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <sys/types.h>
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <sys/stat.h>
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/des.h>
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/rand.h>
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/ui_compat.h>
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid usage(void);
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid doencryption(void);
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint uufwrite(unsigned char *data, int size, unsigned int num, FILE *fp);
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid uufwriteEnd(FILE *fp);
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint uufread(unsigned char *out,int size,unsigned int num,FILE *fp);
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint uuencode(unsigned char *in,int num,unsigned char *out);
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint uudecode(unsigned char *in,int num,unsigned char *out);
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid DES_3cbc_encrypt(DES_cblock *input,DES_cblock *output,long length,
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_key_schedule sk1,DES_key_schedule sk2,
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_cblock *ivec1,DES_cblock *ivec2,int enc);
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define EXIT(a) exit(a&0x10000000L)
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define EXIT(a) exit(a)
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define BUFSIZE (8*1024)
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define VERIFY  1
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define KEYSIZ	8
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define KEYSIZB 1024 /* should hit tty line limit first :-) */
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar key[KEYSIZB+1];
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint do_encrypt,longk=0;
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectFILE *DES_IN,*DES_OUT,*CKSUM_OUT;
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar uuname[200];
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectunsigned char uubuf[50];
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint uubufnum=0;
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define INUUBUFN	(45*100)
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define OUTUUBUF	(65*100)
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectunsigned char b[OUTUUBUF];
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectunsigned char bb[300];
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectDES_cblock cksum={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar cksumname[200]="";
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint vflag,cflag,eflag,dflag,kflag,bflag,fflag,sflag,uflag,flag3,hflag,error;
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint main(int argc, char **argv)
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct stat ins,outs;
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *p;
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *in=NULL,*out=NULL;
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	vflag=cflag=eflag=dflag=kflag=hflag=bflag=fflag=sflag=uflag=flag3=0;
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	error=0;
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset(key,0,sizeof(key));
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=1; i<argc; i++)
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p=argv[i];
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((p[0] == '-') && (p[1] != '\0'))
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p++;
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (*p)
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				switch (*(p++))
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case '3':
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					flag3=1;
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					longk=1;
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 'c':
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					cflag=1;
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					strncpy(cksumname,p,200);
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					cksumname[sizeof(cksumname)-1]='\0';
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					p+=strlen(cksumname);
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 'C':
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					cflag=1;
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					longk=1;
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					strncpy(cksumname,p,200);
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					cksumname[sizeof(cksumname)-1]='\0';
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					p+=strlen(cksumname);
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 'e':
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					eflag=1;
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 'v':
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					vflag=1;
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 'E':
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					eflag=1;
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					longk=1;
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 'd':
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					dflag=1;
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 'D':
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					dflag=1;
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					longk=1;
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 'b':
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					bflag=1;
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 'f':
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					fflag=1;
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 's':
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					sflag=1;
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 'u':
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					uflag=1;
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					strncpy(uuname,p,200);
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					uuname[sizeof(uuname)-1]='\0';
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					p+=strlen(uuname);
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 'h':
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					hflag=1;
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 'k':
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					kflag=1;
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if ((i+1) == argc)
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						{
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						fputs("must have a key with the -k option\n",stderr);
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						error=1;
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						}
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					else
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						{
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						int j;
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						i++;
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						strncpy(key,argv[i],KEYSIZB);
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						for (j=strlen(argv[i])-1; j>=0; j--)
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project							argv[i][j]='\0';
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						}
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				default:
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					fprintf(stderr,"'%c' unknown flag\n",p[-1]);
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					error=1;
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (in == NULL)
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				in=argv[i];
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (out == NULL)
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				out=argv[i];
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				error=1;
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (error) usage();
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* We either
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * do checksum or
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * do encrypt or
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * do decrypt or
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * do decrypt then ckecksum or
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * do checksum then encrypt
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 */
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (((eflag+dflag) == 1) || cflag)
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (eflag) do_encrypt=DES_ENCRYPT;
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (dflag) do_encrypt=DES_DECRYPT;
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (vflag)
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef _Windows
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fprintf(stderr,"des(1) built with %s\n",libdes_version);
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			EXIT(1);
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else usage();
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef _Windows
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (vflag) fprintf(stderr,"des(1) built with %s\n",libdes_version);
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (	(in != NULL) &&
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(out != NULL) &&
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_SYS_MSDOS
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(stat(in,&ins) != -1) &&
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(stat(out,&outs) != -1) &&
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(ins.st_dev == outs.st_dev) &&
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(ins.st_ino == outs.st_ino))
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else /* OPENSSL_SYS_MSDOS */
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(strcmp(in,out) == 0))
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fputs("input and output file are the same\n",stderr);
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			EXIT(3);
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!kflag)
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (des_read_pw_string(key,KEYSIZB+1,"Enter key:",eflag?VERIFY:0))
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fputs("password error\n",stderr);
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			EXIT(2);
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (in == NULL)
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		DES_IN=stdin;
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if ((DES_IN=fopen(in,"r")) == NULL)
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		perror("opening input file");
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EXIT(4);
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CKSUM_OUT=stdout;
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (out == NULL)
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		DES_OUT=stdout;
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CKSUM_OUT=stderr;
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if ((DES_OUT=fopen(out,"w")) == NULL)
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		perror("opening output file");
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EXIT(5);
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_MSDOS
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* This should set the file to binary mode. */
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <fcntl.h>
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!(uflag && dflag))
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		setmode(fileno(DES_IN),O_BINARY);
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!(uflag && eflag))
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		setmode(fileno(DES_OUT),O_BINARY);
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	doencryption();
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	fclose(DES_IN);
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	fclose(DES_OUT);
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EXIT(0);
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid usage(void)
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char **u;
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const char *Usage[]={
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"des <options> [input-file [output-file]]",
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"options:",
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"-v         : des(1) version number",
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"-e         : encrypt using SunOS compatible user key to DES key conversion.",
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"-E         : encrypt ",
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"-d         : decrypt using SunOS compatible user key to DES key conversion.",
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"-D         : decrypt ",
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"-c[ckname] : generate a cbc_cksum using SunOS compatible user key to",
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"             DES key conversion and output to ckname (stdout default,",
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"             stderr if data being output on stdout).  The checksum is",
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"             generated before encryption and after decryption if used",
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"             in conjunction with -[eEdD].",
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"-C[ckname] : generate a cbc_cksum as for -c but compatible with -[ED].",
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"-k key     : use key 'key'",
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"-h         : the key that is entered will be a hexadecimal number",
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"             that is used directly as the des key",
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"-u[uuname] : input file is uudecoded if -[dD] or output uuencoded data if -[eE]",
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"             (uuname is the filename to put in the uuencode header).",
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"-b         : encrypt using DES in ecb encryption mode, the default is cbc mode.",
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"-3         : encrypt using triple DES encryption.  This uses 2 keys",
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"             generated from the input key.  If the input key is less",
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"             than 8 characters long, this is equivalent to normal",
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"             encryption.  Default is triple cbc, -b makes it triple ecb.",
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectNULL
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (u=(char **)Usage; *u; u++)
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fputs(*u,stderr);
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fputc('\n',stderr);
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EXIT(1);
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid doencryption(void)
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef _LIBC
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	extern unsigned long time();
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	register int i;
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_key_schedule ks,ks2;
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_cblock iv,iv2;
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *p;
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int num=0,j,k,l,rem,ll,len,last,ex=0;
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_cblock kk,k2;
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	FILE *O;
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int Exit=0;
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_SYS_MSDOS
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static unsigned char buf[BUFSIZE+8],obuf[BUFSIZE+8];
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static unsigned char *buf=NULL,*obuf=NULL;
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (buf == NULL)
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (    (( buf=OPENSSL_malloc(BUFSIZE+8)) == NULL) ||
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			((obuf=OPENSSL_malloc(BUFSIZE+8)) == NULL))
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fputs("Not enough memory\n",stderr);
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Exit=10;
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto problems;
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (hflag)
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		j=(flag3?16:8);
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p=key;
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (i=0; i<j; i++)
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			k=0;
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((*p <= '9') && (*p >= '0'))
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				k=(*p-'0')<<4;
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if ((*p <= 'f') && (*p >= 'a'))
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				k=(*p-'a'+10)<<4;
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if ((*p <= 'F') && (*p >= 'A'))
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				k=(*p-'A'+10)<<4;
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				fputs("Bad hex key\n",stderr);
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				Exit=9;
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto problems;
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p++;
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((*p <= '9') && (*p >= '0'))
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				k|=(*p-'0');
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if ((*p <= 'f') && (*p >= 'a'))
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				k|=(*p-'a'+10);
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if ((*p <= 'F') && (*p >= 'A'))
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				k|=(*p-'A'+10);
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				fputs("Bad hex key\n",stderr);
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				Exit=9;
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto problems;
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			p++;
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (i < 8)
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				kk[i]=k;
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				k2[i-8]=k;
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		DES_set_key_unchecked(&k2,&ks2);
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_cleanse(k2,sizeof(k2));
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if (longk || flag3)
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (flag3)
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			DES_string_to_2keys(key,&kk,&k2);
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			DES_set_key_unchecked(&k2,&ks2);
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			OPENSSL_cleanse(k2,sizeof(k2));
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			DES_string_to_key(key,&kk);
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (i=0; i<KEYSIZ; i++)
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			l=0;
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			k=key[i];
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			for (j=0; j<8; j++)
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (k&1) l++;
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				k>>=1;
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (l & 1)
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				kk[i]=key[i]&0x7f;
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				kk[i]=key[i]|0x80;
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_set_key_unchecked(&kk,&ks);
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(key,sizeof(key));
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(kk,sizeof(kk));
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* woops - A bug that does not showup under unix :-( */
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset(iv,0,sizeof(iv));
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset(iv2,0,sizeof(iv2));
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	l=1;
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rem=0;
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* first read */
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (eflag || (!dflag && cflag))
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (;;)
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			num=l=fread(&(buf[rem]),1,BUFSIZE,DES_IN);
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			l+=rem;
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			num+=rem;
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (l < 0)
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				perror("read error");
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				Exit=6;
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto problems;
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rem=l%8;
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			len=l-rem;
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (feof(DES_IN))
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				for (i=7-rem; i>0; i--)
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					RAND_pseudo_bytes(buf + l++, 1);
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				buf[l++]=rem;
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ex=1;
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				len+=rem;
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				l-=rem;
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (cflag)
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				DES_cbc_cksum(buf,&cksum,
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					(long)len,&ks,&cksum);
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!eflag)
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (feof(DES_IN)) break;
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					else continue;
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (bflag && !flag3)
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				for (i=0; i<l; i+=8)
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					DES_ecb_encrypt(
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						(DES_cblock *)&(buf[i]),
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						(DES_cblock *)&(obuf[i]),
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						&ks,do_encrypt);
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (flag3 && bflag)
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				for (i=0; i<l; i+=8)
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					DES_ecb2_encrypt(
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						(DES_cblock *)&(buf[i]),
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						(DES_cblock *)&(obuf[i]),
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						&ks,&ks2,do_encrypt);
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (flag3 && !bflag)
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				char tmpbuf[8];
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (rem) memcpy(tmpbuf,&(buf[l]),
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					(unsigned int)rem);
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				DES_3cbc_encrypt(
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					(DES_cblock *)buf,(DES_cblock *)obuf,
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					(long)l,ks,ks2,&iv,
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					&iv2,do_encrypt);
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (rem) memcpy(&(buf[l]),tmpbuf,
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					(unsigned int)rem);
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				DES_cbc_encrypt(
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					buf,obuf,
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					(long)l,&ks,&iv,do_encrypt);
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (l >= 8) memcpy(iv,&(obuf[l-8]),8);
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (rem) memcpy(buf,&(buf[l]),(unsigned int)rem);
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			i=0;
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (i < l)
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (uflag)
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					j=uufwrite(obuf,1,(unsigned int)l-i,
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						DES_OUT);
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					j=fwrite(obuf,1,(unsigned int)l-i,
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						DES_OUT);
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (j == -1)
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					perror("Write error");
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					Exit=7;
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto problems;
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				i+=j;
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (feof(DES_IN))
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (uflag) uufwriteEnd(DES_OUT);
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else /* decrypt */
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ex=1;
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (;;)
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (ex) {
571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (uflag)
572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					l=uufread(buf,1,BUFSIZE,DES_IN);
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					l=fread(buf,1,BUFSIZE,DES_IN);
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ex=0;
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				rem=l%8;
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				l-=rem;
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (l < 0)
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				perror("read error");
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				Exit=6;
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto problems;
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (bflag && !flag3)
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				for (i=0; i<l; i+=8)
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					DES_ecb_encrypt(
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						(DES_cblock *)&(buf[i]),
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						(DES_cblock *)&(obuf[i]),
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						&ks,do_encrypt);
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (flag3 && bflag)
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				for (i=0; i<l; i+=8)
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					DES_ecb2_encrypt(
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						(DES_cblock *)&(buf[i]),
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						(DES_cblock *)&(obuf[i]),
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						&ks,&ks2,do_encrypt);
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (flag3 && !bflag)
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				DES_3cbc_encrypt(
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					(DES_cblock *)buf,(DES_cblock *)obuf,
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					(long)l,ks,ks2,&iv,
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					&iv2,do_encrypt);
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				DES_cbc_encrypt(
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					buf,obuf,
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 	(long)l,&ks,&iv,do_encrypt);
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (l >= 8) memcpy(iv,&(buf[l-8]),8);
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (uflag)
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ll=uufread(&(buf[rem]),1,BUFSIZE,DES_IN);
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ll=fread(&(buf[rem]),1,BUFSIZE,DES_IN);
617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ll+=rem;
618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rem=ll%8;
619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ll-=rem;
620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (feof(DES_IN) && (ll == 0))
621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				last=obuf[l-1];
623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if ((last > 7) || (last < 0))
625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					fputs("The file was not decrypted correctly.\n",
627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						stderr);
628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					Exit=8;
629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					last=0;
630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				l=l-8+last;
632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			i=0;
634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (cflag) DES_cbc_cksum(obuf,
635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(DES_cblock *)cksum,(long)l/8*8,&ks,
636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(DES_cblock *)cksum);
637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (i != l)
638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				j=fwrite(obuf,1,(unsigned int)l-i,DES_OUT);
640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (j == -1)
641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					perror("Write error");
643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					Exit=7;
644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto problems;
645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				i+=j;
647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			l=ll;
649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((l == 0) && feof(DES_IN)) break;
650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (cflag)
653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		l=0;
655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (cksumname[0] != '\0')
656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((O=fopen(cksumname,"w")) != NULL)
658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				CKSUM_OUT=O;
660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				l=1;
661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (i=0; i<8; i++)
664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fprintf(CKSUM_OUT,"%02X",cksum[i]);
665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fprintf(CKSUM_OUT,"\n");
666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (l) fclose(CKSUM_OUT);
667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectproblems:
669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(buf,sizeof(buf));
670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(obuf,sizeof(obuf));
671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(&ks,sizeof(ks));
672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(&ks2,sizeof(ks2));
673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(iv,sizeof(iv));
674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(iv2,sizeof(iv2));
675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(kk,sizeof(kk));
676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(k2,sizeof(k2));
677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(uubuf,sizeof(uubuf));
678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(b,sizeof(b));
679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(bb,sizeof(bb));
680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(cksum,sizeof(cksum));
681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (Exit) EXIT(Exit);
682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*    We ignore this parameter but it should be > ~50 I believe    */
685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint uufwrite(unsigned char *data, int size, unsigned int num, FILE *fp)
686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i,j,left,rem,ret=num;
688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static int start=1;
689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (start)
691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fprintf(fp,"begin 600 %s\n",
693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			(uuname[0] == '\0')?"text.d":uuname);
694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		start=0;
695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (uubufnum)
698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (uubufnum+num < 45)
700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy(&(uubuf[uubufnum]),data,(unsigned int)num);
702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			uubufnum+=num;
703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(num);
704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			i=45-uubufnum;
708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy(&(uubuf[uubufnum]),data,(unsigned int)i);
709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			j=uuencode((unsigned char *)uubuf,45,b);
710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fwrite(b,1,(unsigned int)j,fp);
711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			uubufnum=0;
712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			data+=i;
713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			num-=i;
714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=0; i<(((int)num)-INUUBUFN); i+=INUUBUFN)
718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		j=uuencode(&(data[i]),INUUBUFN,b);
720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fwrite(b,1,(unsigned int)j,fp);
721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rem=(num-i)%45;
723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	left=(num-i-rem);
724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (left)
725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		j=uuencode(&(data[i]),left,b);
727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fwrite(b,1,(unsigned int)j,fp);
728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i+=left;
729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i != num)
731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(uubuf,&(data[i]),(unsigned int)rem);
733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		uubufnum=rem;
734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid uufwriteEnd(FILE *fp)
739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int j;
741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const char *end=" \nend\n";
742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (uubufnum != 0)
744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		uubuf[uubufnum]='\0';
746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		uubuf[uubufnum+1]='\0';
747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		uubuf[uubufnum+2]='\0';
748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		j=uuencode(uubuf,uubufnum,b);
749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fwrite(b,1,(unsigned int)j,fp);
750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	fwrite(end,1,strlen(end),fp);
752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* int size:  should always be > ~ 60; I actually ignore this parameter :-)    */
755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint uufread(unsigned char *out, int size, unsigned int num, FILE *fp)
756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i,j,tot;
758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static int done=0;
759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static int valid=0;
760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static int start=1;
761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (start)
763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (;;)
765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			b[0]='\0';
767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fgets((char *)b,300,fp);
768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (b[0] == '\0')
769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				fprintf(stderr,"no 'begin' found in uuencoded input\n");
771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return(-1);
772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (strncmp((char *)b,"begin ",6) == 0) break;
774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		start=0;
776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (done) return(0);
778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	tot=0;
779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (valid)
780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(out,bb,(unsigned int)valid);
782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tot=valid;
783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		valid=0;
784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (;;)
786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		b[0]='\0';
788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fgets((char *)b,300,fp);
789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (b[0] == '\0') break;
790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=strlen((char *)b);
791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((b[0] == 'e') && (b[1] == 'n') && (b[2] == 'd'))
792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			done=1;
794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (!feof(fp))
795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				fgets((char *)b,300,fp);
797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=uudecode(b,i,bb);
801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i < 0) break;
802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((i+tot+8) > num)
803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* num to copy to make it a multiple of 8 */
805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			j=(num/8*8)-tot-8;
806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy(&(out[tot]),bb,(unsigned int)j);
807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			tot+=j;
808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy(bb,&(bb[j]),(unsigned int)i-j);
809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			valid=i-j;
810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(&(out[tot]),bb,(unsigned int)i);
813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tot+=i;
814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(tot);
816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ccc2l(c,l)      (l =((DES_LONG)(*((c)++)))<<16, \
819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 l|=((DES_LONG)(*((c)++)))<< 8, \
820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 	 l|=((DES_LONG)(*((c)++))))
821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define l2ccc(l,c)      (*((c)++)=(unsigned char)(((l)>>16)&0xff), \
823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    *((c)++)=(unsigned char)(((l)    )&0xff))
825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint uuencode(unsigned char *in, int num, unsigned char *out)
828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int j,i,n,tot=0;
830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_LONG l;
831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	register unsigned char *p;
832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p=out;
833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (j=0; j<num; j+=45)
835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (j+45 > num)
837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			i=(num-j);
838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else	i=45;
839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*(p++)=i+' ';
840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (n=0; n<i; n+=3)
841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ccc2l(in,l);
843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*(p++)=((l>>18)&0x3f)+' ';
844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*(p++)=((l>>12)&0x3f)+' ';
845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*(p++)=((l>> 6)&0x3f)+' ';
846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*(p++)=((l    )&0x3f)+' ';
847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			tot+=4;
848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*(p++)='\n';
850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tot+=2;
851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*p='\0';
853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	l=0;
854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(tot);
855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint uudecode(unsigned char *in, int num, unsigned char *out)
858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int j,i,k;
860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int n=0,space=0;
861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_LONG l;
862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_LONG w,x,y,z;
863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int blank=(unsigned int)'\n'-' ';
864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (j=0; j<num; )
866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		n= *(in++)-' ';
868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (n == blank)
869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			n=0;
871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			in--;
872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (n > 60)
874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fprintf(stderr,"uuencoded line length too long\n");
876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(-1);
877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		j++;
879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (i=0; i<n; j+=4,i+=3)
881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* the following is for cases where spaces are
883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * removed from lines.
884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 */
885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (space)
886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				w=x=y=z=0;
888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				w= *(in++)-' ';
892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				x= *(in++)-' ';
893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				y= *(in++)-' ';
894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				z= *(in++)-' ';
895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
896656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((w > 63) || (x > 63) || (y > 63) || (z > 63))
897656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
898656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				k=0;
899656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (w == blank) k=1;
900656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (x == blank) k=2;
901656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (y == blank) k=3;
902656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (z == blank) k=4;
903656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				space=1;
904656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				switch (k) {
905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 1:	w=0; in--;
906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 2: x=0; in--;
907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 3: y=0; in--;
908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 4: z=0; in--;
909656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				case 0:
911656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					space=0;
912656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					fprintf(stderr,"bad uuencoded data values\n");
913656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					w=x=y=z=0;
914656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					return(-1);
915656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
916656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
917656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
918656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			l=(w<<18)|(x<<12)|(y<< 6)|(z    );
919656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			l2ccc(l,out);
920656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
921656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (*(in++) != '\n')
922656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
923656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fprintf(stderr,"missing nl in uuencoded line\n");
924656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			w=x=y=z=0;
925656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(-1);
926656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
927656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		j++;
928656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*out='\0';
930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	w=x=y=z=0;
931656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(n);
932656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
933