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