Ejemplo n.º 1
0
LPSTR __cdecl _gpg_decrypt(LPCSTR message)
{
	char buffer[ciphertextsize];
	char plaintext[plaintextsize];
	char keyuserid[keyuseridsize];
	int dlgresult;
	BOOL useridvalid;
	char *storedpassphrase;
	char passphrase[passphrasesize];
	char *decmessage = 0;
	int decmessagelen;
	gpgResult gpgresult;

	const char *begin = strstr(message, txtbeginpgpmessage);
	const char *end = strstr(message, txtendpgpmessage);

	if ((begin!=NULL)&&(end!=NULL))
	{
		strcpy(buffer, "");
		strncat(buffer, begin, end-begin+strlen(txtendpgpmessage));
		replace(buffer, "\r", "");
		replace(buffer, "\n", txtcrlf);

		ZeroMemory(keyuserid, sizeof(keyuserid));
		gpgresult=gpgDetectUserID(keyuserid, buffer);
		storedpassphrase=NULL;

		if(gpgresult!=gpgSuccess)
		{
			//        ErrorMessage(txtwarning, txtdetectuseridfailed, txtverifyoptions);
			strcpy(keyuserid, txtunknownuserid);
			useridvalid=FALSE;
		}
		else
		{
			storedpassphrase=getPassphrase(keyuserid);
			useridvalid=TRUE;
		}

		if(storedpassphrase!=NULL)
		{
			strcpy(passphrase, storedpassphrase);
			ZeroMemory(plaintext, sizeof(plaintext));
			gpgresult=gpgDecrypt(plaintext, buffer, passphrase);
		}
		else gpgresult=gpgUnknownError;

		dlgresult=IDOK;
		while((gpgresult!=gpgSuccess)&&(dlgresult!=IDCANCEL))
		{
			dlgresult=DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_PASSPHRASE), NULL, PassphraseDialogProcedure, (LPARAM)keyuserid);

			if(dlgresult==IDOK)
			{
				strcpy(passphrase, dlgpassphrase);
				ZeroMemory(dlgpassphrase, passphrasesize);
				strcat(passphrase, txtcrlf);
				ZeroMemory(plaintext, sizeof(plaintext));
				gpgresult=gpgDecrypt(plaintext, buffer, passphrase);
			}
		}

		if(gpgresult==gpgSuccess)
		{
			strcpy(buffer, plaintext);
		}

		if ( gpgresult==gpgSuccess && useridvalid==TRUE)
			addPassphrase(keyuserid, passphrase);

		ZeroMemory(passphrase, sizeof(passphrase));

		decmessagelen = strlen(buffer)+1;
		decmessage = (char *) LocalAlloc(LPTR,decmessagelen);
		MoveMemory(decmessage, buffer, decmessagelen);
	}

	return decmessage;
}
Ejemplo n.º 2
0
Archivo: xml.c Proyecto: archi-tekt/cpm
/* #############################################################################
 *
 * Description    read, decrypt and parse the given filename
 * Author         Harry Brueckner
 * Date           2005-03-18
 * Arguments      char* filename  - filename to read
 *                char** errormsg - pointer to the GpgMe error message, if any
 *                PASSPHRASE_FN   - passphrase callback function
 *                SHOWERROR_FN    - callback function for error messages
 * Return         1 on error, otherwise 0
 */
int xmlDataFileRead(char* filename, char** errormsg,
    PASSPHRASE_FN passphrase_cb, SHOWERROR_FN showerror_cb)
  {
    xmlNode*            node;
    struct stat         filestat;
    off_t               size;
    int                 error = 0,
                        fd,
                        gpgsize = 0,
                        validate;
    char*               buffer = NULL;
    char*               gpgbuffer = NULL;
    char*               tmpbuffer = NULL;

    TRACE(99, "xmlDataFileRead()", NULL);

    /* we initialize the error message */
    *errormsg = NULL;

    fd = fileLockOpen(filename, O_RDONLY, -1, &tmpbuffer);
    if (fd == -1)
      {   /* unable to read the file, we start a new one */
        showerror_cb(_("file error"), tmpbuffer);
        memFree(__FILE__, __LINE__, tmpbuffer, STDBUFFERLENGTH);

        if (fileExists(filename))
          {   /* if the file exists and we can't read it it's a hard error and
               * we must not continue; we don't need another error message since
               * we already had one displayed.
               */
            return 1;
          }

        /* we create a new, empty document */
        xmldoc = xmlNewDoc(BAD_CAST "1.0");
        node = xmlNewDocNode(xmldoc, NULL, BAD_CAST "root", NULL);
        xmlDocSetRootElement(xmldoc, node);
        createEditorsNode();
        createTemplateNode();

        /* we insert the current version and also create the created and
         * modified entries.
         */
        xmlVersionUpdate(1);

        checkDtd(showerror_cb);

        keyDefaults();

        /* we created a new document, so it's changed */
        runtime -> datachanged = 1;
      }
    else if (!fstat(fd, &filestat) &&
        filestat.st_size)
      {   /* we found a file and have to read it */
        size = filestat.st_size;
        buffer = memAlloc(__FILE__, __LINE__, size);
        /* Flawfinder: ignore */
        if (read(fd, buffer, size) != size)
          {
            memFree(__FILE__, __LINE__, buffer, size);
            return 1;
          }
        close(fd);

        if (config -> encryptdata)
          {
            error = gpgDecrypt(buffer, size, &gpgbuffer, &gpgsize,
                passphrase_cb, showerror_cb);
            if (error)
              { *errormsg = _("could not decrypt database file."); }

            /* since we decrypted the file, we swap buffers */
            memFree(__FILE__, __LINE__, buffer, size);
            buffer = gpgbuffer;
            size = gpgsize;

#ifdef TEST_OPTION
            if (config -> testrun &&
                !strcmp("decrypt", config -> testrun) &&
                buffer)
              { printf("%s", buffer); }
#endif

            /* TODO: add the same keys as used in the encrypted file;
             *       For now we just always add the default keys
             */
            if (runtime -> realmhint)
              {   /* if we have a realm, we add it to the default keys since we
                   * probably want to encrypt data for ourselves as well
                   */
                config -> defaultkeys = listAdd(config -> defaultkeys,
                    runtime -> realmhint);
              }

            keyDefaults();
          }
        else
          {
            /* if we run in unencrypted mode, we must add all default keys */
            keyDefaults();

            showerror_cb(_("warning"), _("the database file is read in unecrypted mode."));
          }

        if (!error &&
            buffer[0] == '\x1f' && buffer[1] == '\x8b')
          {   /* we have a gzipped buffer and must compress it */
            error = zlibDecompress(buffer, size, &gpgbuffer, &gpgsize,
                errormsg);
            if (error)
              {
                tmpbuffer = memAlloc(__FILE__, __LINE__, STDBUFFERLENGTH);
                snprintf(tmpbuffer, STDBUFFERLENGTH,
                    _("error (%s) compressing file '%s'."),
                    *errormsg,
                    filename);
                showerror_cb(_("compression error"), tmpbuffer);
                memFree(__FILE__, __LINE__, tmpbuffer, STDBUFFERLENGTH);

                memFree(__FILE__, __LINE__, buffer, size);
                return 1;
              }

            memFree(__FILE__, __LINE__, buffer, size);
            buffer = gpgbuffer;
            size = gpgsize;
          }
        else
          {
            if (!error && config -> compression > 0)
              {
                tmpbuffer = memAlloc(__FILE__, __LINE__, STDBUFFERLENGTH);
                snprintf(tmpbuffer, STDBUFFERLENGTH,
                    _("database '%s' was not compressed."),
                    filename);
                showerror_cb(_("warning"), tmpbuffer);
                memFree(__FILE__, __LINE__, tmpbuffer, STDBUFFERLENGTH);
              }
          }

        if (!error)
          {
            xmldoc = xmlReadMemory(buffer, size, filename, config -> encoding,
                XML_PARSE_PEDANTIC | XML_PARSE_NONET | XML_PARSE_NOCDATA);
            if (!xmldoc)
              {
                memFree(__FILE__, __LINE__, buffer, size);

                tmpbuffer = memAlloc(__FILE__, __LINE__, STDBUFFERLENGTH);
                snprintf(tmpbuffer, STDBUFFERLENGTH,
                    _("failed to parse xml document '%s'."),
                    filename);
                showerror_cb(_("file error"), tmpbuffer);
                memFree(__FILE__, __LINE__, tmpbuffer, STDBUFFERLENGTH);

                return 1;
              }
          }

        if (buffer)
          { memFree(__FILE__, __LINE__, buffer, size); }

        /* we update our document version */
        if (!error)
          { xmlVersionUpdate(0); }

        if (!error)
          {
            validate = checkDtd(showerror_cb);

            if (validate != 1)
              {
                tmpbuffer = memAlloc(__FILE__, __LINE__, STDBUFFERLENGTH);
                snprintf(tmpbuffer, STDBUFFERLENGTH,
                    _("failed to validate xml document '%s'."),
                    filename);
                showerror_cb(_("file error"), tmpbuffer);
                memFree(__FILE__, __LINE__, tmpbuffer, STDBUFFERLENGTH);

                return 1;
              }
          }
      }
    else
      {   /* the given file has size 0 */
        error = 1;
      }

    return error;
  }