Returns now GNUNET_SYSERR
[oweals/gnunet.git] / src / util / crypto_rsa.c
index 4a0a66b0abd6633957baa3c8c259b4cca1d34657..c7b2c16eef9235536be881f8e59f9be6040f679c 100644 (file)
@@ -546,10 +546,8 @@ rsa_decode_key (const struct RsaPrivateKeyBinaryEncoded *encoding)
  * files does not exist, create a new key and write it to the
  * file.  Caller must free return value.  Note that this function
  * can not guarantee that another process might not be trying
- * the same operation on the same file at the same time.  The
- * caller must somehow know that the file either already exists
- * with a valid key OR be sure that no other process is calling
- * this function at the same time.  If the contents of the file
+ * the same operation on the same file at the same time. 
+ * If the contents of the file
  * are invalid the old file is deleted and a fresh key is
  * created.
  *
@@ -578,12 +576,23 @@ GNUNET_CRYPTO_rsa_key_create_from_file (const char *filename)
                                   GNUNET_DISK_OPEN_CREATE |
                                   GNUNET_DISK_OPEN_FAILIFEXISTS,
                                   GNUNET_DISK_PERM_USER_READ |
-                                  GNUNET_DISK_PERM_USER_WRITE |
-                                  GNUNET_DISK_PERM_GROUP_READ);
+                                  GNUNET_DISK_PERM_USER_WRITE);
       if (NULL == fd)
         {
           if (errno == EEXIST)
-            continue;
+           {         
+             if (GNUNET_YES != GNUNET_DISK_file_test (filename))
+               {
+                 /* must exist but not be accessible, fail for good! */
+                 if (0 != ACCESS (filename, R_OK))                 
+                   GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR,
+                                             "access", filename);
+                 else
+                   GNUNET_break (0); /* what is going on!? */
+                 return NULL;
+               }
+             continue;
+           }
           GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR,
                                     "open", filename);
           return NULL;
@@ -648,7 +657,7 @@ GNUNET_CRYPTO_rsa_key_create_from_file (const char *filename)
                                  sizeof (struct RsaPrivateKeyBinaryEncoded),
                                  GNUNET_NO))
         {
-          if (0 == ++cnt % 10)
+          if (0 == ++cnt % 60)
             {
               ec = errno;
               GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -768,6 +777,8 @@ GNUNET_CRYPTO_rsa_encrypt (const void *block,
 
   GNUNET_assert (size <= sizeof (GNUNET_HashCode));
   pubkey = public2PrivateKey (publicKey);
+  if (pubkey == NULL)
+    return GNUNET_SYSERR;
   isize = size;
   GNUNET_assert (0 ==
                  gcry_mpi_scan (&val, GCRYMPI_FMT_USG, block, isize, &isize));