int get_line(TINYCLR_SSL_FILE *f,char *hash,char *filename) { int i; if (TINYCLR_SSL_FREAD(hash,1,64,f)<64) return 0; hash[64]=0; for (i=0;i<64;i++) { if (hash[i]<'0' || (hash[i]>'9' && hash[i]<'A') || (hash[i]>'F' && hash[i]<'a')||hash[i]>'f') { TINYCLR_SSL_FPRINTF(OPENSSL_TYPE__FILE_STDERR,"Not a hash value '%s'\n",hash); return 0; } } if (TINYCLR_SSL_FGETC(f)!=' ') { TINYCLR_SSL_FPRINTF(OPENSSL_TYPE__FILE_STDERR,"Malformed input line\n"); return 0; } i=TINYCLR_SSL_STRLEN(TINYCLR_SSL_FGETS(filename,PATH_MAX,f)); while (filename[--i]=='\n'||filename[i]=='\r') filename[i]=0; return 1; }
int main(int argc, char *argv[]) { TINYCLR_SSL_FILE *in=NULL,*out=NULL; char *infile=NULL,*outfile=NULL,*keystr=NULL; RC4_KEY key; char buf[BUFSIZ]; int badops=0,i; char **pp; unsigned char md[MD5_DIGEST_LENGTH]; argc--; argv++; while (argc >= 1) { if (TINYCLR_SSL_STRCMP(*argv,"-in") == 0) { if (--argc < 1) goto bad; infile= *(++argv); } else if (TINYCLR_SSL_STRCMP(*argv,"-out") == 0) { if (--argc < 1) goto bad; outfile= *(++argv); } else if (TINYCLR_SSL_STRCMP(*argv,"-key") == 0) { if (--argc < 1) goto bad; keystr= *(++argv); } else { TINYCLR_SSL_FPRINTF(OPENSSL_TYPE__FILE_STDERR,"unknown option %s\n",*argv); badops=1; break; } argc--; argv++; } if (badops) { bad: for (pp=usage; (*pp != NULL); pp++) TINYCLR_SSL_FPRINTF(OPENSSL_TYPE__FILE_STDERR,"%s",*pp); TINYCLR_SSL_EXIT(1); } if (infile == NULL) in=OPENSSL_TYPE__FILE_STDIN; else { in=TINYCLR_SSL_FOPEN(infile,"r"); if (in == NULL) { TINYCLR_SSL_PERROR("open"); TINYCLR_SSL_EXIT(1); } } if (outfile == NULL) out=OPENSSL_TYPE__FILE_STDOUT; else { out=TINYCLR_SSL_FOPEN(outfile,"w"); if (out == NULL) { TINYCLR_SSL_PERROR("open"); TINYCLR_SSL_EXIT(1); } } #ifdef OPENSSL_SYS_MSDOS /* This should set the file to binary mode. */ { #include <fcntl.h> setmode(TINYCLR_SSL_FILENO(in),O_BINARY); setmode(TINYCLR_SSL_FILENO(out),O_BINARY); } #endif if (keystr == NULL) { /* get key */ i=EVP_read_pw_string(buf,BUFSIZ,"Enter RC4 password:"******"bad password read\n"); TINYCLR_SSL_EXIT(1); } keystr=buf; } EVP_Digest((unsigned char *)keystr,TINYCLR_SSL_STRLEN(keystr),md,NULL,EVP_md5(),NULL); OPENSSL_cleanse(keystr,TINYCLR_SSL_STRLEN(keystr)); RC4_set_key(&key,MD5_DIGEST_LENGTH,md); for(;;) { i=TINYCLR_SSL_FREAD(buf,1,BUFSIZ,in); if (i == 0) break; if (i < 0) { TINYCLR_SSL_PERROR("read"); TINYCLR_SSL_EXIT(1); } RC4(&key,(unsigned int)i,(unsigned char *)buf, (unsigned char *)buf); i=TINYCLR_SSL_FWRITE(buf,(unsigned int)i,1,out); if (i != 1) { TINYCLR_SSL_PERROR("write"); TINYCLR_SSL_EXIT(1); } } TINYCLR_SSL_FCLOSE(out); TINYCLR_SSL_FCLOSE(in); TINYCLR_SSL_EXIT(0); return(1); }