]> andersk Git - moira.git/blob - regtape/verify.pc
support for Lincoln Lab people: load with class LINCOLN and a high uid
[moira.git] / regtape / verify.pc
1 /* $Header$
2  *
3  * This program will verify signatures on user records in the database.
4  */
5
6 #include <stdio.h>
7 #include <string.h>
8 #include <ctype.h>
9 #include <sys/time.h>
10 #include <moira.h>
11 #include <moira_site.h>
12 #include <des.h>
13 #include <krb.h>
14 #include <krb_err.h>
15 #include <gdss.h>
16 EXEC SQL INCLUDE sqlca;
17
18
19 char *program;
20
21 main(argc, argv)
22 int argc;
23 char **argv;
24 {
25     char buf[BUFSIZ], *usercheck[100], sigbuf[256], *data, *db="moira";
26     SigInfo si;
27     struct save_queue *sq;
28     int status, i, wait, check, debug, fix;
29     EXEC SQL BEGIN DECLARE SECTION;
30     char login[10], mid[32], rawsig[256], who[257];
31     EXEC SQL VAR rawsig IS STRING(256);
32     int id, timestamp, sms;
33     EXEC SQL END DECLARE SECTION;
34
35     initialize_sms_error_table();
36     initialize_krb_error_table();
37     initialize_gdss_error_table();
38
39     program = "sign";
40     check = debug = fix = 0;
41
42     for (i = 1; i < argc; i++) {
43         if (!strcmp(argv[i], "-w"))
44           wait++;
45         else if (!strcmp(argv[i], "-d"))
46           debug++;
47         else if (!strcmp(argv[i], "-D"))
48           setenv("ING_SET", "set printqry");
49         else if (!strcmp(argv[i], "-fix"))
50           fix++;
51         else if (argv[i][0] == '-')
52           fprintf(stderr, "Usage: %s [-w] [-D] [-fix]\n", argv[0]);
53         else usercheck[check++] = argv[i];
54     }
55
56     EXEC SQL CONNECT :db IDENTIFIED BY :db;
57
58     if (fix) {
59         /* Set the name of our kerberos ticket file */
60         krb_set_tkt_string("/tmp/tkt_sign");
61         status = 1;
62         while (status) {
63             printf("Authenticating as moira.extra:\n");
64             status = krb_get_pw_in_tkt("moira", "extra", "ATHENA.MIT.EDU",
65                                        "krbtgt", "ATHENA.MIT.EDU",
66                                        DEFAULT_TKT_LIFE, 0);
67             if (status != 0)
68               com_err(program, status + krb_err_base, " in krb_get_pw_in_tkt");
69         }
70         com_err(program, 0, "authenticated OK");
71
72         sms = 0;
73         EXEC SQL SELECT string_id INTO :sms FROM strings 
74           WHERE string='moira.extra@ATHENA.MIT.EDU';
75         if (sms == 0) {
76             com_err(program, 0, " failed to find string moira.extra@ATHENA.MIT.EDU in database");
77             dest_tkt();
78             exit(1);
79         }
80
81         sq = sq_create();
82     }
83
84     if (check == 0) {
85         EXEC SQL DECLARE c CURSOR FOR
86           SELECT login, clearid, signature, string, sigdate
87           FROM users, strings
88           WHERE signature != CHR(0) and sigwho = string_id;
89         EXEC SQL OPEN c;
90         while (1) {
91             EXEC SQL FETCH c INTO :login, :mid, :rawsig, :who, :timestamp;
92             if (sqlca.sqlcode != 0) break;
93             sprintf(buf, "%s:%s", strtrim(login), strtrim(mid));
94             si.timestamp = timestamp;
95             si.SigInfoVersion = 0;
96             kname_parse(si.pname, si.pinst, si.prealm, strtrim(who));
97             si.rawsig = (unsigned char *) &rawsig[0];
98             status = GDSS_Recompose(&si, sigbuf);
99             if (status) {
100                 com_err(program, gdss2et(status), "recomposing for user %s",
101                         login);
102                 continue;
103             }
104             si.rawsig = NULL;
105             status = GDSS_Verify(buf, strlen(buf), sigbuf, &si);
106             if (status) {
107                 com_err(program, gdss2et(status), "verifying user %s", login);
108             }
109             if (fix && status == GDSS_E_BADSIG) {
110                 sq_save_data(sq, strsave(buf));
111             }
112             if (wait) {
113                 printf("Next");
114                 fflush(stdout);
115                 gets(buf);
116             }
117         }
118         if (fix) {
119             while (sq_get_data(sq, &data)) {
120                 strncpy(login, data, 8);
121                 if (strchr(login, ':'))
122                   *strchr(login, ':') = 0;
123             again:
124                 com_err(program, 0, "fixing sig for %s", login);
125                 status = GDSS_Sign(data, strlen(data), sigbuf, &si);
126                 if (status) {
127                     com_err(program, gdss2et(status), "signing data");
128                     continue;
129                 }
130                 si.rawsig = (unsigned char *)rawsig;
131                 status = GDSS_Verify(data, strlen(data), sigbuf, &si);
132                 if (status) {
133                     com_err(program, gdss2et(status), "verifying data");
134                     continue;
135                 }
136                 if (strlen(rawsig) > 68) {
137                     sleep(1);
138                     goto again;
139                 }
140
141                 timestamp = si.timestamp;
142                 EXEC SQL UPDATE users 
143                   SET signature = :rawsig, sigwho = :sms, sigdate = :timestamp
144                     WHERE login = :login;
145                 if (sqlca.sqlcode != 0) {
146                     com_err(program, 0, "dbms error %d", sqlca.sqlcode);
147                     dest_tkt();
148                     exit(1);
149                 }
150                 EXEC SQL COMMIT WORK;
151             }
152         }
153     } else {
154         for (i = check - 1; i >= 0; i--) {
155             strcpy(login, usercheck[i]);
156             EXEC SQL DECLARE s CURSOR FOR
157               SELECT clearid, signature, string, sigdate
158               FROM users, strings
159               WHERE sigwho = string_id and login = :login;
160             EXEC SQL OPEN s;
161             while (1) {
162                 EXEC SQL FETCH s INTO :mid, :rawsig, :who, :timestamp;
163                 if (sqlca.sqlcode != 0) break;
164                 sprintf(buf, "%s:%s", strtrim(login), strtrim(mid));
165                 if (debug) {
166                     printf("Verifying \"%s\"\n", buf);
167                 }
168                 si.timestamp = timestamp;
169                 si.SigInfoVersion = 0;
170                 kname_parse(si.pname, si.pinst, si.prealm, strtrim(who));
171                 si.rawsig = (unsigned char *) &rawsig[0];
172                 status = GDSS_Recompose(&si, sigbuf);
173                 if (status) {
174                     com_err(program, gdss2et(status), "recomposing for user %s", login);
175                     continue;
176                 }
177                 si.rawsig = NULL;
178                 status = GDSS_Verify(buf, strlen(buf), sigbuf, &si);
179                 if (fix && status == GDSS_E_BADSIG) {
180                     com_err(program, 0, "fixing signature for %s", login);
181                 againagain:
182                     status = GDSS_Sign(buf, strlen(buf), sigbuf);
183                     if (status) {
184                         com_err(program, gdss2et(status), "signing data");
185                         continue;
186                     }
187                     si.rawsig = (unsigned char *) rawsig;
188                     status = GDSS_Verify(buf, strlen(buf), sigbuf, &si);
189                     if (status) {
190                         com_err(program, gdss2et(status), "verifying data");
191                         continue;
192                     }
193                     if (strlen(rawsig) > 68) {
194                         sleep(1);
195                         goto againagain;
196                     }
197
198                     timestamp = si.timestamp;
199                     EXEC SQL UPDATE users 
200                       SET signature = :rawsig, sigwho = :sms, sigdate = :timestamp
201                         WHERE login = :login;
202                     if (sqlca.sqlcode != 0) {
203                         com_err(program, 0, "dbms error %d", sqlca.sqlcode);
204                         dest_tkt();
205                         exit(1);
206                     }
207                     EXEC SQL COMMIT WORK;
208                 } else if (status)
209                   com_err(program, gdss2et(status), "verifying user %s", login);
210                 else {
211                     com_err(program, 0, "signature verified %s", buf);
212                     if (debug == 2) {
213                         hex_dump(sigbuf);
214                     }
215                 }
216                 if (wait) {
217                     printf("Next");
218                     fflush(stdout);
219                     gets(buf);
220                 }
221             }
222         }
223     }
224
225     dest_tkt();
226     exit(0);
227 }
228
229
230 hex_dump(p)
231 unsigned  char *p;
232 {
233     printf("Size: %d\n", strlen(p));
234     while (strlen(p) >= 8) {
235         printf("%02x %02x %02x %02x %02x %02x %02x %02x\n",
236                 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
237         p += 8;
238     }
239     switch (strlen(p)) {
240     case 7:
241         printf("%02x %02x %02x %02x %02x %02x %02x\n",
242                 p[0], p[1], p[2], p[3], p[4], p[5], p[6]);
243         break;
244     case 6:
245         printf("%02x %02x %02x %02x %02x %02x\n",
246                 p[0], p[1], p[2], p[3], p[4], p[5]);
247         break;
248     case 5:
249         printf("%02x %02x %02x %02x %02x\n",
250                 p[0], p[1], p[2], p[3], p[4]);
251         break;
252     case 4:
253         printf("%02x %02x %02x %02x\n",
254                 p[0], p[1], p[2], p[3]);
255         break;
256     case 3:
257         printf("%02x %02x %02x\n",
258                 p[0], p[1], p[2]);
259         break;
260     case 2:
261         printf("%02x %02x\n",
262                 p[0], p[1]);
263         break;
264     case 1:
265         printf("%02x\n",
266                 p[0]);
267         break;
268     default:
269         return;
270     }
271 }
This page took 0.088859 seconds and 5 git commands to generate.