Allow gcry_mpi_dump to print opaque MPIs.
authorWerner Koch <wk@gnupg.org>
Wed, 17 Jul 2013 14:55:02 +0000 (16:55 +0200)
committerWerner Koch <wk@gnupg.org>
Wed, 17 Jul 2013 14:55:02 +0000 (16:55 +0200)
* mpi/mpicoder.c (gcry_mpi_dump): Detect abd print opaque MPIs.
* tests/mpitests.c (test_opaque): New.
(main): Call new test.

Signed-off-by: Werner Koch <wk@gnupg.org>
mpi/mpicoder.c
tests/mpitests.c

index 06d5553..aca3710 100644 (file)
@@ -187,6 +187,17 @@ gcry_mpi_dump (const gcry_mpi_t a)
   log_printf (" ");
   if (!a)
     log_printf ("[MPI_NULL]");
+  else if (mpi_is_opaque (a))
+    {
+      unsigned int nbits;
+      const unsigned char *p;
+
+      p = gcry_mpi_get_opaque (a, &nbits);
+      log_printf ("[%u bit: ", nbits);
+      for (i=0; i < (nbits + 7)/8; i++)
+        log_printf ("%02x", p[i]);
+      log_printf ("]");
+    }
   else
     {
       if (a->sign)
index 5643c1b..432f3e8 100644 (file)
@@ -150,6 +150,38 @@ test_const_and_immutable (void)
 }
 
 
+static void
+test_opaque (void)
+{
+  gcry_mpi_t a;
+  char *p;
+  unsigned int nbits;
+
+  p = gcry_xstrdup ("This is a test buffer");
+  a = gcry_mpi_set_opaque (NULL, p, 21*8+1); /* (a non byte aligned length) */
+
+  if (!gcry_mpi_get_flag (a, GCRYMPI_FLAG_OPAQUE))
+    die ("opaque flag not set\n");
+
+  p = gcry_mpi_get_opaque (a, &nbits);
+  if (!p)
+    die ("gcry_mpi_get_opaque returned NULL\n");
+  if (nbits != 21*8+1)
+    die ("gcry_mpi_get_opaque returned a changed bit size\n");
+  if (strcmp (p, "This is a test buffer"))
+    die ("gcry_mpi_get_opaque returned a changed buffer\n");
+
+  if (verbose)
+    {
+      fprintf (stderr, "mpi: ");
+      gcry_mpi_dump (a);
+      putc ('\n', stderr);
+    }
+
+  gcry_mpi_release (a);
+}
+
+
 static int
 test_add (void)
 {
@@ -354,6 +386,7 @@ main (int argc, char* argv[])
   gcry_control(GCRYCTL_DISABLE_SECMEM);
 
   test_const_and_immutable ();
+  test_opaque ();
   test_add ();
   test_sub ();
   test_mul ();