diff options
author | Werner Koch <wk@gnupg.org> | 2013-10-11 13:32:35 +0200 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2013-10-11 13:56:55 +0200 |
commit | d0ae6635e4e6ae273c3a137c513d518f28f6eab3 (patch) | |
tree | 7c108a42eb37d568964e136f169f36cdfdf621c6 /cipher | |
parent | 150c0313f971bcea62d2802f0389c883e11ebb31 (diff) | |
download | libgcrypt-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')
-rw-r--r-- | cipher/dsa.c | 78 | ||||
-rw-r--r-- | cipher/ecc.c | 188 | ||||
-rw-r--r-- | cipher/elgamal.c | 74 | ||||
-rw-r--r-- | cipher/pubkey.c | 58 | ||||
-rw-r--r-- | cipher/rsa.c | 87 |
5 files changed, 289 insertions, 196 deletions
diff --git a/cipher/dsa.c b/cipher/dsa.c index deeb1132..3dfef07a 100644 --- a/cipher/dsa.c +++ b/cipher/dsa.c @@ -953,36 +953,64 @@ dsa_check_secret_key (int algo, gcry_mpi_t *skey) static gcry_err_code_t -dsa_sign (int algo, gcry_sexp_t *r_result, gcry_mpi_t data, gcry_mpi_t *skey, - int flags, int hashalgo) +dsa_sign (gcry_sexp_t *r_sig, gcry_sexp_t s_data, gcry_sexp_t keyparms) { gcry_err_code_t rc; - DSA_secret_key sk; - gcry_mpi_t r, s; + struct pk_encoding_ctx ctx; + gcry_mpi_t data = NULL; + DSA_secret_key sk = {NULL, NULL, NULL, NULL, NULL}; + gcry_mpi_t sig_r = NULL; + gcry_mpi_t sig_s = NULL; - (void)algo; - (void)flags; - (void)hashalgo; + _gcry_pk_util_init_encoding_ctx (&ctx, PUBKEY_OP_SIGN, + dsa_get_nbits (keyparms)); - if ((! data) - || (! skey[0]) || (! skey[1]) || (! skey[2]) - || (! skey[3]) || (! skey[4])) - rc = GPG_ERR_BAD_MPI; - else + /* Extract the data. */ + rc = _gcry_pk_util_data_to_mpi (s_data, &data, &ctx); + if (rc) + goto leave; + if (DBG_CIPHER) + log_mpidump ("dsa_sign data", data); + + /* Extract the key. */ + rc = _gcry_pk_util_extract_mpis (keyparms, "pqgyx", + &sk.p, &sk.q, &sk.g, &sk.y, &sk.x, NULL); + if (rc) + return rc; + if (DBG_CIPHER) { - sk.p = skey[0]; - sk.q = skey[1]; - sk.g = skey[2]; - sk.y = skey[3]; - sk.x = skey[4]; - r = mpi_alloc (mpi_get_nlimbs (sk.p)); - s = mpi_alloc (mpi_get_nlimbs (sk.p)); - rc = sign (r, s, data, &sk, flags, hashalgo); - if (!rc) - rc = gcry_sexp_build (r_result, NULL, "(sig-val(dsa(r%M)(s%M)))", r, s); - mpi_free (r); - mpi_free (s); + log_mpidump ("dsa_sign p", sk.p); + log_mpidump ("dsa_sign q", sk.q); + log_mpidump ("dsa_sign g", sk.g); + log_mpidump ("dsa_sign y", sk.y); + if (!fips_mode ()) + log_mpidump ("dsa_sign x", sk.x); + } + + sig_r = gcry_mpi_new (0); + sig_s = gcry_mpi_new (0); + rc = sign (sig_r, sig_s, data, &sk, ctx.flags, ctx.hash_algo); + if (rc) + goto leave; + if (DBG_CIPHER) + { + log_mpidump ("dsa_sign sig_r", sig_r); + log_mpidump ("dsa_sign sig_s", sig_s); } + rc = gcry_sexp_build (r_sig, NULL, "(sig-val(dsa(r%M)(s%M)))", sig_r, sig_s); + + leave: + gcry_mpi_release (sig_r); + gcry_mpi_release (sig_s); + gcry_mpi_release (sk.p); + gcry_mpi_release (sk.q); + gcry_mpi_release (sk.g); + gcry_mpi_release (sk.y); + gcry_mpi_release (sk.x); + gcry_mpi_release (data); + _gcry_pk_util_free_encoding_ctx (&ctx); + if (DBG_CIPHER) + log_debug ("dsa_sign => %s\n", gpg_strerror (rc)); return rc; } @@ -1073,7 +1101,7 @@ dsa_verify (gcry_sexp_t s_sig, gcry_sexp_t s_data, gcry_sexp_t s_keyparms) gcry_sexp_release (l1); _gcry_pk_util_free_encoding_ctx (&ctx); if (DBG_CIPHER) - log_debug ("dsa_verify => %s\n", rc?gpg_strerror (rc):"good"); + log_debug ("dsa_verify => %s\n", rc?gpg_strerror (rc):"Good"); return rc; } diff --git a/cipher/ecc.c b/cipher/ecc.c index 20ba1334..f98a5cc2 100644 --- a/cipher/ecc.c +++ b/cipher/ecc.c @@ -1461,87 +1461,129 @@ ecc_check_secret_key (int algo, gcry_mpi_t *skey) static gcry_err_code_t -ecc_sign (int algo, gcry_sexp_t *r_result, gcry_mpi_t data, gcry_mpi_t *skey, - int flags, int hashalgo) +ecc_sign (gcry_sexp_t *r_sig, gcry_sexp_t s_data, gcry_sexp_t keyparms) { - gpg_err_code_t rc; + gcry_err_code_t rc; + struct pk_encoding_ctx ctx; + gcry_mpi_t data = NULL; + gcry_sexp_t l1 = NULL; + char *curvename = NULL; + gcry_mpi_t mpi_g = NULL; + gcry_mpi_t mpi_q = NULL; ECC_secret_key sk; - gcry_mpi_t r, s; + gcry_mpi_t sig_r = NULL; + gcry_mpi_t sig_s = NULL; - (void)algo; + memset (&sk, 0, sizeof sk); - if (!data || !skey[0] || !skey[1] || !skey[2] || !skey[3] || !skey[4] - || !skey[6] ) - return GPG_ERR_BAD_MPI; + _gcry_pk_util_init_encoding_ctx (&ctx, PUBKEY_OP_SIGN, 0); - /* FIXME: The setting of model and dialect are crude hacks. We will - fix that by moving the s-expression parsing from pubkey.c to - here. */ - sk.E.model = ((flags & PUBKEY_FLAG_EDDSA) - ? MPI_EC_TWISTEDEDWARDS - : MPI_EC_WEIERSTRASS); - sk.E.dialect = ((flags & PUBKEY_FLAG_EDDSA) - ? ECC_DIALECT_ED25519 - : ECC_DIALECT_STANDARD); - sk.E.p = skey[0]; - sk.E.a = skey[1]; - sk.E.b = skey[2]; - point_init (&sk.E.G); - sk.Q.x = NULL; - sk.Q.y = NULL; - sk.Q.z = NULL; - rc = _gcry_ecc_os2ec (&sk.E.G, skey[3]); + /* Extract the data. */ + rc = _gcry_pk_util_data_to_mpi (s_data, &data, &ctx); if (rc) + goto leave; + if (DBG_CIPHER) + log_mpidump ("ecc_sign data", data); + + /* + * Extract the key. + */ + rc = _gcry_pk_util_extract_mpis (keyparms, "-p?a?b?g?n?/q?+d", + &sk.E.p, &sk.E.a, &sk.E.b, &mpi_g, &sk.E.n, + &mpi_q, &sk.d, NULL); + if (rc) + goto leave; + if (mpi_g) { - point_free (&sk.E.G); - return rc; + point_init (&sk.E.G); + rc = _gcry_ecc_os2ec (&sk.E.G, mpi_g); + if (rc) + goto leave; + } + /* Add missing parameters using the optional curve parameter. */ + gcry_sexp_release (l1); + l1 = gcry_sexp_find_token (keyparms, "curve", 5); + if (l1) + { + curvename = gcry_sexp_nth_string (l1, 1); + if (curvename) + { + rc = _gcry_ecc_fill_in_curve (0, curvename, &sk.E, NULL); + if (rc) + return rc; + } + } + /* Guess required fields if a curve parameter has not been given. + FIXME: This is a crude hacks. We need to fix that. */ + if (!curvename) + { + sk.E.model = ((ctx.flags & PUBKEY_FLAG_EDDSA) + ? MPI_EC_TWISTEDEDWARDS + : MPI_EC_WEIERSTRASS); + sk.E.dialect = ((ctx.flags & PUBKEY_FLAG_EDDSA) + ? ECC_DIALECT_ED25519 + : ECC_DIALECT_STANDARD); + } + if (DBG_CIPHER) + { + log_debug ("ecc_sign info: %s/%s\n", + _gcry_ecc_model2str (sk.E.model), + _gcry_ecc_dialect2str (sk.E.dialect)); + if (sk.E.name) + log_debug ("ecc_sign name: %s\n", sk.E.name); + log_printmpi ("ecc_sign p", sk.E.p); + log_printmpi ("ecc_sign a", sk.E.a); + log_printmpi ("ecc_sign b", sk.E.b); + log_printpnt ("ecc_sign g", &sk.E.G, NULL); + log_printmpi ("ecc_sign n", sk.E.n); + log_printmpi ("ecc_sign q", mpi_q); + if (!fips_mode ()) + log_printmpi ("ecc_sign d", sk.d); + } + if (!sk.E.p || !sk.E.a || !sk.E.b || !sk.E.G.x || !sk.E.n || !sk.d) + { + rc = GPG_ERR_NO_OBJ; + goto leave; } - sk.E.n = skey[4]; - - r = mpi_alloc (mpi_get_nlimbs (sk.E.p)); - s = mpi_alloc (mpi_get_nlimbs (sk.E.p)); - { - const unsigned char *buf; - unsigned int n; - gcry_assert (mpi_is_opaque (skey[6])); + sig_r = gcry_mpi_new (0); + sig_s = gcry_mpi_new (0); + if ((ctx.flags & PUBKEY_FLAG_EDDSA)) + { + /* EdDSA requires the public key. */ + rc = sign_eddsa (data, &sk, sig_r, sig_s, ctx.hash_algo, mpi_q); + if (!rc) + rc = gcry_sexp_build (r_sig, NULL, + "(sig-val(eddsa(r%M)(s%M)))", sig_r, sig_s); + } + else + { + rc = sign_ecdsa (data, &sk, sig_r, sig_s, ctx.flags, ctx.hash_algo); + if (!rc) + rc = gcry_sexp_build (r_sig, NULL, + "(sig-val(ecdsa(r%M)(s%M)))", sig_r, sig_s); + } - buf = gcry_mpi_get_opaque (skey[6], &n); - if (!buf) - rc = GPG_ERR_INV_OBJ; - else - { - n = (n + 7)/8; - sk.d = NULL; - rc = gcry_mpi_scan (&sk.d, GCRYMPI_FMT_USG, buf, n, NULL); - if (!rc) - { - if ((flags & PUBKEY_FLAG_EDDSA)) - { - rc = sign_eddsa (data, &sk, r, s, hashalgo, skey[5]); - if (!rc) - rc = gcry_sexp_build (r_result, NULL, - "(sig-val(eddsa(r%M)(s%M)))", r, s); - } - else - { - rc = sign_ecdsa (data, &sk, r, s, flags, hashalgo); - if (!rc) - rc = gcry_sexp_build (r_result, NULL, - "(sig-val(ecdsa(r%M)(s%M)))", r, s); - } - gcry_mpi_release (sk.d); - sk.d = NULL; - } - } - } - mpi_free (r); - mpi_free (s); + leave: + gcry_mpi_release (sk.E.p); + gcry_mpi_release (sk.E.a); + gcry_mpi_release (sk.E.b); + gcry_mpi_release (mpi_g); point_free (&sk.E.G); - if (sk.Q.x) - point_free (&sk.Q); + gcry_mpi_release (sk.E.n); + gcry_mpi_release (mpi_q); + point_free (&sk.Q); + gcry_mpi_release (sk.d); + gcry_mpi_release (sig_r); + gcry_mpi_release (sig_s); + gcry_free (curvename); + gcry_mpi_release (data); + gcry_sexp_release (l1); + _gcry_pk_util_free_encoding_ctx (&ctx); + if (DBG_CIPHER) + log_debug ("ecc_sign => %s\n", gpg_strerror (rc)); return rc; } @@ -1649,6 +1691,11 @@ ecc_verify (gcry_sexp_t s_sig, gcry_sexp_t s_data, gcry_sexp_t s_keyparms) log_printmpi ("ecc_verify n", pk.E.n); log_printmpi ("ecc_verify q", mpi_q); } + if (!pk.E.p || !pk.E.a || !pk.E.b || !pk.E.G.x || !pk.E.n || !mpi_q) + { + rc = GPG_ERR_NO_OBJ; + goto leave; + } /* @@ -1693,10 +1740,11 @@ ecc_verify (gcry_sexp_t s_sig, gcry_sexp_t s_data, gcry_sexp_t s_keyparms) gcry_mpi_release (pk.E.p); gcry_mpi_release (pk.E.a); gcry_mpi_release (pk.E.b); + gcry_mpi_release (mpi_g); point_free (&pk.E.G); gcry_mpi_release (pk.E.n); + gcry_mpi_release (mpi_q); point_free (&pk.Q); - gcry_mpi_release (mpi_g); gcry_mpi_release (data); gcry_mpi_release (sig_r); gcry_mpi_release (sig_s); @@ -1704,7 +1752,7 @@ ecc_verify (gcry_sexp_t s_sig, gcry_sexp_t s_data, gcry_sexp_t s_keyparms) gcry_sexp_release (l1); _gcry_pk_util_free_encoding_ctx (&ctx); if (DBG_CIPHER) - log_debug ("ecc_verify => %s\n", rc?gpg_strerror (rc):"good"); + log_debug ("ecc_verify => %s\n", rc?gpg_strerror (rc):"Good"); return rc; } diff --git a/cipher/elgamal.c b/cipher/elgamal.c index b82e83f0..a4f5ce3d 100644 --- a/cipher/elgamal.c +++ b/cipher/elgamal.c @@ -854,37 +854,65 @@ elg_decrypt (int algo, gcry_sexp_t *r_plain, static gcry_err_code_t -elg_sign (int algo, gcry_sexp_t *r_result, gcry_mpi_t data, gcry_mpi_t *skey, - int flags, int hashalgo) +elg_sign (gcry_sexp_t *r_sig, gcry_sexp_t s_data, gcry_sexp_t keyparms) { gcry_err_code_t rc; - ELG_secret_key sk; - gcry_mpi_t r, s; + struct pk_encoding_ctx ctx; + gcry_mpi_t data = NULL; + ELG_secret_key sk = {NULL, NULL, NULL, NULL}; + gcry_mpi_t sig_r = NULL; + gcry_mpi_t sig_s = NULL; - (void)algo; - (void)flags; - (void)hashalgo; + _gcry_pk_util_init_encoding_ctx (&ctx, PUBKEY_OP_SIGN, + elg_get_nbits (keyparms)); + /* Extract the data. */ + rc = _gcry_pk_util_data_to_mpi (s_data, &data, &ctx); + if (rc) + goto leave; + if (DBG_CIPHER) + log_mpidump ("elg_sign data", data); if (mpi_is_opaque (data)) - return GPG_ERR_INV_DATA; + { + rc = GPG_ERR_INV_DATA; + goto leave; + } - if ((! data) - || (! skey[0]) || (! skey[1]) || (! skey[2]) || (! skey[3])) - rc = GPG_ERR_BAD_MPI; - else + /* Extract the key. */ + rc = _gcry_pk_util_extract_mpis (keyparms, "pgyx", + &sk.p, &sk.g, &sk.y, &sk.x, NULL); + if (rc) + return rc; + if (DBG_CIPHER) { - sk.p = skey[0]; - sk.g = skey[1]; - sk.y = skey[2]; - sk.x = skey[3]; - r = mpi_alloc (mpi_get_nlimbs (sk.p)); - s = mpi_alloc (mpi_get_nlimbs (sk.p)); - sign (r, s, data, &sk); - rc = gcry_sexp_build (r_result, NULL, "(sig-val(elg(r%M)(s%M)))", r, s); - mpi_free (r); - mpi_free (s); + log_mpidump ("elg_sign p", sk.p); + log_mpidump ("elg_sign g", sk.g); + log_mpidump ("elg_sign y", sk.y); + if (!fips_mode ()) + log_mpidump ("elg_sign x", sk.x); + } + + sig_r = gcry_mpi_new (0); + sig_s = gcry_mpi_new (0); + sign (sig_r, sig_s, data, &sk); + if (DBG_CIPHER) + { + log_mpidump ("elg_sign sig_r", sig_r); + log_mpidump ("elg_sign sig_s", sig_s); } + rc = gcry_sexp_build (r_sig, NULL, "(sig-val(elg(r%M)(s%M)))", sig_r, sig_s); + leave: + gcry_mpi_release (sig_r); + gcry_mpi_release (sig_s); + gcry_mpi_release (sk.p); + gcry_mpi_release (sk.g); + gcry_mpi_release (sk.y); + gcry_mpi_release (sk.x); + gcry_mpi_release (data); + _gcry_pk_util_free_encoding_ctx (&ctx); + if (DBG_CIPHER) + log_debug ("elg_sign => %s\n", gpg_strerror (rc)); return rc; } @@ -954,7 +982,7 @@ elg_verify (gcry_sexp_t s_sig, gcry_sexp_t s_data, gcry_sexp_t s_keyparms) gcry_sexp_release (l1); _gcry_pk_util_free_encoding_ctx (&ctx); if (DBG_CIPHER) - log_debug ("elg_verify => %s\n", rc?gpg_strerror (rc):"good"); + log_debug ("elg_verify => %s\n", rc?gpg_strerror (rc):"Good"); return rc; } 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); } diff --git a/cipher/rsa.c b/cipher/rsa.c index 39effcba..db644520 100644 --- a/cipher/rsa.c +++ b/cipher/rsa.c @@ -1013,53 +1013,90 @@ rsa_decrypt (int algo, gcry_sexp_t *r_plain, gcry_mpi_t *data, static gcry_err_code_t -rsa_sign (int algo, gcry_sexp_t *r_result, gcry_mpi_t data, gcry_mpi_t *skey, - int flags, int hashalgo) +rsa_sign (gcry_sexp_t *r_sig, gcry_sexp_t s_data, gcry_sexp_t keyparms) { gpg_err_code_t rc; - RSA_secret_key sk; - gcry_mpi_t result; + struct pk_encoding_ctx ctx; + gcry_mpi_t data = NULL; + RSA_secret_key sk = {NULL, NULL, NULL, NULL, NULL, NULL}; + gcry_mpi_t sig = NULL; - (void)algo; - (void)flags; - (void)hashalgo; + _gcry_pk_util_init_encoding_ctx (&ctx, PUBKEY_OP_SIGN, + rsa_get_nbits (keyparms)); + /* Extract the data. */ + rc = _gcry_pk_util_data_to_mpi (s_data, &data, &ctx); + if (rc) + goto leave; + if (DBG_CIPHER) + log_mpidump ("rsa_sign data", data); if (mpi_is_opaque (data)) - return GPG_ERR_INV_DATA; + { + rc = GPG_ERR_INV_DATA; + goto leave; + } - sk.n = skey[0]; - sk.e = skey[1]; - sk.d = skey[2]; - sk.p = skey[3]; - sk.q = skey[4]; - sk.u = skey[5]; - result = mpi_alloc (mpi_get_nlimbs (sk.n)); - secret (result, data, &sk); - if ((flags & PUBKEY_FLAG_FIXEDLEN)) + /* Extract the key. */ + rc = _gcry_pk_util_extract_mpis (keyparms, "nedp?q?u?", + &sk.n, &sk.e, &sk.d, &sk.p, &sk.q, &sk.u, + NULL); + if (rc) + return rc; + if (DBG_CIPHER) + { + log_mpidump ("rsa_sign n", sk.n); + log_mpidump ("rsa_sign e", sk.e); + if (!fips_mode ()) + { + log_mpidump ("rsa_sign d", sk.d); + log_mpidump ("rsa_sign p", sk.p); + log_mpidump ("rsa_sign q", sk.q); + log_mpidump ("rsa_sign u", sk.u); + } + } + + /* Do RSA computation and build the result. */ + sig = gcry_mpi_new (0); + secret (sig, data, &sk); + if (DBG_CIPHER) + log_mpidump ("rsa_sign sig", sig); + if ((ctx.flags & PUBKEY_FLAG_FIXEDLEN)) { /* We need to make sure to return the correct length to avoid problems with missing leading zeroes. */ unsigned char *em; size_t emlen = (mpi_get_nbits (sk.n)+7)/8; - rc = _gcry_mpi_to_octet_string (&em, NULL, result, emlen); + rc = _gcry_mpi_to_octet_string (&em, NULL, sig, emlen); if (!rc) { - rc = gcry_sexp_build (r_result, NULL, + rc = gcry_sexp_build (r_sig, NULL, "(sig-val(rsa(s%b)))", (int)emlen, em); gcry_free (em); } } else - rc = gcry_sexp_build (r_result, NULL, "(sig-val(rsa(s%M)))", result); - mpi_free (result); + rc = gcry_sexp_build (r_sig, NULL, "(sig-val(rsa(s%M)))", sig); + + leave: + gcry_mpi_release (sig); + gcry_mpi_release (sk.n); + gcry_mpi_release (sk.e); + gcry_mpi_release (sk.d); + gcry_mpi_release (sk.p); + gcry_mpi_release (sk.q); + gcry_mpi_release (sk.u); + gcry_mpi_release (data); + _gcry_pk_util_free_encoding_ctx (&ctx); + if (DBG_CIPHER) + log_debug ("rsa_sign => %s\n", gpg_strerror (rc)); return rc; } static gcry_err_code_t -rsa_verify (gcry_sexp_t s_sig, gcry_sexp_t s_data, gcry_sexp_t s_keyparms) +rsa_verify (gcry_sexp_t s_sig, gcry_sexp_t s_data, gcry_sexp_t keyparms) { gcry_err_code_t rc; struct pk_encoding_ctx ctx; @@ -1070,7 +1107,7 @@ rsa_verify (gcry_sexp_t s_sig, gcry_sexp_t s_data, gcry_sexp_t s_keyparms) gcry_mpi_t result = NULL; _gcry_pk_util_init_encoding_ctx (&ctx, PUBKEY_OP_VERIFY, - rsa_get_nbits (s_keyparms)); + rsa_get_nbits (keyparms)); /* Extract the data. */ rc = _gcry_pk_util_data_to_mpi (s_data, &data, &ctx); @@ -1095,7 +1132,7 @@ rsa_verify (gcry_sexp_t s_sig, gcry_sexp_t s_data, gcry_sexp_t s_keyparms) log_mpidump ("rsa_verify sig", sig); /* Extract the key. */ - rc = _gcry_pk_util_extract_mpis (s_keyparms, "ne", &pk.n, &pk.e, NULL); + rc = _gcry_pk_util_extract_mpis (keyparms, "ne", &pk.n, &pk.e, NULL); if (rc) return rc; if (DBG_CIPHER) @@ -1123,7 +1160,7 @@ rsa_verify (gcry_sexp_t s_sig, gcry_sexp_t s_data, gcry_sexp_t s_keyparms) gcry_sexp_release (l1); _gcry_pk_util_free_encoding_ctx (&ctx); if (DBG_CIPHER) - log_debug ("rsa_verify => %s\n", rc?gpg_strerror (rc):"good"); + log_debug ("rsa_verify => %s\n", rc?gpg_strerror (rc):"Good"); return rc; } |