mpi: Add special format GCRYMPI_FMT_OPAQUE.
authorWerner Koch <wk@gnupg.org>
Mon, 11 Nov 2013 10:07:56 +0000 (11:07 +0100)
committerWerner Koch <wk@gnupg.org>
Mon, 11 Nov 2013 18:15:20 +0000 (19:15 +0100)
* src/gcrypt.h.in (GCRYMPI_FMT_OPAQUE): New.
(_gcry_sexp_nth_opaque_mpi): Remove.
* src/sexp.c (gcry_sexp_nth_mpi): Add support for GCRYMPI_FMT_OPAQUE.
(_gcry_sexp_vextract_param): Replace removed function by
GCRYMPI_FMT_OPAQUE.
--

Using a new formatting mode is easier than to add a dedicated
extraction function for opaque MPIs.

Signed-off-by: Werner Koch <wk@gnupg.org>
NEWS
cipher/ecc-curves.c
src/g10lib.h
src/gcrypt.h.in
src/sexp.c

diff --git a/NEWS b/NEWS
index d63ca96..00435e2 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -106,6 +106,7 @@ Noteworthy changes in version 1.6.0 (unreleased)
  GCRYMPI_CONST_THREE             NEW.
  GCRYMPI_CONST_FOUR              NEW.
  GCRYMPI_CONST_EIGHT             NEW.
+ GCRYMPI_FMT_OPAQUE              NEW.
  GCRYPT_VERSION_NUMBER           NEW.
  GCRY_KDF_SCRYPT                 NEW.
  gcry_pubkey_get_sexp            NEW.
index 12f539a..98fbf0c 100644 (file)
@@ -599,7 +599,7 @@ point_from_keyparam (gcry_mpi_point_t *r_a,
     {
       gcry_mpi_t a;
 
-      a = _gcry_sexp_nth_opaque_mpi (l1, 1);
+      a = gcry_sexp_nth_mpi (l1, 1, GCRYMPI_FMT_OPAQUE);
       gcry_sexp_release (l1);
       if (!a)
         return GPG_ERR_INV_OBJ;
@@ -831,7 +831,7 @@ _gcry_mpi_ec_new (gcry_ctx_t *r_ctx,
           n = NULL;
         }
 
-      /* Now that we now the curve name we can look for the public key
+      /* Now that we know the curve name we can look for the public key
          Q.  point_from_keyparam needs to know the curve parameters so
          that it is able to use the correct decompression.  Parsing
          the private key D could have been done earlier but it is less
index 80c73ee..ae4502c 100644 (file)
@@ -338,7 +338,6 @@ gcry_err_code_t _gcry_mpi_init (void);
 /*-- sexp.c --*/
 gcry_err_code_t _gcry_sexp_vbuild (gcry_sexp_t *retsexp, size_t *erroff,
                                    const char *format, va_list arg_ptr);
-gcry_mpi_t _gcry_sexp_nth_opaque_mpi (gcry_sexp_t list, int number);
 char *_gcry_sexp_nth_string (const gcry_sexp_t list, int number);
 gpg_err_code_t _gcry_sexp_vextract_param (gcry_sexp_t sexp, const char *path,
                                           const char *list, va_list arg_ptr);
index 234e8a4..fffc15c 100644 (file)
@@ -489,7 +489,8 @@ enum gcry_mpi_format
     GCRYMPI_FMT_PGP = 2,    /* As used by OpenPGP (unsigned only).  */
     GCRYMPI_FMT_SSH = 3,    /* As used by SSH (like STD but with length).  */
     GCRYMPI_FMT_HEX = 4,    /* Hex format. */
-    GCRYMPI_FMT_USG = 5     /* Like STD but unsigned. */
+    GCRYMPI_FMT_USG = 5,    /* Like STD but unsigned. */
+    GCRYMPI_FMT_OPAQUE = 8  /* Opaque format (some functions only).  */
   };
 
 /* Flags used for creating big integers.  */
index 6e4ff27..238aef6 100644 (file)
@@ -765,43 +765,37 @@ gcry_sexp_nth_string (const gcry_sexp_t list, int number)
 gcry_mpi_t
 gcry_sexp_nth_mpi (gcry_sexp_t list, int number, int mpifmt)
 {
-  const char *s;
   size_t n;
   gcry_mpi_t a;
 
-  if ( !mpifmt )
-    mpifmt = GCRYMPI_FMT_STD;
-
-  s = sexp_nth_data (list, number, &n);
-  if (!s)
-    return NULL;
-
-  if ( gcry_mpi_scan ( &a, mpifmt, s, n, NULL ) )
-    return NULL;
+  if (mpifmt == GCRYMPI_FMT_OPAQUE)
+    {
+      char *p;
 
-  return a;
-}
+      p = gcry_sexp_nth_buffer (list, number, &n);
+      if (!p)
+        return NULL;
 
+      a = gcry_is_secure (list)? _gcry_mpi_snew (0) : _gcry_mpi_new (0);
+      if (a)
+        gcry_mpi_set_opaque (a, p, n*8);
+      else
+        gcry_free (p);
+    }
+  else
+    {
+      const char *s;
 
-/*
- * Get data from the car and store return it as an opaque MPI.
- */
-gcry_mpi_t
-_gcry_sexp_nth_opaque_mpi (gcry_sexp_t list, int number)
-{
-  char *p;
-  size_t n;
-  gcry_mpi_t a;
+      if (!mpifmt)
+        mpifmt = GCRYMPI_FMT_STD;
 
-  p = gcry_sexp_nth_buffer (list, number, &n);
-  if (!p)
-    return NULL;
+      s = sexp_nth_data (list, number, &n);
+      if (!s)
+        return NULL;
 
-  a = gcry_is_secure (list)? _gcry_mpi_snew (0) : _gcry_mpi_new (0);
-  if (a)
-    gcry_mpi_set_opaque (a, p, n*8);
-  else
-    gcry_free (p);
+      if (gcry_mpi_scan (&a, mpifmt, s, n, NULL))
+        return NULL;
+    }
 
   return a;
 }
@@ -2293,7 +2287,7 @@ _gcry_sexp_vextract_param (gcry_sexp_t sexp, const char *path,
                     }
                 }
               else if (mode == '/')
-                *array[idx] = _gcry_sexp_nth_opaque_mpi (l1, 1);
+                *array[idx] = gcry_sexp_nth_mpi (l1, 1, GCRYMPI_FMT_OPAQUE);
               else if (mode == '-')
                 *array[idx] = gcry_sexp_nth_mpi (l1, 1, GCRYMPI_FMT_STD);
               else