gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r20598 - in gnunet: doc/man src/datastore src/exit src/fs s


From: gnunet
Subject: [GNUnet-SVN] r20598 - in gnunet: doc/man src/datastore src/exit src/fs src/include src/util src/vpn
Date: Mon, 19 Mar 2012 11:17:49 +0100

Author: grothoff
Date: 2012-03-19 11:17:48 +0100 (Mon, 19 Mar 2012)
New Revision: 20598

Modified:
   gnunet/doc/man/gnunet-rsa.1
   gnunet/src/datastore/datastore.h
   gnunet/src/exit/exit.h
   gnunet/src/fs/gnunet-service-fs.h
   gnunet/src/include/block_dns.h
   gnunet/src/include/gnunet_common.h
   gnunet/src/include/gnunet_crypto_lib.h
   gnunet/src/include/gnunet_strings_lib.h
   gnunet/src/util/crypto_hash.c
   gnunet/src/util/gnunet-rsa.c
   gnunet/src/util/strings.c
   gnunet/src/vpn/vpn.h
Log:
adding API for short (256-bit) hash codes

Modified: gnunet/doc/man/gnunet-rsa.1
===================================================================
--- gnunet/doc/man/gnunet-rsa.1 2012-03-19 10:03:32 UTC (rev 20597)
+++ gnunet/doc/man/gnunet-rsa.1 2012-03-19 10:17:48 UTC (rev 20598)
@@ -17,8 +17,11 @@
 Print the corresponding public key to stdout.
 .B
 .IP "\-P, \-\-print-peer-identity"
-Print the corresponding peer identity (hash of the public key) to stdout.
+Print the corresponding peer identity (hash of the public key) to stdout.  
This hash is used for the name of peers.
 .B
+.IP "\-s, \-\-print-short-identity"
+Print the corresponding short hash (256-bit hash of the public key) to stdout. 
 This hash is used for names in the zkey zone.
+.B
 .IP "\-c FILENAME,  \-\-config=FILENAME"
 Use the configuration file FILENAME.
 .B

Modified: gnunet/src/datastore/datastore.h
===================================================================
--- gnunet/src/datastore/datastore.h    2012-03-19 10:03:32 UTC (rev 20597)
+++ gnunet/src/datastore/datastore.h    2012-03-19 10:17:48 UTC (rev 20598)
@@ -130,7 +130,7 @@
    * Desired key (optional).  Check the "size" of the
    * header to see if the key is actually present.
    */
-  GNUNET_HashCode key GNUNET_PACKED;
+  GNUNET_HashCode key;
 
 };
 
@@ -253,7 +253,7 @@
   /**
    * Key under which the item can be found.
    */
-  GNUNET_HashCode key GNUNET_PACKED;
+  GNUNET_HashCode key;
 
 };
 GNUNET_NETWORK_STRUCT_END

Modified: gnunet/src/exit/exit.h
===================================================================
--- gnunet/src/exit/exit.h      2012-03-19 10:03:32 UTC (rev 20597)
+++ gnunet/src/exit/exit.h      2012-03-19 10:17:48 UTC (rev 20598)
@@ -49,7 +49,7 @@
   /**
    * Identification for the desired service.
    */
-  GNUNET_HashCode service_descriptor GNUNET_PACKED;
+  GNUNET_HashCode service_descriptor;
 
   /**
    * Skeleton of the TCP header to send.  Port numbers are to
@@ -142,7 +142,7 @@
   /**
    * Identification for the desired service.
    */
-  GNUNET_HashCode service_descriptor GNUNET_PACKED;
+  GNUNET_HashCode service_descriptor;
 
   /* followed by UDP payload */
 };
@@ -230,7 +230,7 @@
   /**
    * Identification for the desired service.
    */
-  GNUNET_HashCode service_descriptor GNUNET_PACKED;
+  GNUNET_HashCode service_descriptor;
 
   /**
    * ICMP header to use.

Modified: gnunet/src/fs/gnunet-service-fs.h
===================================================================
--- gnunet/src/fs/gnunet-service-fs.h   2012-03-19 10:03:32 UTC (rev 20597)
+++ gnunet/src/fs/gnunet-service-fs.h   2012-03-19 10:17:48 UTC (rev 20598)
@@ -129,7 +129,7 @@
    * Hashcodes of the file(s) we're looking for.
    * Details depend on the query type.
    */
-  GNUNET_HashCode query GNUNET_PACKED;
+  GNUNET_HashCode query;
 
   /* this is followed by hash codes as specified in the "hash_bitmap";
    * after that, an optional bloomfilter (with bits set for replies

Modified: gnunet/src/include/block_dns.h
===================================================================
--- gnunet/src/include/block_dns.h      2012-03-19 10:03:32 UTC (rev 20597)
+++ gnunet/src/include/block_dns.h      2012-03-19 10:17:48 UTC (rev 20598)
@@ -64,7 +64,7 @@
    * The descriptor for the service
    * (a peer may provide more than one service)
    */
-  GNUNET_HashCode service_descriptor GNUNET_PACKED;
+  GNUNET_HashCode service_descriptor;
 
   /**
    * When does this record expire?

Modified: gnunet/src/include/gnunet_common.h
===================================================================
--- gnunet/src/include/gnunet_common.h  2012-03-19 10:03:32 UTC (rev 20597)
+++ gnunet/src/include/gnunet_common.h  2012-03-19 10:17:48 UTC (rev 20598)
@@ -208,27 +208,25 @@
   uint16_t type GNUNET_PACKED;
 
 };
-GNUNET_NETWORK_STRUCT_END
 
+
 /**
  * @brief 512-bit hashcode
  */
-typedef struct
+typedef struct GNUNET_HashCode
 {
   uint32_t bits[512 / 8 / sizeof (uint32_t)];   /* = 16 */
 }
 GNUNET_HashCode;
 
 
-GNUNET_NETWORK_STRUCT_BEGIN
-
 /**
  * The identity of the host (basically the SHA-512 hashcode of
  * it's public key).
  */
 struct GNUNET_PeerIdentity
 {
-  GNUNET_HashCode hashPubKey GNUNET_PACKED;
+  GNUNET_HashCode hashPubKey;
 };
 GNUNET_NETWORK_STRUCT_END
 

Modified: gnunet/src/include/gnunet_crypto_lib.h
===================================================================
--- gnunet/src/include/gnunet_crypto_lib.h      2012-03-19 10:03:32 UTC (rev 
20597)
+++ gnunet/src/include/gnunet_crypto_lib.h      2012-03-19 10:17:48 UTC (rev 
20598)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 Christian Grothoff (and 
other contributing authors)
+     (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2012 Christian Grothoff 
(and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -138,7 +138,27 @@
 
 
 
+
 /**
+ * @brief 256-bit hashcode
+ */
+struct GNUNET_CRYPTO_ShortHashCode
+{
+  uint32_t bits[256 / 8 / sizeof (uint32_t)];   /* = 8 */
+};
+
+
+/**
+ * @brief 0-terminated ASCII encoding of a 'struct GNUNET_ShortHashCode'.
+ */
+struct GNUNET_CRYPTO_ShortHashAsciiEncoded
+{
+  unsigned char short_encoding[53];
+};
+
+
+
+/**
  * @brief an RSA signature
  */
 struct GNUNET_CRYPTO_RsaSignature
@@ -433,8 +453,20 @@
 
 
 /**
- * Convert ASCII encoding back to GNUNET_CRYPTO_hash
+ * Convert short hash to ASCII encoding.
  *
+ * @param block the hash code
+ * @param result where to store the encoding (struct 
GNUNET_CRYPTO_ShortHashAsciiEncoded can be
+ *  safely cast to char*, a '\\0' termination is set).
+ */
+void
+GNUNET_CRYPTO_short_hash_to_enc (const struct GNUNET_CRYPTO_ShortHashCode * 
block,
+                                struct GNUNET_CRYPTO_ShortHashAsciiEncoded 
*result);
+
+
+/**
+ * Convert ASCII encoding back to a 'GNUNET_HashCode'
+ *
  * @param enc the encoding
  * @param enclen number of characters in 'enc' (without 0-terminator, which 
can be missing)
  * @param result where to store the GNUNET_CRYPTO_hash code
@@ -446,16 +478,41 @@
 
 
 /**
- * Convert ASCII encoding back to GNUNET_CRYPTO_hash
+ * Convert ASCII encoding back to a 'struct GNUNET_CRYPTO_ShortHash'
+ *
  * @param enc the encoding
+ * @param enclen number of characters in 'enc' (without 0-terminator, which 
can be missing)
  * @param result where to store the GNUNET_CRYPTO_hash code
  * @return GNUNET_OK on success, GNUNET_SYSERR if result has the wrong encoding
  */
+int
+GNUNET_CRYPTO_short_hash_from_string2 (const char *enc, size_t enclen,
+                                      struct GNUNET_CRYPTO_ShortHashCode * 
result);
+
+
+/**
+ * Convert ASCII encoding back to GNUNET_HashCode
+ *
+ * @param enc the encoding
+ * @param result where to store the hash code
+ * @return GNUNET_OK on success, GNUNET_SYSERR if result has the wrong encoding
+ */
 #define GNUNET_CRYPTO_hash_from_string(enc, result) \
   GNUNET_CRYPTO_hash_from_string2 (enc, strlen(enc), result)
 
 
 /**
+ * Convert ASCII encoding back to a 'struct GNUNET_CRYPTO_ShortHash'
+ *
+ * @param enc the encoding
+ * @param result where to store the GNUNET_CRYPTO_ShortHash 
+ * @return GNUNET_OK on success, GNUNET_SYSERR if result has the wrong encoding
+ */
+#define GNUNET_CRYPTO_short_hash_from_string(enc, result) \
+  GNUNET_CRYPTO_short_hash_from_string2 (enc, strlen(enc), result)
+
+
+/**
  * Compute the distance between 2 hashcodes.
  * The computation must be fast, not involve
  * a.a or a.e (they're used elsewhere), and
@@ -483,6 +540,42 @@
 
 
 /**
+ * Compute short (256-bit) hash of a given block.
+ *
+ * @param block the data to hash
+ * @param size size of the block
+ * @param ret pointer to where to write the hashcode
+ */
+void
+GNUNET_CRYPTO_short_hash (const void *block, size_t size, 
+                         struct GNUNET_CRYPTO_ShortHashCode * ret);
+
+
+/**
+ * Double short (256-bit) hash to create a long hash.
+ *
+ * @param sh short hash to double
+ * @param dh where to store the (doubled) long hash (not really a hash)
+ */
+void
+GNUNET_CRYPTO_short_hash_double (const struct GNUNET_CRYPTO_ShortHashCode *sh,
+                                struct GNUNET_HashCode *dh);
+
+
+/**
+ * Truncate doubled short hash back to a short hash.
+ *
+ * @param lh doubled short hash to reduce again
+ * @param sh where to store the short hash
+ * @return GNUNET_OK on success, GNUNET_SYSERR if this was not a
+ *         doubled short hash
+ */
+int
+GNUNET_CRYPTO_short_hash_from_truncation (const struct GNUNET_HashCode *dh,
+                                         struct GNUNET_CRYPTO_ShortHashCode 
*sh);
+
+
+/**
  * Calculate HMAC of a message (RFC 2104)
  *
  * @param key secret key

Modified: gnunet/src/include/gnunet_strings_lib.h
===================================================================
--- gnunet/src/include/gnunet_strings_lib.h     2012-03-19 10:03:32 UTC (rev 
20597)
+++ gnunet/src/include/gnunet_strings_lib.h     2012-03-19 10:17:48 UTC (rev 
20598)
@@ -230,8 +230,8 @@
  * @return pointer to the next byte in 'out' or NULL on error.
  */
 char *
-GNUNET_STRINGS_data_to_string (unsigned char *data, size_t size,
-                              char *out, size_t out_size);
+GNUNET_STRINGS_data_to_string (const unsigned char *data, size_t size,
+                              char *out, size_t out_size);
 
 
 /**

Modified: gnunet/src/util/crypto_hash.c
===================================================================
--- gnunet/src/util/crypto_hash.c       2012-03-19 10:03:32 UTC (rev 20597)
+++ gnunet/src/util/crypto_hash.c       2012-03-19 10:17:48 UTC (rev 20598)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2001, 2002, 2003, 2004, 2005, 2006, 2009 Christian Grothoff (and 
other contributing authors)
+     (C) 2001, 2002, 2003, 2004, 2005, 2006, 2009, 2012 Christian Grothoff 
(and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -34,6 +34,7 @@
 #include "gnunet_common.h"
 #include "gnunet_crypto_lib.h"
 #include "gnunet_disk_lib.h"
+#include "gnunet_strings_lib.h"
 #include <gcrypt.h>
 
 #define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__)
@@ -55,6 +56,21 @@
 
 
 /**
+ * Compute short (256-bit) hash of a given block.
+ *
+ * @param block the data to GNUNET_CRYPTO_hash, length is given as a second 
argument
+ * @param size the length of the data to GNUNET_CRYPTO_hash
+ * @param ret pointer to where to write the hashcode
+ */
+void
+GNUNET_CRYPTO_short_hash (const void *block, size_t size, 
+                         struct GNUNET_CRYPTO_ShortHashCode * ret)
+{
+  gcry_md_hash_buffer (GCRY_MD_SHA256, ret, block, size);
+}
+
+
+/**
  * Context used when hashing a file.
  */
 struct GNUNET_CRYPTO_FileHashContext
@@ -243,26 +259,8 @@
 
 /* ***************** binary-ASCII encoding *************** */
 
-/* FIXME: should use GNUNET_STRINGS_data_to_string and strings_to_data 
below!!! */
 
 /**
- * Get the numeric value corresponding to a character.
- *
- * @param a a character
- * @return corresponding numeric value
- */
-static unsigned int
-getValue__ (unsigned char a)
-{
-  if ((a >= '0') && (a <= '9'))
-    return a - '0';
-  if ((a >= 'A') && (a <= 'V'))
-    return (a - 'A' + 10);
-  return -1;
-}
-
-
-/**
  * Convert GNUNET_CRYPTO_hash to ASCII encoding.  The ASCII encoding is rather
  * GNUnet specific.  It was chosen such that it only uses characters
  * in [0-9A-V], can be produced without complex arithmetics and uses a
@@ -277,88 +275,32 @@
 GNUNET_CRYPTO_hash_to_enc (const GNUNET_HashCode * block,
                            struct GNUNET_CRYPTO_HashAsciiEncoded *result)
 {
-  /**
-   * 32 characters for encoding (GNUNET_CRYPTO_hash => 32 characters)
-   */
-  static char *encTable__ = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
-  unsigned int wpos;
-  unsigned int rpos;
-  unsigned int bits;
-  unsigned int vbit;
+  char *np;
 
-  GNUNET_assert (block != NULL);
-  GNUNET_assert (result != NULL);
-  vbit = 0;
-  wpos = 0;
-  rpos = 0;
-  bits = 0;
-  while ((rpos < sizeof (GNUNET_HashCode)) || (vbit > 0))
-  {
-    if ((rpos < sizeof (GNUNET_HashCode)) && (vbit < 5))
-    {
-      bits = (bits << 8) | ((unsigned char *) block)[rpos++];   /* eat 8 more 
bits */
-      vbit += 8;
-    }
-    if (vbit < 5)
-    {
-      bits <<= (5 - vbit);      /* zero-padding */
-      GNUNET_assert (vbit == 2);        /* padding by 3: 512+3 mod 5 == 0 */
-      vbit = 5;
-    }
-    GNUNET_assert (wpos < sizeof (struct GNUNET_CRYPTO_HashAsciiEncoded) - 1);
-    result->encoding[wpos++] = encTable__[(bits >> (vbit - 5)) & 31];
-    vbit -= 5;
-  }
-  GNUNET_assert (wpos == sizeof (struct GNUNET_CRYPTO_HashAsciiEncoded) - 1);
-  GNUNET_assert (vbit == 0);
-  result->encoding[wpos] = '\0';
+  np = GNUNET_STRINGS_data_to_string ((const unsigned char *) block,
+                                     sizeof (struct GNUNET_HashCode),
+                                     (char*) result,
+                                     sizeof (struct 
GNUNET_CRYPTO_HashAsciiEncoded) - 1);
+  GNUNET_assert (NULL != np);
+  *np = '\0';
 }
 
 
 /**
- * Convert ASCII encoding back to GNUNET_CRYPTO_hash
+ * Convert ASCII encoding back to hash code.
  *
  * @param enc the encoding
  * @param enclen number of characters in 'enc' (without 0-terminator, which 
can be missing)
- * @param result where to store the GNUNET_CRYPTO_hash code
+ * @param result where to store the hash code
  * @return GNUNET_OK on success, GNUNET_SYSERR if result has the wrong encoding
  */
 int
 GNUNET_CRYPTO_hash_from_string2 (const char *enc, size_t enclen,
                                 GNUNET_HashCode * result)
 {
-  unsigned int rpos;
-  unsigned int wpos;
-  unsigned int bits;
-  unsigned int vbit;
-  int ret;
-
-  if (enclen != sizeof (struct GNUNET_CRYPTO_HashAsciiEncoded) - 1)
-    return GNUNET_SYSERR;
-
-  vbit = 2;                     /* padding! */
-  wpos = sizeof (GNUNET_HashCode);
-  rpos = sizeof (struct GNUNET_CRYPTO_HashAsciiEncoded) - 1;
-  bits = (ret = getValue__ (enc[--rpos])) >> 3;
-  if (-1 == ret)
-    return GNUNET_SYSERR;
-  while (wpos > 0)
-  {
-    GNUNET_assert (rpos > 0);
-    bits = ((ret = getValue__ (enc[--rpos])) << vbit) | bits;
-    if (-1 == ret)
-      return GNUNET_SYSERR;
-    vbit += 5;
-    if (vbit >= 8)
-    {
-      ((unsigned char *) result)[--wpos] = (unsigned char) bits;
-      bits >>= 8;
-      vbit -= 8;
-    }
-  }
-  GNUNET_assert (rpos == 0);
-  GNUNET_assert (vbit == 0);
-  return GNUNET_OK;
+  return GNUNET_STRINGS_string_to_data (enc, enclen,
+                                       (unsigned char*) result,
+                                       sizeof (struct GNUNET_HashCode));
 }
 
 
@@ -645,4 +587,88 @@
 }
 
 
+
+/**
+ * Double short (256-bit) hash to create a long hash.
+ *
+ * @param sh short hash to double
+ * @param dh where to store the (doubled) long hash (not really a hash)
+ */
+void
+GNUNET_CRYPTO_short_hash_double (const struct GNUNET_CRYPTO_ShortHashCode *sh,
+                                struct GNUNET_HashCode *dh)
+{
+  char *ptr;
+
+  ptr = (char*) dh;
+  memcpy (ptr, sh, sizeof (struct GNUNET_CRYPTO_ShortHashCode));
+  memcpy (&ptr[sizeof (struct GNUNET_CRYPTO_ShortHashCode)], sh, sizeof 
(struct GNUNET_CRYPTO_ShortHashCode));
+}
+
+
+/**
+ * Truncate doubled short hash back to a short hash.
+ *
+ * @param lh doubled short hash to reduce again
+ * @param sh where to store the short hash
+ * @return GNUNET_OK on success, GNUNET_SYSERR if this was not a
+ *         doubled short hash
+ */
+int
+GNUNET_CRYPTO_short_hash_from_truncation (const struct GNUNET_HashCode *dh,
+                                         struct GNUNET_CRYPTO_ShortHashCode 
*sh)
+{
+  const struct GNUNET_CRYPTO_ShortHashCode *s;
+
+  s = (const struct GNUNET_CRYPTO_ShortHashCode *) dh;
+  if (0 != memcmp (&s[0],
+                  &s[1],
+                  sizeof (struct GNUNET_CRYPTO_ShortHashCode)))
+    return GNUNET_SYSERR;
+  *sh = *s;
+  return GNUNET_OK;
+}
+
+
+/**
+ * Convert ASCII encoding back to a 'struct GNUNET_CRYPTO_ShortHash'
+ *
+ * @param enc the encoding
+ * @param enclen number of characters in 'enc' (without 0-terminator, which 
can be missing)
+ * @param result where to store the GNUNET_CRYPTO_hash code
+ * @return GNUNET_OK on success, GNUNET_SYSERR if result has the wrong encoding
+ */
+int
+GNUNET_CRYPTO_short_hash_from_string2 (const char *enc, size_t enclen,
+                                      struct GNUNET_CRYPTO_ShortHashCode * 
result)
+{
+  return GNUNET_STRINGS_string_to_data (enc, enclen,
+                                       (unsigned char*) result,
+                                       sizeof (struct 
GNUNET_CRYPTO_ShortHashCode));
+}
+
+
+/**
+ * Convert short hash to ASCII encoding.
+ *
+ * @param block the hash code
+ * @param result where to store the encoding (struct 
GNUNET_CRYPTO_ShortHashAsciiEncoded can be
+ *  safely cast to char*, a '\\0' termination is set).
+ */
+void
+GNUNET_CRYPTO_short_hash_to_enc (const struct GNUNET_CRYPTO_ShortHashCode * 
block,
+                                struct GNUNET_CRYPTO_ShortHashAsciiEncoded 
*result)
+{
+  char *np;
+
+  np = GNUNET_STRINGS_data_to_string ((const unsigned char *) block,
+                                     sizeof (struct 
GNUNET_CRYPTO_ShortHashCode),
+                                     (char*) result,
+                                     sizeof (struct 
GNUNET_CRYPTO_ShortHashAsciiEncoded) - 1);
+  GNUNET_assert (NULL != np);
+  *np = '\0';
+}
+
+
+
 /* end of crypto_hash.c */

Modified: gnunet/src/util/gnunet-rsa.c
===================================================================
--- gnunet/src/util/gnunet-rsa.c        2012-03-19 10:03:32 UTC (rev 20597)
+++ gnunet/src/util/gnunet-rsa.c        2012-03-19 10:17:48 UTC (rev 20598)
@@ -37,7 +37,12 @@
  */
 static int print_peer_identity;
 
+/**
+ * Flag for printing short hash of public key.
+ */
+static int print_short_identity;
 
+
 /**
  * Main function that will be run by the scheduler.
  *
@@ -78,6 +83,16 @@
     GNUNET_CRYPTO_hash_to_enc (&pid.hashPubKey, &enc);
     fprintf (stdout, "%s\n", enc.encoding);
   }
+  if (print_short_identity)
+  {
+    struct GNUNET_CRYPTO_ShortHashAsciiEncoded enc;
+    struct GNUNET_CRYPTO_ShortHashCode sh;
+
+    GNUNET_CRYPTO_rsa_key_get_public (pk, &pub);
+    GNUNET_CRYPTO_short_hash (&pub, sizeof (pub), &sh);
+    GNUNET_CRYPTO_short_hash_to_enc (&sh, &enc);
+    fprintf (stdout, "%s\n", enc.short_encoding);
+  }
   GNUNET_CRYPTO_rsa_key_free (pk);
 }
 
@@ -99,6 +114,9 @@
     { 'P', "print-peer-identity", NULL,
       gettext_noop ("print the hash of the public key in ASCII format"),
       0, &GNUNET_GETOPT_set_one, &print_peer_identity },
+    { 's', "print-short-identity", NULL,
+      gettext_noop ("print the short hash of the public key in ASCII format"),
+      0, &GNUNET_GETOPT_set_one, &print_short_identity },
     GNUNET_GETOPT_OPTION_END
   };
   return (GNUNET_OK ==

Modified: gnunet/src/util/strings.c
===================================================================
--- gnunet/src/util/strings.c   2012-03-19 10:03:32 UTC (rev 20597)
+++ gnunet/src/util/strings.c   2012-03-19 10:17:48 UTC (rev 20598)
@@ -643,10 +643,10 @@
  * @return pointer to the next byte in 'out' or NULL on error.
  */
 char *
-GNUNET_STRINGS_data_to_string (unsigned char *data, size_t size, char *out, 
size_t out_size)
+GNUNET_STRINGS_data_to_string (const unsigned char *data, size_t size, char 
*out, size_t out_size)
 {
   /**
-   * 32 characters for encoding (GNUNET_CRYPTO_hash => 32 characters)
+   * 32 characters for encoding 
    */
   static char *encTable__ = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
   unsigned int wpos;
@@ -656,7 +656,11 @@
 
   GNUNET_assert (data != NULL);
   GNUNET_assert (out != NULL);
-  GNUNET_assert (out_size >= (((size*8) + ((size*8) % 5)) % 5));
+  if (out_size < (((size*8) + ((size*8) % 5)) % 5))
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
   vbit = 0;
   wpos = 0;
   rpos = 0;
@@ -675,12 +679,18 @@
       vbit = 5;
     }
     if (wpos >= out_size)
+    {
+      GNUNET_break (0);
       return NULL;
+    }
     out[wpos++] = encTable__[(bits >> (vbit - 5)) & 31];
     vbit -= 5;
   }
   if (wpos != out_size)
+  {
+    GNUNET_break (0);
     return NULL;
+  }
   GNUNET_assert (vbit == 0);
   return &out[wpos];
 }

Modified: gnunet/src/vpn/vpn.h
===================================================================
--- gnunet/src/vpn/vpn.h        2012-03-19 10:03:32 UTC (rev 20597)
+++ gnunet/src/vpn/vpn.h        2012-03-19 10:17:48 UTC (rev 20598)
@@ -115,7 +115,7 @@
   /**
    * Service descriptor identifying the service.
    */
-  GNUNET_HashCode service_descriptor GNUNET_PACKED;
+  GNUNET_HashCode service_descriptor;
 
   /**
    * Unique ID to match a future response to this request.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]