]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Import of code from heimdal
authorHeimdal Developers <heimdal-discuss@sics.se>
Thu, 3 Nov 2011 17:37:36 +0000 (12:37 -0500)
committerDerrick Brashear <shadow@dementix.org>
Thu, 3 Nov 2011 20:15:34 +0000 (13:15 -0700)
This commit updates the code imported from heimdal to
ee7340860a22f81fb869cc431efc1fd4e5c77d34 (switch-from-svn-to-git-2542-gee73408)

Upstream changes are:

Jeffrey Altman (2):
      Windows: fallback to PROV_RNG if no PROV_RSA_FULL
      roken: posix errnos for windows

Love Hornquist Astrand (3):
      drop __restrict to please old compilers
      add krb5_is_enctype_weak
      Don't export tests from library, reported in bug from Tom Payeire

New files are:
roken/setenv.c
roken/unsetenv.c

Change-Id: I7e3b3db2a58eaaae9de91431565176921d79af3b
Reviewed-on: http://gerrit.openafs.org/5798
Reviewed-by: Derrick Brashear <shadow@dementix.org>
Tested-by: Derrick Brashear <shadow@dementix.org>
src/external/heimdal-last
src/external/heimdal/hcrypto/rand-w32.c
src/external/heimdal/hcrypto/validate.c
src/external/heimdal/krb5/crypto.c
src/external/heimdal/roken/roken.h.in
src/external/heimdal/roken/search.hin
src/external/heimdal/roken/setenv.c [new file with mode: 0644]
src/external/heimdal/roken/tsearch.c
src/external/heimdal/roken/unsetenv.c [new file with mode: 0644]

index 2ed5b6cb83d2b04b721e67d44e0cebf94eab925f..629da3b3ff54b4de846b270fd19e5f0ecfc9e505 100644 (file)
@@ -1 +1 @@
-b118610a9c56835c4ac5dc49ce8124cae8078346
+ee7340860a22f81fb869cc431efc1fd4e5c77d34
index 07f52ca4c89b46aa8f757e7bc6f155f2a87edc42..4bb21c93882eda5446e9df65083d9a590a440109 100644 (file)
@@ -56,13 +56,30 @@ _hc_CryptProvider(void)
 
     rv = CryptAcquireContext(&cryptprovider, NULL,
                              MS_ENHANCED_PROV, PROV_RSA_FULL,
-                             0);
+                             CRYPT_VERIFYCONTEXT);
 
     if (GetLastError() == NTE_BAD_KEYSET) {
-        if(!rv)
+        rv = CryptAcquireContext(&cryptprovider, NULL,
+                                 MS_ENHANCED_PROV, PROV_RSA_FULL,
+                                 CRYPT_NEWKEYSET);
+    }
+
+    if (rv) {
+        /* try the default provider */
+        rv = CryptAcquireContext(&cryptprovider, NULL, 0, PROV_RSA_FULL,
+                                 CRYPT_VERIFYCONTEXT);
+
+        if (GetLastError() == NTE_BAD_KEYSET) {
             rv = CryptAcquireContext(&cryptprovider, NULL,
-                                      MS_ENHANCED_PROV, PROV_RSA_FULL,
-                                      CRYPT_NEWKEYSET);
+                                     MS_ENHANCED_PROV, PROV_RSA_FULL,
+                                     CRYPT_NEWKEYSET);
+        }
+    }
+
+    if (rv) {
+        /* try just a default random number generator */
+        rv = CryptAcquireContext(&cryptprovider, NULL, 0, PROV_RNG,
+                                 CRYPT_VERIFYCONTEXT);
     }
 
     if (rv &&
@@ -98,6 +115,12 @@ w32crypto_bytes(unsigned char *outdata, int size)
 static void
 w32crypto_cleanup(void)
 {
+    HCRYPTPROV cryptprovider;
+
+    if (InterlockedCompareExchangePointer((PVOID *) &cryptprovider,
+                                         0, (PVOID) g_cryptprovider) == 0) {
+        CryptReleaseContext(cryptprovider, 0);
+    }
 }
 
 static void
index 48b9bfc6e352031fb2f6ae63bc77baf8bd8c1245..6f61cc53b307894a0167d881ead4d342556cbc7d 100644 (file)
@@ -56,7 +56,7 @@ struct tests {
     void *outiv;
 };
 
-struct tests tests[] = {
+static struct tests hc_tests[] = {
     {
        EVP_aes_256_cbc,
        "aes-256",
@@ -300,8 +300,8 @@ hcrypto_validate(void)
        return;
     validated++;
 
-    for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
-       test_cipher(&tests[i]);
+    for (i = 0; i < sizeof(hc_tests) / sizeof(hc_tests[0]); i++)
+       test_cipher(&hc_tests[i]);
 
     check_hmac();
 }
index c707efe56a65cc252ca7b5bca41c195da5fe1b1b..d43b704185cdbeda054a905c067634746b922e33 100644 (file)
@@ -2280,6 +2280,26 @@ krb5_allow_weak_crypto(krb5_context context,
     return 0;
 }
 
+/**
+ * Returns is the encryption is strong or weak
+ *
+ * @param context Kerberos 5 context
+ * @param enctype encryption type to probe
+ *
+ * @return Returns true if encryption type is weak or is not supported.
+ *
+ * @ingroup krb5_crypto
+ */
+
+KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL
+krb5_is_enctype_weak(krb5_context context, krb5_enctype enctype)
+{
+    struct _krb5_encryption_type *et = _krb5_find_enctype(enctype);
+    if(et == NULL || (et->flags & F_WEAK))
+       return TRUE;
+    return FALSE;
+}
+
 static size_t
 wrapped_length (krb5_context context,
                krb5_crypto  crypto,
index e5b8616d93d660101ccc85612e3304d7c4010aae..d6985d5b9e5fe48622d249df56cfe2968e04f08a 100644 (file)
@@ -79,9 +79,22 @@ typedef SOCKET rk_socket_t;
 
 ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_SOCK_IOCTL(SOCKET s, long cmd, int * argp);
 
-#define ETIMEDOUT               WSAETIMEDOUT
-#define EWOULDBLOCK             WSAEWOULDBLOCK
-#define ENOTSOCK               WSAENOTSOCK
+/* Microsoft VC 2010 POSIX definitions */
+#ifndef ENOTSOCK
+#define ENOTSOCK               128
+#endif
+#ifndef ENOTSUP
+#define ENOTSUP                 129
+#endif
+#ifndef EOVERFLOW
+#define EOVERFLOW               132
+#endif
+#ifndef ETIMEDOUT
+#define ETIMEDOUT               138
+#endif
+#ifndef EWOULDBLOCK
+#define EWOULDBLOCK             140
+#endif
 
 #define rk_SOCK_INIT() rk_WSAStartup()
 #define rk_SOCK_EXIT() rk_WSACleanup()
index b4edcffbb15762d66fc0deebf63e3c9481e0350a..f8592c481c3fd63eec4e60d1a9cf7d8413e3c84b 100644 (file)
@@ -32,7 +32,7 @@ typedef       enum {
 
 ROKEN_CPP_START
 
-ROKEN_LIB_FUNCTION void        * ROKEN_LIB_CALL rk_tdelete(const void * __restrict, void ** __restrict,
+ROKEN_LIB_FUNCTION void        * ROKEN_LIB_CALL rk_tdelete(const void *, void **,
                 int (*)(const void *, const void *));
 ROKEN_LIB_FUNCTION void        * ROKEN_LIB_CALL rk_tfind(const void *, void * const *,
               int (*)(const void *, const void *));
diff --git a/src/external/heimdal/roken/setenv.c b/src/external/heimdal/roken/setenv.c
new file mode 100644 (file)
index 0000000..b4dbefe
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan
+ * (Royal Institute of Technology, Stockholm, Sweden).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Institute nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <config.h>
+
+#include "roken.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/*
+ * This is the easy way out, use putenv to implement setenv. We might
+ * leak some memory but that is ok since we are usally about to exec
+ * anyway.
+ */
+
+ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
+setenv(const char *var, const char *val, int rewrite)
+{
+#ifndef _WIN32
+    char *t = NULL;
+
+    if (!rewrite && getenv(var) != 0)
+       return 0;
+
+    if (asprintf (&t, "%s=%s", var, val) < 0 || t == NULL)
+       return -1;
+
+    if (putenv(t) == 0)
+       return 0;
+    else
+       return -1;
+#else  /* Win32 */
+    char dummy[8];
+
+    if (!rewrite && GetEnvironmentVariable(var, dummy, sizeof(dummy)/sizeof(char)) != 0)
+       return 0;
+
+    if (SetEnvironmentVariable(var, val) == 0)
+       return -1;
+    else
+       return 0;
+#endif
+}
index c51a643398afe7e4f08182a9997ed89cbd3849c3..65328d367df7bb25e881f1ac67a878757b93c378 100644 (file)
@@ -113,7 +113,7 @@ rk_twalk(const void *vroot,
  * compar: function to carry out node comparisons
  */
 ROKEN_LIB_FUNCTION void *
-rk_tdelete(const void * __restrict vkey, void ** __restrict vrootp,
+rk_tdelete(const void * vkey, void ** vrootp,
        int (*compar)(const void *, const void *))
 {
        node_t **rootp = (node_t **)vrootp;
diff --git a/src/external/heimdal/roken/unsetenv.c b/src/external/heimdal/roken/unsetenv.c
new file mode 100644 (file)
index 0000000..b349654
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan
+ * (Royal Institute of Technology, Stockholm, Sweden).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Institute nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "roken.h"
+
+#if !HAVE_DECL_ENVIRON
+extern char **environ;
+#endif
+
+/*
+ * unsetenv --
+ */
+ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
+unsetenv(const char *name)
+{
+  int len;
+  const char *np;
+  char **p;
+
+  if (name == 0 || environ == 0)
+    return;
+
+  for (np = name; *np && *np != '='; np++)
+    /* nop */;
+  len = np - name;
+
+  for (p = environ; *p != 0; p++)
+    if (strncmp(*p, name, len) == 0 && (*p)[len] == '=')
+      break;
+
+  for (; *p != 0; p++)
+    *p = *(p + 1);
+}