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] */