1:
2:
3:
4:
5:
6:
7:
8:
9:
10: #include <stdio.h>
11: #include <unistd.h>
12: #include <fcntl.h>
13: #include <sys/stat.h>
14: #include <openssl/evp.h>
15:
16: #define STDIN 0
17: #define STDOUT 1
18: #define BUFLEN 512
19:
20: static const char *usage = "Usage: example4 [-d]\n";
21:
22: void do_encode(void);
23: void do_decode(void);
24:
25: int main(int argc, char *argv[])
26: {
27: if ((argc == 1))
28: {
29: do_encode();
30: }
31: else if ((argc == 2) && !strcmp(argv[1],"-d"))
32: {
33: do_decode();
34: }
35: else
36: {
37: fprintf(stderr,"%s", usage);
38: exit(1);
39: }
40:
41: return 0;
42: }
43:
44: void do_encode()
45: {
46: char buf[BUFLEN];
47: char ebuf[BUFLEN+24];
48: unsigned int ebuflen;
49: EVP_ENCODE_CTX ectx;
50:
51: EVP_EncodeInit(&ectx);
52:
53: while(1)
54: {
55: int readlen = read(STDIN, buf, sizeof(buf));
56:
57: if (readlen <= 0)
58: {
59: if (!readlen)
60: break;
61: else
62: {
63: perror("read");
64: exit(1);
65: }
66: }
67:
68: EVP_EncodeUpdate(&ectx, ebuf, &ebuflen, buf, readlen);
69:
70: write(STDOUT, ebuf, ebuflen);
71: }
72:
73: EVP_EncodeFinal(&ectx, ebuf, &ebuflen);
74:
75: write(STDOUT, ebuf, ebuflen);
76: }
77:
78: void do_decode()
79: {
80: char buf[BUFLEN];
81: char ebuf[BUFLEN+24];
82: unsigned int ebuflen;
83: EVP_ENCODE_CTX ectx;
84:
85: EVP_DecodeInit(&ectx);
86:
87: while(1)
88: {
89: int readlen = read(STDIN, buf, sizeof(buf));
90: int rc;
91:
92: if (readlen <= 0)
93: {
94: if (!readlen)
95: break;
96: else
97: {
98: perror("read");
99: exit(1);
100: }
101: }
102:
103: rc = EVP_DecodeUpdate(&ectx, ebuf, &ebuflen, buf, readlen);
104: if (rc <= 0)
105: {
106: if (!rc)
107: {
108: write(STDOUT, ebuf, ebuflen);
109: break;
110: }
111:
112: fprintf(stderr, "Error: decoding message\n");
113: return;
114: }
115:
116: write(STDOUT, ebuf, ebuflen);
117: }
118:
119: EVP_DecodeFinal(&ectx, ebuf, &ebuflen);
120:
121: write(STDOUT, ebuf, ebuflen);
122: }
123: