summaryrefslogtreecommitdiff
path: root/cipher/elgamal.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-19 16:43:33 +0200
commiteca9e2e50ddd4c9020fe1d4a9a3c77d20ebb90f6 (patch)
treeb2213a92e408c942ac77ad3e5c4995f4d06cdd0a /cipher/elgamal.c
parentd399faf5db71d429bfd6fa4a9cfc82e2a55055f0 (diff)
downloadlibgcrypt-eca9e2e50ddd4c9020fe1d4a9a3c77d20ebb90f6.tar.gz
pk: Move s-expr creation for sign and encrypt to the modules.
* cipher/pubkey.c (pubkey_encrypt): Fold into gcry_pk_encrypt. (pubkey_decrypt): Fold into gcry_pk_decrypt. (pubkey_sign): Fold into gcry_pk_sign. (pubkey_verify): Fold into gcry_pk_verify. (octet_string_from_mpi): Make it a wrapper and factor code out to ... * mpi/mpicoder.c (_gcry_mpi_to_octet_string): New function. * src/cipher.h (PUBKEY_FLAG_FIXEDLEN): New. * cipher/pubkey.c (sexp_data_to_mpi): Set flag for some encodings. (gcry_pk_encrypt): Simply by moving the s-expr generation to the modules. (gcry_pk_sign): Ditto. * cipher/dsa.c (dsa_sign): Create s-expr. * cipher/elgamal.c (elg_encrypt, elg_sign): Ditto. * cipher/rsa.c (rsa_encrypt, rsa_sign): Ditto. * cipher/ecc.c (ecc_sign, ecc_encrypt_raw): Ditto. (ecdsa_names): Add "eddsa". * tests/t-ed25519.c (one_test): Expect "eddsa" token. Signed-off-by: Werner Koch <wk@gnupg.org>
Diffstat (limited to 'cipher/elgamal.c')
-rw-r--r--cipher/elgamal.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/cipher/elgamal.c b/cipher/elgamal.c
index 65448e0a..447d089d 100644
--- a/cipher/elgamal.c
+++ b/cipher/elgamal.c
@@ -705,27 +705,33 @@ elg_check_secret_key (int algo, gcry_mpi_t *skey)
static gcry_err_code_t
-elg_encrypt (int algo, gcry_mpi_t *resarr,
+elg_encrypt (int algo, gcry_sexp_t *r_result,
gcry_mpi_t data, gcry_mpi_t *pkey, int flags)
{
- gcry_err_code_t err = GPG_ERR_NO_ERROR;
+ gcry_err_code_t rc;
ELG_public_key pk;
+ gcry_mpi_t a, b;
(void)algo;
(void)flags;
if ((! data) || (! pkey[0]) || (! pkey[1]) || (! pkey[2]))
- err = GPG_ERR_BAD_MPI;
+ rc = GPG_ERR_BAD_MPI;
else
{
pk.p = pkey[0];
pk.g = pkey[1];
pk.y = pkey[2];
- resarr[0] = mpi_alloc (mpi_get_nlimbs (pk.p));
- resarr[1] = mpi_alloc (mpi_get_nlimbs (pk.p));
- do_encrypt (resarr[0], resarr[1], data, &pk);
+ a = mpi_alloc (mpi_get_nlimbs (pk.p));
+ b = mpi_alloc (mpi_get_nlimbs (pk.p));
+ do_encrypt (a, b, data, &pk);
+ rc = gcry_err_code (gcry_sexp_build (r_result, NULL,
+ "(enc-val(elg(a%m)(b%m)))",
+ a, b));
+ mpi_free (a);
+ mpi_free (b);
}
- return err;
+ return rc;
}
@@ -756,11 +762,12 @@ elg_decrypt (int algo, gcry_mpi_t *result,
static gcry_err_code_t
-elg_sign (int algo, gcry_mpi_t *resarr, gcry_mpi_t data, gcry_mpi_t *skey,
+elg_sign (int algo, gcry_sexp_t *r_result, gcry_mpi_t data, gcry_mpi_t *skey,
int flags, int hashalgo)
{
- gcry_err_code_t err = GPG_ERR_NO_ERROR;
+ gcry_err_code_t rc;
ELG_secret_key sk;
+ gcry_mpi_t r, s;
(void)algo;
(void)flags;
@@ -771,19 +778,24 @@ elg_sign (int algo, gcry_mpi_t *resarr, gcry_mpi_t data, gcry_mpi_t *skey,
if ((! data)
|| (! skey[0]) || (! skey[1]) || (! skey[2]) || (! skey[3]))
- err = GPG_ERR_BAD_MPI;
+ rc = GPG_ERR_BAD_MPI;
else
{
sk.p = skey[0];
sk.g = skey[1];
sk.y = skey[2];
sk.x = skey[3];
- resarr[0] = mpi_alloc (mpi_get_nlimbs (sk.p));
- resarr[1] = mpi_alloc (mpi_get_nlimbs (sk.p));
- sign (resarr[0], resarr[1], data, &sk);
+ r = mpi_alloc (mpi_get_nlimbs (sk.p));
+ s = mpi_alloc (mpi_get_nlimbs (sk.p));
+ sign (r, s, data, &sk);
+ rc = gcry_err_code (gcry_sexp_build (r_result, NULL,
+ "(sig-val(elg(r%M)(s%M)))",
+ r, s));
+ mpi_free (r);
+ mpi_free (s);
}
- return err;
+ return rc;
}