summaryrefslogtreecommitdiff
path: root/cipher/ecc.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2013-09-07 10:06:46 +0200
committerWerner Koch <wk@gnupg.org>2013-09-20 17:41:19 +0200
commit722bfc1e5f2268453db62f38cc46b5ec6ef3adee (patch)
treea59265211609e084227958e308e1d3236c79fcbb /cipher/ecc.c
parent64cd7ab93da7c95cc8aa320c61c6e29f9e2399c4 (diff)
downloadlibgcrypt-722bfc1e5f2268453db62f38cc46b5ec6ef3adee.tar.gz
pk: Move s-exp creation for gcry_pk_decrypt to the modules.
* cipher/pubkey.c (sexp_to_enc): Remove RET_MODERN arg and merge it into FLAGS. (gcry_pk_decrypt): Move result s-exp building into the modules. * src/cipher-proto.h (gcry_pk_decrypt_t): Add some args. * cipher/ecc.c (ecc_decrypt_raw): Change to return an s-exp. * cipher/elgamal.c (elg_decrypt): Ditto. * cipher/rsa.c (rsa_decrypt): Ditto. (rsa_blind, rsa_unblind): Merge into rsa_decrypt. This saves several extra MPI allocations. -- The extra args added to gcry_pk_decrypt_t are a temporary solution unti we move the input s-exp parsing also into the modules. Signed-off-by: Werner Koch <wk@gnupg.org>
Diffstat (limited to 'cipher/ecc.c')
-rw-r--r--cipher/ecc.c48
1 files changed, 26 insertions, 22 deletions
diff --git a/cipher/ecc.c b/cipher/ecc.c
index 9a9c21b9..cf054f83 100644
--- a/cipher/ecc.c
+++ b/cipher/ecc.c
@@ -1661,20 +1661,24 @@ ecc_encrypt_raw (int algo, gcry_sexp_t *r_result, gcry_mpi_t k,
* see ecc_encrypt_raw for details.
*/
static gcry_err_code_t
-ecc_decrypt_raw (int algo, gcry_mpi_t *result, gcry_mpi_t *data,
- gcry_mpi_t *skey, int flags)
+ecc_decrypt_raw (int algo, gcry_sexp_t *r_plain, gcry_mpi_t *data,
+ gcry_mpi_t *skey, int flags,
+ enum pk_encoding encoding, int hash_algo,
+ unsigned char *label, size_t labellen)
{
+ gpg_err_code_t rc;
ECC_secret_key sk;
mpi_point_struct R; /* Result that we return. */
mpi_point_struct kG;
mpi_ec_t ctx;
gcry_mpi_t r;
- int err;
(void)algo;
(void)flags;
-
- *result = NULL;
+ (void)encoding;
+ (void)hash_algo;
+ (void)label;
+ (void)labellen;
if (!data || !data[0]
|| !skey[0] || !skey[1] || !skey[2] || !skey[3] || !skey[4]
@@ -1682,11 +1686,11 @@ ecc_decrypt_raw (int algo, gcry_mpi_t *result, gcry_mpi_t *data,
return GPG_ERR_BAD_MPI;
point_init (&kG);
- err = _gcry_ecc_os2ec (&kG, data[0]);
- if (err)
+ rc = _gcry_ecc_os2ec (&kG, data[0]);
+ if (rc)
{
point_free (&kG);
- return err;
+ return rc;
}
sk.E.model = MPI_EC_WEIERSTRASS;
@@ -1694,22 +1698,22 @@ ecc_decrypt_raw (int algo, gcry_mpi_t *result, gcry_mpi_t *data,
sk.E.a = skey[1];
sk.E.b = skey[2];
point_init (&sk.E.G);
- err = _gcry_ecc_os2ec (&sk.E.G, skey[3]);
- if (err)
+ rc = _gcry_ecc_os2ec (&sk.E.G, skey[3]);
+ if (rc)
{
point_free (&kG);
point_free (&sk.E.G);
- return err;
+ return rc;
}
sk.E.n = skey[4];
point_init (&sk.Q);
- err = _gcry_ecc_os2ec (&sk.Q, skey[5]);
- if (err)
+ rc = _gcry_ecc_os2ec (&sk.Q, skey[5]);
+ if (rc)
{
point_free (&kG);
point_free (&sk.E.G);
point_free (&sk.Q);
- return err;
+ return rc;
}
sk.d = skey[6];
@@ -1733,6 +1737,10 @@ ecc_decrypt_raw (int algo, gcry_mpi_t *result, gcry_mpi_t *data,
log_fatal ("ecdh: Failed to get affine coordinates\n");
r = _gcry_ecc_ec2os (x, y, sk.E.p);
+ if (!r)
+ rc = gpg_err_code_from_syserror ();
+ else
+ rc = 0;
mpi_free (x);
mpi_free (y);
}
@@ -1743,14 +1751,10 @@ ecc_decrypt_raw (int algo, gcry_mpi_t *result, gcry_mpi_t *data,
point_free (&sk.E.G);
point_free (&sk.Q);
- if (!r)
- return GPG_ERR_ENOMEM;
-
- /* Success. */
-
- *result = r;
-
- return 0;
+ if (!rc)
+ rc = gcry_err_code (gcry_sexp_build (r_plain, NULL, "(value %m)", r));
+ mpi_free (r);
+ return rc;
}