* protect-tool.c: New option --enable-status-msg.
[gnupg.git] / sm / decrypt.c
index 9b02392..9a21cfb 100644 (file)
@@ -54,14 +54,15 @@ struct decrypt_filter_parm_s {
 /* 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, ksba_const_sexp_t 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)
     {
@@ -237,7 +238,7 @@ 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;
   Base64Context b64reader = NULL;
@@ -270,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));
@@ -332,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;
@@ -356,6 +362,7 @@ gpgsm_decrypt (CTRL ctrl, int in_fd, FILE *out_fp)
               ksba_sexp_t serial;
               ksba_sexp_t enc_val;
               char *hexkeygrip = NULL;
+              char *desc = NULL;
 
               rc = ksba_cms_get_issuer_serial (cms, recp, &issuer, &serial);
               if (rc == -1 && recp)
@@ -402,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);
@@ -416,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 */
@@ -431,6 +440,8 @@ gpgsm_decrypt (CTRL ctrl, int in_fd, FILE *out_fp)
                                               &dfparm);
                     }
                 }
+              xfree (hexkeygrip);
+              xfree (desc);
             }
           if (!any_key)
             {
@@ -482,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);