diff options
author | Werner Koch <wk@gnupg.org> | 2013-09-07 10:06:46 +0200 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2013-09-20 17:41:19 +0200 |
commit | 722bfc1e5f2268453db62f38cc46b5ec6ef3adee (patch) | |
tree | a59265211609e084227958e308e1d3236c79fcbb /cipher/ecc.c | |
parent | 64cd7ab93da7c95cc8aa320c61c6e29f9e2399c4 (diff) | |
download | libgcrypt-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.c | 48 |
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; } |