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-19 16:43:33 +0200
commit1bf08850bf9343146c938bc03917417e16393e9a (patch)
treee045f1721f71ebb6769e2048bf8d53e7d39a0320 /cipher/ecc.c
parent2fe084873333c4d67bcfba0b527d63cd3cff6c47 (diff)
downloadlibgcrypt-1bf08850bf9343146c938bc03917417e16393e9a.tar.gz
pk: Move s-expr creation for genkey to the modules.
* cipher/pubkey.c (pubkey_generate): Fold into gcry_pk_genkey (gcry_pk_genkey): Move result s-exp creation into the modules. * cipher/dsa.c (dsa_generate): Create result as s-exp. * cipher/elgamal.c (elg_generate): Ditto. * cipher/rsa.c (rsa_generate): Ditto. * cipher/ecc.c (ecc_generate): Ditto. * src/cipher-proto.h (pk_ext_generate_t): Remove type (gcry_pk_spec): and remove from struct. Signed-off-by: Werner Koch <wk@gnupg.org>
Diffstat (limited to 'cipher/ecc.c')
-rw-r--r--cipher/ecc.c101
1 files changed, 52 insertions, 49 deletions
diff --git a/cipher/ecc.c b/cipher/ecc.c
index b7d62397..9a9c21b9 100644
--- a/cipher/ecc.c
+++ b/cipher/ecc.c
@@ -1152,12 +1152,9 @@ verify_eddsa (gcry_mpi_t input, ECC_public_key *pkey,
************** interface ******************
*********************************************/
-/* Extended version of ecc_generate. */
static gcry_err_code_t
-ecc_generate_ext (int algo, unsigned int nbits, unsigned long evalue,
- const gcry_sexp_t genparms,
- gcry_mpi_t *skey, gcry_mpi_t **retfactors,
- gcry_sexp_t *r_extrainfo)
+ecc_generate (int algo, unsigned int nbits, unsigned long evalue,
+ const gcry_sexp_t genparms, gcry_sexp_t *r_skey)
{
gpg_err_code_t rc;
elliptic_curve_t E;
@@ -1169,10 +1166,17 @@ ecc_generate_ext (int algo, unsigned int nbits, unsigned long evalue,
int transient_key = 0;
gcry_random_level_t random_level;
mpi_ec_t ctx = NULL;
+ gcry_sexp_t curve_info = NULL;
+ gcry_mpi_t base = NULL;
+ gcry_mpi_t public = NULL;
+ gcry_mpi_t secret = NULL;
(void)algo;
(void)evalue;
+ memset (&E, 0, sizeof E);
+ memset (&sk, 0, sizeof sk);
+
if (genparms)
{
/* Parse the optional "curve" parameter. */
@@ -1240,7 +1244,7 @@ ecc_generate_ext (int algo, unsigned int nbits, unsigned long evalue,
/* Copy data to the result. */
if (_gcry_mpi_ec_get_affine (x, y, &sk.E.G, ctx))
log_fatal ("ecgen: Failed to get affine coordinates for %s\n", "G");
- skey[3] = _gcry_ecc_ec2os (x, y, sk.E.p);
+ base = _gcry_ecc_ec2os (x, y, sk.E.p);
if (sk.E.dialect == ECC_DIALECT_ED25519)
{
unsigned char *encpk;
@@ -1249,68 +1253,69 @@ ecc_generate_ext (int algo, unsigned int nbits, unsigned long evalue,
rc = eddsa_encodepoint (&sk.Q, 256/8, ctx, x, y, &encpk, &encpklen);
if (rc)
return rc;
- skey[5] = mpi_new (0);
- gcry_mpi_set_opaque (skey[5], encpk, encpklen*8);
+ public = mpi_new (0);
+ gcry_mpi_set_opaque (public, encpk, encpklen*8);
encpk = NULL;
- if (DBG_CIPHER)
- log_printmpi ("ecgen e_pk", skey[5]);
}
else
{
if (_gcry_mpi_ec_get_affine (x, y, &sk.Q, ctx))
log_fatal ("ecgen: Failed to get affine coordinates for %s\n", "Q");
- skey[5] = _gcry_ecc_ec2os (x, y, sk.E.p);
+ public = _gcry_ecc_ec2os (x, y, sk.E.p);
}
- skey[0] = sk.E.p; sk.E.p = NULL;
- skey[1] = sk.E.a; sk.E.a = NULL;
- skey[2] = sk.E.b; sk.E.b = NULL;
- skey[4] = sk.E.n; sk.E.n = NULL;
- skey[6] = sk.d; sk.d = NULL;
-
- if (E.name) /* Fixme: No error return checking. */
- gcry_sexp_build (r_extrainfo, NULL, "(curve %s)", E.name);
-
- /* Make an dummy list of factors. */
- *retfactors = gcry_calloc ( 1, sizeof **retfactors );
- if (!*retfactors)
+ secret = sk.d; sk.d = NULL;
+ if (E.name)
{
- rc = gpg_err_code_from_syserror ();
- goto leave;
+ rc = gcry_sexp_build (&curve_info, NULL, "(curve %s)", E.name);
+ if (rc)
+ goto leave;
}
+ rc = gcry_err_code (gcry_sexp_build
+ (r_skey, NULL,
+ "(key-data"
+ " (public-key"
+ " (ecc%S(p%m)(a%m)(b%m)(g%m)(n%m)(q%m)))"
+ " (private-key"
+ " (ecc%S(p%m)(a%m)(b%m)(g%m)(n%m)(q%m)(d%m)))"
+ " )",
+ curve_info,
+ sk.E.p, sk.E.a, sk.E.b, base, sk.E.n, public,
+ curve_info,
+ sk.E.p, sk.E.a, sk.E.b, base, sk.E.n, public, secret));
+ if (rc)
+ goto leave;
+
if (DBG_CIPHER)
{
- log_printmpi ("ecgen result p", skey[0]);
- log_printmpi ("ecgen result a", skey[1]);
- log_printmpi ("ecgen result b", skey[2]);
- log_printmpi ("ecgen result G", skey[3]);
- log_printmpi ("ecgen result n", skey[4]);
- log_printmpi ("ecgen result Q", skey[5]);
- log_printmpi ("ecgen result d", skey[6]);
+ log_printmpi ("ecgen result p", sk.E.p);
+ log_printmpi ("ecgen result a", sk.E.a);
+ log_printmpi ("ecgen result b", sk.E.b);
+ log_printmpi ("ecgen result G", base);
+ log_printmpi ("ecgen result n", sk.E.n);
+ log_printmpi ("ecgen result Q", public);
+ log_printmpi ("ecgen result d", secret);
}
- rc = 0;
leave:
- point_free (&sk.E.G);
- point_free (&sk.Q);
- _gcry_mpi_ec_free (ctx);
+ mpi_free (secret);
+ mpi_free (public);
+ mpi_free (base);
+ {
+ _gcry_ecc_curve_free (&sk.E);
+ point_free (&sk.Q);
+ mpi_free (sk.d);
+ }
_gcry_ecc_curve_free (&E);
- gcry_mpi_release (x);
- gcry_mpi_release (y);
+ mpi_free (x);
+ mpi_free (y);
+ _gcry_mpi_ec_free (ctx);
+ gcry_sexp_release (curve_info);
return rc;
}
static gcry_err_code_t
-ecc_generate (int algo, unsigned int nbits, unsigned long evalue,
- gcry_mpi_t *skey, gcry_mpi_t **retfactors)
-{
- (void)evalue;
- return ecc_generate_ext (algo, nbits, 0, NULL, skey, retfactors, NULL);
-}
-
-
-static gcry_err_code_t
ecc_check_secret_key (int algo, gcry_mpi_t *skey)
{
gpg_err_code_t err;
@@ -2020,7 +2025,6 @@ gcry_pk_spec_t _gcry_pubkey_spec_ecdsa =
ecc_verify,
ecc_get_nbits,
run_selftests,
- ecc_generate_ext,
compute_keygrip,
_gcry_ecc_get_param,
_gcry_ecc_get_curve,
@@ -2041,7 +2045,6 @@ gcry_pk_spec_t _gcry_pubkey_spec_ecdh =
NULL,
ecc_get_nbits,
run_selftests,
- ecc_generate_ext,
compute_keygrip,
_gcry_ecc_get_param,
_gcry_ecc_get_curve,