See ChangeLog: Thu Jan 27 18:00:44 CET 2000 Werner Koch
authorWerner Koch <wk@gnupg.org>
Thu, 27 Jan 2000 16:50:44 +0000 (16:50 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 27 Jan 2000 16:50:44 +0000 (16:50 +0000)
ChangeLog
Makefile.am
acconfig.h
cipher/ChangeLog
cipher/pubkey.c
configure.in
jnlib/ChangeLog [new file with mode: 0644]
src/ChangeLog
src/gcrypt.h
src/sexp.c
src/wrapper.c

index b5139d5..b67eee5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Thu Jan 27 18:00:44 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * configure.in (g10defs.h): Replaced by gnupg-defs.h
+
 Mon Jan 24 13:04:28 CET 2000  Werner Koch  <wk@gnupg.de>
 
        * jnlib/ : New.
index 60fb64c..bf47e02 100644 (file)
@@ -22,7 +22,7 @@ EXTRA_DIST = README-alpha VERSION  PROJECTS BUGS
 # gettext never gets it right, so we take here care of deleting the
 # symlink.  my_clean_gcrypt is just a kludge until we can include
 # libgcrypt.
-DISTCLEANFILES = g10defs.h intl/libintl.h ${my_clean_gcrypt}
+DISTCLEANFILES = gnupg-defs.h intl/libintl.h ${my_clean_gcrypt}
 
 dist-hook:
        @set -e; \
index 40ef16a..d364c7b 100644 (file)
@@ -17,8 +17,8 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  */
-#ifndef G10_CONFIG_H
-#define G10_CONFIG_H
+#ifndef GNUPG_CONFIG_H
+#define GNUPG_CONFIG_H
 
 /* need this, because some autoconf tests rely on this (e.g. stpcpy)
  * and it should be used for new programs
 
 @BOTTOM@
 
-#include "g10defs.h"
+#include "gnupg-defs.h"
 
-#endif /*G10_CONFIG_H*/
+#endif /*GNUPG_CONFIG_H*/
index 5925a04..cd899ed 100644 (file)
@@ -1,3 +1,7 @@
+Thu Jan 27 18:00:44 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * pubkey.c (sexp_to_key): Fixed mem leaks in case of errors.
+
 Mon Jan 24 22:24:38 CET 2000  Werner Koch  <wk@gnupg.de>
 
        * pubkey.c (gcry_pk_decrypt): Implemented.
index 4def6f6..3ace1d8 100644 (file)
@@ -668,11 +668,15 @@ sexp_to_key( GCRY_SEXP sexp, int want_private, MPI **retarray, int *retalgo)
     for(s=elems1; *s; s++, idx++ ) {
        l2 = gcry_sexp_find_token( list, s, 1 );
        if( !l2 ) {
+           for(i=0; i<idx; i++)
+               g10_free( array[i] );
            g10_free( array );
            return GCRYERR_NO_OBJ; /* required parameter not found */
        }
        array[idx] = gcry_sexp_cdr_mpi( l2, GCRYMPI_FMT_USG );
        if( !array[idx] ) {
+           for(i=0; i<idx; i++)
+               g10_free( array[i] );
            g10_free( array );
            return GCRYERR_INV_OBJ; /* required parameter is invalid */
        }
@@ -680,12 +684,16 @@ sexp_to_key( GCRY_SEXP sexp, int want_private, MPI **retarray, int *retalgo)
     for(s=elems2; *s; s++, idx++ ) {
        l2 = gcry_sexp_find_token( list, s, 1 );
        if( !l2 ) {
+           for(i=0; i<idx; i++)
+               g10_free( array[i] );
            g10_free( array );
            return GCRYERR_NO_OBJ; /* required parameter not found */
        }
        /* FIXME: put the MPI in secure memory when needed */
        array[idx] = gcry_sexp_cdr_mpi( l2, GCRYMPI_FMT_USG );
        if( !array[idx] ) {
+           for(i=0; i<idx; i++)
+               g10_free( array[i] );
            g10_free( array );
            return GCRYERR_INV_OBJ; /* required parameter is invalid */
        }
@@ -1100,21 +1108,138 @@ gcry_pk_testkey( GCRY_SEXP s_key )
 /****************
  * Create a public key pair and return it in r_key.
  * How the key is created depends on s_parms:
- * (GNU
- *  (genkey
- *   (algo
- *     (parameter_name_1 ....)
- *     ....
- *     (parameter_name_n ....)
- * )))
+ * (genkey
+ *  (algo
+ *    (parameter_name_1 ....)
+ *     ....
+ *    (parameter_name_n ....)
+ * ))
  * The key is returned in a format depending on the
- * algorithm. Both, private and secret key are returned
+ * algorithm. Both, private and secret keys are returned
  * and optionally some additional informatin.
+ * For elgamal we return this structure:
+ * (key-data
+ *  (public-key
+ *    (elg
+ *     (p <mpi>)
+ *     (g <mpi>)
+ *     (y <mpi>)
+ *    )
+ *  )
+ *  (private-key
+ *    (elg
+ *     (p <mpi>)
+ *     (g <mpi>)
+ *     (y <mpi>)
+ *     (x <mpi>)
+ *    )
+ *  )
+ *  (misc-key-info
+ *     (pm1-factors n1 n2 ... nn)
+ *  )
+ * )
  */
 int
 gcry_pk_genkey( GCRY_SEXP *r_key, GCRY_SEXP s_parms )
 {
-    return GCRYERR_NOT_IMPL;
+    GCRY_SEXP list, l2, *s_elems, pub_list, sec_list, misc_list;
+    const char *name;
+    const char *s;
+    size_t n;
+    int rc, i;
+    const char *algo_name;
+    int algo;
+    char sec_elems[20], pub_elems[20]; /* fixme: check bounds */
+    GCRY_MPI skey[10], *factors;
+    unsigned int nbits;
+
+    list = gcry_sexp_find_token( s_parms, "genkey", 0 );
+    if( !list )
+       return GCRYERR_INV_OBJ; /* Does not contain genkey data */
+    list = gcry_sexp_cdr( list );
+    if( !list )
+       return GCRYERR_NO_OBJ; /* no cdr for the genkey */
+    name = gcry_sexp_car_data( list, &n );
+    if( !name )
+       return GCRYERR_INV_OBJ; /* algo string missing */
+    for(i=0; (s=algo_info_table[i].name); i++ ) {
+       if( strlen(s) == n && !memcmp( s, name, n ) )
+           break;
+    }
+    if( !s )
+       return GCRYERR_INV_PK_ALGO; /* unknown algorithm */
+
+    algo = algo_info_table[i].algo;
+    algo_name = algo_info_table[i].name;
+    strcpy( pub_elems, algo_info_table[i].common_elements );
+    strcat( pub_elems, algo_info_table[i].public_elements );
+    strcpy( sec_elems, algo_info_table[i].common_elements );
+    strcat( sec_elems, algo_info_table[i].secret_elements );
+
+    l2 = gcry_sexp_find_token( list, "nbits", 0 );
+    if( !l2 )
+       return GCRYERR_NO_OBJ; /* no nbits aparemter */
+    name = gcry_sexp_cdr_data( l2, &n );
+    if( !name )
+       return GCRYERR_INV_OBJ; /* nbits without a cdr */
+    {
+       char *p = g10_xmalloc(n+1);
+       memcpy(p, name, n );
+       p[n] = 0;
+       nbits = (unsigned int)strtol( p, NULL, 0 );
+       g10_free( p );
+    }
+
+    rc = pubkey_generate( algo, nbits, skey, &factors );
+    if( rc ) {
+       return rc;
+    }
+
+    /* build the public key list */
+    s_elems = g10_xcalloc( (strlen(pub_elems)+2), sizeof *s_elems );
+    s_elems[0] = SEXP_NEW( algo_name, 0 );
+    for(i=0; pub_elems[i]; i++ ) {
+       char tmp[2];
+       tmp[0] = pub_elems[i];
+       tmp[1] = 0;
+       s_elems[i+1] = gcry_sexp_new_name_mpi( tmp, skey[i] );
+    }
+    pub_list = SEXP_CONS( SEXP_NEW( "public-key", 0 ),
+                         gcry_sexp_alist( s_elems ) );
+    g10_free( s_elems );
+
+    /* build the secret key list */
+    s_elems = g10_xcalloc( (strlen(sec_elems)+2), sizeof *s_elems );
+    s_elems[0] = SEXP_NEW( algo_name, 0 );
+    for(i=0; sec_elems[i]; i++ ) {
+       char tmp[2];
+       tmp[0] = sec_elems[i];
+       tmp[1] = 0;
+       s_elems[i+1] = gcry_sexp_new_name_mpi( tmp, skey[i] );
+    }
+    sec_list = SEXP_CONS( SEXP_NEW( "private-key", 0 ),
+                         gcry_sexp_alist( s_elems ) );
+    g10_free( s_elems );
+
+    /* build the list of factors */
+    for(n=0; factors[n]; n++ )
+       ;
+    s_elems = g10_xcalloc( n+2, sizeof *s_elems );
+    s_elems[0] = SEXP_NEW( "pm1-factors", 0 );
+    for(i=0; factors[i]; i++ ) {
+       s_elems[i+1] = gcry_sexp_new_mpi( factors[i] );
+    }
+    misc_list = SEXP_CONS( SEXP_NEW( "misc-key-info", 0 ),
+                         gcry_sexp_alist( s_elems ) );
+    g10_free( s_elems );
+
+    /* and put all together */
+    *r_key = gcry_sexp_vlist( SEXP_NEW( "key-data", 0 ),
+                             pub_list, sec_list, misc_list, NULL );
+    gcry_sexp_release( pub_list );
+    gcry_sexp_release( sec_list );
+    gcry_sexp_release( misc_list );
+    return 0;
 }
 
 /****************
index ff584f5..6c3b209 100644 (file)
@@ -8,7 +8,7 @@ dnl Must reset CDPATH so that bash's cd does not print to stdout
 CDPATH=
 
 AC_PREREQ(2.13)
-AC_INIT(g10/g10.c)
+AC_INIT(g10/gpg.c)
 AC_CONFIG_AUX_DIR(scripts)
 AM_CONFIG_HEADER(config.h)
 
@@ -687,25 +687,25 @@ GNUPG_FIX_HDR_VERSION(gcrypt/gcrypt.h, GCRYPT_VERSION)
 
 AC_OUTPUT_COMMANDS([
 chmod +x gcrypt/gcrypt-config
-cat >g10defs.tmp <<G10EOF
+cat >gnupg-defs.tmp <<G10EOF
 /* Generated automatically by configure */
 #ifdef HAVE_DRIVE_LETTERS
-  #define G10_LOCALEDIR "c:/lib/gnupg/locale"
+  #define GNUPG_LOCALEDIR "c:/lib/gnupg/locale"
   #define GNUPG_LIBDIR  "c:/lib/gnupg"
   #define GNUPG_DATADIR "c:/lib/gnupg"
 #else
-  #define G10_LOCALEDIR "${prefix}/${DATADIRNAME}/locale"
+  #define GNUPG_LOCALEDIR "${prefix}/${DATADIRNAME}/locale"
   #define GNUPG_LIBDIR  "${libdir}/gnupg"
   #define GNUPG_DATADIR "${datadir}/gnupg"
 #endif
 G10EOF
-if cmp -s g10defs.h g10defs.tmp 2>/dev/null; then
-    echo "g10defs.h is unchanged"
-    rm -f g10defs.tmp
+if cmp -s gnupg-defs.h gnupg-defs.tmp 2>/dev/null; then
+    echo "gnupg-defs.h is unchanged"
+    rm -f gnupg-defs.tmp
 else
-    rm -f g10defs.h
-    mv g10defs.tmp g10defs.h
-    echo "g10defs.h created"
+    rm -f gnupg-defs.h
+    mv gnupg-defs.tmp gnupg-defs.h
+    echo "gnupg-defs.h created"
 fi
 ],[
 prefix=$prefix
diff --git a/jnlib/ChangeLog b/jnlib/ChangeLog
new file mode 100644 (file)
index 0000000..a41901b
--- /dev/null
@@ -0,0 +1,14 @@
+Mon Jan 24 13:04:28 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * README: New.
+       * Makefile.am: new.
+       * argparse.c argparse.h logging.c logging.h
+         mischelp.h stringhelp.c stringhelp.h xmalloc.c
+         xmalloc.h dotlock.c: Moved from ../util to here.
+       * dotlock.h: New.
+       * libjnlib-config.h: New.
+
+       * logging.c (log_set_file): New.
+       (log_printf): New.
+       (do_logv): Add kludge to insert LFs.
+
index 30e508f..9d50ce1 100644 (file)
@@ -1,3 +1,7 @@
+Thu Jan 27 18:00:44 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * sexp.c (gcry_sexp_sscan): Allow NULL for erroff.
+
 Mon Jan 24 22:24:38 CET 2000  Werner Koch  <wk@gnupg.de>
 
        * sexp.c (gcry_sexp_alist): New.
index c21e6b3..cdaca75 100644 (file)
@@ -167,6 +167,7 @@ size_t          gcry_sexp_sprint( GCRY_SEXP sexp, int mode, char *buffer,
                                                size_t maxlength );
 GCRY_SEXP   gcry_sexp_find_token( GCRY_SEXP list,
                                  const char *tok, size_t toklen );
+GCRY_SEXP   gcry_sexp_enum( GCRY_SEXP list, void **context, int mode );
 GCRY_SEXP   gcry_sexp_car( GCRY_SEXP list );
 GCRY_SEXP   gcry_sexp_cdr( GCRY_SEXP list );
 const char *gcry_sexp_car_data( GCRY_SEXP list, size_t *datalen );
index e56e6c1..d720d4f 100644 (file)
@@ -433,9 +433,9 @@ gcry_sexp_find_token( GCRY_SEXP list, const char *tok, size_t toklen )
  * the address of a void pointer initialized to NULL.  Then don't touch this
  * variable anymore but pass it verbatim to the function; you will get
  * all lists back in turn. End of lists is indicated by a returned NIL in
- * whic case you should not continue to use this function
+ * which case you should not continue to use this function
  * (it would wrap around).  If you decide to cancel the operation before
- * the final NIL you vae to release the context by calling the function
+ * the final NIL you have to release the context by calling the function
  * with a the context but a LIST set to NULL.
  * Note that this function returns only lists and not single objects.
  */
@@ -595,6 +595,10 @@ gcry_sexp_sscan( GCRY_SEXP *retsexp, const char *buffer,
     int quoted_esc=0;
     int datalen=0;
     int first;
+    size_t dummy_erroff;
+
+    if( !erroff )
+       erroff = &dummy_erroff;
 
     tail = head = NULL;
     first = 0;
index c38e0a4..bc0cbef 100644 (file)
@@ -38,5 +38,5 @@ void *gcry_xcalloc_secure( size_t n, size_t m )
 void *gcry_xrealloc( void *a, size_t n ) { return g10_xrealloc( a, n ); }
 char *gcry_xstrdup( const char * a)     { return g10_xstrdup( a); }
 void  gcry_free( void *p )              { g10_free( p ); }
-int   gcry_is_secure( const void *p )   { g10_is_secure( p ); }
+int   gcry_is_secure( const void *p )   { return g10_is_secure( p ); }