summaryrefslogtreecommitdiff
path: root/cipher
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
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')
-rw-r--r--cipher/dsa.c78
-rw-r--r--cipher/ecc.c188
-rw-r--r--cipher/elgamal.c74
-rw-r--r--cipher/pubkey.c58
-rw-r--r--cipher/rsa.c87
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;
}