* Manifest: New.
authorWerner Koch <wk@gnupg.org>
Tue, 11 Nov 2003 12:57:36 +0000 (12:57 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 11 Nov 2003 12:57:36 +0000 (12:57 +0000)
* gcrypt.texi (Working with S-expressions): Added "%b".

* sexp.c (sexp_sscan): Implemented "%b" format specifier.

* tsexp.c (basic): Add pass structure and a test for the %b
format.

NEWS
cipher/ChangeLog
cipher/Manifest [new file with mode: 0644]
doc/ChangeLog
doc/gcrypt.texi
src/ChangeLog
src/sexp.c
tests/ChangeLog
tests/tsexp.c

diff --git a/NEWS b/NEWS
index bd72b2a..3fc42d9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,10 +3,13 @@ Noteworthy changes in version 1.1.90 (unreleased)
 
  * The use of the GCRY_WEAK_RANDOM level is now deprecated in favor of
    the new gcry_create_nonce function.
+
+ * gcry_sexp_build now supports a "%b" format to include a memory buffer.
  
  * Interface changes relative to the 1.1.44 release:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 gcry_create_nonce               NEW
+gcry_sexp_build                 ENHANCED
 
 
 Noteworthy changes in version 1.1.44 (2003-10-31)
index a02d895..1b513b9 100644 (file)
@@ -1,3 +1,7 @@
+2003-11-11  Werner Koch  <wk@gnupg.org>
+
+       * Manifest: New.
+
 2003-11-04  Werner Koch  <wk@gnupg.org>
 
        * md.c (gcry_md_hash_buffer): Use shortcut for SHA1
diff --git a/cipher/Manifest b/cipher/Manifest
new file mode 100644 (file)
index 0000000..c397e89
--- /dev/null
@@ -0,0 +1,19 @@
+# Manifest - checksums
+# Copyright 2003 Free Software Foundation, Inc.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This file is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# Checksums for all source files in this directory. Format is
+# filename, blanks, base-64 part of an OpenPGP detached signature
+# without the header lines.  Blank lines and lines beginning with a
+# hash mark are ignored.  Tools to manipulate this file are currently
+# under development.
+
+random.c iQCVAwUAP6jMrkOmKjpR34vuAQJkHwP/dtQR7fux2UePwXBA96lqHsU5Y27qKlymSukbrafZWlwSV/TRQnCWKUf/gSYzFCoWI1uB9/bqVkKUlt2g7IYbF5VO19TOjR+rwGbDARrgczRt4WxU2RHfc6mK7VPvxA3CwUThPc7SJ+rv3A68uZhNKSmm+YZTwaL5nnqk6bzSNdg==rzCG
+
index 65aadac..314dc1e 100644 (file)
@@ -1,3 +1,7 @@
+2003-11-11  Werner Koch  <wk@gnupg.org>
+
+       * gcrypt.texi (Working with S-expressions): Added "%b".
+
 2003-11-04  Werner Koch  <wk@gnupg.org>
 
        * gcrypt.texi (Retrieving random numbers): Add gcry_create_nonce.
index 96f6d76..83d04b6 100644 (file)
@@ -3076,6 +3076,11 @@ string is inserted into the resulting S-expression.
 @item %d
 The next argument is expected to be of type @code{int} and its 
 value ist inserted into the resulting S-expression.
+@item %b
+The next argument is expected to be of type @code{int} directly
+followed by an argument of type @code{char *}.  This represents a
+buffer of given length to be inserted into the resulting regular
+expression.
 @end table
 
 @noindent
index 0a64aac..535a9a4 100644 (file)
@@ -1,3 +1,7 @@
+2003-11-11  Werner Koch  <wk@gnupg.org>
+
+       * sexp.c (sexp_sscan): Implemented "%b" format specifier.
+
 2003-11-11  Moritz Schulte  <mo@g10code.com>
 
        * libgcrypt.m4: Do not set prefix when calling libgcrypt-config.
index bde7dc5..e271414 100644 (file)
@@ -823,10 +823,12 @@ unquote_string (const unsigned char *string, size_t length, unsigned char *buf)
  *     %m - MPI
  *     %s - string (no autoswitch to secure allocation)
  *     %d - integer stored as string (no autoswitch to secure allocation)
+ *      %b - memory buffer; this takes _two_ arguments: an integer with the 
+ *           length of the buffer and a pointer to the buffer.
  *  all other format elements are currently not defined and return an error.
  *  this includes the "%%" sequence becauce the percent sign is not an
  *  allowed character.
- * FIXME: We should find a way to store the secure-MPIS not in the string
+ * FIXME: We should find a way to store the secure-MPIs not in the string
  * but as reference to somewhere - this can help us to save huge amounts
  * of secure memory.  The problem is, that if only one element is secure, all
  * other elements are automagicaly copied to secure meory too, so the most
@@ -867,7 +869,7 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ\
 
   /* Depending on wether ARG_LIST is non-zero or not, this macro gives
      us the next argument, either from the variable argument list as
-     specified by ARG_PTR or from the arugment array ARG_LIST.  */
+     specified by ARG_PTR or from the argument array ARG_LIST.  */
 #define ARG_NEXT(storage, type)                          \
   do                                                     \
     {                                                    \
@@ -1129,6 +1131,21 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ\
              memcpy (c.pos, astr, alen);
              c.pos += alen;
            }
+         else if (*p == 'b')
+           {
+             /* Insert a memory buffer.  */
+             const char *astr;
+             int alen;
+
+             ARG_NEXT (alen, int);
+             ARG_NEXT (astr, const char *);
+             
+             MAKE_SPACE (alen);
+             *c.pos++ = ST_DATA;
+             STORE_LEN (c.pos, alen);
+             memcpy (c.pos, astr, alen);
+             c.pos += alen;
+           }
          else if (*p == 'd')
            {
              /* Insert an integer as string.  */
index e8ff68f..25ae600 100644 (file)
@@ -1,3 +1,8 @@
+2003-11-11  Werner Koch  <wk@gnupg.org>
+
+       * tsexp.c (basic): Add pass structure and a test for the %b
+       format. 
+
 2003-11-04  Werner Koch  <wk@gnupg.org>
 
        * Makefile.am (noinst_PROGRAMS): Use this so that test programs
index 1e73c0e..78aeb4e 100644 (file)
@@ -59,6 +59,7 @@ fail ( const char *format, ... )
 static void
 basic (void)
 {
+  int pass;
   gcry_sexp_t sexp;
   int idx;
   const char *string;
@@ -76,84 +77,114 @@ basic (void)
   };
 
   info ("doing some pretty pointless tests\n"); 
-  string = ("(public-key (dsa (p #41424344#) (y this_is_y) "
-            "(q #61626364656667#) (g %m)))");
-     
-  if ( gcry_sexp_build (&sexp, NULL, string, gcry_mpi_set_ui (NULL, 42)) )
-    {
-      fail (" scanning `%s' failed\n", string);
-      return;
-    }
 
-  /* now find something */
-  for (idx=0; values[idx].token; idx++)
+  for (pass=0;;pass++)
     {
-      const char *token = values[idx].token;
-      const char *parm = values[idx].parm;
-      gcry_sexp_t s1, s2;
-      gcry_mpi_t a;
-      const char *p;
-      size_t n;
-
-      s1 = gcry_sexp_find_token (sexp, token, strlen(token) );
-      if (!s1)
+      switch (pass)
         {
-          fail ("didn't found `%s'\n", token);
-          continue;
-        }
-
-      p = gcry_sexp_nth_data (s1, 0, &n);
-      if (!p)
-        {
-          fail ("no car for `%s'\n", token);
-          continue;
-        }
-      info ("car=`%.*s'\n", (int)n, p);
-
-      s2 = gcry_sexp_cdr (s1);
-      if (!s2) 
-        {
-          fail ("no cdr for `%s'\n", token);
-          continue;
+        case 0:
+          string = ("(public-key (dsa (p #41424344#) (y this_is_y) "
+                    "(q #61626364656667#) (g %m)))");
+          
+          if ( gcry_sexp_build (&sexp, NULL, string,
+                                gcry_mpi_set_ui (NULL, 42)) )
+            {
+              fail (" scanning `%s' failed\n", string);
+              return;
+            }
+          break;
+          
+        case 1:
+          string = ("(public-key (dsa (p #41424344#) (y this_is_y) "
+                    "(q %b) (g %m)))");
+      
+          if ( gcry_sexp_build (&sexp, NULL, string, 
+                                15, "foo\0\x01\0x02789012345",
+                                gcry_mpi_set_ui (NULL, 42)) )
+            {
+              fail (" scanning `%s' failed\n", string);
+              return;
+            }
+          break;
+          
+        default:
+          return; /* Ready. */
         }
 
-      p = gcry_sexp_nth_data (s2, 0, &n);
-      if (p)
-        {
-          fail ("data at car of `%s'\n", token);
-          continue;
-        }
 
-      if (parm)
+      /* now find something */
+      for (idx=0; values[idx].token; idx++)
         {
-          s2 = gcry_sexp_find_token (s1, parm, strlen (parm));
-          if (!s2)
-           {
-              fail ("didn't found `%s'\n", parm);
+          const char *token = values[idx].token;
+          const char *parm = values[idx].parm;
+          gcry_sexp_t s1, s2;
+          gcry_mpi_t a;
+          const char *p;
+          size_t n;
+
+          s1 = gcry_sexp_find_token (sexp, token, strlen(token) );
+          if (!s1)
+            {
+              fail ("didn't found `%s'\n", token);
               continue;
-           }
-          p = gcry_sexp_nth_data (s2, 0, &n);
-          if (!p) 
+            }
+
+          p = gcry_sexp_nth_data (s1, 0, &n);
+          if (!p)
             {
-              fail("no car for `%s'\n", parm );
+              fail ("no car for `%s'\n", token);
               continue;
             }
           info ("car=`%.*s'\n", (int)n, p);
-          p = gcry_sexp_nth_data (s2, 1, &n);
-          if (!p) 
+
+          s2 = gcry_sexp_cdr (s1);
+          if (!s2) 
             {
-              fail("no cdr for `%s'\n", parm );
+              fail ("no cdr for `%s'\n", token);
               continue;
             }
-          info ("cdr=`%.*s'\n", (int)n, p);
-          
-          a = gcry_sexp_nth_mpi (s2, 0, GCRYMPI_FMT_USG);
-          if (!a)
-           {
-              fail("failed to cdr the mpi for `%s'\n", parm);
+
+          p = gcry_sexp_nth_data (s2, 0, &n);
+          if (p)
+            {
+              fail ("data at car of `%s'\n", token);
               continue;
             }
+
+          if (parm)
+            {
+              s2 = gcry_sexp_find_token (s1, parm, strlen (parm));
+              if (!s2)
+                {
+                  fail ("didn't found `%s'\n", parm);
+                  continue;
+                }
+              p = gcry_sexp_nth_data (s2, 0, &n);
+              if (!p) 
+                {
+                  fail("no car for `%s'\n", parm );
+                  continue;
+                }
+              info ("car=`%.*s'\n", (int)n, p);
+              p = gcry_sexp_nth_data (s2, 1, &n);
+              if (!p) 
+                {
+                  fail("no cdr for `%s'\n", parm );
+                  continue;
+                }
+              info ("cdr=`%.*s'\n", (int)n, p);
+          
+              a = gcry_sexp_nth_mpi (s2, 0, GCRYMPI_FMT_USG);
+              if (!a)
+                {
+                  fail("failed to cdr the mpi for `%s'\n", parm);
+                  continue;
+                }
+            }
         }
+     
+      gcry_sexp_release (sexp);
+      sexp = NULL;
     }
 }