* protect-tool.c: New option --enable-status-msg.
[gnupg.git] / sm / decrypt.c
index 23858ef..9a21cfb 100644 (file)
@@ -51,17 +51,18 @@ struct decrypt_filter_parm_s {
 
 
 
-/* decrypt the session key and fill in the parm structure.  The
+/* Decrypt the session key and fill in the parm structure.  The
    algo and the IV is expected to be already in PARM. */
 static int 
-prepare_decryption (const char *hexkeygrip, KsbaConstSexp enc_val,
+prepare_decryption (ctrl_t ctrl, const char *hexkeygrip, const char *desc,
+                    ksba_const_sexp_t enc_val,
                     struct decrypt_filter_parm_s *parm)
 {
   char *seskey = NULL;
   size_t n, seskeylen;
   int rc;
 
-  rc = gpgsm_agent_pkdecrypt (hexkeygrip, enc_val,
+  rc = gpgsm_agent_pkdecrypt (ctrl, hexkeygrip, desc, enc_val,
                               &seskey, &seskeylen);
   if (rc)
     {
@@ -148,7 +149,7 @@ prepare_decryption (const char *hexkeygrip, KsbaConstSexp enc_val,
    Due to different buffer sizes or different length of input and
    output, it may happen that fewer bytes are process or fewer bytes
    are written. */
-static KsbaError  
+static gpg_error_t
 decrypt_filter (void *arg,
                 const void *inbuf, size_t inlen, size_t *inused,
                 void *outbuf, size_t maxoutlen, size_t *outlen)
@@ -237,16 +238,15 @@ decrypt_filter (void *arg,
 \f
 /* Perform a decrypt operation.  */
 int
-gpgsm_decrypt (CTRL ctrl, int in_fd, FILE *out_fp)
+gpgsm_decrypt (ctrl_t ctrl, int in_fd, FILE *out_fp)
 {
   int rc;
-  KsbaError err;
   Base64Context b64reader = NULL;
   Base64Context b64writer = NULL;
-  KsbaReader reader;
-  KsbaWriter writer;
-  KsbaCMS cms = NULL;
-  KsbaStopReason stopreason;
+  ksba_reader_t reader;
+  ksba_writer_t writer;
+  ksba_cms_t cms = NULL;
+  ksba_stop_reason_t stopreason;
   KEYDB_HANDLE kh;
   int recp;
   FILE *in_fp = NULL;
@@ -271,7 +271,7 @@ gpgsm_decrypt (CTRL ctrl, int in_fd, FILE *out_fp)
       goto leave;
     }
 
-  rc = gpgsm_create_reader (&b64reader, ctrl, in_fp, &reader);
+  rc = gpgsm_create_reader (&b64reader, ctrl, in_fp, 0, &reader);
   if (rc)
     {
       log_error ("can't create reader: %s\n", gpg_strerror (rc));
@@ -285,30 +285,25 @@ gpgsm_decrypt (CTRL ctrl, int in_fd, FILE *out_fp)
       goto leave;
     }
 
-  err = ksba_cms_new (&cms);
-  if (err)
-    {
-      rc = err;
-      goto leave;
-    }
+  rc = ksba_cms_new (&cms);
+  if (rc)
+    goto leave;
 
-  err = ksba_cms_set_reader_writer (cms, reader, writer);
-  if (err)
+  rc = ksba_cms_set_reader_writer (cms, reader, writer);
+  if (rc)
     {
       log_debug ("ksba_cms_set_reader_writer failed: %s\n",
-                 gpg_strerror (err));
-      rc = err;
+                 gpg_strerror (rc));
       goto leave;
     }
 
   /* parser loop */
   do 
     {
-      err = ksba_cms_parse (cms, &stopreason);
-      if (err)
+      rc = ksba_cms_parse (cms, &stopreason);
+      if (rc)
         {
-          log_debug ("ksba_cms_parse failed: %s\n", gpg_strerror (err));
-          rc = err;
+          log_debug ("ksba_cms_parse failed: %s\n", gpg_strerror (rc));
           goto leave;
         }
 
@@ -338,6 +333,11 @@ gpgsm_decrypt (CTRL ctrl, int in_fd, FILE *out_fp)
                                numbuf, algoid?algoid:"?", NULL);
               }
 
+              /* If it seems that this is not an ecrypted message we
+                 return a more sensible error code. */
+              if (!algoid)
+                rc = gpg_error (GPG_ERR_NO_DATA);
+
               goto leave;
             }
           dfparm.algo = algo;
@@ -352,27 +352,27 @@ gpgsm_decrypt (CTRL ctrl, int in_fd, FILE *out_fp)
                                             &dfparm.ivlen);
           if (rc)
             {
-              log_error ("error getting IV: %s\n", gpg_strerror (err));
-              rc = err;
+              log_error ("error getting IV: %s\n", gpg_strerror (rc));
               goto leave;
             }
           
           for (recp=0; !any_key; recp++)
             {
               char *issuer;
-              KsbaSexp serial;
-              KsbaSexp enc_val;
+              ksba_sexp_t serial;
+              ksba_sexp_t enc_val;
               char *hexkeygrip = NULL;
+              char *desc = NULL;
 
-              err = ksba_cms_get_issuer_serial (cms, recp, &issuer, &serial);
-              if (err == -1 && recp)
+              rc = ksba_cms_get_issuer_serial (cms, recp, &issuer, &serial);
+              if (rc == -1 && recp)
                 break; /* no more recipients */
-              if (err)
+              if (rc)
                 log_error ("recp %d - error getting info: %s\n",
-                           recp, gpg_strerror (err));
+                           recp, gpg_strerror (rc));
               else
                 {
-                  KsbaCert cert = NULL;
+                  ksba_cert_t cert = NULL;
 
                   log_debug ("recp %d - issuer: `%s'\n",
                              recp, issuer? issuer:"[NONE]");
@@ -409,6 +409,7 @@ gpgsm_decrypt (CTRL ctrl, int in_fd, FILE *out_fp)
                     }
 
                   hexkeygrip = gpgsm_get_keygrip_hexstring (cert);
+                  desc = gpgsm_format_keydesc (cert);
 
                 oops:
                   xfree (issuer);
@@ -423,12 +424,13 @@ gpgsm_decrypt (CTRL ctrl, int in_fd, FILE *out_fp)
                            recp);
               else
                 {
-                  rc = prepare_decryption (hexkeygrip, enc_val, &dfparm);
+                  rc = prepare_decryption (ctrl,
+                                           hexkeygrip, desc, enc_val, &dfparm);
                   xfree (enc_val);
                   if (rc)
                     {
-                      log_debug ("decrypting session key failed: %s\n",
-                                 gpg_strerror (rc));
+                      log_info ("decrypting session key failed: %s\n",
+                                gpg_strerror (rc));
                     }
                   else
                     { /* setup the bulk decrypter */
@@ -438,6 +440,8 @@ gpgsm_decrypt (CTRL ctrl, int in_fd, FILE *out_fp)
                                               &dfparm);
                     }
                 }
+              xfree (hexkeygrip);
+              xfree (desc);
             }
           if (!any_key)
             {
@@ -489,7 +493,10 @@ gpgsm_decrypt (CTRL ctrl, int in_fd, FILE *out_fp)
 
  leave:
   if (rc)
-    gpgsm_status (ctrl, STATUS_DECRYPTION_FAILED, NULL);
+    {
+      gpgsm_status (ctrl, STATUS_DECRYPTION_FAILED, NULL);
+      log_error ("message decryption failed: %s\n", gpg_strerror (rc));
+    }
   ksba_cms_release (cms);
   gpgsm_destroy_reader (b64reader);
   gpgsm_destroy_writer (b64writer);