|  | /* NOCW */ | 
|  | /* | 
|  | Please read the README file for condition of use, before | 
|  | using this software. | 
|  |  | 
|  | Maurice Gittens  <mgittens@gits.nl>   January 1997 | 
|  |  | 
|  | */ | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <unistd.h> | 
|  | #include <fcntl.h> | 
|  | #include <sys/stat.h> | 
|  | #include <openssl/evp.h> | 
|  |  | 
|  | #define STDIN     	0 | 
|  | #define STDOUT    	1 | 
|  | #define BUFLEN	  	512 | 
|  |  | 
|  | static const char *usage = "Usage: example4 [-d]\n"; | 
|  |  | 
|  | void do_encode(void); | 
|  | void do_decode(void); | 
|  |  | 
|  | int main(int argc, char *argv[]) | 
|  | { | 
|  | if ((argc == 1)) | 
|  | { | 
|  | do_encode(); | 
|  | } | 
|  | else if ((argc == 2) && !strcmp(argv[1],"-d")) | 
|  | { | 
|  | do_decode(); | 
|  | } | 
|  | else | 
|  | { | 
|  | fprintf(stderr,"%s", usage); | 
|  | exit(1); | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | void do_encode() | 
|  | { | 
|  | char buf[BUFLEN]; | 
|  | char ebuf[BUFLEN+24]; | 
|  | unsigned int ebuflen; | 
|  | EVP_ENCODE_CTX ectx; | 
|  |  | 
|  | EVP_EncodeInit(&ectx); | 
|  |  | 
|  | while(1) | 
|  | { | 
|  | int readlen = read(STDIN, buf, sizeof(buf)); | 
|  |  | 
|  | if (readlen <= 0) | 
|  | { | 
|  | if (!readlen) | 
|  | break; | 
|  | else | 
|  | { | 
|  | perror("read"); | 
|  | exit(1); | 
|  | } | 
|  | } | 
|  |  | 
|  | EVP_EncodeUpdate(&ectx, ebuf, &ebuflen, buf, readlen); | 
|  |  | 
|  | write(STDOUT, ebuf, ebuflen); | 
|  | } | 
|  |  | 
|  | EVP_EncodeFinal(&ectx, ebuf, &ebuflen); | 
|  |  | 
|  | write(STDOUT, ebuf, ebuflen); | 
|  | } | 
|  |  | 
|  | void do_decode() | 
|  | { | 
|  | char buf[BUFLEN]; | 
|  | char ebuf[BUFLEN+24]; | 
|  | unsigned int ebuflen; | 
|  | EVP_ENCODE_CTX ectx; | 
|  |  | 
|  | EVP_DecodeInit(&ectx); | 
|  |  | 
|  | while(1) | 
|  | { | 
|  | int readlen = read(STDIN, buf, sizeof(buf)); | 
|  | int rc; | 
|  |  | 
|  | if (readlen <= 0) | 
|  | { | 
|  | if (!readlen) | 
|  | break; | 
|  | else | 
|  | { | 
|  | perror("read"); | 
|  | exit(1); | 
|  | } | 
|  | } | 
|  |  | 
|  | rc = EVP_DecodeUpdate(&ectx, ebuf, &ebuflen, buf, readlen); | 
|  | if (rc <= 0) | 
|  | { | 
|  | if (!rc) | 
|  | { | 
|  | write(STDOUT, ebuf, ebuflen); | 
|  | break; | 
|  | } | 
|  |  | 
|  | fprintf(stderr, "Error: decoding message\n"); | 
|  | return; | 
|  | } | 
|  |  | 
|  | write(STDOUT, ebuf, ebuflen); | 
|  | } | 
|  |  | 
|  | EVP_DecodeFinal(&ectx, ebuf, &ebuflen); | 
|  |  | 
|  | write(STDOUT, ebuf, ebuflen); | 
|  | } | 
|  |  |