summaryrefslogtreecommitdiff
path: root/cipher/pubkey.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2013-10-11 13:32:35 +0200
committerWerner Koch <wk@gnupg.org>2013-10-11 13:56:55 +0200
commitd0ae6635e4e6ae273c3a137c513d518f28f6eab3 (patch)
tree7c108a42eb37d568964e136f169f36cdfdf621c6 /cipher/pubkey.c
parent150c0313f971bcea62d2802f0389c883e11ebb31 (diff)
downloadlibgcrypt-d0ae6635e4e6ae273c3a137c513d518f28f6eab3.tar.gz
pubkey: Move sexp parsing for gcry_pk_sign to the modules.
* cipher/rsa.c (rsa_sign): Revamp. * cipher/dsa.c (dsa_sign): Revamp. * cipher/elgamal.c (elg_sign): Revamp. * cipher/ecc.c (ecc_sign): Revamp. * cipher/pubkey.c (gcry_pk_sign): Simplify. Signed-off-by: Werner Koch <wk@gnupg.org>
Diffstat (limited to 'cipher/pubkey.c')
-rw-r--r--cipher/pubkey.c58
1 files changed, 5 insertions, 53 deletions
diff --git a/cipher/pubkey.c b/cipher/pubkey.c
index 034b00fa..c0f4ab27 100644
--- a/cipher/pubkey.c
+++ b/cipher/pubkey.c
@@ -1116,71 +1116,23 @@ gcry_pk_decrypt (gcry_sexp_t *r_plain, gcry_sexp_t s_data, gcry_sexp_t s_skey)
gcry_error_t
gcry_pk_sign (gcry_sexp_t *r_sig, gcry_sexp_t s_hash, gcry_sexp_t s_skey)
{
- gcry_mpi_t *skey = NULL;
- gcry_mpi_t hash = NULL;
- gcry_pk_spec_t *spec = NULL;
- struct pk_encoding_ctx ctx;
- int i;
- int is_ecc;
gcry_err_code_t rc;
+ gcry_pk_spec_t *spec;
+ gcry_sexp_t keyparms;
*r_sig = NULL;
- rc = sexp_to_key (s_skey, 1, GCRY_PK_USAGE_SIGN, NULL,
- &skey, &spec, &is_ecc);
- if (rc)
- goto leave;
-
- gcry_assert (spec);
-
- /* Get the stuff we want to sign. Note that pk_get_nbits does also
- work on a private key. We don't need the number of bits for ECC
- here, thus set it to 0 so that we don't need to parse it. */
- _gcry_pk_util_init_encoding_ctx (&ctx, PUBKEY_OP_SIGN,
- is_ecc? 0 : gcry_pk_get_nbits (s_skey));
- rc = _gcry_pk_util_data_to_mpi (s_hash, &hash, &ctx);
+ rc = spec_from_sexp (s_skey, 1, &spec, &keyparms);
if (rc)
goto leave;
- if (DBG_CIPHER && !fips_mode ())
- {
- log_debug ("gcry_pk_sign: algo=%d\n", spec->algo);
- for(i = 0; i < pubkey_get_nskey (spec->algo); i++)
- log_mpidump (" skey", skey[i]);
- log_mpidump(" data", hash);
- }
-
if (spec->sign)
- rc = spec->sign (spec->algo, r_sig, hash, skey, ctx.flags, ctx.hash_algo);
+ rc = spec->sign (r_sig, s_hash, keyparms);
else
rc = GPG_ERR_NOT_IMPLEMENTED;
- if (rc)
- goto leave;
-
- /* Fixme: To print the result we need to print an sexp. */
- /* if (!rc && DBG_CIPHER && !fips_mode ()) */
- /* for (i = 0; i < pubkey_get_nsig (algo); i++) */
- /* log_mpidump (" sig", resarr[i]); */
-
leave:
- if (skey)
- {
- if (is_ecc)
- /* Q is optional and may be NULL, while there is D after Q. */
- for (i = 0; i < 7; i++)
- {
- if (skey[i])
- mpi_free (skey[i]);
- skey[i] = NULL;
- }
- else
- release_mpi_array (skey);
- gcry_free (skey);
- }
-
- mpi_free (hash);
-
+ gcry_sexp_release (keyparms);
return gcry_error (rc);
}