Made sign+encrypt work.
authorWerner Koch <wk@gnupg.org>
Thu, 3 Jan 2008 16:14:18 +0000 (16:14 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 3 Jan 2008 16:14:18 +0000 (16:14 +0000)
NEWS
po/de.po
po/sv.po
src/ChangeLog
src/engine-assuan.c
src/engine.c
src/mimemaker.c

diff --git a/NEWS b/NEWS
index b6a24da..d1fa020 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,8 @@ Noteworthy changes for version 0.10.4
  UNDER HEAVY DEVELOPMENT - DO NOT USE FOR PRODUCTION!
     - Under OL2007 some menu entries are missing.
 
+ * Sign and encrypt works now.
+
 
 Noteworthy changes for version 0.10.3 (2007-12-10)
 ==================================================
index 3ab5a9a..b596b47 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GpgOL 0.10.0\n"
 "Report-Msgid-Bugs-To: bug-gpgol@g10code.com\n"
-"POT-Creation-Date: 2007-12-10 10:44+0100\n"
+"POT-Creation-Date: 2008-01-03 12:18+0100\n"
 "PO-Revision-Date: 2007-12-07 08:44+0100\n"
 "Last-Translator: Werner Koch <wk@gnupg.org>\n"
 "Language-Team: de\n"
@@ -56,7 +56,7 @@ msgstr "Debugausgabe (zur Problemanalyse)"
 msgid "Select Certificate Manager"
 msgstr "GnuPG Zertifikats&verwaltung"
 
-#: src/engine.c:363
+#: src/engine.c:364
 msgid ""
 "The user interface server is not available or does not work.  Using an "
 "internal user interface.\n"
@@ -70,7 +70,7 @@ msgstr ""
 "Diese ist allerdings sehr vereinfacht und kann z.B. keine S/MIME "
 "verschlüsselten Nachrichten entschlüsseln."
 
-#: src/engine.c:367 src/ext-commands.cpp:659 src/main.c:603 src/main.c:609
+#: src/engine.c:368 src/ext-commands.cpp:672 src/main.c:603 src/main.c:609
 msgid "GpgOL"
 msgstr "GpgOL"
 
@@ -244,11 +244,11 @@ msgstr "Nachricht mit GnuPG verschlüsseln"
 msgid "&sign message with GnuPG"
 msgstr "Nachricht mit GnuPG unterschreiben"
 
-#: src/ext-commands.cpp:453 src/ext-commands.cpp:817
+#: src/ext-commands.cpp:453 src/ext-commands.cpp:849
 msgid "Encrypt message with GnuPG"
 msgstr "Nachricht mit GnuPG verschlüsseln"
 
-#: src/ext-commands.cpp:454 src/ext-commands.cpp:827
+#: src/ext-commands.cpp:454 src/ext-commands.cpp:859
 msgid "Sign message with GnuPG"
 msgstr "Nachricht mit GnuPG unterschreiben"
 
@@ -260,59 +260,59 @@ msgstr "GnuPG Zertifikats&verwaltung"
 msgid "Open the certificate manager"
 msgstr "Die Zertifikatsverwaltung öffnen"
 
-#: src/ext-commands.cpp:658
+#: src/ext-commands.cpp:671
 msgid "Could not start certificate manager"
 msgstr "Die Zertifikatsverwaltung konnte nicht aufgerufen werden"
 
-#: src/ext-commands.cpp:701
+#: src/ext-commands.cpp:733
 msgid "Select this option to decrypt and verify the message."
 msgstr ""
 "Wählen Sie diese Option um die Nachricht zu entschlüsseln bzw. zu "
 "verifizieren."
 
-#: src/ext-commands.cpp:708
+#: src/ext-commands.cpp:740
 msgid "Select this option to show information on the crypto status"
 msgstr ""
 "Wählen Sie diese Option um Informationen über den Krypto-Status der "
 "Nachricht anzuzeigen."
 
-#: src/ext-commands.cpp:716 src/ext-commands.cpp:797
+#: src/ext-commands.cpp:748 src/ext-commands.cpp:829
 msgid "Check the signature now and display the result"
 msgstr "Die digitale Unterschrift jetzt prüfen und das Resultat anzeigen"
 
-#: src/ext-commands.cpp:723
+#: src/ext-commands.cpp:755
 msgid "Select this option to automatically select the protocol."
 msgstr "Wählen Sie diese Option zum das Protokoll automatisch auszuwählen."
 
-#: src/ext-commands.cpp:730
+#: src/ext-commands.cpp:762
 msgid "Select this option to select the PGP/MIME protocol."
 msgstr "Wählen Sie diese Option zum das PGP/MIME Protokoll auszuwählen."
 
-#: src/ext-commands.cpp:737
+#: src/ext-commands.cpp:769
 msgid "Select this option to select the S/MIME protocol."
 msgstr "Wählen Sie diese Option zum das S/MIME Protokoll auszuwählen."
 
-#: src/ext-commands.cpp:744
+#: src/ext-commands.cpp:776
 msgid "Select this option to encrypt the message."
 msgstr "Wählen Sie diese Option zum Verschlüsseln der Nachricht."
 
-#: src/ext-commands.cpp:751
+#: src/ext-commands.cpp:783
 msgid "Select this option to sign the message."
 msgstr "Wählen Sie diese Option zum Unterschreiben der Nachricht."
 
-#: src/ext-commands.cpp:758
+#: src/ext-commands.cpp:790
 msgid "Select this option to open the certificate manager"
 msgstr "Wählen Sie diese Option zum die Zertifikatsverwaltung zu öffenen."
 
-#: src/ext-commands.cpp:787
+#: src/ext-commands.cpp:819
 msgid "Show S/MIME status info"
 msgstr "S/MIME Status Informationen anzeigen"
 
-#: src/ext-commands.cpp:807
+#: src/ext-commands.cpp:839
 msgid "Use S/MIME for sign/encrypt"
 msgstr "S/MIME zum signieren/verschlüsseln verwenden"
 
-#: src/ext-commands.cpp:837
+#: src/ext-commands.cpp:869
 msgid "Open the GpgOL certificate manager"
 msgstr "Zertifikatsverwaltung von GpgOL öffnen"
 
@@ -334,7 +334,7 @@ msgstr ""
 "\n"
 "geschrieben."
 
-#: src/mapihelp.cpp:1193
+#: src/mapihelp.cpp:1228
 msgid ""
 "[The content of this message is not visible because it has been decrypted by "
 "another Outlook session.  Use the \"decrypt/verify\" command to make it "
@@ -344,7 +344,7 @@ msgstr ""
 "Outlook Sitzung entschlüsselt wurde.  Verwenden Sie den Menüpunkt "
 "\"entschlüsseln/verifizieren\" um den Inhalt wieder sichtbar zu machen.]"
 
-#: src/mapihelp.cpp:1739
+#: src/mapihelp.cpp:1774
 msgid ""
 "[The content of this message is not visible due to an processing error in "
 "GpgOL.]"
@@ -363,13 +363,13 @@ msgstr ""
 "Sie sicher, daß lediglich das Text Format ausgewählt wurde.\n"
 "(In der Menüleiste: \"Format\" => \"Nur Text\")"
 
-#: src/message.cpp:131
+#: src/message.cpp:152
 msgid "[Crypto operation failed - can't show the body of the message]"
 msgstr ""
 "[Krypto-Operation ist fehlgeschlagen - Der Text der Nachricht kann nicht "
 "angezeigt werden.]"
 
-#: src/message.cpp:220
+#: src/message.cpp:241
 #, c-format
 msgid ""
 "Message class: %s\n"
@@ -382,20 +382,20 @@ msgstr ""
 "Struktur der Nachricht:\n"
 "%s"
 
-#: src/message.cpp:228
+#: src/message.cpp:249
 msgid "GpgOL - Message Information"
 msgstr "GpgOL - Informationen zu der Nachricht"
 
-#: src/message.cpp:814
+#: src/message.cpp:837
 msgid "No recipients to encrypt to are given"
 msgstr "Empfänger zum Verschlüsseln wurde nicht angegeben"
 
-#: src/message.cpp:830
+#: src/message.cpp:853
 #, c-format
 msgid "Encryption failed (%s)"
 msgstr "Verschlüsselungsfehler (%s)"
 
-#: src/message.cpp:851
+#: src/message.cpp:874
 #, c-format
 msgid "Signing failed (%s)"
 msgstr "Unterschrifterstellungsfehler (%s)"
index ae9b57e..5980c19 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GPGol\n"
 "Report-Msgid-Bugs-To: bug-gpgol@g10code.com\n"
-"POT-Creation-Date: 2007-12-10 10:44+0100\n"
+"POT-Creation-Date: 2008-01-03 12:18+0100\n"
 "PO-Revision-Date: 2006-12-12 23:52+0100\n"
 "Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -57,7 +57,7 @@ msgstr ""
 msgid "Select Certificate Manager"
 msgstr "GPG-nyckel&hanterare"
 
-#: src/engine.c:363
+#: src/engine.c:364
 msgid ""
 "The user interface server is not available or does not work.  Using an "
 "internal user interface.\n"
@@ -66,7 +66,7 @@ msgid ""
 "are not readable."
 msgstr ""
 
-#: src/engine.c:367 src/ext-commands.cpp:659 src/main.c:603 src/main.c:609
+#: src/engine.c:368 src/ext-commands.cpp:672 src/main.c:603 src/main.c:609
 msgid "GpgOL"
 msgstr ""
 
@@ -247,12 +247,12 @@ msgstr "Signera meddelandet med GPG"
 msgid "&sign message with GnuPG"
 msgstr "Signera meddelandet med GPG"
 
-#: src/ext-commands.cpp:453 src/ext-commands.cpp:817
+#: src/ext-commands.cpp:453 src/ext-commands.cpp:849
 #, fuzzy
 msgid "Encrypt message with GnuPG"
 msgstr "Signera meddelandet med GPG"
 
-#: src/ext-commands.cpp:454 src/ext-commands.cpp:827
+#: src/ext-commands.cpp:454 src/ext-commands.cpp:859
 #, fuzzy
 msgid "Sign message with GnuPG"
 msgstr "Signera meddelandet med GPG"
@@ -266,62 +266,62 @@ msgstr "GPG-nyckel&hanterare"
 msgid "Open the certificate manager"
 msgstr ""
 
-#: src/ext-commands.cpp:658
+#: src/ext-commands.cpp:671
 #, fuzzy
 msgid "Could not start certificate manager"
 msgstr "Kunde inte starta nyckelhanteraren"
 
-#: src/ext-commands.cpp:701
+#: src/ext-commands.cpp:733
 #, fuzzy
 msgid "Select this option to decrypt and verify the message."
 msgstr "Välj det här alternativet för att kryptera meddelandet."
 
-#: src/ext-commands.cpp:708
+#: src/ext-commands.cpp:740
 #, fuzzy
 msgid "Select this option to show information on the crypto status"
 msgstr "Välj det här alternativet för att signera meddelandet."
 
-#: src/ext-commands.cpp:716 src/ext-commands.cpp:797
+#: src/ext-commands.cpp:748 src/ext-commands.cpp:829
 msgid "Check the signature now and display the result"
 msgstr ""
 
-#: src/ext-commands.cpp:723
+#: src/ext-commands.cpp:755
 #, fuzzy
 msgid "Select this option to automatically select the protocol."
 msgstr "Välj det här alternativet för att kryptera meddelandet."
 
-#: src/ext-commands.cpp:730
+#: src/ext-commands.cpp:762
 #, fuzzy
 msgid "Select this option to select the PGP/MIME protocol."
 msgstr "Välj det här alternativet för att kryptera meddelandet."
 
-#: src/ext-commands.cpp:737
+#: src/ext-commands.cpp:769
 #, fuzzy
 msgid "Select this option to select the S/MIME protocol."
 msgstr "Välj det här alternativet för att kryptera meddelandet."
 
-#: src/ext-commands.cpp:744
+#: src/ext-commands.cpp:776
 msgid "Select this option to encrypt the message."
 msgstr "Välj det här alternativet för att kryptera meddelandet."
 
-#: src/ext-commands.cpp:751
+#: src/ext-commands.cpp:783
 msgid "Select this option to sign the message."
 msgstr "Välj det här alternativet för att signera meddelandet."
 
-#: src/ext-commands.cpp:758
+#: src/ext-commands.cpp:790
 #, fuzzy
 msgid "Select this option to open the certificate manager"
 msgstr "Välj det här alternativet för att kryptera meddelandet."
 
-#: src/ext-commands.cpp:787
+#: src/ext-commands.cpp:819
 msgid "Show S/MIME status info"
 msgstr ""
 
-#: src/ext-commands.cpp:807
+#: src/ext-commands.cpp:839
 msgid "Use S/MIME for sign/encrypt"
 msgstr ""
 
-#: src/ext-commands.cpp:837
+#: src/ext-commands.cpp:869
 msgid "Open the GpgOL certificate manager"
 msgstr ""
 
@@ -338,14 +338,14 @@ msgid ""
 "\"%s\""
 msgstr ""
 
-#: src/mapihelp.cpp:1193
+#: src/mapihelp.cpp:1228
 msgid ""
 "[The content of this message is not visible because it has been decrypted by "
 "another Outlook session.  Use the \"decrypt/verify\" command to make it "
 "visible]"
 msgstr ""
 
-#: src/mapihelp.cpp:1739
+#: src/mapihelp.cpp:1774
 msgid ""
 "[The content of this message is not visible due to an processing error in "
 "GpgOL.]"
@@ -362,11 +362,11 @@ msgstr ""
 "och inte RTF-meddelanden. Se till att endast textformatet\n"
 "har valts i inställningarna."
 
-#: src/message.cpp:131
+#: src/message.cpp:152
 msgid "[Crypto operation failed - can't show the body of the message]"
 msgstr ""
 
-#: src/message.cpp:220
+#: src/message.cpp:241
 #, c-format
 msgid ""
 "Message class: %s\n"
@@ -375,20 +375,20 @@ msgid ""
 "%s"
 msgstr ""
 
-#: src/message.cpp:228
+#: src/message.cpp:249
 msgid "GpgOL - Message Information"
 msgstr ""
 
-#: src/message.cpp:814
+#: src/message.cpp:837
 msgid "No recipients to encrypt to are given"
 msgstr ""
 
-#: src/message.cpp:830
+#: src/message.cpp:853
 #, fuzzy, c-format
 msgid "Encryption failed (%s)"
 msgstr "Kryptering misslyckades"
 
-#: src/message.cpp:851
+#: src/message.cpp:874
 #, fuzzy, c-format
 msgid "Signing failed (%s)"
 msgstr "Signering misslyckades"
index ecb0bcd..318f9b7 100644 (file)
@@ -1,3 +1,12 @@
+2008-01-03  Werner Koch  <wk@g10code.com>
+
+       * mimemaker.c (mime_sign_encrypt): Fix result test of do_mime_sign.
+       (write_tempsign_attachment): Remove.
+       (do_mime_sign): Change last ark to a sink_t.
+       (mime_sign_encrypt): Rework to use a temporary stream instead of a
+       temporary attachment.
+       (create_mapi_attachment): Remove arg TEMPSIGN.
+
 2007-12-18  Werner Koch  <wk@g10code.com>
 
        * mapihelp.cpp (get_msgcls_from_pgp_lines): Limit check to the
index 7225725..8351b37 100644 (file)
@@ -911,7 +911,7 @@ async_worker_thread (void *dummy)
           if (addit)
             {
               hdarray[hdarraylen++] = item->hd;
-              item->waiting = 1; /* Just for the tarce output.  */
+              item->waiting = 1; /* Just for the trace output.  */
             }
           if (!item->delayed_ready && (item->got_error || item->got_ready))
             any_ready = 1;
@@ -940,14 +940,14 @@ async_worker_thread (void *dummy)
 /*               } */
 /*           } */
 
-/*           log_debug ("%s:%s: %d items in queue; waiting for %d items:",  */
-/*                      SRCNAME, __func__, count, hdarraylen-1); */
-/*           for (item = work_queue; item; item = item->next) */
-/*             { */
-/*               if (item->waiting) */
-/*                 log_debug ("%s:%s: [%s:%p]", */
-/*                            SRCNAME, __func__, item->name, item->hd); */
-/*             } */
+          log_debug ("%s:%s: %d items in queue; waiting for %d items:",
+                     SRCNAME, __func__, count, hdarraylen-1);
+          for (item = work_queue; item; item = item->next)
+            {
+              if (item->waiting)
+                log_debug ("%s:%s: [%s:%p]",
+                           SRCNAME, __func__, item->name, item->hd);
+            }
           n = WaitForMultipleObjects (hdarraylen, hdarray, FALSE, INFINITE);
 /*           n = MsgWaitForMultipleObjects (hdarraylen, hdarray, FALSE, */
 /*                                          INFINITE, QS_ALLEVENTS); */
index 81afa42..fb535b7 100644 (file)
@@ -41,7 +41,7 @@
                                        SRCNAME, __func__, __LINE__); \
                         } while (0)
 
-static int debug_filter = 1;
+static int debug_filter = 0;
 
 /* This variable indicates whether the assuan engine is used.  */
 static int use_assuan;
index 919205c..def5048 100644 (file)
@@ -1,5 +1,5 @@
 /* mimemaker.c - Construct MIME message out of a MAPI
- *     Copyright (C) 2007 g10 Code GmbH
+ *     Copyright (C) 2007, 2008 g10 Code GmbH
  *
  * This file is part of GpgOL.
  * 
@@ -47,8 +47,6 @@
 /* The filename of the attachment we create as the result of sign or
    encrypt operation.  */
 #define MIMEATTACHFILENAME "gpgolXXX.dat"
-/* The filename of another temporary attachment.  */
-#define TMPMIMEATTACHFILENAME "gpgolXX0.dat"
 
 static const char oid_mimetag[] =
     {0x2A, 0x86, 0x48, 0x86, 0xf7, 0x14, 0x03, 0x0a, 0x04};
@@ -140,13 +138,11 @@ check_protocol (protocol_t protocol)
 
 /* Create a new MAPI attchment for MESSAGE which will be used to
    prepare the MIME message.  On sucess the stream to write the data
-   to is stored at STREAM and the attachment object itself is the
+   to is stored at STREAM and the attachment object itself is
    returned.  The caller needs to call SaveChanges.  Returns NULL on
-   failure in which case STREAM will be set to NULL.  If TEMPSIGN is
-   set the attchment is used only as a temporary buffer and will later
-   be part of an encrypted mIME body.  */
+   failure in which case STREAM will be set to NULL.  */
 static LPATTACH
-create_mapi_attachment (LPMESSAGE message, sink_t sink, int tempsign)
+create_mapi_attachment (LPMESSAGE message, sink_t sink)
 {
   HRESULT hr;
   ULONG pos;
@@ -189,7 +185,7 @@ create_mapi_attachment (LPMESSAGE message, sink_t sink, int tempsign)
 
   /* We better insert a short filename. */
   prop.ulPropTag = PR_ATTACH_FILENAME_A;
-  prop.Value.lpszA = tempsign? TMPMIMEATTACHFILENAME : MIMEATTACHFILENAME;
+  prop.Value.lpszA = MIMEATTACHFILENAME;
   hr = HrSetOneProp ((LPMAPIPROP)att, &prop);
   if (hr)
     {
@@ -925,37 +921,6 @@ write_attachments (sink_t sink,
 }
 
 
-/* Write the tempsign attachment.  */
-static int
-write_tempsign_attachment (sink_t sink, 
-                           LPMESSAGE message, mapi_attach_item_t *table)
-{
-  int idx, rc;
-  char *buffer;
-  size_t buflen;
-
-  for (idx=0; table && !table[idx].end_of_table; idx++)
-    {
-      if (table[idx].attach_type == ATTACHTYPE_MOSSTEMPL
-          && table[idx].filename
-          && !strcmp (table[idx].filename, TMPMIMEATTACHFILENAME))
-        {
-          buffer = mapi_get_attach (message, table+idx, &buflen);
-          if (!buffer)
-            {
-              log_debug ("Tempsign attachment at index %d not found\n", idx);
-              return -1;
-            }
-          /* Write the attachment out as is.  */
-          rc = write_buffer (sink, buffer, buflen);
-          xfree (buffer);
-          return rc;
-        }
-    }
-  log_error ("Tempsign attachment not found\n");
-  return -1;  /* Ooops.  */
-}
-
 
 /* Delete all attachments from TABLE except for the one we just created */
 static int
@@ -1167,10 +1132,11 @@ create_top_signing_header (char *buffer, size_t buflen, protocol_t protocol,
 /* Main body of mime_sign without the the code to delete the original
    attachments.  On success the function returns the current
    attachment table at R_ATT_TABLE or sets this to NULL on error.  If
-   TEMPSIGN is set the result will later be encrypted.  */
+   TMPSINK is set not atcghment will be created but the output
+   written to that sink.  */
 static int 
 do_mime_sign (LPMESSAGE message, protocol_t protocol, 
-              mapi_attach_item_t **r_att_table, int tempsign)
+              mapi_attach_item_t **r_att_table, sink_t tmpsink)
 {
   int result = -1;
   int rc;
@@ -1198,9 +1164,17 @@ do_mime_sign (LPMESSAGE message, protocol_t protocol,
   if (protocol == PROTOCOL_UNKNOWN)
     return -1;
 
-  attach = create_mapi_attachment (message, sink, tempsign);
-  if (!attach)
-    return -1;
+  if (tmpsink)
+    {
+      attach = NULL;
+      sink = tmpsink;
+    }
+  else
+    {
+      attach = create_mapi_attachment (message, sink);
+      if (!attach)
+        return -1;
+    }
 
   /* Prepare the signing.  */
   if (engine_create_filter (&filter, collect_signature, &sigbuffer))
@@ -1241,7 +1215,7 @@ do_mime_sign (LPMESSAGE message, protocol_t protocol,
   if ((rc = write_boundary (sink, boundary, 0)))
     goto failure;
 
-  /* Create a new sink for hashing and wire/hash our content.  */
+  /* Create a new sink for hashing and write/hash our content.  */
   hashsink->cb_data = filter;
   hashsink->extrasink = sink;
   hashsink->writefnc = sink_hashing_write;
@@ -1355,14 +1329,18 @@ do_mime_sign (LPMESSAGE message, protocol_t protocol,
   }
 
 
-  if (close_mapi_attachment (&attach, sink))
-    goto failure;
+  if (attach)
+    {
+      if (close_mapi_attachment (&attach, sink))
+        goto failure;
+    }
 
   result = 0;  /* Everything is fine, fall through the cleanup now.  */
 
  failure:
   engine_cancel (filter);
-  cancel_mapi_attachment (&attach, sink);
+  if (attach)
+    cancel_mapi_attachment (&attach, sink);
   xfree (body);
   if (result)
     mapi_release_attach_table (att_table);
@@ -1585,7 +1563,7 @@ mime_encrypt (LPMESSAGE message, protocol_t protocol, char **recipients)
   memset (sink, 0, sizeof *sink);
   memset (encsink, 0, sizeof *encsink);
 
-  attach = create_mapi_attachment (message, sink, 0);
+  attach = create_mapi_attachment (message, sink);
   if (!attach)
     return -1;
 
@@ -1692,71 +1670,118 @@ mime_sign_encrypt (LPMESSAGE message, protocol_t protocol, char **recipients)
 {
   int result = -1;
   int rc = 0;
+  HRESULT hr;
   LPATTACH attach;
+  LPSTREAM tmpstream = NULL;
   struct sink_s sinkmem;
   sink_t sink = &sinkmem;
   struct sink_s encsinkmem;
   sink_t encsink = &encsinkmem;
+  struct sink_s tmpsinkmem;
+  sink_t tmpsink = &tmpsinkmem;
   char boundary[BOUNDARYSIZE+1];
   mapi_attach_item_t *att_table = NULL;
   engine_filter_t filter;
 
   memset (sink, 0, sizeof *sink);
   memset (encsink, 0, sizeof *encsink);
+  memset (tmpsink, 0, sizeof *tmpsink);
 
-  attach = create_mapi_attachment (message, sink, 0);
+  attach = create_mapi_attachment (message, sink);
   if (!attach)
     return -1;
 
+  /* Create a temporary sink to construct the signed data.  */ 
+  hr = OpenStreamOnFile (MAPIAllocateBuffer, MAPIFreeBuffer,
+                         (SOF_UNIQUEFILENAME | STGM_DELETEONRELEASE
+                          | STGM_CREATE | STGM_READWRITE),
+                         NULL, "GPG", &tmpstream); 
+  if (FAILED (hr)) 
+    {
+      log_error ("%s:%s: can't create temp file: hr=%#lx\n",
+                 SRCNAME, __func__, hr); 
+      rc = -1;
+      goto failure;
+    }
+  tmpsink->cb_data = tmpstream;
+  tmpsink->writefnc = sink_std_write;
+
+
   /* Prepare the encryption.  We do this early as it is quite common
      that some recipients are not be available and thus the encryption
      will fail early. */
-  TRACEPOINT ();
   if (engine_create_filter (&filter, write_buffer_for_cb, sink))
     goto failure;
-  TRACEPOINT ();
   if ((rc=engine_encrypt_start (filter, protocol, recipients, &protocol)))
     goto failure;
 
-  TRACEPOINT ();
   protocol = check_protocol (protocol);
   if (protocol == PROTOCOL_UNKNOWN)
     goto failure;
-  TRACEPOINT ();
 
-  /* Now sign the message.  This creates another attchment with the
+  /* Now sign the message.  This creates another attachment with the
      complete MIME object of the signed message.  We can't do the
      encryption in streaming mode while running the encryption because
      we need to fix up that ugly micalg parameter after having created
      the signature.  */
-  if (!do_mime_sign (message, protocol, &att_table, 1))
+  if (do_mime_sign (message, protocol, &att_table, tmpsink))
     goto failure;
 
-  TRACEPOINT ();
   /* Write the top header.  */
   rc = create_top_encryption_header (sink, protocol, boundary);
   if (rc)
     goto failure;
 
-  TRACEPOINT ();
   /* Create a new sink for encrypting the temporary attachment with
      the signed message.  */
   encsink->cb_data = filter;
   encsink->writefnc = sink_encryption_write;
-  
-  rc = write_tempsign_attachment (encsink, message, att_table);
-  if (rc)
-    goto failure;
 
-  TRACEPOINT ();
+  /* Copy the temporary stream to the encryption sink.  */
+  {
+    LARGE_INTEGER off;
+    ULONG nread;
+    char buffer[4096];
+
+    off.QuadPart = 0;
+    hr = IStream_Seek (tmpstream, off, STREAM_SEEK_SET, NULL);
+    if (hr)
+      {
+        log_error ("%s:%s: seeking back to the begin failed: hr=%#lx",
+                   SRCNAME, __func__, hr);
+        rc = gpg_error (GPG_ERR_EIO);
+        goto failure;
+      }
+
+    for (;;)
+      {
+        hr = IStream_Read (tmpstream, buffer, sizeof buffer, &nread);
+        if (hr)
+          {
+            log_error ("%s:%s: IStream::Read failed: hr=%#lx", 
+                       SRCNAME, __func__, hr);
+            rc = gpg_error (GPG_ERR_EIO);
+            goto failure;
+          }
+        if (!nread)
+          break;  /* EOF */
+        rc = write_buffer (encsink, buffer, nread);
+        if (rc)
+          {
+            log_error ("%s:%s: writing tmpstream to encsink failed: %s", 
+                       SRCNAME, __func__, gpg_strerror (rc));
+            goto failure;
+          }
+      }
+  }
+
+
   /* Flush the encryption sink and wait for the encryption to get
      ready.  */
   if ((rc = write_buffer (encsink, NULL, 0)))
     goto failure;
-  TRACEPOINT ();
   if ((rc = engine_wait (filter)))
     goto failure;
-  TRACEPOINT ();
   filter = NULL; /* Not valid anymore.  */
   encsink->cb_data = NULL; /* Not needed anymore.  */
   
@@ -1764,24 +1789,21 @@ mime_sign_encrypt (LPMESSAGE message, protocol_t protocol, char **recipients)
   if (*boundary && (rc = write_boundary (sink, boundary, 1)))
     goto failure;
   
-  TRACEPOINT ();
   if (close_mapi_attachment (&attach, sink))
     goto failure;
 
-  TRACEPOINT ();
   if (finalize_message (message, att_table))
     goto failure;
 
-  TRACEPOINT ();
   result = 0;  /* Everything is fine, fall through the cleanup now.  */
 
  failure:
-  TRACEPOINT ();
   if (result)
     log_debug ("%s:%s: failed rc=%d (%s) <%s>", SRCNAME, __func__, rc, 
                gpg_strerror (rc), gpg_strsource (rc));
   engine_cancel (filter);
-  cancel_mapi_attachment (&attach, sink);
+  if (tmpstream)
+    IStream_Release (tmpstream);
   mapi_release_attach_table (att_table);
   return result;
 }