mpi: Add function gcry_mpi_set_opaque_copy.
authorWerner Koch <wk@gnupg.org>
Mon, 4 Nov 2013 15:47:13 +0000 (16:47 +0100)
committerWerner Koch <wk@gnupg.org>
Tue, 5 Nov 2013 16:26:52 +0000 (17:26 +0100)
* src/gcrypt.h.in (gcry_mpi_set_opaque_copy): New.
* src/visibility.c (gcry_mpi_set_opaque_copy): New.
* src/visibility.h (gcry_mpi_set_opaque_copy): Mark visible.
* src/libgcrypt.def, src/libgcrypt.vers: Add new API.
* tests/mpitests.c (test_opaque): Add test.

Signed-off-by: Werner Koch <wk@gnupg.org>
NEWS
doc/gcrypt.texi
src/gcrypt.h.in
src/libgcrypt.def
src/libgcrypt.vers
src/visibility.c
src/visibility.h
tests/mpitests.c

diff --git a/NEWS b/NEWS
index d60e067..8010c37 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -75,6 +75,7 @@ Noteworthy changes in version 1.6.0 (unreleased)
  gcry_mpi_neg                    NEW.
  gcry_mpi_abs                    NEW.
  gcry_mpi_snatch                 NEW.
+ gcry_mpi_set_opaque_copy        NEW.
  gcry_mpi_point_t                NEW.
  gcry_mpi_point_new              NEW.
  gcry_mpi_point_release          NEW.
index 4a202dd..76cf0bd 100644 (file)
@@ -4467,6 +4467,13 @@ valid functions are gcry_mpi_get_opaque and gcry_mpi_release.  Use
 gcry_mpi_scan to convert a string of arbitrary bytes into an MPI.
 @end deftypefun
 
+@deftypefun gcry_mpi_t gcry_mpi_set_opaque_copy (@w{gcry_mpi_t @var{a}}, @w{const void *@var{p}}, @w{unsigned int @var{nbits}})
+
+Same as @code{gcry_mpi_set_opaque} but ownership of @var{p} is not
+taken instead a copy of @var{p} is used.
+@end deftypefun
+
+
 @deftypefun {void *} gcry_mpi_get_opaque (@w{gcry_mpi_t @var{a}}, @w{unsigned int *@var{nbits}})
 
 Return a pointer to an opaque value stored in @var{a} and return its
index 2742556..234e8a4 100644 (file)
@@ -726,10 +726,18 @@ void     gcry_mpi_rshift (gcry_mpi_t x, gcry_mpi_t a, unsigned int n);
 void     gcry_mpi_lshift (gcry_mpi_t x, gcry_mpi_t a, unsigned int n);
 
 /* Store NBITS of the value P points to in A and mark A as an opaque
-   value.  WARNING: Never use an opaque MPI for anything thing else than
+   value.  On success A received the the ownership of the value P.
+   WARNING: Never use an opaque MPI for anything thing else than
    gcry_mpi_release, gcry_mpi_get_opaque. */
 gcry_mpi_t gcry_mpi_set_opaque (gcry_mpi_t a, void *p, unsigned int nbits);
 
+/* Store NBITS of the value P points to in A and mark A as an opaque
+   value.  The function takes a copy of the provided value P.
+   WARNING: Never use an opaque MPI for anything thing else than
+   gcry_mpi_release, gcry_mpi_get_opaque. */
+gcry_mpi_t gcry_mpi_set_opaque_copy (gcry_mpi_t a,
+                                     const void *p, unsigned int nbits);
+
 /* Return a pointer to an opaque value stored in A and return its size
    in NBITS.  Note that the returned pointer is still owned by A and
    that the function should never be used for an non-opaque MPI. */
index 64ba370..e2aba2b 100644 (file)
@@ -259,5 +259,7 @@ EXPORTS
       gcry_cipher_gettag        @227
       gcry_cipher_checktag      @228
 
+      gcry_mpi_set_opaque_copy  @229
+
 
 ;; end of file with public symbols for Windows.
index 93eaa93..c3a09b8 100644 (file)
@@ -88,7 +88,8 @@ GCRYPT_1.6 {
     gcry_mpi_mul_2exp; gcry_mpi_mul_ui; gcry_mpi_mulm; gcry_mpi_new;
     gcry_mpi_powm; gcry_mpi_print; gcry_mpi_randomize; gcry_mpi_release;
     gcry_mpi_rshift; gcry_mpi_scan; gcry_mpi_set; gcry_mpi_set_bit;
-    gcry_mpi_set_flag; gcry_mpi_set_highbit; gcry_mpi_set_opaque;
+    gcry_mpi_set_flag; gcry_mpi_set_highbit;
+    gcry_mpi_set_opaque; gcry_mpi_set_opaque_copy;
     gcry_mpi_set_ui; gcry_mpi_snew; gcry_mpi_sub; gcry_mpi_sub_ui;
     gcry_mpi_subm; gcry_mpi_swap; gcry_mpi_test_bit;
     gcry_mpi_lshift; gcry_mpi_snatch;
index 1f7bb3a..852bdf9 100644 (file)
@@ -629,6 +629,12 @@ gcry_mpi_set_opaque (gcry_mpi_t a, void *p, unsigned int nbits)
   return _gcry_mpi_set_opaque (a, p, nbits);
 }
 
+gcry_mpi_t
+gcry_mpi_set_opaque_copy (gcry_mpi_t a, const void *p, unsigned int nbits)
+{
+  return _gcry_mpi_set_opaque_copy (a, p, nbits);
+}
+
 void *
 gcry_mpi_get_opaque (gcry_mpi_t a, unsigned int *nbits)
 {
index b2fa4c0..438db5b 100644 (file)
@@ -603,6 +603,7 @@ MARK_VISIBLE (gcry_mpi_set_bit)
 MARK_VISIBLE (gcry_mpi_set_flag)
 MARK_VISIBLE (gcry_mpi_set_highbit)
 MARK_VISIBLE (gcry_mpi_set_opaque)
+MARK_VISIBLEX(gcry_mpi_set_opaque_copy)
 MARK_VISIBLE (gcry_mpi_set_ui)
 MARK_VISIBLE (gcry_mpi_snew)
 MARK_VISIBLE (gcry_mpi_sub)
@@ -632,8 +633,8 @@ MARK_VISIBLEX(_gcry_mpi_get_const)
    between a public and an internal version is that the internal
    version use gpg_err_code_t and the public version gpg_error_t.  */
 
-#define gcry_sexp_extract_param _gcry_USE_THE_UNDERSCORED_FUNCTION
-
+#define gcry_sexp_extract_param   _gcry_USE_THE_UNDERSCORED_FUNCTION
+#define gcry_mpi_set_opaque_copy  _gcry_USE_THE_UNDERSCORED_FUNCTION
 
 #endif /*!_GCRY_INCLUDED_BY_VISIBILITY_C*/
 
index c5c60d7..1c4edb6 100644 (file)
@@ -213,6 +213,24 @@ test_opaque (void)
   if (debug)
     gcry_log_debugmpi ("mpi", a);
 
+  p = gcry_xstrdup ("This is a test buffer");
+  a = gcry_mpi_set_opaque_copy (NULL, p, 21*8+1);
+  gcry_free (p);
+
+  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 (debug)
+    gcry_log_debugmpi ("mpi", a);
+
   gcry_mpi_release (a);
 }