Updated from latest NewPG project
[gnupg.git] / sm / encrypt.c
index 8465c87..40e1258 100644 (file)
@@ -58,45 +58,6 @@ struct encrypt_cb_parm_s {
 };
 
 
-static KsbaCert
-get_default_recipient (void)
-{
-  const char key[] =
-    "/CN=test cert 1,OU=Aegypten Project,O=g10 Code GmbH,L=#44FC7373656C646F7266#,C=DE";
-
-  KEYDB_SEARCH_DESC desc;
-  KsbaCert cert = NULL;
-  KEYDB_HANDLE kh = NULL;
-  int rc;
-
-  rc = keydb_classify_name (key, &desc);
-  if (rc)
-    {
-      log_error ("failed to find recipient: %s\n", gnupg_strerror (rc));
-      return NULL;
-    }
-
-  kh = keydb_new (0);
-  if (!kh)
-    return NULL;
-
-  rc = keydb_search (kh, &desc, 1);
-  if (rc)
-    {
-      log_debug ("failed to find default certificate: rc=%d\n", rc);
-    }
-  else 
-    {
-      rc = keydb_get_cert (kh, &cert);
-      if (rc)
-        {
-          log_debug ("failed to get cert: rc=%d\n", rc);
-        }
-    }
-
-  keydb_release (kh);
-  return cert;
-}
 
 
 \f
@@ -247,7 +208,7 @@ encrypt_dek (const DEK dek, KsbaCert cert, char **encval)
 {
   GCRY_SEXP s_ciph, s_data, s_pkey;
   int rc;
-  char *buf;
+  KsbaSexp buf;
   size_t len;
 
   *encval = NULL;
@@ -259,7 +220,13 @@ encrypt_dek (const DEK dek, KsbaCert cert, char **encval)
       log_error ("no public key for recipient\n");
       return GNUPG_No_Public_Key;
     }
-  rc = gcry_sexp_sscan (&s_pkey, NULL, buf, strlen(buf));
+  len = gcry_sexp_canon_len (buf, 0, NULL, NULL);
+  if (!len)
+    {
+      log_error ("libksba did not return a proper S-Exp\n");
+      return GNUPG_Bug;
+    }
+  rc = gcry_sexp_sscan (&s_pkey, NULL, buf, len);
   xfree (buf); buf = NULL;
   if (rc)
     {
@@ -392,12 +359,18 @@ gpgsm_encrypt (CTRL ctrl, CERTLIST recplist, int data_fd, FILE *out_fp)
   DEK dek = NULL;
   int recpno;
   FILE *data_fp = NULL;
-  struct certlist_s help_recplist;
   CERTLIST cl;
 
   memset (&encparm, 0, sizeof encparm);
-  help_recplist.next = NULL;
-  help_recplist.cert = NULL;
+
+  if (!recplist)
+    {
+      log_error(_("no valid recipients given\n"));
+      gpgsm_status (ctrl, STATUS_NO_RECP, "0");
+      rc = GNUPG_No_Public_Key;
+      goto leave;
+    }
+
   kh = keydb_new (0);
   if (!kh)
     {
@@ -406,19 +379,6 @@ gpgsm_encrypt (CTRL ctrl, CERTLIST recplist, int data_fd, FILE *out_fp)
       goto leave;
     }
 
-  /* If no recipient list is given, use a default one */
-  if (!recplist)
-    {
-      help_recplist.cert = get_default_recipient ();
-      if (!help_recplist.cert)
-        {
-          log_error ("no default recipient found\n");
-          rc = seterr (General_Error);
-          goto leave;
-        }
-      recplist = &help_recplist;
-    }
-
   data_fp = fdopen ( dup (data_fd), "rb");
   if (!data_fp)
     {
@@ -439,6 +399,7 @@ gpgsm_encrypt (CTRL ctrl, CERTLIST recplist, int data_fd, FILE *out_fp)
     }
   encparm.fp = data_fp;
 
+  ctrl->pem_name = "ENCRYPTED MESSAGE";
   rc = gpgsm_create_writer (&b64writer, ctrl, out_fp, &writer);
   if (rc)
     {
@@ -501,9 +462,8 @@ gpgsm_encrypt (CTRL ctrl, CERTLIST recplist, int data_fd, FILE *out_fp)
     }
 
   encparm.dek = dek;
-  /* fixme: we should use a larger buffer - the small one is better
-     for testing */
-  encparm.bufsize = 10 * dek->ivlen;
+  /* Use a ~8k (AES) or ~4k (3DES) buffer */
+  encparm.bufsize = 500 * dek->ivlen;
   encparm.buffer = xtrymalloc (encparm.bufsize);
   if (!encparm.buffer)
     {
@@ -585,7 +545,5 @@ gpgsm_encrypt (CTRL ctrl, CERTLIST recplist, int data_fd, FILE *out_fp)
   if (data_fp)
     fclose (data_fp);
   xfree (encparm.buffer);
-  if (help_recplist.cert)
-    ksba_cert_release (help_recplist.cert);
   return rc;
 }