diff options
author | Werner Koch <wk@gnupg.org> | 2013-04-11 20:27:46 +0200 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2013-04-11 20:27:46 +0200 |
commit | 1f3cfad66456dd6f2e48f20b8eb0c51343449a1c (patch) | |
tree | 46076f365f00ae81e800a7a30bdcf3d5ab69192d /tests/t-mpi-point.c | |
parent | a4e1f6ae7ea7f140e36c331a362bc299dce08416 (diff) | |
download | libgcrypt-1f3cfad66456dd6f2e48f20b8eb0c51343449a1c.tar.gz |
Add gcry_pubkey_get_sexp.
* src/gcrypt.h.in (GCRY_PK_GET_PUBKEY): New.
(GCRY_PK_GET_SECKEY): New.
(gcry_pubkey_get_sexp): New.
* src/visibility.c (gcry_pubkey_get_sexp): New.
* src/visibility.h (gcry_pubkey_get_sexp): Mark visible.
* src/libgcrypt.def, src/libgcrypt.vers: Add new function.
* cipher/pubkey-internal.h: New.
* cipher/Makefile.am (libcipher_la_SOURCES): Add new file.
* cipher/ecc.c: Include pubkey-internal.h
(_gcry_pk_ecc_get_sexp): New.
* cipher/pubkey.c: Include pubkey-internal.h and context.h.
(_gcry_pubkey_get_sexp): New.
* src/context.c (_gcry_ctx_find_pointer): New.
* src/cipher-proto.h: Add _gcry_pubkey_get_sexp.
* tests/t-mpi-point.c (print_sexp): New.
(context_param, basic_ec_math_simplified): Add tests for the new
function.
* configure.ac (NEED_GPG_ERROR_VERSION): Set to 1.11.
(AH_BOTTOM) Add error codes from gpg-error 1.12
* src/g10lib.h (fips_not_operational): Use GPG_ERR_NOT_OPERATIONAL.
* mpi/ec.c (_gcry_mpi_ec_get_mpi): Fix computation of Q.
(_gcry_mpi_ec_get_point): Ditto.
--
While checking the new code I figured that the auto-computation of Q
must have led to a segv. It seems we had no test case for that.
Signed-off-by: Werner Koch <wk@gnupg.org>
Diffstat (limited to 'tests/t-mpi-point.c')
-rw-r--r-- | tests/t-mpi-point.c | 104 |
1 files changed, 102 insertions, 2 deletions
diff --git a/tests/t-mpi-point.c b/tests/t-mpi-point.c index a3b6c569..9f7360e2 100644 --- a/tests/t-mpi-point.c +++ b/tests/t-mpi-point.c @@ -216,6 +216,23 @@ print_point (const char *text, gcry_mpi_point_t a) } +static void +print_sexp (const char *prefix, gcry_sexp_t a) +{ + char *buf; + size_t size; + + if (prefix) + fputs (prefix, stderr); + size = gcry_sexp_sprint (a, GCRYSEXP_FMT_ADVANCED, NULL, 0); + buf = gcry_xmalloc (size); + + gcry_sexp_sprint (a, GCRYSEXP_FMT_ADVANCED, buf, size); + fprintf (stderr, "%.*s", (int)size, buf); + gcry_free (buf); +} + + static gcry_mpi_t hex2mpi (const char *string) { @@ -500,9 +517,34 @@ context_param (void) gpg_strerror (err)); else { + gcry_sexp_t sexp; + get_and_cmp_mpi ("q", sample_p256_q, "NIST P-256", ctx); get_and_cmp_point ("q", sample_p256_q_x, sample_p256_q_y, "NIST P-256", ctx); + + err = gcry_pubkey_get_sexp (&sexp, 0, ctx); + if (err) + fail ("gcry_pubkey_get_sexp(0) failed: %s\n", gpg_strerror (err)); + else if (debug) + print_sexp ("Result of gcry_pubkey_get_sexp (0):\n", sexp); + gcry_sexp_release (sexp); + + err = gcry_pubkey_get_sexp (&sexp, GCRY_PK_GET_PUBKEY, ctx); + if (err) + fail ("gcry_pubkey_get_sexp(GET_PUBKEY) failed: %s\n", + gpg_strerror (err)); + else if (debug) + print_sexp ("Result of gcry_pubkey_get_sexp (GET_PUBKEY):\n", sexp); + gcry_sexp_release (sexp); + + err = gcry_pubkey_get_sexp (&sexp, GCRY_PK_GET_SECKEY, ctx); + if (gpg_err_code (err) != GPG_ERR_NO_SECKEY) + fail ("gcry_pubkey_get_sexp(GET_SECKEY) returned wrong error: %s\n", + gpg_strerror (err)); + gcry_sexp_release (sexp); + + gcry_ctx_release (ctx); } gcry_sexp_release (keyparam); @@ -537,7 +579,7 @@ basic_ec_math (void) gcry_mpi_t d; gcry_mpi_t x, y, z; - wherestr = "set_get_point"; + wherestr = "basic_ec_math"; show ("checking basic math functions for EC\n"); P = hex2mpi ("0xfffffffffffffffffffffffffffffffeffffffffffffffff"); @@ -600,8 +642,9 @@ basic_ec_math_simplified (void) gcry_mpi_point_t G, Q; gcry_mpi_t d; gcry_mpi_t x, y, z; + gcry_sexp_t sexp; - wherestr = "set_get_point"; + wherestr = "basic_ec_math_simplified"; show ("checking basic math functions for EC (variant)\n"); d = hex2mpi ("D4EF27E32F8AD8E2A1C6DDEBB1D235A69E3CEF9BCE90273D"); @@ -644,6 +687,63 @@ basic_ec_math_simplified (void) gcry_mpi_release (z); gcry_mpi_release (y); gcry_mpi_release (x); + + /* Let us also check wheer we can update the context. */ + err = gcry_mpi_ec_set_point ("g", G, ctx); + if (err) + die ("gcry_mpi_ec_set_point(G) failed\n"); + err = gcry_mpi_ec_set_mpi ("d", d, ctx); + if (err) + die ("gcry_mpi_ec_set_mpi(d) failed\n"); + + /* FIXME: Below we need to check that the returned S-expression is + as requested. For now we use manual inspection using --debug. */ + + /* Does get_sexp return the private key? */ + err = gcry_pubkey_get_sexp (&sexp, 0, ctx); + if (err) + fail ("gcry_pubkey_get_sexp(0) failed: %s\n", gpg_strerror (err)); + else if (verbose) + print_sexp ("Result of gcry_pubkey_get_sexp (0):\n", sexp); + gcry_sexp_release (sexp); + + /* Does get_sexp return the public key if requested? */ + err = gcry_pubkey_get_sexp (&sexp, GCRY_PK_GET_PUBKEY, ctx); + if (err) + fail ("gcry_pubkey_get_sexp(GET_PUBKEY) failed: %s\n", gpg_strerror (err)); + else if (verbose) + print_sexp ("Result of gcry_pubkey_get_sexp (GET_PUBKEY):\n", sexp); + gcry_sexp_release (sexp); + + /* Does get_sexp return the public key if after d has been deleted? */ + err = gcry_mpi_ec_set_mpi ("d", NULL, ctx); + if (err) + die ("gcry_mpi_ec_set_mpi(d=NULL) failed\n"); + err = gcry_pubkey_get_sexp (&sexp, 0, ctx); + if (err) + fail ("gcry_pubkey_get_sexp(0 w/o d) failed: %s\n", gpg_strerror (err)); + else if (verbose) + print_sexp ("Result of gcry_pubkey_get_sexp (0 w/o d):\n", sexp); + gcry_sexp_release (sexp); + + /* Does get_sexp return an error after d has been deleted? */ + err = gcry_pubkey_get_sexp (&sexp, GCRY_PK_GET_SECKEY, ctx); + if (gpg_err_code (err) != GPG_ERR_NO_SECKEY) + fail ("gcry_pubkey_get_sexp(GET_SECKEY) returned wrong error: %s\n", + gpg_strerror (err)); + gcry_sexp_release (sexp); + + /* Does get_sexp return an error after d and Q have been deleted? */ + err = gcry_mpi_ec_set_point ("q", NULL, ctx); + if (err) + die ("gcry_mpi_ec_set_point(q=NULL) failed\n"); + err = gcry_pubkey_get_sexp (&sexp, 0, ctx); + if (gpg_err_code (err) != GPG_ERR_BAD_CRYPT_CTX) + fail ("gcry_pubkey_get_sexp(0 w/o Q,d) returned wrong error: %s\n", + gpg_strerror (err)); + gcry_sexp_release (sexp); + + gcry_mpi_point_release (Q); gcry_mpi_release (d); gcry_mpi_point_release (G); |