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

Contents of /branches/mixmaster_2_9_STABLE/Mix/Src/pgptest.c

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.5