/[pkg-mixmaster]/trunk/Mix/Src/pgptest.c
ViewVC logotype

Contents of /trunk/Mix/Src/pgptest.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (hide annotations) (download)
Wed Oct 31 08:19:51 2001 UTC (11 years, 7 months ago) by rabbi
File MIME type: text/plain
File size: 5478 byte(s)
Initial revision
1 rabbi 1 /* PGP module test */
2    
3     /* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
4     ANY KIND, either express or implied. See the file COPYRIGHT for
5     details. */
6    
7     #include "mix3.h"
8     #include "pgp.h"
9     #include <stdlib.h>
10     #include <string.h>
11     #include <fcntl.h>
12     #include <assert.h>
13     #include <sys/types.h>
14     #include <sys/stat.h>
15     #include <time.h>
16     #include <fcntl.h>
17     #ifdef POSIX
18     #include <unistd.h>
19     #include <termios.h>
20     #endif
21    
22     int pass(BUFFER *b)
23     {
24     char p[LINELEN];
25     int fd;
26     int n;
27    
28     #ifdef HAVE_TERMIOS
29     struct termios attr;
30     #endif
31    
32     fprintf(stderr, "enter passphrase: ");
33     fflush(stderr);
34     #ifdef HAVE_TERMIOS
35     fd = open("/dev/tty", O_RDONLY);
36     if (tcgetattr(fd, &attr) != 0)
37     return (-1);
38     attr.c_lflag &= ~ECHO;
39     attr.c_lflag |= ICANON;
40     if (tcsetattr(fd, TCSAFLUSH, &attr) != 0)
41     return (-1);
42     n = read(fd, p, LINELEN);
43    
44     attr.c_lflag |= ECHO;
45     if (tcsetattr(fd, TCSAFLUSH, &attr) != 0)
46     return (-1);
47     close(fd);
48     p[n - 1] = 0;
49    
50     #else
51     fgets(p, LINELEN, stdin);
52     #endif
53    
54     fprintf(stderr, "\n");
55     buf_appends(b, p);
56     return (0);
57     }
58    
59     void usage(char *n)
60     {
61     fprintf(stderr, "Usage: %s -e [-b] user@domain\n", n);
62     fprintf(stderr, " %s -s [-b] [yourname@domain]\n", n);
63     fprintf(stderr, " %s -c [-b]\n", n);
64     fprintf(stderr, " %s -d [passphrase]\n", n);
65     fprintf(stderr, " %s -g[r] yourname@domain [bits]\n", n);
66     fprintf(stderr, " %s -a[+-] [-b]\n\n", n);
67     fprintf(stderr, "PGP public key ring: %s\n", PGPPUBRING);
68     fprintf(stderr, "PGP secret key ring: %s\n", PGPSECRING);
69     }
70    
71     int decrypt(BUFFER *u, BUFFER *option, char *n)
72     {
73     BUFFER *v;
74     BUFFER *sig;
75     int err = 0;
76    
77     v = buf_new();
78     sig = buf_new();
79    
80     buf_set(v, u);
81     err = pgp_decrypt(v, NULL, sig, PGPPUBRING, PGPSECRING);
82     if (err >= 0 || err == PGP_SIGBAD)
83     buf_move(u, v);
84    
85     if (err == PGP_ERR) {
86     pass(option);
87     err = pgp_decrypt(u, option, sig, PGPPUBRING, PGPSECRING);
88     }
89     switch (err) {
90     case PGP_NOMSG:
91     fprintf(stderr, "%s: Not a PGP message.\n", n);
92     break;
93     case PGP_ERR:
94     fprintf(stderr, "%s: Can't read message.\n", n);
95     break;
96     case PGP_SIGOK:
97     fprintf(stderr, "%s: Valid signature: %s\n", n, sig->data);
98     err = 0;
99     break;
100     case PGP_SIGNKEY:
101     fprintf(stderr, "%s: Unknown signature key %s, cannot verify.\n", n, sig->data);
102     err = 1;
103     break;
104     case PGP_SIGBAD:
105     fprintf(stderr, "%s: Bad signature.\n", n);
106     err = 1;
107     break;
108     }
109    
110     buf_free(v);
111     buf_free(sig);
112    
113     return (err);
114     }
115    
116     int main(int argc, char *argv[])
117     {
118     BUFFER *u, *option, *pp;
119     char *filename = NULL;
120     char *cmd = NULL;
121     int text = 1;
122     int err = 99;
123     int bits = 0;
124    
125     mix_init(NULL);
126     VERBOSE = 3;
127    
128     u = buf_new();
129     option = buf_new();
130     pp = buf_new();
131    
132     if (argc > 1 && argv[1][0] == '-')
133     cmd = argv[1];
134    
135     if (argc == 1 || (cmd > 0 && (cmd[1] == 'e' || cmd[1] == 'c' ||
136     cmd[1] == 'd' || cmd[1] == 'a' ||
137     cmd[1] == 's' || cmd[1] == 'C'))) {
138     if ((argc > 2 && (cmd == NULL || cmd[1] == 'a')) || argc > 3) {
139     FILE *f;
140    
141     f = fopen(argv[argc - 1], "rb");
142     if (f == NULL) {
143     fprintf(stderr, "%s: Can't open %s\n", argv[0], argv[argc - 1]);
144     err = -1;
145     } else {
146     buf_read(u, f);
147     fclose(f);
148     filename = argv[argc - 1];
149     argc--;
150     }
151     } else
152     buf_read(u, stdin);
153     }
154     if (argc == 1)
155     err = decrypt(u, option, argv[0]);
156    
157     if (argc > 2 && argv[2][0] == '-' && argv[2][1] == 'b') {
158     text = 0;
159     if (argc > 3)
160     buf_appends(option, argv[3]);
161     } else if (argc > 2)
162     buf_appends(option, argv[2]);
163    
164     if (cmd)
165     switch (cmd[1]) {
166     case 's':
167     err = pgp_encrypt(PGP_SIGN | (text ? PGP_TEXT : 0), u, NULL, option,
168     NULL, PGPPUBRING, PGPSECRING);
169     if (err != 0) {
170     pass(pp);
171     err = pgp_encrypt(PGP_SIGN | (text ? PGP_TEXT : 0), u, NULL, option,
172     pp, PGPPUBRING, PGPSECRING);
173     }
174     if (err != 0)
175     fprintf(stderr, "Error.\n");
176     break;
177     case 'e':
178     if (option->length) {
179     err = pgp_encrypt(PGP_ENCRYPT | (text ? PGP_TEXT : 0), u, option, NULL,
180     NULL, PGPPUBRING, PGPSECRING);
181     if (err < 0)
182     fprintf(stderr, "%s: can't encrypt message for %s\n",
183     argv[0], argv[2]);
184     }
185     break;
186     case 'c':
187     pass(option);
188     err = pgp_encrypt(PGP_CONVENTIONAL | (text ? PGP_TEXT : 0), u, option,
189     NULL, NULL, PGPPUBRING, PGPSECRING);
190     if (err < 0)
191     fprintf(stderr, "%s: can't encrypt message\n", argv[0]);
192     break;
193     case 'C':
194     pass(option);
195     err = pgp_encrypt(PGP_NCONVENTIONAL | (text ? PGP_TEXT : 0), u, option,
196     NULL, NULL, PGPPUBRING, PGPSECRING);
197     if (err < 0)
198     fprintf(stderr, "%s: can't encrypt message\n", argv[0]);
199     break;
200     case 'g':
201     if (argc < 3) {
202     err = 99;
203     goto end;
204     }
205     pass(pp);
206     if (argc == 4)
207     sscanf(argv[3], "%d", &bits);
208     err = pgp_keygen(cmd[2] == 'r' ? PGP_ES_RSA : PGP_E_ELG,
209     bits, option, pp, PGPPUBRING, PGPSECRING, 0);
210     break;
211     case 'a':
212     switch (cmd[2]) {
213     case '-':
214     err = pgp_dearmor(u, u);
215     if (err == -1)
216     fprintf(stderr, "Not a PGP-armored message\n");
217     goto end;
218     case '+':
219     break;
220     default:
221     pgp_literal(u, filename, text);
222     pgp_compress(u);
223     break;
224     }
225     err = pgp_armor(u, 0);
226     break;
227     case 'd':
228     err = decrypt(u, option, argv[0]);
229     break;
230     }
231     end:
232     if (err == 99)
233     usage(argv[0]);
234    
235     if (err >= 0)
236     buf_write(u, stdout);
237    
238     buf_free(option);
239     buf_free(pp);
240     buf_free(u);
241    
242     mix_exit();
243     return (err == -1 ? 1 : err);
244     }

  ViewVC Help
Powered by ViewVC 1.1.5