Add modes/cts128.c, Ciphertext Stealing implementation.
[openssl.git] / demos / maurice / example4.c
1 /* NOCW */
2 /*
3         Please read the README file for condition of use, before
4         using this software.
5
6         Maurice Gittens  <mgittens@gits.nl>   January 1997
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