* cipher.c (gcry_cipher_encrypt): Reworked so that the output will
authorWerner Koch <wk@gnupg.org>
Fri, 17 Jan 2003 16:42:23 +0000 (16:42 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 17 Jan 2003 16:42:23 +0000 (16:42 +0000)
never contain the plaintext even if the caller did not checked the
return value.

* md.c (gcry_md_get_algo): Changed error code to GCRYERR_GENERAL
because we don't have an invalid md algo but no algorithm enabled.

* pubkey.c (gcry_pk_genkey): Changed error code for bounds check
of table parameters to GCRYERR_INTERNAL.

* md.c (gcry_md_open): Partly reverted Timo's change from
2002-10-10 by removing the check for the algorithm.  An algorithm
of 0 is allowed and anyway we should not double check it or check
it using a different function.  Also fixed the flags check.

* pubkey.c (gcry_pk_encrypt): Make sure that R_CIPH points to NULL
on error.
(gcry_pk_decrypt): Ditto for R_PLAIN.
(gcry_pk_sign): Ditto for R_SIG.
(gcry_pk_genkey): Ditto for R_KEY.

cipher/ChangeLog
cipher/cipher.c
cipher/md.c
cipher/pubkey.c

index 7745d5c..b904cf3 100644 (file)
@@ -1,3 +1,32 @@
+2003-01-17  Werner Koch  <wk@gnupg.org>
+
+       * cipher.c (gcry_cipher_encrypt): Reworked so that the output will
+       never contain the plaintext even if the caller did not checked the
+       return value.
+
+       * md.c (gcry_md_get_algo): Changed error code to GCRYERR_GENERAL
+       because we don't have an invalid md algo but no algorithm enabled.
+
+       * pubkey.c (gcry_pk_genkey): Changed error code for bounds check
+       of table parameters to GCRYERR_INTERNAL.
+
+       * md.c (gcry_md_open): Partly reverted Timo's change from
+       2002-10-10 by removing the check for the algorithm.  An algorithm
+       of 0 is allowed and anyway we should not double check it or check
+       it using a different function.  Also fixed the flags check.
+
+       * pubkey.c (gcry_pk_encrypt): Make sure that R_CIPH points to NULL
+       on error.
+       (gcry_pk_decrypt): Ditto for R_PLAIN.
+       (gcry_pk_sign): Ditto for R_SIG.
+       (gcry_pk_genkey): Ditto for R_KEY.
+
+2003-01-16  Werner Koch  <wk@gnupg.org>
+
+       * md.c (gcry_md_write): Changed 2nd argument type to void*.
+       (gcry_md_hash_buffer): Changed type of boths buffers to void*.
+       (gcry_md_setkey): Changed 2nd argument type to void*.
+
 2003-01-15  Werner Koch  <wk@gnupg.org>
 
        * pubkey.c (sexp_data_to_mpi): New.  This handles pkcs1 padding.
@@ -1197,7 +1226,7 @@ Mon Feb 16 10:08:47 1998  Werner Koch  (wk@isil.d.shuttle.de)
        (digest_algo_to_string): New.
 
 
- Copyright 1998,1999,2000,2001 Free Software Foundation, Inc.
+ Copyright 1998,1999,2000,2001,2002,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
index 42c2b1d..3aff308 100644 (file)
@@ -1,5 +1,5 @@
 /* cipher.c  - cipher dispatcher
- * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ * Copyright (C) 1998,1999,2000,2001,2002,2003 Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
@@ -904,31 +904,40 @@ cipher_encrypt( GCRY_CIPHER_HD c, byte *outbuf,
  * been requested,
  */
 int
-gcry_cipher_encrypt( GCRY_CIPHER_HD h, byte *out, size_t outsize,
-                                      const byte  *in, size_t inlen )
+gcry_cipher_encrypt (GcryCipherHd h, byte *out, size_t outsize,
+                     const byte  *in, size_t inlen )
 {
-    int rc;
+  int rc;
 
-    if ( !in ) {
-       /* caller requested in-place encryption */
-       /* actullay cipher_encrypt() does not need to know about it, but
-        * we may chnage this to get better performace */
-       rc = cipher_encrypt ( h, out, out, outsize );
+  if (!in)
+    {
+      /* caller requested in-place encryption */
+      /* actullay cipher_encrypt() does not need to know about it, but
+       * we may change this to get better performace */
+      rc = cipher_encrypt ( h, out, out, outsize );
     }
-    else {
-       if ( outsize < inlen )
-           return set_lasterr ( GCRYERR_TOO_SHORT );
-        if ( ( h->mode == GCRY_CIPHER_MODE_ECB ||
-               (h->mode == GCRY_CIPHER_MODE_CBC && 
-               !((h->flags & GCRY_CIPHER_CBC_CTS) &&
-                 (inlen > h->blocksize)))) &&
-            (inlen % h->blocksize) != 0 )
-         return set_lasterr( GCRYERR_INV_ARG );
-
-       rc = cipher_encrypt ( h, out, in, inlen );
+  else
+    {
+      if ( outsize < inlen )
+        rc = GCRYERR_TOO_SHORT;
+      else if ((h->mode == GCRY_CIPHER_MODE_ECB
+                || (h->mode == GCRY_CIPHER_MODE_CBC
+                    && !((h->flags & GCRY_CIPHER_CBC_CTS)
+                         && (inlen > h->blocksize))
+                    )
+                )  
+               && (inlen % h->blocksize))
+        rc = GCRYERR_INV_ARG;
+      else
+        rc = cipher_encrypt (h, out, in, inlen);
     }
 
-    return rc? set_lasterr (rc):0;
+  if (rc && out)
+    memset (out, 0x42, outsize); /* Failsafe: Make sure that the
+                                    plaintext will never make it into
+                                    OUT. */
+
+  return rc? set_lasterr (rc):0;
 }
 
 
index 572580a..bd5f7a2 100644 (file)
@@ -1,5 +1,5 @@
 /* md.c  -  message digest dispatcher
- * Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
@@ -350,18 +350,16 @@ md_open( int algo, int secure, int hmac )
 }
 
 
-GCRY_MD_HD
+/* Create a message digest object for algorithm ALGO.  FLAGS may be
+   given as an bitwise OR of the gcry_md_flags values.  ALGO may be
+   given as 0 if the algorithms to be used are later set using
+   gcry_md_enable. */
+GcryMDHd
 gcry_md_open (int algo, unsigned int flags)
 {
   GCRY_MD_HD hd;
 
-  if (check_digest_algo (algo))
-    {
-      set_lasterr (GCRYERR_INV_MD_ALGO);
-      return NULL;
-    }
-  if ((flags &~ GCRY_MD_FLAG_SECURE) > GCRY_MD_FLAG_SECURE
-      && (flags &~ GCRY_MD_FLAG_HMAC) > GCRY_MD_FLAG_HMAC)
+  if ((flags & ~(GCRY_MD_FLAG_SECURE | GCRY_MD_FLAG_HMAC)))
     {
       set_lasterr (GCRYERR_INV_ARG);
       return NULL;
@@ -537,9 +535,9 @@ md_write( GCRY_MD_HD a, byte *inbuf, size_t inlen)
 
 
 void
-gcry_md_write( GCRY_MD_HD hd, const byte *inbuf, size_t inlen)
+gcry_md_write( GCRY_MD_HD hd, const void *inbuf, size_t inlen)
 {
-    md_write( hd, (byte*)inbuf, inlen );
+    md_write( hd, (unsigned char *)inbuf, inlen );
 }
 
 
@@ -634,7 +632,7 @@ gcry_md_ctl( GCRY_MD_HD hd, int cmd, byte *buffer, size_t buflen)
 
 
 int
-gcry_md_setkey( GCRY_MD_HD hd, const char *key, size_t keylen )
+gcry_md_setkey( GCRY_MD_HD hd, const void *key, size_t keylen )
 {
     int rc = 0;
 
@@ -753,7 +751,7 @@ gcry_md_get( GCRY_MD_HD hd, int algo, byte *buffer, int buflen )
  * abort on an invalid algo.  DISABLED_ALGOS are ignored here.
  */
 void
-gcry_md_hash_buffer( int algo, char *digest, const char *buffer, size_t length)
+gcry_md_hash_buffer( int algo, void *digest, const void *buffer, size_t length)
 {
     if( algo == GCRY_MD_RMD160 )
        _gcry_rmd160_hash_buffer( digest, buffer, length );
@@ -789,7 +787,7 @@ gcry_md_get_algo (GCRY_MD_HD hd)
   int algo = md_get_algo (hd);
   if (!algo)
     {
-      set_lasterr (GCRYERR_INV_MD_ALGO);
+      set_lasterr (GCRYERR_GENERAL);
       return 0;
     }
   return algo;
@@ -1000,3 +998,6 @@ gcry_md_info( GCRY_MD_HD h, int cmd, void *buffer, size_t *nbytes)
     return 0;
 }
 
+
+
+
index 37c4fdb..24d2af1 100644 (file)
@@ -1232,6 +1232,7 @@ gcry_pk_encrypt (GCRY_SEXP *r_ciph, GCRY_SEXP s_data, GCRY_SEXP s_pkey)
     const char *key_algo_name, *algo_name, *algo_elems;
     int i, rc, algo;
 
+    *r_ciph = NULL;
     /* get the key */
     rc = sexp_to_key( s_pkey, 0, &pkey, &algo, &i);
     if( rc ) 
@@ -1356,6 +1357,7 @@ gcry_pk_decrypt( GCRY_SEXP *r_plain, GCRY_SEXP s_data, GCRY_SEXP s_skey )
     MPI *skey, *data, plain;
     int rc, algo, dataalgo, want_pkcs1;
 
+    *r_plain = NULL;
     rc = sexp_to_key( s_skey, 1, &skey, &algo, NULL );
     if( rc ) {
        return rc;
@@ -1429,6 +1431,7 @@ gcry_pk_sign( GCRY_SEXP *r_sig, GCRY_SEXP s_hash, GCRY_SEXP s_skey )
     int i, algo, rc;
     const char *key_algo_name, *algo_name, *algo_elems;
 
+    *r_sig = NULL;
     rc = sexp_to_key( s_skey, 1, &skey, &algo, &i);
     if( rc )
        return rc;
@@ -1645,6 +1648,7 @@ gcry_pk_genkey( GCRY_SEXP *r_key, GCRY_SEXP s_parms )
     GCRY_MPI skey[10], *factors;
     unsigned int nbits;
 
+    *r_key = NULL;
     list = gcry_sexp_find_token( s_parms, "genkey", 0 );
     if( !list )
        return GCRYERR_INV_OBJ; /* Does not contain genkey data */
@@ -1673,14 +1677,14 @@ gcry_pk_genkey( GCRY_SEXP *r_key, GCRY_SEXP s_parms )
     s = algo_info_table[i].common_elements;
     s2 = algo_info_table[i].public_elements;
     if( strlen( s ) + strlen( s2 ) > DIM( pub_elems ) )
-        return GCRYERR_TOO_SHORT; /* check bound failed */
+        return GCRYERR_INTERNAL; /* check bound failed */
     strcpy( pub_elems, s );
     strcat( pub_elems, s2 );
 
     s = algo_info_table[i].common_elements;
     s2 = algo_info_table[i].secret_elements;
     if( strlen( s ) + strlen( s2 ) > DIM( sec_elems ) )
-        return GCRYERR_TOO_SHORT; /* check bound failed */
+        return GCRYERR_INTERNAL; /* check bound failed */
     strcpy( sec_elems, s );
     strcat( sec_elems, s2 );
 
@@ -1948,7 +1952,7 @@ gcry_pk_ctl( int cmd, void *buffer, size_t buflen)
  *
  * On error the value -1 is returned and the error reason may be
  * retrieved by gcry_errno().
- * Note:  Because this function is in most caes used to return an
+ * Note:  Because this function is in most cases used to return an
  * integer value, we can make it easier for the caller to just look at
  * the return value.  The caller will in all cases consult the value
  * and thereby detecting whether a error occured or not (i.e. while checking
@@ -1993,3 +1997,4 @@ gcry_pk_algo_info( int algo, int what, void *buffer, size_t *nbytes)
 }
 
 
+