summaryrefslogtreecommitdiff
path: root/tests/t-mpi-point.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2013-04-11 20:27:46 +0200
committerWerner Koch <wk@gnupg.org>2013-04-11 20:27:46 +0200
commit1f3cfad66456dd6f2e48f20b8eb0c51343449a1c (patch)
tree46076f365f00ae81e800a7a30bdcf3d5ab69192d /tests/t-mpi-point.c
parenta4e1f6ae7ea7f140e36c331a362bc299dce08416 (diff)
downloadlibgcrypt-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.c104
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);