## modules/pa/gpg.c

/* [<][>][^][v][top][bottom][index][help] */

## FUNCTIONS

This source file includes following functions.

1. PA_VerifySignature
2. PA_Decrypt
3. PA_ImportKey

       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) {
         /* [<][>][^][v][top][bottom][index][help] */
      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) {
         /* [<][>][^][v][top][bottom][index][help] */
      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) {
         /* [<][>][^][v][top][bottom][index][help] */
     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

/* [<][>][^][v][top][bottom][index][help] */