1    | #include <stdio.h>
2    | #include <stdlib.h>
3    | #include <string.h>
4    | #include <sys/wait.h>
5    | #include <unistd.h>
6    | #include <errno.h>
7    | 
8    | #include "gpg.h"
9    | 
10   | extern int spawn_job (char *path, char *argv[], 
11   | 		      int *in_fd, int *out_fd, int *err_fd);
12   | 
13   | struct VerifySignObject verifySignObj;
14   | struct ReadCryptedObject readCryptedObj;
15   | struct ImportKeyObject importKeyObj;
16   | 
17   | /* ------------------------------------------------- */
18   | void PA_VerifySignature(struct VerifySignObject *vSO) {
19   |   
20   |   char *strArgs[10];
21   |   char Args0[100];
22   |   char Args1[100], Args2[100], Args3[100], Args4[100], Args5[100];
23   |   int gpg_pid;
24   |   int gpg_in_fd, out_fd, err_fd;
25   |   int status;
26   |   char txt[LINE_LENGTH];
27   |   char *keyStr;
28   | 
29   |   /* Copy the incoming object on the internal global object */
30   |   memmove( &verifySignObj, vSO, sizeof(struct VerifySignObject)  );
31   | 
32   |   strcpy(Args0, "--no-secmem-warning");
33   |   strcpy(Args1, "--keyring");
34   |   strcpy(Args2, verifySignObj.keyRing);
35   |   strcpy(Args3, "--verify");
36   |   if (!strcmp(verifySignObj.iSigFilename, "")) {
37   |     strcpy(Args4, verifySignObj.iDocSigFilename);
38   |   } else {
39   |     strcpy(Args4, verifySignObj.iSigFilename);
40   |     strcpy(Args5, verifySignObj.iDocSigFilename);
41   |   }
42   | 
43   |   strArgs[0] = Args0;
44   |   strArgs[1] = Args1;  
45   |   strArgs[2] = Args2;  
46   |   strArgs[3] = Args3;
47   |   strArgs[4] = Args4;
48   |   strArgs[5] = Args5;
49   |   strArgs[6] = (char *)0;
50   |   
51   |  
52   |   gpg_in_fd = INPUT_FD;
53   |   out_fd = OUTPUT_FD;
54   |   err_fd = ERROR_FD;
55   |   if ( ( gpg_pid = spawn_job ("gpg", strArgs,
56   | 			      &gpg_in_fd, &out_fd, &err_fd) ) < 0 )
57   |     {
58   |       printf ("could not spawn gpg");
59   |     }
60   |   
61   |   if (waitpid (gpg_pid, &status, 0) < 0)
62   |     {
63   |       fprintf (stderr, "Error reaping child\t%s\n", ERRSTRING);
64   |       printf ("could not reap gpg process");
65   |       /*      exit (1); */
66   |     }
67   |   if (status != 0)
68   |     {
69   |       fprintf (stderr, "Bad child status: %d\t%s\n", status, ERRSTRING);
70   |       printf ("gpg failure");
71   |       /*      exit (1); */
72   |     }
73   | 
74   | 
75   |   /* Parsing gpg output */
76   |   vSO->isValid = 0;
77   |   while (fgets (txt, STRING_LENGTH - 1, stdin) != NULL)
78   |     {
79   |       /*             printf ( "GPG output : %s\n", txt );  */
80   |       if (strstr(txt, "Good signature") != NULL)
81   | 	vSO->isValid = 1;
82   |       if ((keyStr = strstr(txt, "key ID")) != NULL) {
83   | 	keyStr += 7;
84   | 	sscanf(keyStr, "%8X\n", &vSO->keyID);
85   |       }
86   |     }
87   |   close (INPUT_FD);
88   | }
89   | 
90   | /* ------------------------------------------------- */
91   | void PA_Decrypt(struct ReadCryptedObject *rDO) {
92   |   
93   |   char *strArgs[9];
94   |   char clearTextExtension[4] = ".gpg";
95   |   char Args0[100] = "abracadabra";
96   |   char Args1[100];
97   |   char Args2[100];
98   |   char Args3[100];
99   |   char Args4[100];
100  |   char Args5[100];
101  |   char Args6[100];
102  |   int gpg_pid;
103  |   int gpg_in_fd, out_fd, err_fd;
104  |   int status;
105  |   char txt[LINE_LENGTH];
106  | 
107  | 
108  |   /* Copy the incoming object on the internal global object */
109  |   memmove( &readCryptedObj, rDO, sizeof(struct ReadCryptedObject)  );
110  | 
111  |   strcpy(Args0, "--no-tty");
112  |   strcpy(Args1, "--no-secmem-warning");
113  |   strcpy(Args2, "--keyring");
114  |   strcpy(Args3, readCryptedObj.keyRing);
115  |   strcpy(Args4, "--output");
116  |   strcpy(Args5, strcat(readCryptedObj.iFilename, clearTextExtension));
117  |   strcpy(Args6, readCryptedObj.iFilename);
118  |   
119  |   strArgs[0] = Args0;
120  |   strArgs[1] = Args1;  
121  |   strArgs[2] = Args2;  
122  |   strArgs[3] = Args3;  
123  |   strArgs[4] = Args4;  
124  |   strArgs[5] = Args5;  
125  |   strArgs[6] = Args6;  
126  |   strArgs[7] = (char *) 0;   
127  | 
128  |   gpg_in_fd = INPUT_FD;
129  |   out_fd = OUTPUT_FD;
130  |   err_fd = ERROR_FD;
131  |   if ( ( gpg_pid = spawn_job ("gpg", strArgs,
132  | 			      &gpg_in_fd, &out_fd, &err_fd) ) < 0 )
133  |     {
134  |       printf ("could not spawn gpg");
135  |     }
136  |   
137  |   if (waitpid (gpg_pid, &status, 0) < 0)
138  |     {
139  |       fprintf (stderr, "Error reaping child\t%s\n", ERRSTRING);
140  |       printf ("could not reap gpg process");
141  |       /*      exit (1); */
142  |     }
143  |   if (status != 0)
144  |     {
145  |       fprintf (stderr, "Bad child status: %d\t%s\n", status, ERRSTRING);
146  |       printf ("gpg failure");
147  |       /*      exit (1); */
148  |     }
149  | 
150  | 
151  |   /* Parsing gpg output */
152  |   while (fgets (txt, STRING_LENGTH - 1, stdin) != NULL)
153  |     {
154  |       /*      printf ( "GPG output : %s\n", txt );  */
155  |       
156  |       /*      if ((keyStr = strstr(txt, "key")) != NULL) {
157  | 	 keyStr += 4;
158  | 	 sscanf(keyStr, "%8X\n", &iKO->keyID); 
159  | 	 } */
160  |     }
161  |   close (INPUT_FD);
162  | }
163  | 
164  | 
165  | /* ------------------------------------------------- */
166  | void PA_ImportKey(struct ImportKeyObject *iKO) {
167  |   
168  |   char *strArgs[9];
169  |   char Args0[100] = "abracadabra";
170  |   char Args1[100], Args2[100], Args3[100], Args4[100], Args5[100];
171  |   int gpg_pid;
172  |   int gpg_in_fd, out_fd, err_fd;
173  |   int status;
174  |   char txt[LINE_LENGTH];
175  |   char *keyStr;
176  | 
177  |   /* Copy the incoming object on the internal global object */
178  |   memmove( &importKeyObj, iKO, sizeof(struct ImportKeyObject)  );
179  | 
180  |   importKeyObj.rc = iKO_GENERALFAILURE;
181  | 
182  |   strcpy(Args0, "--no-tty");
183  |   strcpy(Args1, "--no-secmem-warning");
184  |   strcpy(Args2, "--keyring");
185  |   strcpy(Args3, importKeyObj.keyRing);
186  |   strcpy(Args4, "--import");
187  |   strcpy(Args5, importKeyObj.iFilename);
188  | 
189  |   strArgs[0] = Args0;  
190  |   strArgs[1] = Args1;  
191  |   strArgs[2] = Args2;  
192  |   strArgs[3] = Args3;  
193  |   strArgs[4] = Args4;  
194  |   strArgs[5] = Args5;
195  |   strArgs[6] = (char *)0;
196  | 
197  |   gpg_in_fd = INPUT_FD;
198  |   out_fd = OUTPUT_FD;
199  |   err_fd = ERROR_FD;
200  |   if ( ( gpg_pid = spawn_job ("/usr/local/bin/gpg", strArgs,
201  | 			      &gpg_in_fd, &out_fd, &err_fd) ) < 0 )
202  |     {
203  |       printf ("could not spawn gpg");
204  |     }
205  |   
206  |   if (waitpid (gpg_pid, &status, 0) < 0)
207  |     {
208  |       fprintf (stderr, "Error reaping child\t%s\n", ERRSTRING);
209  |       printf ("could not reap gpg process");
210  |       /*      exit (1); */
211  |     }
212  | 
213  |   
214  |   if (status != 0)
215  |     {
216  |       fprintf (stderr, "Bad child status: %d\t%s\n", status, ERRSTRING);
217  |       printf ("gpg failure");
218  |       /*      exit (1); */
219  |     }
220  | 
221  | 
222  |   /* Parsing gpg output */
223  |   iKO->rc = iKO_GENERALFAILURE;
224  |   while (fgets (txt, STRING_LENGTH - 1, stdin) != NULL)
225  |     {
226  |       /*      printf ( "GPG output : %s\n", txt );    */
227  | 
228  |       if ((keyStr = strstr(txt, "imported")) != NULL) {
229  | 	iKO->rc = iKO_OK;
230  |       }
231  |       if ((keyStr = strstr(txt, "unchanged")) != NULL) {
232  | 	iKO->rc = iKO_UNCHANGED;
233  |       }
234  | 
235  |       if ((keyStr = strstr(txt, "key")) != NULL) {
236  | 	 keyStr += 4;
237  | 	 sscanf(keyStr, "%8X\n", &iKO->keyID); 
238  |       } 
239  |     }
240  |   close (INPUT_FD);
241  | }
242  | 
243  |