summaryrefslogtreecommitdiff
path: root/cipher/pubkey.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2013-10-11 15:39:22 +0200
committerWerner Koch <wk@gnupg.org>2013-10-11 15:39:22 +0200
commit6bd5d18c45a4a3ce8f0f66f56c83b80594877f53 (patch)
tree610dd1f7881729aa98ee1795e66303bc8e4ae8ce /cipher/pubkey.c
parentd0ae6635e4e6ae273c3a137c513d518f28f6eab3 (diff)
downloadlibgcrypt-6bd5d18c45a4a3ce8f0f66f56c83b80594877f53.tar.gz
pubkey: Move sexp parsing for gcry_pk_encrypt to the modules.
* cipher/rsa.c (rsa_encrypt): Revamp. * cipher/elgamal.c (elg_encrypt): Revamp. * cipher/ecc.c (ecc_encrypt_raw): Revamp. * cipher/pubkey.c (gcry_pk_encrypt): Simplify. * tests/basic.c (check_pubkey_crypt): Init plain, ciph, and data so that they are initialized even after an encrypt failure. -- Note that we do not have a regression test for ecc_encrypt_raw. Thus it is possible that a bug has been introduced. Should be tested using GnuPG master. Signed-off-by: Werner Koch <wk@gnupg.org>
Diffstat (limited to 'cipher/pubkey.c')
-rw-r--r--cipher/pubkey.c48
1 files changed, 5 insertions, 43 deletions
diff --git a/cipher/pubkey.c b/cipher/pubkey.c
index c0f4ab27..8a46e4e5 100644
--- a/cipher/pubkey.c
+++ b/cipher/pubkey.c
@@ -926,60 +926,22 @@ gcry_error_t
gcry_pk_encrypt (gcry_sexp_t *r_ciph, gcry_sexp_t s_data, gcry_sexp_t s_pkey)
{
gcry_err_code_t rc;
- gcry_mpi_t *pkey = NULL;
- gcry_mpi_t data = NULL;
- struct pk_encoding_ctx ctx;
- gcry_pk_spec_t *spec = NULL;
- int i;
+ gcry_pk_spec_t *spec;
+ gcry_sexp_t keyparms;
*r_ciph = NULL;
- /* Get the key. */
- rc = sexp_to_key (s_pkey, 0, GCRY_PK_USAGE_ENCR, NULL, &pkey, &spec, NULL);
- if (rc)
- goto leave;
-
- gcry_assert (spec);
-
- /* Get the stuff we want to encrypt. */
- _gcry_pk_util_init_encoding_ctx (&ctx, PUBKEY_OP_ENCRYPT, gcry_pk_get_nbits (s_pkey));
- rc = _gcry_pk_util_data_to_mpi (s_data, &data, &ctx);
+ rc = spec_from_sexp (s_pkey, 0, &spec, &keyparms);
if (rc)
goto leave;
- /* In fips mode DBG_CIPHER will never evaluate to true but as an
- extra failsafe protection we explicitly test for fips mode
- here. */
- if (DBG_CIPHER && !fips_mode ())
- {
- log_debug ("pubkey_encrypt: algo=%d\n", spec->algo);
- for(i = 0; i < pubkey_get_npkey (spec->algo); i++)
- log_mpidump (" pkey", pkey[i]);
- log_mpidump (" data", data);
- }
-
if (spec->encrypt)
- rc = spec->encrypt (spec->algo, r_ciph, data, pkey, ctx.flags);
+ rc = spec->encrypt (r_ciph, s_data, keyparms);
else
rc = GPG_ERR_NOT_IMPLEMENTED;
-
- /* if (DBG_CIPHER && !fips_mode ()) */
- /* { */
- /* for (i = 0; i < pubkey_get_nenc (spec->algo); i++) */
- /* log_mpidump (" encr", ciph[i]); */
- /* } */
-
leave:
- mpi_free (data);
- if (pkey)
- {
- release_mpi_array (pkey);
- gcry_free (pkey);
- }
-
- gcry_free (ctx.label);
-
+ gcry_sexp_release (keyparms);
return gcry_error (rc);
}