mpi: Introduce 4 user flags for gcry_mpi_t.
authorWerner Koch <wk@gnupg.org>
Thu, 28 Nov 2013 08:07:15 +0000 (09:07 +0100)
committerWerner Koch <wk@gnupg.org>
Mon, 2 Dec 2013 15:21:44 +0000 (16:21 +0100)
* src/gcrypt.h.in (GCRYMPI_FLAG_USER1, GCRYMPI_FLAG_USER2)
(GCRYMPI_FLAG_USER3, GCRYMPI_FLAG_USER4): New.
* mpi/mpiutil.c (gcry_mpi_set_flag, gcry_mpi_clear_flag)
(gcry_mpi_get_flag, _gcry_mpi_free): Implement them.
(gcry_mpi_set_opaque): Keep user flags.
--

The space for the flags in the MPI struct is free and thus we can help
applications to make use of some flags.  This is for example useful to
indicate that an MPI needs special processing before use.

Signed-off-by: Werner Koch <wk@gnupg.org>
NEWS
doc/gcrypt.texi
mpi/mpiutil.c
src/gcrypt.h.in

diff --git a/NEWS b/NEWS
index 00435e2..ec853c9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -101,6 +101,10 @@ Noteworthy changes in version 1.6.0 (unreleased)
  gcry_mpi_ec_curve_point         NEW.
  GCRYMPI_FLAG_IMMUTABLE          NEW.
  GCRYMPI_FLAG_CONST              NEW.
+ GCRYMPI_FLAG_USER1              NEW.
+ GCRYMPI_FLAG_USER2              NEW.
+ GCRYMPI_FLAG_USER3              NEW.
+ GCRYMPI_FLAG_USER4              NEW.
  GCRYMPI_CONST_ONE               NEW.
  GCRYMPI_CONST_TWO               NEW.
  GCRYMPI_CONST_THREE             NEW.
index 4870a1c..91168a8 100644 (file)
@@ -4822,6 +4822,11 @@ commonly used constants are pre-defined and accessible using the
 macros @code{GCRYMPI_CONST_ONE}, @code{GCRYMPI_CONST_TWO},
 @code{GCRYMPI_CONST_THREE}, @code{GCRYMPI_CONST_FOUR}, and
 @code{GCRYMPI_CONST_EIGHT}.
+@item GCRYMPI_FLAG_USER1
+@itemx GCRYMPI_FLAG_USER2
+@itemx GCRYMPI_FLAG_USER3
+@itemx GCRYMPI_FLAG_USER4
+These flags are reserved for use by the application.
 @end table
 
 @deftypefun void gcry_mpi_set_flag (@w{gcry_mpi_t @var{a}}, @
index a82a8e7..c4259ac 100644 (file)
@@ -220,7 +220,11 @@ _gcry_mpi_free( gcry_mpi_t a )
     }
   /* Check that the flags makes sense.  We better allow for bit 1
      (value 2) for backward ABI compatibility.  */
-  if ((a->flags & ~(1|2|4|16)))
+  if ((a->flags & ~(1|2|4|16
+                    |GCRYMPI_FLAG_USER1
+                    |GCRYMPI_FLAG_USER2
+                    |GCRYMPI_FLAG_USER3
+                    |GCRYMPI_FLAG_USER4)))
     log_bug("invalid flag value in mpi_free\n");
   gcry_free(a);
 }
@@ -275,7 +279,8 @@ gcry_mpi_set_opaque( gcry_mpi_t a, void *p, unsigned int nbits )
   a->alloced = 0;
   a->nlimbs = 0;
   a->sign  = nbits;
-  a->flags = 4;
+  a->flags = 4 | (a->flags & (GCRYMPI_FLAG_USER1|GCRYMPI_FLAG_USER2
+                              |GCRYMPI_FLAG_USER3|GCRYMPI_FLAG_USER4));
   if (gcry_is_secure (a->d))
     a->flags |= 1;
   return a;
@@ -603,6 +608,12 @@ gcry_mpi_set_flag (gcry_mpi_t a, enum gcry_mpi_flag flag)
     case GCRYMPI_FLAG_SECURE:     mpi_set_secure(a); break;
     case GCRYMPI_FLAG_CONST:      a->flags |= (16|32); break;
     case GCRYMPI_FLAG_IMMUTABLE:  a->flags |= 16; break;
+
+    case GCRYMPI_FLAG_USER1:
+    case GCRYMPI_FLAG_USER2:
+    case GCRYMPI_FLAG_USER3:
+    case GCRYMPI_FLAG_USER4:      a->flags |= flag; break;
+
     case GCRYMPI_FLAG_OPAQUE:
     default: log_bug("invalid flag value\n");
     }
@@ -619,6 +630,14 @@ gcry_mpi_clear_flag (gcry_mpi_t a, enum gcry_mpi_flag flag)
       if (!(a->flags & 32))
         a->flags &= ~16;
       break;
+
+    case GCRYMPI_FLAG_USER1:
+    case GCRYMPI_FLAG_USER2:
+    case GCRYMPI_FLAG_USER3:
+    case GCRYMPI_FLAG_USER4:
+      a->flags &= ~flag;
+      break;
+
     case GCRYMPI_FLAG_CONST:
     case GCRYMPI_FLAG_SECURE:
     case GCRYMPI_FLAG_OPAQUE:
@@ -635,6 +654,10 @@ gcry_mpi_get_flag (gcry_mpi_t a, enum gcry_mpi_flag flag)
     case GCRYMPI_FLAG_OPAQUE:    return !!(a->flags & 4);
     case GCRYMPI_FLAG_IMMUTABLE: return !!(a->flags & 16);
     case GCRYMPI_FLAG_CONST:     return !!(a->flags & 32);
+    case GCRYMPI_FLAG_USER1:
+    case GCRYMPI_FLAG_USER2:
+    case GCRYMPI_FLAG_USER3:
+    case GCRYMPI_FLAG_USER4:     return !!(a->flags & flag);
     default: log_bug("invalid flag value\n");
     }
   /*NOTREACHED*/
index 625fa9f..53133bf 100644 (file)
@@ -501,7 +501,11 @@ enum gcry_mpi_flag
                                  a way to store some bytes.  This is
                                  useful for encrypted big integers.  */
     GCRYMPI_FLAG_IMMUTABLE = 4, /* Mark the MPI as immutable.  */
-    GCRYMPI_FLAG_CONST     = 8  /* Mark the MPI as a constant.  */
+    GCRYMPI_FLAG_CONST     = 8, /* Mark the MPI as a constant.  */
+    GCRYMPI_FLAG_USER1 = 0x0100,/* User flag 1.  */
+    GCRYMPI_FLAG_USER2 = 0x0200,/* User flag 2.  */
+    GCRYMPI_FLAG_USER3 = 0x0400,/* User flag 3.  */
+    GCRYMPI_FLAG_USER4 = 0x0800,/* User flag 4.  */
   };