/[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 182 - (show annotations) (download)
Sun Aug 25 13:27:40 2002 UTC (10 years, 9 months ago) by weaselp
File MIME type: text/plain
File size: 5545 byte(s)
Use names rather than numbers as arument to pgp_armor. Have PGP PRIVATE for armoring
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 if (p[strlen(p)-1]=='\n')
53 p[strlen(p)-1] = 0;
54 #endif
55
56 fprintf(stderr, "\n");
57 buf_appends(b, p);
58 return (0);
59 }
60
61 void usage(char *n)
62 {
63 fprintf(stderr, "Usage: %s -e [-b] user@domain\n", n);
64 fprintf(stderr, " %s -s [-b] [yourname@domain]\n", n);
65 fprintf(stderr, " %s -c [-b]\n", n);
66 fprintf(stderr, " %s -d [passphrase]\n", n);
67 fprintf(stderr, " %s -g[r] yourname@domain [bits]\n", n);
68 fprintf(stderr, " %s -a[+-] [-b]\n\n", n);
69 fprintf(stderr, "PGP public key ring: %s\n", PGPPUBRING);
70 fprintf(stderr, "PGP secret key ring: %s\n", PGPSECRING);
71 }
72
73 int decrypt(BUFFER *u, BUFFER *option, char *n)
74 {
75 BUFFER *v;
76 BUFFER *sig;
77 int err = 0;
78
79 v = buf_new();
80 sig = buf_new();
81
82 buf_set(v, u);
83 err = pgp_decrypt(v, NULL, sig, PGPPUBRING, PGPSECRING);
84 if (err >= 0 || err == PGP_SIGBAD)
85 buf_move(u, v);
86
87 if (err == PGP_ERR) {
88 pass(option);
89 err = pgp_decrypt(u, option, sig, PGPPUBRING, PGPSECRING);
90 }
91 switch (err) {
92 case PGP_NOMSG:
93 fprintf(stderr, "%s: Not a PGP message.\n", n);
94 break;
95 case PGP_ERR:
96 fprintf(stderr, "%s: Can't read message.\n", n);
97 break;
98 case PGP_SIGOK:
99 fprintf(stderr, "%s: Valid signature: %s\n", n, sig->data);
100 err = 0;
101 break;
102 case PGP_SIGNKEY:
103 fprintf(stderr, "%s: Unknown signature key %s, cannot verify.\n", n, sig->data);
104 err = 1;
105 break;
106 case PGP_SIGBAD:
107 fprintf(stderr, "%s: Bad signature.\n", n);
108 err = 1;
109 break;
110 }
111
112 buf_free(v);
113 buf_free(sig);
114
115 return (err);
116 }
117
118 int main(int argc, char *argv[])
119 {
120 BUFFER *u, *option, *pp;
121 char *filename = NULL;
122 char *cmd = NULL;
123 int text = 1;
124 int err = 99;
125 int bits = 0;
126
127 mix_init(NULL);
128 VERBOSE = 3;
129
130 u = buf_new();
131 option = buf_new();
132 pp = buf_new();
133
134 if (argc > 1 && argv[1][0] == '-')
135 cmd = argv[1];
136
137 if (argc == 1 || (cmd > 0 && (cmd[1] == 'e' || cmd[1] == 'c' ||
138 cmd[1] == 'd' || cmd[1] == 'a' ||
139 cmd[1] == 's' || cmd[1] == 'C'))) {
140 if ((argc > 2 && (cmd == NULL || cmd[1] == 'a')) || argc > 3) {
141 FILE *f;
142
143 f = fopen(argv[argc - 1], "rb");
144 if (f == NULL) {
145 fprintf(stderr, "%s: Can't open %s\n", argv[0], argv[argc - 1]);
146 err = -1;
147 } else {
148 buf_read(u, f);
149 fclose(f);
150 filename = argv[argc - 1];
151 argc--;
152 }
153 } else
154 buf_read(u, stdin);
155 }
156 if (argc == 1)
157 err = decrypt(u, option, argv[0]);
158
159 if (argc > 2 && argv[2][0] == '-' && argv[2][1] == 'b') {
160 text = 0;
161 if (argc > 3)
162 buf_appends(option, argv[3]);
163 } else if (argc > 2)
164 buf_appends(option, argv[2]);
165
166 if (cmd)
167 switch (cmd[1]) {
168 case 's':
169 err = pgp_encrypt(PGP_SIGN | (text ? PGP_TEXT : 0), u, NULL, option,
170 NULL, PGPPUBRING, PGPSECRING);
171 if (err != 0) {
172 pass(pp);
173 err = pgp_encrypt(PGP_SIGN | (text ? PGP_TEXT : 0), u, NULL, option,
174 pp, PGPPUBRING, PGPSECRING);
175 }
176 if (err != 0)
177 fprintf(stderr, "Error.\n");
178 break;
179 case 'e':
180 if (option->length) {
181 err = pgp_encrypt(PGP_ENCRYPT | (text ? PGP_TEXT : 0), u, option, NULL,
182 NULL, PGPPUBRING, PGPSECRING);
183 if (err < 0)
184 fprintf(stderr, "%s: can't encrypt message for %s\n",
185 argv[0], argv[2]);
186 }
187 break;
188 case 'c':
189 pass(option);
190 err = pgp_encrypt(PGP_CONVENTIONAL | (text ? PGP_TEXT : 0), u, option,
191 NULL, NULL, PGPPUBRING, PGPSECRING);
192 if (err < 0)
193 fprintf(stderr, "%s: can't encrypt message\n", argv[0]);
194 break;
195 case 'C':
196 pass(option);
197 err = pgp_encrypt(PGP_NCONVENTIONAL | (text ? PGP_TEXT : 0), u, option,
198 NULL, NULL, PGPPUBRING, PGPSECRING);
199 if (err < 0)
200 fprintf(stderr, "%s: can't encrypt message\n", argv[0]);
201 break;
202 case 'g':
203 if (argc < 3) {
204 err = 99;
205 goto end;
206 }
207 pass(pp);
208 if (argc == 4)
209 sscanf(argv[3], "%d", &bits);
210 err = pgp_keygen(cmd[2] == 'r' ? PGP_ES_RSA : PGP_E_ELG,
211 bits, option, pp, PGPPUBRING, PGPSECRING, 0);
212 break;
213 case 'a':
214 switch (cmd[2]) {
215 case '-':
216 err = pgp_dearmor(u, u);
217 if (err == -1)
218 fprintf(stderr, "Not a PGP-armored message\n");
219 goto end;
220 case '+':
221 break;
222 default:
223 pgp_literal(u, filename, text);
224 pgp_compress(u);
225 break;
226 }
227 err = pgp_armor(u, PGP_ARMOR_NORMAL);
228 break;
229 case 'd':
230 err = decrypt(u, option, argv[0]);
231 break;
232 }
233 end:
234 if (err == 99)
235 usage(argv[0]);
236
237 if (err >= 0)
238 buf_write(u, stdout);
239
240 buf_free(option);
241 buf_free(pp);
242 buf_free(u);
243
244 mix_exit();
245 return (err == -1 ? 1 : err);
246 }

  ViewVC Help
Powered by ViewVC 1.1.5