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 |