gwyn@smoke.BRL.MIL (Doug Gwyn) (07/16/90)
/* strypt -- encrypts/decrypts an Artworx "Strip Poker II" image file for Apple IIGS Last edit: 08-Jul-1990 Douglas A. Gwyn <Gwyn@BRL.MIL> Usage: strypt [-z] old new This program copies an Apple IIGS Strip Poker Data Disk image file, decoding the pixel data in scan lines 0 through 146. If the -z option is used, it will also set all scan-line control bytes and the pixels in scan lines 147 through 199 to 0 in the output file; this is useful when decrypting a file preparatory to translating it to some other image file format such as GIF. The encryption scheme is self-inverse; i.e., the same program can be used (without the -z option) for either encryption or decryption of Artworx image files; presumably Artworx uses a similar program to encrypt their files before putting them on their Data Disks. These files contain uncompressed SHR images, normally assigned Apple File Type $C1, Auxiliary Type $0000; however, for maximum portability this program does not set the file type of its output file, which (depending on the C implementation) will probably be created with file type "BIN". Hence, you may need to use a file- type changing utility in order to make these output files acceptable as input to Apple IIGS display utilities that depend too much on Apple's File Type scheme. (SHRConvert 2.1 and ShowPic 4.6 do not require this.) Please note that Artworx images are NOT in the public domain and should therefore NOT be posted to public bulletin boards or information services. I am providing this program (which itself IS in the public domain) as a service to Apple IIGS owners, for their personal use only! There aren't many software publishers currently supporting the Apple IIGS; for our own self interest, we MUST respect the property rights of those who do support our machines. If somebody asks for a copy of Artworx images, give him this program instead and tell him to buy the Artworx Data Disks; they're cheap. As of this writing, the following Program and Data Disks have been released for the Apple IIGS: Strip Poker II: Suzi & Melissa Data Disk #1: Morgan & Kathy Data Disk #2: Samantha & Jack Data Disk #3: Gina & Holly Artworx Strip Poker II and Strip Poker Data Disks are available from enlightened software distributors; if you cannot find one, try writing to: Artworx Software Company, Inc. 1844 Penfield Road Penfield, New York 14526 Be sure to commend them for supporting the Apple IIGS! */ #ifdef __STDC__ #include <stdlib.h> /* for EXIT_*, exit() */ #define RB_MODE "rb" #define WB_MODE "wb" #else extern void exit(); #define RB_MODE "r" #define WB_MODE "w" #endif #include <stdio.h> #ifndef EXIT_SUCCESS #define EXIT_SUCCESS 0 #endif #ifndef EXIT_FAILURE #define EXIT_FAILURE (-1) /* Suitable for APW C */ #endif /* The following parameters specify IIGS Super Hi-Res addresses; a $C1/$0000 file is simply an exact copy of SHR address space. */ #define PIXELS ((unsigned)0x2000) /* start of pixel data (and file) */ #define TRAILER ((unsigned)0x7BE0) /* end of Artworx encipherment */ #define PALETS ((unsigned)0x9E00) /* start of color palettes */ main( argc, argv ) int argc; char *argv[]; { register unsigned short w; /* word being *crypted */ register int c; /* input character */ register unsigned short key = 0x1F2B; /* *cryption key */ register FILE *ifp; /* input stream */ register FILE *ofp; /* output stream */ unsigned p = PIXELS; /* -> next image byte */ int zero; /* set iff -z option */ if ( (zero = argc > 1 && argv[1][0] == '-' && argv[1][1] == 'z') ) ++argv, --argc; if ( argc != 3 ) { (void)fprintf( stderr, "Usage: strypt [-z] old new\n" ); exit( EXIT_FAILURE ); } if ( (ifp = fopen( argv[1], "rb" )) == NULL ) { (void)fprintf( stderr, "strypt: can't open input\n" ); exit( EXIT_FAILURE ); } if ( (ofp = fopen( argv[2], "wb" )) == NULL ) { (void)fprintf( stderr, "strypt: can't open output\n" ); exit( EXIT_FAILURE ); } while ( (c = getc( ifp )) != EOF ) { w = c; /* low byte */ w |= getc( ifp ) << 8; /* high byte */ if ( (p += 2) <= TRAILER ) w ^= key++; else if ( zero && p <= PALETS ) w = 0; if ( putc( (int)w & 0xFF, ofp ) == EOF || putc( (int)w >> 8, ofp ) == EOF ) { (void)fprintf( stderr, "strypt: write error\n" ); exit( EXIT_FAILURE ); } } (void)fflush( ofp ); /* just in case */ return EXIT_SUCCESS; }